免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 13437 | 回复: 3
打印 上一主题 下一主题

python3模拟百度登录并实现贴吧自动签到 [复制链接]

论坛徽章:
2
操作系统版块每日发帖之星
日期:2015-06-26 22:20:00每日论坛发贴之星
日期:2015-06-26 22:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-08 14:16 |只看该作者 |倒序浏览
baiduclient.py
  1. '''
  2. Created on 2014-2-20

  3. @author: Vincent
  4. '''
  5. import urllib.parse
  6. import gzip
  7. import json
  8. import re
  9. from http.client import HTTPConnection
  10. from htmlutils import TieBaParser
  11. import httputils as utils

  12. # 请求头
  13. headers = dict()
  14. headers["Connection"] = "keep-alive"
  15. headers["Cache-Control"] = "max-age=0"
  16. headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
  17. headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36"
  18. headers["Content-Type"] = "application/x-www-form-urlencoded"
  19. headers["Accept-Encoding"] = "gzip,deflate,sdch"
  20. headers["Accept-Language"] = "zh-CN,zh;q=0.8"
  21. headers["Cookie"] = ""

  22. # cookie
  23. cookies = list()

  24. # 个人信息
  25. userInfo = {}

  26. def login(account, password):
  27.     '''登录'''
  28.     global cookies
  29.     headers["Host"] = "wappass.baidu.com"
  30.     body = "username={0}&password={1}&submit=%E7%99%BB%E5%BD%95&quick_user=0&isphone=0&sp_login=waprate&uname_login=&loginmerge=1&vcodestr=&u=http%253A%252F%252Fwap.baidu.com%253Fuid%253D1392873796936_247&skin=default_v2&tpl=&ssid=&from=&uid=1392873796936_247&pu=&tn=&bdcm=3f7d51b436d12f2e83389b504fc2d56285356820&type=&bd_page_type="
  31.     body = body.format(account, password)
  32.     conn = HTTPConnection("wappass.baidu.com", 80)
  33.     conn.request("POST", "/passport/login", body, headers)
  34.     resp = conn.getresponse()
  35.     cookies += utils.getCookiesFromHeaders(resp.getheaders())
  36.     utils.saveCookies(headers, cookies)
  37.     # 登录成功会返回302
  38.     return True if resp.code == 302 else False
  39.      

  40. def getTieBaList():
  41.     '''获取已关注的贴吧列表'''
  42.     conn = HTTPConnection("tieba.baidu.com", 80)
  43.     conn.request("GET", "/mo/m?tn=bdFBW&tab=favorite", "", headers)
  44.     resp = conn.getresponse()   
  45.     tieBaParser = TieBaParser()
  46.     tieBaParser.feed(resp.read().decode())
  47.     tbList = tieBaParser.getTieBaList()
  48.     return tbList
  49.      

  50. def getSignInfo(tieBaName):
  51.     '''获取贴吧签到信息'''
  52.     queryStr = urllib.parse.urlencode({"kw":tieBaName, "ie":"utf-8", "t":0.571444})
  53.     conn = HTTPConnection("tieba.baidu.com", 80)
  54.     conn.request("GET", "/sign/loadmonth?" + queryStr, "", headers)
  55.     data = gzip.decompress(conn.getresponse().read()).decode("GBK")
  56.     signInfo = json.loads(data)
  57.     return signInfo
  58.      
  59.       
  60. tbsPattern = re.compile('"tbs" value=".{20,35}"')

  61. def signIn(tieBaName):
  62.     '''签到'''
  63.     # 获取页面中的参数tbs
  64.     conn1 = HTTPConnection("tieba.baidu.com", 80)
  65.     queryStr1 = urllib.parse.urlencode({"kw": tieBaName})
  66.     conn1.request("GET", "/mo/m?" + queryStr1, "", headers)
  67.     html = conn1.getresponse().read().decode()
  68.     tbs = tbsPattern.search(html).group(0)[13:-1]
  69.     # 签到
  70.     conn2 = HTTPConnection("tieba.baidu.com", 80)
  71.     body = urllib.parse.urlencode({"kw":tieBaName, "tbs":tbs, "ie":"utf-8"})
  72.     conn2.request("POST", "/sign/add" , body , headers)
  73.     resp2 = conn2.getresponse()
  74.     data = json.loads((gzip.decompress(resp2.read())).decode())
  75.     return data
  76.      

  77. def getUserInfo():
  78.     '''获取个人信息'''
  79.     headers.pop("Host")
  80.     conn = HTTPConnection("tieba.baidu.com", 80)
  81.     conn.request("GET", "/f/user/json_userinfo", "", headers)
  82.     resp = conn.getresponse()
  83.     data = gzip.decompress(resp.read()).decode("GBK")
  84.     global userInfo
  85.     userInfo = json.loads(data)


  86. if __name__ == "__main__":
  87.     account = input("请输入帐号:")
  88.     password = input("请输入密码:")
  89.    
  90.     ok = login(account, password)
  91.     if ok:
  92.         getUserInfo()
  93.         print(userInfo["data"]["user_name_weak"] + "~~~登录成功", end="\n------\n")
  94.         for tb in getTieBaList():
  95.             print(tb + "吧:")
  96.             signInfo = signIn(tb)
  97.             if signInfo["no"] != 0:
  98.                 print("签到失败!")
  99.                 print(signInfo["error"])
  100.             else:
  101.                 print("签到成功!")
  102.                 print("签到天数:" + str(signInfo["data"]["uinfo"]["cout_total_sing_num"]))
  103.                 print("连续签到天数:" + str(signInfo["data"]["uinfo"]["cont_sign_num"]))
  104.             print("------")
  105.     else:
  106.         print("登录失败")
复制代码
htmlutils.py
  1. '''
  2. Created on 2014-2-20

  3. @author: Vincent
  4. '''

  5. from html.parser import HTMLParser

  6. class TieBaParser(HTMLParser):
  7.     def __init__(self):
  8.         HTMLParser.__init__(self)
  9.         self.tieBaList = list()
  10.         self.flag = False
  11.          
  12.     def getTieBaList(self):
  13.         return self.tieBaList
  14.      
  15.     def handle_starttag(self, tag, attrs):
  16.         if tag == "a":
  17.             for name , value in attrs:
  18.                 if name == "href" and "m?kw=" in value:
  19.                     self.flag = True
  20.                         
  21.     def handle_data(self, data):
  22.         if self.flag:
  23.             self.tieBaList.append(data)
  24.             self.flag = False
复制代码
httputils.py
  1. '''
  2. Created on 2014-2-20

  3. @author: Vincent
  4. '''
  5. def getCookiesFromHeaders(headers):
  6.     '''从http响应中获取所有cookie'''
  7.     cookies = list()
  8.     for header in headers:
  9.         if "Set-Cookie" in header:
  10.             cookie = header[1].split(";")[0]
  11.             cookies.append(cookie)
  12.     return cookies
  13.          
  14. def saveCookies(headers, cookies):
  15.     '''保存cookies'''
  16.     for cookie in cookies:
  17.         headers["Cookie"] += cookie + ";"

  18. def getCookieValue(cookies, cookieName):
  19.     '''从cookies中获取指定cookie的值'''
  20.     for cookie in cookies:
  21.         if cookieName in cookie:
  22.             index = cookie.index("=") + 1
  23.             value = cookie[index:]
  24.             return value
  25.          
  26. def parseQueryString(queryString):
  27.     '''解析查询串'''
  28.     result = dict()
  29.     strs = queryString.split("&")
  30.     for s in strs:
  31.         name = s.split("=")[0]
  32.         value = s.split("=")[1]
  33.         result[name] = value
  34.     return result
复制代码

论坛徽章:
9
2015亚冠之阿尔纳斯尔
日期:2015-09-10 16:21:162015亚冠之塔什干火车头
日期:2015-07-01 16:23:022015年亚洲杯之巴勒斯坦
日期:2015-04-20 17:19:46子鼠
日期:2014-11-13 09:51:26未羊
日期:2014-08-28 18:13:36技术图书徽章
日期:2014-02-21 09:30:15酉鸡
日期:2014-01-14 11:12:49天蝎座
日期:2013-12-09 17:56:53平安夜徽章
日期:2015-12-26 00:06:30
2 [报告]
发表于 2015-07-08 16:20 |只看该作者
学习了.......

论坛徽章:
6
CU大牛徽章
日期:2013-03-13 15:15:08CU大牛徽章
日期:2013-03-13 15:26:06CU大牛徽章
日期:2013-03-13 15:26:47戌狗
日期:2013-10-17 09:48:53CU十二周年纪念徽章
日期:2013-10-24 15:41:34丑牛
日期:2014-09-19 14:58:11
3 [报告]
发表于 2015-08-20 17:49 |只看该作者
不错,要mark一下~~~~~~~~

论坛徽章:
0
4 [报告]
发表于 2015-12-28 14:18 |只看该作者
现在还好用么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP