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爬虫之爬虫编写全记录
Nov 06 Python
python实现可将字符转换成大写的tcp服务器实例
Apr 29 Python
OpenCV实现人脸识别
Apr 07 Python
python实现生命游戏的示例代码(Game of Life)
Jan 24 Python
Flask 让jsonify返回的json串支持中文显示的方法
Mar 26 Python
Flask入门之上传文件到服务器的方法示例
Jul 18 Python
对Python发送带header的http请求方法详解
Jan 02 Python
Django Celery异步任务队列的实现
Jul 24 Python
利用python3 的pygame模块实现塔防游戏
Dec 30 Python
python使用多线程+socket实现端口扫描
May 28 Python
Python selenium实现断言3种方法解析
Sep 08 Python
Python中文分词库jieba(结巴分词)详细使用介绍
Apr 07 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字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
php获取文章上一页与下一页的方法
2014/12/01 PHP
php中Ctype函数用法详解
2014/12/09 PHP
php导入excel文件到mysql数据库的方法
2015/01/14 PHP
PHP连接MYSQL数据库实例代码
2016/01/20 PHP
Google排名中的10个最著名的 JavaScript库
2010/04/27 Javascript
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
理解Javascript_10_对象模型
2010/10/16 Javascript
javascript测试题练习代码
2012/10/10 Javascript
jquery 使用简明教程
2014/03/05 Javascript
对JavaScript中this指针的新理解分享
2015/01/31 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
浅谈json取值(对象和数组)
2016/06/24 Javascript
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
基于JS实现视频上传显示进度条
2020/05/12 Javascript
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
Python在线运行代码助手
2016/07/15 Python
Python学习小技巧之列表项的推导式与过滤操作
2017/05/20 Python
图解Python变量与赋值
2018/04/03 Python
python2爬取百度贴吧指定关键字和图片代码实例
2019/08/14 Python
Python3+Selenium+Chrome实现自动填写WPS表单
2020/02/12 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
使用python爬取抖音app视频的实例代码
2020/12/01 Python
CSS3中Animation动画属性用法详解
2016/07/04 HTML / CSS
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
商务英语求职自荐信范文
2013/12/24 职场文书
租房协议书怎么写
2014/04/10 职场文书
道德大讲堂实施方案
2014/05/14 职场文书
大学生求职信范文
2014/05/24 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
毕业生实习证明
2014/09/19 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
个人廉洁自律总结
2015/03/06 职场文书
OpenCV实现反阈值二值化
2021/11/17 Java/Android
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python
tomcat正常启动但网页却无法访问的几种解决方法
2022/05/06 Servers