概述
前几个月研究了下利用账号密码模拟登录新浪微博,搞了好长时间都没有结果,最后无赖的使用cooike爬到了数据。这几天因为自己要做个东西,必须用账号密码登录,于是又研究了下,结果很快就弄出来了。想想之前搞了那么常时间都没弄出来,难道我在这几个月里编程水平提高了??? -_-||
一,工具
chrome+fiddler。
注意:
1,本来想直接使用火狐提供的httpfox,但是就在前几天火狐浏览器突然升级了,然后这个工具我就找不到了。
2,在使用fiddler的时候,若抓取不到chrome中的数据,原因很可能是你用了一些插件使fiddler抓取不到数据,需要将插件关闭。
3,现在新浪都使用的是https的连接了,所以需要在fiddler中设置抓取https。本来想用火狐的,结果前几天升级了,导致fiddler导入的证书不安全,根本访问不了新浪的网址。真是r了狗。
总之还是用chrome吧。
二,新浪认证流程
使用fiddler的一个好处就是抓取的信息很完整,至少感觉比httpfox要完整。这次使用fiddler好好的查看了下新浪认证的流程,下面总结一下。
新浪有很多个登录入口,而新浪使用了SSO(单点登录)的方法进行认证,即:在一个登录节点登录后,访问其他的网络服务时,就不需要登录了。所以如果你想要模拟登录微博,其实不用直接模拟登录weibo.com,因为weibo.com很可能还会让你输入登录的验证码什么的。特别麻烦。这里选择了另一个登录网址https://login.sina.com.cn/signup/signin.php,通过这个网址登录不用输入验证码,但是此时登录的还不是微博,在上面的那个网址认证成功后,利用得到的cookie再去weibo.com或weibo.cn认证,最后获取weibo.com或weibo.cn的cookie,之后爬取数据就可以通过cookie进行了也就是我之前写的那篇博客。
回到之前的登录流程上,先打开fiddler,再打开https://login.sina.com.cn/signup/signin.php这个网址。
然后输入用户名,密码。点击登录。在fiddler上能看到请求了很多网址。
这里比较重要的网址有这几个:
1,login.sina.com.cn/sso/prelogin.php?entry=account&callback=sinaSSOController.preloginCallBack&su=MTU4NTAzMTg0MDc%3D&rsakt=mod&client=ssologin.js(v1.4.15)&_=1512008557384
2,login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1512008557445
3,passport.weibo.com/wbsso/login?ticket=ST-NjM3MjA0MTM1NA%3D%3D-1512008674-gz-AD5F649D2BAA76814D96D3CB494D033B-1&ssosavestate=1543544674&callback=sinaSSOController.doCrossDomainCallBack&scriptId=ssoscript0&client=ssologin.js(v1.4.19)&_=1512008557867
4,passport.weibo.cn/sso/crossdomain?action=login&savestate=1&callback=sinaSSOController.doCrossDomainCallBack&scriptId=ssoscript3&client=ssologin.js(v1.4.19)&_=1512008557868
如图所示:
其中,1对应了新浪的预登录,2表示新浪的正式登录,3,表示获取weibo.com的跨域认证。4表示到weibo.cn的跨域认证。而我们所需要的就是3,4返回的cookie。
2.1 预登录
在fiddler中点击带1 中prelogin的url时,可以看到请求时的参数和请求返回的参数,请求的参数如下:
根据其他博主的探索可以知道,su表示的加密后的用户名,加密算法为base64。_为时间戳,其他的值是固定的。
返回的结果如下:
其中比较重要的是nonce,pubkey,rsakv,以及servertime参数。在下一步的加密密码时需要用到。
2.2 登录
在1 中预登录完成后,会继续请求2 的url。在请求2 中的url时,是post,post的数据如下:
可以看到在预登录中返回的nonce,pubkey,rsakv,以及servertime参数都加入到了该post的data中,其中的sp表示的是加密后的密码,用到的是ras加密,根据其他博主的探究得知加密的公钥是上一步中的pubkey+js文件中指定的“10001”模块。然后再加上上步得到的servertime以及nonce参数。对于加密这一块并不是很懂,所以在程序中只是调用ssologin.js文件中加密部分对密码进行加密。post的其他参数目前固定,所以直接填入即可。
当用户密码正确时,返回值如下:
可以看到返回的crossDomainUrlList中包含的就是向weibo.com,97973,以及weibo.cn等新浪服务跨域访问的凭证了。
2.3 获取cookie
在上一步中返回了weibo.com,weibo.cn的登录地址,现在所做的就是访问这几个url,带上第二部中得到的cookie就可以成功的获取到weibo.com,或weibo.cn的cookie。最后带上获取的cookie就可以爬取页面数据了。
悲伤的消息:博主今天用程序模拟登录时发现不能登录到weibo.cn,可以登录到weibo.com。每次登录weibo.cn的时候都是重定向到登录界面,但是程序显示的结果确实是获取到了weibo.cn的cookie。好伤心。请问有人研究过登录weibo.cn的小伙伴能跟我交流一下QAQ 2017-12-05
个人推荐爬去weibo.cn的数据,因为在weibo.com中涉及到页面的分步加载,以及页面返回的是unicode等问题,操作繁琐。所以爬去weibo.cn的数据要简单。
三,代码实现
微博登录的流程大致是这样,但是新浪会时不时改动登录的逻辑,但是改动应该不会很大,所以使用时,请务必按照以上步骤自己试验一遍看看是否有参数发生了变化。代码已上传:http://download.csdn.net/download/tyoukai_/10139542
参考:
http://www.csuldw.com/2016/11/10/2016-11-10-simulate-sina-login/?utm_source=tuicool&utm_medium=referral
http://blog.csdn.net/fly_leopard/article/details/51082531
最后
以上就是鳗鱼火为你收集整理的利用账号密码模拟登录新浪微博的全部内容,希望文章能够帮你解决利用账号密码模拟登录新浪微博所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复