网站调用新浪微博内容(探索的过程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是加密后的密码,可以参考上面的加密方法得到。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线