使用libcurl登陆百度贴吧并发贴

模拟登陆最头痛的就是那烦人的验证方式了,想要模拟浏览器登陆百度一来需要注意保存与发送cookie,二来就是验证码的问题了,通过抓包分析,登陆百度的过程一般分为下面几个步骤

1、访问http://www.baidu.com/并保存cookie
2、使用上面保存的cookie访问https://passport.baidu.com/v2/api/?getapi&tpl=mn&apiver=v3&tt=1395058791532&class=login&logintype=dialogLogin&callback=bd__cbs__w6qu6获取token
3、使用token及上面的cookie包括用户码与密码等向https://passport.baidu.com/v2/api/?login发送POST请求进行登陆
4、如果你RP比较好或者运气比较好的话上面三步便已成功登陆了,但我却并没有那么好运,所以如果返回了错误257的话需要匹配出codestring
5、使用匹配出的codestring做参数访问https://passport.baidu.com/cgi-bin/genimage取得并保存验证码图片
6、使用验证码重新构造POST请求数据(以上一系列操作均需要发送保存的cookie)返回步骤3

此时不出意外便应该成功登陆了,成功登陆后我们保存返回的cookie,利用这个cookie就可以做任何登陆用户可以做的事了,比如说发贴,发贴的过程就比较简单了,大概分为以下几步

1、访问要发贴的贴吧保存cookie并匹配出fid与tbs(至于fid与tbs具体应该是以何种方式得到的表示我不清楚= =,反正我这样匹配出来的fid与tbs发贴是成功的= =)
2、构造POST数据向http://tieba.baidu.com/f/commit/thread/add发送POST请求进行发贴
3、如果你运气真的很不好,或者你没有关注那个贴吧亦或者你在那个吧被封掉了等一些需要验证码的请求你需要匹配出codestring,然后得到验证码(因为我没有以上情况,所以发贴不需要验证码,所以后面如何获取验证码就不说了)

看起来好像很简单的样子,是的,但是要注意的一点是在登陆时获取token时需要进行两次访问,第一次访问会得到这样的数据
the fisrt two args should be string type:0,1!,再访问一次但可正确得到token了

bd__cbs__w6qu6({“errInfo”:{ “no”: “0” }, “data”: { “rememberedUserName” : “”, “codeString” : “”, “token” : “0141c6729cca1c668bbb21500523ffc0”, “cookie” : “1”, “usernametype”:””, “spLogin” : “rate”, “disable”:””, “loginrecord”:{ ’email’:[ ], ‘phone’:[ ] } }})

构造登陆的POST数据是这样的

staticpage=http%3A%2F%2Ftieba.baidu.com%2Ftb%2Fstatic-common%2Fhtml%2Fpass%2Fv3Jump.html&charset=UTF-8&token=设置为你得到的token&tpl=tb&apiver=v3&tt=1395059441161&codestring=&safeflg=0&u=http%3A%2F%2Ftieba.baidu.com%2F&isPhone=&quick_user=0&logintype=dialogLogin&logLoginType=pc_loginDialog&loginmerge=true&splogin=rate&username=你的用户名url转码&password=你的密码&verifycode=&mem_pass=on&ppui_logintime=106651&callback=parent.bd__pcbs__nzds6p

如果需要验证码时返回有这第一段,我们取出codeString=至&之间的数据
href += “err_no=257&callback=parent.bd__pcbs__nzds6p&codeString=captchaservice623932364c41485a4d4b7756356b746f70794
75a4d4c4a74436e746d5645347367386939526358466553773162576431
6b66347650787562444277664f74795577696e572b74752f58487267366
26a50372b523464542b453270694b775966636b32734c69545031357865
59457a5665694333734d754d4b71593159556d52355445535252502b553
74870704a30577132392f6f413642494c597a44546d6d73764c734b43797
44a72767042797574773264634e5249554b5943445736784b6c33346e4f
6431664573473055456f754c533966324f6d4d36395278484b6c3576594b
723358485673582f4b64653441395649515a742f744e59684b704d37746a
4767353661566442316b7a6d7a574b425461557a3475534e596a484f456d
586b7a32642f4e3970323032617948612f542f62646b636b794b753235415
351&userName=

然后访问
https://passport.baidu.com/cgi-bin/genimage?匹配出来的字符串
便可以得到验证码图片

然后再次构造POST数据和上面的样,只不过要设置codestring以及verifycode为相应的参数,前者是我们匹配出来的字符串,后者则是验证码了

发贴的POST数据大概是这样的
kw=贴吧名称&fid=匹配出来的fid&content=贴子的内容&title=帖子的标题&__type__=thread&tbs=匹配出来的tbs&ie=utf-8&vcode_md5=0&floor_num=0&rich_text=1&tid=0

其中tbs与fid是如何获得的我表示并没有深究,因为我通过对相应贴吧进行简单匹配后发现发贴成功,所以没有深究。 。 。

下面就放上使用c语言写的一个登陆与发贴的简单程序(有登陆验证码)

因为使用pcre做字符匹配,使用GTK做图片显示,所以编译时需要加上-lcurl -lpcre pkg-config --cflags --libs gtk+-3.0参数

–阅读次数(132)

发表评论

电子邮件地址不会被公开。

*