博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解析新浪微博的登录过程
阅读量:4625 次
发布时间:2019-06-09

本文共 3235 字,大约阅读时间需要 10 分钟。

如果要想获取微博中的数据,最重要的第一步就是模拟登录了,如果登录都不行,后续的都是扯淡。这里主要分析微博的登陆过程,新浪微博的认证流程:

1、这里在火狐下使用HttpFox工具抓取登陆的数据交互,打开HttpFox,用户进入weibo.com/login.php登陆页面,抓取得到数据如下:

image

我们用浏览器登陆weibo.com/login.php网页时,服务器在不断地跳转,从不同的位置给客户端返回所需的资源及稍后登陆所需的数据。我们需要找到对我们登陆所需要的信息,重要的交互记录如下:

image

选中的部分,从http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.11)&_=1387782049912站点位置GET得到的内容会在Content窗口显示,格式为Text/html,即:

sinaSSOController.preloginCallBack({"retcode":0,"servertime":1387782050,"pcid":"xd-62049b61eeb94c62c92e4c4d10db7dcb4c7d","nonce":"DF8VR6","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","exectime":0})

servertime、nonce 都是登录时候需要使用的,用于POST信息的加密。

2、输入用户名后,当用户名输入框焦点失去的时候,页面将再次访问http://login.sina.com.cn/sso/prelogin.php,得到上步中类似的消息:

image

这样便得到了新的servertime、nonce 等值,稍后用户登录时使用的是这些数的最新值。

3、输入密码,点击登陆,页面POST请求如下:

image

分析向http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.11)提交的参数POST Data:

entry    weibogateway    1from    savestate    7useticket    1pagerefer    vsnf    1su    aG91YW5kbGlob21lJTQwZ21haWwuY29tservice    miniblogservertime    1387784432nonce    PH653Npwencode    rsa2rsakv    1330428213sp    04b4568a21646afc2418e86c99958ec09d3cf45c624404a96dd63a4f13a09384148af1b727d046ff17727f307460ff0b90db2a4d6c9d3ad1e1809b4756a002cf93129dcb0480b349dba2439db7874d0f32a7c0770d0f80360f6fa139d4e3f09bb2b50099b329cb2de5d59fdafc199dc7b3b2d731b43c5dd0948149fc6df4d624encoding    UTF-8prelt    101url    http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBackreturntype    META

su表示POST的账号,username经过了BASE64加密;password 经过了三次SHA1 加密, 且其中加入了 servertime 和 nonce 的值来干扰(两次SHA1加密后, 将结果加上 servertime 和 nonce 的值, 再SHA1算一次),sp为加密后的密码。

再看服务器的返回值,Type=text/html (NS_BINDING_ABORTED)而Result=(Aborted),Content窗口为:Error loading content (NS_ERROR_DOCUMENT_NOT_CACHED),因为网页发生了重定向跳转,原网页中止,HttpFox没有捕获到返回值。通过Python程序可以得到返回值,如下:

新浪通行证

我们关心的返回结果是script部分:

location.replace(http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&ssosavestate=1390380654&ticket=ST-MzQ4NzQ5NTYyMA==-1387788654-xd-FED0CAF6BC574B4DE353DF875F9DB6AF&retcode=0);      

因为,HttpFox检测到随后两步的跳转网址为:

image

蓝色:http://weibo.com/sso/login.php?ssosavestate=1390381500&url=http%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack%2

6sudaref%3Dweibo.com&ticket=ST-MzQ4NzQ5NTYyMA==-1387789500-xd-710FAD84CC8AF2EE75FE5D197CD76234&retcode=0
这一步上传url的值即为script部分(这里由于不是同一次登录,值不同但结构相同),retcode=0表示登陆成功,然后打开url跳转到下一步。

第二步:http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&sudaref=weibo.com

用户登陆成功,返回weibo.com的信息到客户端cookie中,记录了用户登陆信息。

4、接下来就是新浪的SSO(Single Sign-on)登陆了,就是在同一个顶级域名下,通过载入顶级域名的Cookie,来实现统一登陆。服务器会自动再次访问weibo.com(上图第四行),因为cookie已经写入,登陆成功服务器返回302,重定向到用户主页面。此后再访问微博中其他人的主页或使用微博的其他应用,服务器便可以通过cookie来检测用户的状态了。

当然,新浪的登陆方式未来可能发生改动,目前(2013-12-23)大致就是这个过程。

使用Python实现微博的模拟登陆。

转载于:https://www.cnblogs.com/houkai/p/3487816.html

你可能感兴趣的文章
nrf51 SDK自带例程的解读
查看>>
SESSION技术
查看>>
数据结构(五)之直接插入排序
查看>>
SQL函数——LENGTH()和LENGTHB()
查看>>
vim - manual -个人笔记
查看>>
详解Javascript中prototype属性(推荐)
查看>>
angularjs实现首页轮播图
查看>>
Git 对象 和checkout 和stash的笔记
查看>>
团队项目总结2-服务器通信模型和顺序图
查看>>
hdu 1085 Holding Bin-Laden Captive!
查看>>
[周记]8.7~8.16
查看>>
递归定义
查看>>
kindeditor 代码高亮设置
查看>>
图的邻接表存储
查看>>
2018 leetcode
查看>>
PHP中获取当前页面的完整URL
查看>>
Chapter 4 Syntax Analysis
查看>>
vi/vim使用
查看>>
讨论Spring整合Mybatis时一级缓存失效得问题
查看>>
Maven私服配置Setting和Pom文件
查看>>