python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)


Posted in Python onFebruary 24, 2014

baiduclient.py

import urllib.parse
import gzip
import json
import re
from http.client import HTTPConnection
from htmlutils import TieBaParser
import httputils as utils
# 请求头
headers = dict()
headers["Connection"] = "keep-alive"
headers["Cache-Control"] = "max-age=0"
headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
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"
headers["Content-Type"] = "application/x-www-form-urlencoded"
headers["Accept-Encoding"] = "gzip,deflate,sdch"
headers["Accept-Language"] = "zh-CN,zh;q=0.8"
headers["Cookie"] = ""
# cookie
cookies = list()
# 个人信息
userInfo = {}
def login(account, password):
    '''登录'''
    global cookies
    headers["Host"] = "wappass.baidu.com"
    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="
    body = body.format(account, password)
    conn = HTTPConnection("wappass.baidu.com", 80)
    conn.request("POST", "/passport/login", body, headers)
    resp = conn.getresponse()
    cookies += utils.getCookiesFromHeaders(resp.getheaders())
    utils.saveCookies(headers, cookies)
    # 登录成功会返回302
    return True if resp.code == 302 else False
    
def getTieBaList():
    '''获取已关注的贴吧列表'''
    conn = HTTPConnection("tieba.baidu.com", 80)
    conn.request("GET", "/mo/m?tn=bdFBW&tab=favorite", "", headers)
    resp = conn.getresponse()    
    tieBaParser = TieBaParser()
    tieBaParser.feed(resp.read().decode())
    tbList = tieBaParser.getTieBaList()
    return tbList
    
def getSignInfo(tieBaName):
    '''获取贴吧签到信息'''
    queryStr = urllib.parse.urlencode({"kw":tieBaName, "ie":"utf-8", "t":0.571444})
    conn = HTTPConnection("tieba.baidu.com", 80)
    conn.request("GET", "/sign/loadmonth?" + queryStr, "", headers)
    data = gzip.decompress(conn.getresponse().read()).decode("GBK")
    signInfo = json.loads(data)
    return signInfo
     
tbsPattern = re.compile('"tbs" value=".{20,35}"')
def signIn(tieBaName):
    '''签到'''
    # 获取页面中的参数tbs
    conn1 = HTTPConnection("tieba.baidu.com", 80)
    queryStr1 = urllib.parse.urlencode({"kw": tieBaName})
    conn1.request("GET", "/mo/m?" + queryStr1, "", headers)
    html = conn1.getresponse().read().decode()
    tbs = tbsPattern.search(html).group(0)[13:-1]
    # 签到
    conn2 = HTTPConnection("tieba.baidu.com", 80)
    body = urllib.parse.urlencode({"kw":tieBaName, "tbs":tbs, "ie":"utf-8"})
    conn2.request("POST", "/sign/add" , body , headers)
    resp2 = conn2.getresponse()
    data = json.loads((gzip.decompress(resp2.read())).decode())
    return data
    
def getUserInfo():
    '''获取个人信息'''
    headers.pop("Host")
    conn = HTTPConnection("tieba.baidu.com", 80)
    conn.request("GET", "/f/user/json_userinfo", "", headers)
    resp = conn.getresponse()
    data = gzip.decompress(resp.read()).decode("GBK")
    global userInfo
    userInfo = json.loads(data)

if __name__ == "__main__":
    account = input("请输入帐号:")
    password = input("请输入密码:") 
    ok = login(account, password)
    if ok:
        getUserInfo()
        print(userInfo["data"]["user_name_weak"] + "~~~登录成功", end="\n------\n")
        for tb in getTieBaList():
            print(tb + "吧:")
            signInfo = signIn(tb)
            if signInfo["no"] != 0:
                print("签到失败!")
                print(signInfo["error"])
            else:
                print("签到成功!")
                print("签到天数:" + str(signInfo["data"]["uinfo"]["cout_total_sing_num"]))
                print("连续签到天数:" + str(signInfo["data"]["uinfo"]["cont_sign_num"]))
            print("------") 
    else:
        print("登录失败")

htmlutils.py

'''
Created on 2014-2-20
@author: Vincent
'''
from html.parser import HTMLParser
class TieBaParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.tieBaList = list()
        self.flag = False
    def getTieBaList(self):
        return self.tieBaList
    def handle_starttag(self, tag, attrs):
        if tag == "a":
            for name , value in attrs:
                if name == "href" and "m?kw=" in value:
                    self.flag = True
    def handle_data(self, data):
        if self.flag:
            self.tieBaList.append(data)
            self.flag = False

httputils.py

'''
Created on 2014-2-20
@author: Vincent
'''
def getCookiesFromHeaders(headers):
    '''从http响应中获取所有cookie'''
    cookies = list()
    for header in headers:
        if "Set-Cookie" in header:
            cookie = header[1].split(";")[0]
            cookies.append(cookie)
    return cookies
def saveCookies(headers, cookies):
    '''保存cookies'''
    for cookie in cookies:
        headers["Cookie"] += cookie + ";"
def getCookieValue(cookies, cookieName):
    '''从cookies中获取指定cookie的值'''
    for cookie in cookies:
        if cookieName in cookie:
            index = cookie.index("=") + 1
            value = cookie[index:]
            return value
def parseQueryString(queryString):
    '''解析查询串'''
    result = dict()
    strs = queryString.split("&")
    for s in strs:
        name = s.split("=")[0]
        value = s.split("=")[1]
        result[name] = value
    return result
Python 相关文章推荐
从零学Python之入门(四)运算
May 27 Python
python基于pygame实现响应游戏中事件的方法(附源码)
Nov 11 Python
解决python2.7 查询mysql时出现中文乱码
Oct 09 Python
python 设置文件编码格式的实现方法
Dec 21 Python
python保存二维数组到txt文件中的方法
Nov 15 Python
Python多线程原理与用法实例剖析
Jan 22 Python
查看python安装路径及pip安装的包列表及路径
Apr 03 Python
对python中的float除法和整除法的实例详解
Jul 20 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
Aug 22 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
Mar 10 Python
Python实现在线批量美颜功能过程解析
Jun 10 Python
Python实现迪杰斯特拉算法过程解析
Sep 18 Python
python实现socket客户端和服务端简单示例
Feb 24 #Python
python抓取网页内容示例分享
Feb 24 #Python
使用python装饰器验证配置文件示例
Feb 24 #Python
python通过urllib2爬网页上种子下载示例
Feb 24 #Python
python控制台显示时钟的示例
Feb 24 #Python
python3访问sina首页中文的处理方法
Feb 24 #Python
python原始套接字编程示例分享
Feb 21 #Python
You might like
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
php生成html文件方法总结
2014/12/01 PHP
php读取csc文件并输出
2015/05/21 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
PHP实现网站应用微信登录功能详解
2019/04/11 PHP
javascript的对话框详解与参数
2007/03/08 Javascript
JavaScript 事件的一些重要说明
2009/10/25 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
2011/02/25 Javascript
jQuery创建平滑的页面滚动(顶部或底部)
2013/02/26 Javascript
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
2018/09/13 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
vue-cli3 DllPlugin 提取公用库的方法
2019/04/24 Javascript
[01:12]DOTA2 2015年秋季互动指南
2015/11/10 DOTA
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
python中使用sys模板和logging模块获取行号和函数名的方法
2014/04/15 Python
理解Python垃圾回收机制
2016/02/12 Python
深入解析Python中的上下文管理器
2016/06/28 Python
关于Python面向对象编程的知识点总结
2017/02/14 Python
python实现屏保计时器的示例代码
2018/08/08 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
Django实现前台上传并显示图片功能
2020/05/29 Python
python 判断一组数据是否符合正态分布
2020/09/23 Python
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
Java如何格式化日期
2012/08/07 面试题
中软国际Java程序员机试题
2012/08/19 面试题
恐龙的灭绝教学反思
2014/02/12 职场文书
小班下学期评语
2014/05/04 职场文书
争做文明公民倡议书
2014/08/29 职场文书
webpack的移动端适配方案小结
2021/07/25 Javascript
python疲劳驾驶困倦低头检测功能的实现
2022/04/04 Python