如何通过VB6.0编程的方式获取百度贴吧帐号的BDUSS

阅读本教程之前请确保您有vb6.0基础以及xmlhttp或者winhttp等控件的基础知识,没vb6.0基础也可以先看代码解释,然后按照思路移植到你熟知的编程语言上。

如图排布好各个控件如图排布好各个控件.png

简答的来说一下百度贴吧登录的流程,首先访问百度任意一个可以获取BAIDUID的页面(BAIDUID这个数据在cookie里面,可以用浏览器f12看到),比如说百度首页等等,不过我这里选择的是访问http://tieba.baidu.com/dc/common/tbs 因为这个页面返回的数据量小,所以方便调试。

第二步,此时用winhttp发包就会携带上第一次访问时获取的BAIDUID,然后访问https://passport.baidu.com/v2/api/?getapi&tpl=mn 这个页面会得到一个apitoken

第三步,向https://passport.baidu.com/v2/api/?login 这个url上POST你的百度贴吧帐号,密码,还有第二步得到的apitoken,然后响应报文的头部里面有N多的set-cookie,找到BDUSS对应的setcookie那一行然后分割字符串即可。

接着说如何编程实现,这里很多人喜欢用xmlhttp,我强烈不推荐用他,因为xmlhttp用的是IE的内核,如果你的IE浏览器已经登录了百度帐号,那么里面的持久cookie和其他的本地存储会影响我们的编程。所以我选择winhttp,这是一个类似于xmlhttp的activex类,但是它却又是完全和IE隔离的(类似于你chrome打开一个隐身模式窗口一样)这样纯净的环境不会对我们编程造成影响。

创建winhttp.png

双击command1控件,自动生成click事件的代码块,在里面输入
Set request = CreateObject("WinHttp.WinHttpRequest.5.1") 表示创建一个winhttp对象QQ截图20150424213620.png

接着输入通过get方式请求http://tieba.baidu.com/dc/common/tbs 得到BAIDUID的代码
按f5调试,如果text3里面的头部有Setcookie:BAIDUID=xxxxxxxxxxxxxx就表示成功了。QQ截图20150424213712.png

request.open "GET", "http://tieba.baidu.com/dc/common/tbs", False 'POST 或 GET 方式打开对象
request.send '发送数据
Text3 = request.getAllResponseHeaders + vbCrLf + request.responseText + vbCrLf + vbCrLf '返回数据
Request.abort

第二步通过get方式访问https://passport.baidu.com/v2/api/?getapi&tpl=mn 得到apitoken
如图表示成功QQ截图20150424214024.png

request.open "GET", "https://passport.baidu.com/v2/api/?getapi&tpl=mn", False 'POST 或 GET 方式打开对象
request.send '发送数据
Text3 = Text3 + request.getAllResponseHeaders + vbCrLf + request.responseText + vbCrLf + vbCrLf '返回数据
Request.abort

然后问题来了,怎么从响应实体里面分离出apitoken呢?vb没正则表达式,所以只能最原始的mid和instr分离咯!直接上代码。

apitoken = Mid(Text3, InStr(Text3 "bdPass.api.params._token='") + Len("bdPass.api.params._token='"), Len("0873d30060de6a13bda2e49ec9214d0f"))

说老实话,可能是我用习惯了vb的缘故,上面这行代码一气呵成,其实也不复杂,只要你小学数数能力还不错的话,仔细看还是没错的,调试程序的时候的时候msgbox apitoken看一下是否分离正确了即可。首先instr定位出"bdPass.api.params._token='"的位置,然后加号加上Len("bdPass.api.params._token='") 也就是他的长度,这样就可以定位到真正的apitoken的第一个字符所在的位置,然后Len("0873d30060de6a13bda2e49ec9214d0f"))就是计算我之前获取到的一个apitoken的长度,因为我们只要截取那么长即可,所以就这样写就可以(我是懒得一个一个数总共多少字,直接len得到就好,方便麻)QQ截图20150424214644.png
直接贴出调试结果,看来msgbox里面的数据还是对的上的,分离字符串语句没错。

接着第四步最关键的地方就是向https://passport.baidu.com/v2/api/?login 提交用户名密码了,这里用POST方式提交,和前面的有所不同,要设置一下头部,用winhttp对象的setRequestHeader方法来设置
直接给代码,看看就好。

request.open "POST", "https://passport.baidu.com/v2/api/?login", False 'POST 或 GET 方式打开对象
request.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
request.setRequestHeader "Accept", "*/*"
request.setRequestHeader "Referer", "http://www.baidu.com" '提交来路
request.setRequestHeader "Accept-Language", "zh-cn"
request.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2;)"
request.setRequestHeader "Connection", "Keep-Alive"
datastr = "charset=utf-8&mem_pass=on&token=" + apitoken + "&tpl=mn&username=" + Text1 + "&password=" + Text2
MsgBox datastr
request.send datastr '发送数据
Text3 = Text3 + request.getAllResponseHeaders + vbCrLf + request.responseText + vbCrLf + vbCrLf '返回数据

最关键的datastr这是需要post的数据,charse表示字符集,我用的是utf-8,默认不改,mem_pass=on表示是否设为内存cookie,这个学过web前端的你们懂得,我们这里on还是off无影响,token参数就是前面的apitoken,直接拼接进去即可,后面tpl=mn不管他,username和password就是用户名密码,照例拼接进去即可。

我上我的调试结果,里面有BDUSS表示成功了,如果没有的话有3个原因,你的用户名或者密码错误,或者开启了登录保护,或者需要验证码登录,验证码处理问题我以后再说,你们可以在本地电脑上用浏览器登录一遍然后再用这个程序登录理论上就不需要验证码了(除非你的账号多次异地登录等等原因)
QQ截图20150424215509.png

其中我们只关心BDUSS就好,其他神马PTOKEN之类貌似是单点登录用到的,这里无视他们。

OK ,到此为止我们已经已经成功获取到了BDUSS,只要再把字符串分割出来就可以了。
QQ截图20150424220112.png

原帖在黑客组吧首发http://tieba.baidu.com/p/3721757672 转载请注明出处以及作者@昌维001 谢谢!~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值