代码去爬去新浪微博的登陆操作心得(二)

优采云 发布时间: 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是加密后的密码,可以参考上面的加密方法获得。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线