因为总是忘记签到,所以尝试写了一个签到脚本,因为使用的是Python3,所以没法使用Urllib2,于是选择了Requests,事实证明,Requests比Urllib2好用。整体思路比较简单,就是模拟百度登陆的过程进行交互,然后获取COOKIES并保存,之后都使用COOKIES登陆,然后模拟贴吧客户端的收发包过程进行交互,但实际上遇到了非常多的问题,这里就记录下这次的调试经验
主程序比较简单,就是判断是否登陆成功,然后开始签到,其中判断登陆是否成功时,参考的程序中用的是访问此地址“http://tieba.baidu.com/i/i/forum?&pn=1”,检测状态值,用浏览器抓包查看是返回302自动跳转,不过就算程序里加入allow_redirects=False,返回值也是200,所以笔者改用了贴吧主页https://tieba.baidu.com/index.html,然后检测是否有关键字“爱逛的吧”
获取贴吧列表时,绝大部分程序都使用的是“http://tieba.baidu.com/f/like/mylike?&pn=”来获取贴吧列表,然后还需翻页,但笔者在测试时发现此网址并没有相应的列表,并且在网页中直接打开时有时也没有任何数据,所以在github上翻阅许多代码最后找到"http://tieba.baidu.com/mo/m?tn=bdFBW&tab=favorite"这个地址,目前不清楚每页最多能容纳多少贴吧(测试数量为120),如果出现问题可以反馈给笔者
签到时就是获取贴吧的fid值和tbs值进行post,前两个值可以在访问网页版对应贴吧获取(实际上可以是定制,这个参数不是必需的,为了减少风险,还是选择尽量正确、完整地post信息),根据返回值里面的error_code就可以获得签到情况,为了防止向已签到的贴吧post签到信息,在签到之前加了一个检验,就是访问网页版对应的贴吧,然后找到对应的关键字,这里用的是自带的正则表达式库re,如果熟悉beautifulsoup可以使用这个库来实现,并且连续访问速度不能过快,否则会返回错误代码(网页版签到会弹验证码,客户端没有验证码,暂时不知道会不会有其他问题,为了安全稳定,签到不同贴吧之间加了个随机的延迟)
模拟客户端签到时post的信息需要进行一次加密(网页版不需要),这个是直接移植的参考代码,笔者没有亲自抓包测试,所以不做讲解
上面的是带cookies的访问,其中最重要的一条就是bduss,这个是百度登陆成功时返回的cookies(同时会返回stoken、ptoken等cookies,但不是必需的),甚至仅有这一条cookies就可以登陆百度,所以在完成模拟签到之后又尝试写了用账密模拟登陆百度,因为获取bduss体验起来还是不够方便
登陆百度这段代码是卡了最长时间的,因为。。。众说纷纭,做了太多尝试
登陆时需要先访问百度首页,然后访问登陆界面,获取这两个的cookies(仅访问登陆界面也是可以的),因为正常用网页登陆时是一步一步点进去的,而不可能是直接post信息,所以在没获得前两个网页的cookies的1况下post是非法的(要获得一个cookies,好像是baiduid),然后带着cookies去访问百度的api页面获取token(没有访问前面页面的cookies获取到的是the fisrt two args should be string type:0,1!意味着缺少信息),获取之后带着账密和token令牌post就可以了(这里的headers是特殊的,参见代码,用普通的headers无法登陆),然后根据返回值error判断是否有验证码(基本都有),然后下载验证码放入一个gif文件并打开,手动输入验证码然后带着验证码标签和验证码内容再post,然后根据返回值判断情况(注意千万不要输错密码,多次错误会被锁定3小时!)如果登陆成功保存cookies即可,下次就只需带cookies登陆,并且每次登陆之后都会刷新和自动保存新cookies,目前不清楚多久会失效,需要观察
在模拟post的过程中,发现抓包得到的post信息相比参考代码多了很多,于是查找了相关资料,当时参考了“https://www.cnblogs.com/qiyeboy/p/5722424.html”的文章,写了很长一段繁琐的代码,最后发现这些参数不是必需的。。。只当是练手罢了
本文记录了开发过程中遇到的一些问题以及心得体会,代码托管在在GIT上“https://github.com/Pyrokine/tieba_autosign”,在文件夹中创建一个cookie的空文件即可(没有写相应的创建代码)
感谢以下GEEKS
https://github.com/chaonet/baidu_tieba_auto_sign
http://blog.csdn.net/programmer_sir/article/details/38961109