代码去爬去新浪微博的登陆操作心得(二)
优采云 发布时间: 2021-07-15 23:49代码去爬去新浪微博的登陆操作心得(二)
概述:
由于业务需要,需要编写爬虫代码来爬取新浪微博用户的信息。
虽然网上可以查到很多资料,但由于新浪微博的改版和登录机制的修改,很多老的文章不适合使用。
经过一番摸索,成功模拟了新浪微博的登录操作。该项目使用 Javascript 语言并在 Chrome 扩展程序中运行。和大家分享一下过程和经验。
请注意,这篇文章是在 2013.08.16 写的。由于微博业务变化频繁,随着时间的推移,文章可能不再适用。
正文:探索的过程
1.了解大致流程
登录微博,使用fiddler工具*敏*感*词*http请求,拦截如下操作:
可以看到,在整个微博登录过程中,有四个重要的HTTP请求,分别是:
(1) GET /sso/prelogin.php
(2) POST /sso/login.php
(3) GET /ajaxlogin.php
(4) GET /u/2813262187
其中,sso是单点登录
(1)是登录前的预处理,名字很明显--pre。这一步主要是获取几个重要的参数,作为下一个POST表单的参数。
可以在浏览器中访问请求地址查看返回结果:
(v1.4.11)
结果如下:
1sinaSSOController.preloginCallBack({"retcode":0,
2"servertime":1376533839,
3"pcid":"gz-7bdd82b8980057a8bbc1f86b21d5a86184dd",
4"nonce":"R1KGHZ",
5 “PUBKEY”: “EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC2533E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443”,
6"rsakv":"1330428213",
7"exectime":2})
返回的数据包括servertime:服务时间戳,nonce:6位随机码,pubkey:用于rsa2密码加密的公钥,rsakv:显然也用于加密。
这四个值都是下一步需要用到的。
在长版的新浪微博登录机制中,使用的是sha加密方式,没有pubkey和rsakv参数,
所以网上看到的2012年爬虫代码模拟登录的代码已经不适合使用了,但是整体逻辑变化不大。只需稍加修改即可使用。我就是这样来到这里的。 , 撞墙无数=.=
给两个参考文章:
对于 Python
对于 PHP
(2)提交表单的操作,我们还是检查HTTP请求和表单内容
我看到了,servertime、nonce、rsakv 和 su:加密的用户名,sp:加密的密码。现在的问题是用户名和密码是如何加密的,这样我们就可以轻松关注js代码了
请求新浪登录页面:有密码加密的js代码,
里面的代码是加密的。找个工具解密(),基本看不到里面的逻辑。
(3)解析ssologin.js
既然知道servertime和nonce是用来加密的,那我们不妨在文件中搜索这两个关键字,一搜发现好东西:
回到上面看看,form里面有su和sp,都在这里,可以看到su使用了base64加密;而 su 有点复杂,
if中的代码是新浪当前版本的密码加密方式rsa2的代码,else中的代码是版本sha加密的代码,我们只需要关心if中的内容,
加密过程很简单,先生成一个RSAKey对象,设置PublicKey,然后加密。
一一推回去,就可以知道最后一步加密的最后一个参数ag就是原来的密码值了,就不会眼花缭乱了~
总而言之,以pubkey和10001的长字符串为参数调用setPublic()。注意它们都是十六进制数;然后使用 (servertime + nonce + pwd) 作为参数调用 Encrypt()。 .
我们来看看sinaSSOEncoder是什么。它的定义在解密代码的第 1118 行。从这里开始,我们将截取到文件的末尾,我们自己使用。
1}).call(sinaSSOEncoder);
2//sinaSSOController=newSSOController();
3//sinaSSOController.init();
这样就解决了密码加密的问题。
2. 模拟请求过程
既然知道了大体原理,就可以开始模拟整个登录过程了,
(1) GET 请求(v1.4.11)
在返回的数据中,servertime、nonce和rsakv是有规律匹配的。请注意,请求时也必须将时间戳发送到服务器。我们来看看fiddler*敏*感*词*的QueryString:
前五个参数都是在URL中显示和声明的,最后一个_是在发送请求的时候加上并传递过来的。
我正在使用Javascript,使用Jquery,只需将其添加到$.ajax 中的数据属性即可。
(2)POST 请求(v1.4.11)提交登录表单
1 个代理('(v1.4.11)',
2{type:'POST',headers:{Referer:'#39;},
3 数据:{
4entry:'微博',
5gateway:1,
6from:'',
7savestate:7,
8useticket:1,
9pagerefer:'#39;,
10vsnf:1,
11 su:'MTgxMDU0MjMzNyU0MHFxLmNvbQ==',
12service:'miniblog',
13 服务器时间:服务器时间,
14 nonce:nonce,
15pwencode:'rsa2',
16 rsakv:rsakv,
17 sp:sp,
18encoding:'UTF-8',
19prelt:505,
20url:'#39;,
21returntype:'META'
22}
23}, function(err,data){ ...});
Agent 是一个封装模块,用于发送请求事务。重点看里面的数据对象,其中su是base64加密的用户名,每次调用都是固定的,所以这里不好写;
servertime、nonce、rsakv都是上一步截取的;
sp是加密后的密码,可以参考上面的加密方法获得。