网站调用新浪微博内容(探索的过程1.了解大致过程登陆微博,文章可能不再适用)
优采云 发布时间: 2022-03-26 14:06网站调用新浪微博内容(探索的过程1.了解大致过程登陆微博,文章可能不再适用)
概述:
由于业务需要,需要编写爬虫代码来爬取新浪微博用户的信息。
虽然网上可以查到很多资料,但由于新浪微博的改版,其登录机制被修改了,所以很多老的文章都不适合用了。
经过一番摸索,成功模拟了新浪微博的登录操作。该项目使用 Javascript 语言并在 ChromeExtension 中运行。我想和大家分享这个过程和经验。
请注意,这篇文章是在 2013.08.16 上写的。由于微博业务变化频繁,文章可能随着年龄的增长不再适用。
文本:探索的过程
1. 了解大致流程
登录微博,使用fiddler工具*敏*感*词*HTTP请求,拦截如下操作:
可以看出,在整个微博登录过程中,有四个重要的HTTP请求,分别是:
(1) GET /sso/prelogin.php
(2) POST /sso/login.php
(3) GET /ajaxlogin.php
(4) 获取 /u/2813262187
其中,sso为单点登录
(1)是登录前的预处理,名字也很明显--pre,这一步主要是获取几个重要的参数,作为下一个POST表单的参数。
您可以在浏览器中访问该请求的地址,查看返回结果:
(v1.4.11)
结果如下:
1sinaSSOController.preloginCallBack({"retcode":0,
2“服务器时间”:1376533839,
3"pcid":"gz-7bdd82b8980057a8bbc1f86b21d5a86184dd",
4"nonce":"R1KGHZ",
5 “PUBKEY”: “EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC2533E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443”
6"rsakv":"1330428213",
7“执行时间”:2})
返回的数据包括 servertime:服务时间戳,nonce:6 位随机码,pubkey:用于 rsa2 密码加密的公钥,rsakv:显然也用于加密。
下一步需要这四个值。
长期版的新浪微博登录机制,采用sha的加密方式,没有pubkey和rsakv参数。
所以网上看到的2012爬虫模拟登录代码的爬虫代码已经不适合使用了,但是整体逻辑没有太大变化,稍微修改一下还是可以使用的。=.=
给出两个参考文章:
对于 Python
对于 PHP
(2)提交表单的操作,我们还是看HTTP请求,看表单内容
请参阅 servertime、nonce、rsakv 和 su:加密的用户名,sp:加密的密码。现在的问题是如何加密用户名和密码。我们很容易将注意力集中在 js 代码上。
请求新浪登录页面:,其中收录密码加密的js代码,
里面的代码是加密的,找个工具来解密(),你几乎看不到里面的逻辑。
(3)分析 sslogin.js
既然知道了servertime和nonce是用来加密的,那我们不妨在文件中搜索一下这两个关键字,找到好东西:
回到上面看到,表格中有su和sp,两者都在这里,可以看到su使用的是base64加密方式;而 su 稍微复杂一点,
if是当前版本新浪密码加密方式rsa2的代码,else是版本sha加密的代码,我们只需要关心if里面的内容,
加密过程很简单,首先生成一个RSAKey对象,设置PublicKey,然后加密。
一个个往回推,可以知道最后一步加密的最后一个参数ag就是原来的密码值,不会看的眼花缭乱~
综上所述,调用 setPublic() 时以一长串 pubkey 和 10001 作为参数,注意都是十六进制数;然后使用 (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:'微博',
5个网关:1个,
6来自:'',
7保存状态:7,
8使用票:1,
9pagerefer:'#39;,
10vsnf:1,
11 苏:'MTgxMDU0MjMzNyU0MHFxLmNvbQ==',
12service:'迷你博客',
13 服务器时间:服务器时间,
14 随机数:随机数,
15pwencode:'rsa2',
16 rsakv:rsakv,
17 sp:sp,
18编码:'UTF-8',
19prelt:505,
20url:'ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
21 返回类型:“元”
二十二}
23},函数(错误,数据){...});
agent是发送请求事务的封装模块,重点关注里面的数据对象,其中su是base64加密的用户名,每次调用都是固定的,所以这里写死;
servertime、nonce、rsakv都是上一步截取的;
sp是加密后的密码,可以参考上面的加密方法得到。