网站调用新浪微博内容(探索的过程1.了解大致过程登陆微博,文章可能不再适用)
优采云 发布时间: 2021-09-19 12:06网站调用新浪微博内容(探索的过程1.了解大致过程登陆微博,文章可能不再适用)
概述:
由于业务需要,我们需要编写爬虫代码来抓取新浪微博用户的信息
虽然在互联网上可以找到很多信息,但由于新浪微博的修订和登录机制的修改,很多旧的文章不适合使用
经过一番探索,我们成功模拟了新浪微博的登录操作。该项目使用JavaScript语言并在Chrome扩展中运行。让我们与您分享这个过程和经验
请注意,本文是用2013. 08.16. 由于微博业务的频繁变化,it文章可能随着年龄的增长不再适用
文本:探索的过程
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)
结果如下:
1sinasocontroller.preloginCallBack({“retcode”:0
2“服务器时间”:1376533839
3“pcid”:“gz-7bdd82b8980057a8bbc1f86b21d5a86184dd”
4“暂时”:“R1KGHZ”
5“公开密钥”:“EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC2533E5063508E7F9A3BB77F4333490F915F6D63C55FE2F08A49B353F44AD3993CACC02DB784ABB8E42A9B1BBFFFB388E87A0E41B9B8F73A928EE0CEE1F6739884B97E9E88A1BB4927AC4A7981D644443”
6“rsakv”:“1330428213”
7“执行时间”:2})
返回的数据包括servertime:Service timestamp、nonce:6位随机码、pubkey:RSA 2密码加密使用的公钥和RSA kV:显然也用于加密
这四个值需要在下一步中使用
在新浪微博登录机制的长期版本中,使用了Sha加密,没有pubkey和rsakv参数
因此,在互联网上看到的2012年爬虫代码和模拟着陆代码不再适合使用,但总体逻辑没有太大变化。只需稍加修改,它仍然可以使用。这就是我为什么来到这里并撞上无数墙的原因=
给出两个参考文章:
对于Python
对于PHP
(2)提交表单时,我们仍会查看HTTP请求和表单内容
是的,servertime,nonce,rsakv,Su:加密用户名,SP:加密密码。现在的问题是如何加密用户名和密码。很容易关注JS代码
请求新浪登录页:,其中收录用于密码加密的JS代码
里面的代码是加密的,找一个解密工具(),你几乎看不到逻辑
(3)analysis ssologin.JS)
既然我们知道servertime和nonce用于加密,我们不妨在文件中搜索这两个关键字并找到一些好的内容:
回到上面,您可以看到表单中有Su和SP。您可以看到Su使用base64加密,而Su稍微复杂一些
If是新浪当前版本的密码加密RSA 2的代码,else是Sha加密版本的代码,我们只需要关心If中的内容
加密过程非常简单。首先,生成一个rsakey对象,设置publickey,然后对其进行加密
通过一个接一个地向后推,您可以知道最后一个加密步骤中的最后一个参数Ag是原创密码值,不会让人眼花缭乱~
总之,使用pubkey和10001的长字符串作为参数来调用setpublic()。注意它们是十六进制数;然后使用(servertime+nonce+PWD)作为参数来调用encrypt()
让我们看看sinassoencoder是什么。它的定义是在1118行解密代码中。从这里,截取它到文件的末尾,并将其移出以供我们自己使用
1} )。呼叫(sinaSSOEncoder)
2//sinaSSOController=newSSOController()
3//sinaSSOController.init()
这就解决了密码加密的问题
2.模拟请求过程
既然您了解了一般原理,就可以开始模拟整个登录过程了
(1)get请求)(v1.4.11)
返回的数据定期与服务器时间、NANCE和RSAKV相匹配。请注意,当请求时,时间戳也应该发送到服务器。让我们看看Fiddler监视的QueRISH字符串:
前五个参数在URL中显示和声明。最后一个参数在发送请求时添加。传递它
我使用JavaScript,只需将它添加到jQuery和$.Ajax中的data属性中
(2)post请求)(v1.4.11)提交登录表单
1名代理人(v1.4.11)",
2{type:'POST',headers:{Referer:'39;}
3数据:{
4条目:'微博'
5公路:1
6从:“”
7保存状态:7
8使用票:1
9页参考:'#39
10vsnf:1
11 su:'MTgxMDU0MjMzNyU0MHFxLmNvbQ=='
12服务:'迷你博客'
13服务器时间:服务器时间
14 nonce:nonce
15pwencode:'rsa2'
16千伏:千伏
17 sp:sp
18编码:'UTF-8'
19预备课程:505
20url:'#39
21返回类型:'META'
22}
23},函数(err,data){…}
代理是用于发送请求事务的封装模块。关注其中的数据对象。Su是base64加密的用户名。每个调用都是固定的,所以它写在这里
Servertime、nonce和rsakv在上一步中被截获
SP为加密密码,可参照上述加密方法获取