PC登录新浪微博模拟登录(人人网)(组图)

优采云 发布时间: 2021-06-11 06:22

  PC登录新浪微博模拟登录(人人网)(组图)

  PC登录新浪微博时,用户名和密码在客户端用js进行了预加密,POST前会先GET一组参数,也会是POST_DATA的一部分。这样就不能用通常的简单方法来模拟POST登录(如人人网)。

  通过爬虫获取新浪微博数据,模拟登录必不可少。

  1、 在提交 POST 请求之前,需要通过 GET 获取四个参数(servertime、nonce、pubkey 和 rsakv)。这不仅仅是之前提到的简单的服务器时间和随机数。这主要是因为js有了用户名,密码加密方式发生了变化。

  1.1 由于加密方式的变化,这里我们将使用RSA模块。 RSA公钥加密算法的介绍请参考网络中的相关内容。下载并安装 rsa 模块:

  下载:

  rsa 模块文档地址:

  根据你的Python版本选择适合你的rsa安装包(.egg)。 win下安装需要通过命令行使用easy_install.exe(win下安装setuptool,从这里下载:setuptools-0.6c11.win32-py2.6.exe安装文件)安装,例如:easy_install rsa-3.1.1-py2.6.egg,在最后的命令行下测试import rsa,如果没有报错则安装成功。

  1.2 获取并查看新浪微博登录js文件

  查看新浪通url()的源码,在那里可以找到js地址,但是里面的内容打开后是加密的,可以在网上找一个在线解密站点解密,查看最终用户名和密码加密方式。

  1.3 登录

  第一步登录,添加自己的用户名(username),并请求prelogin_url链接地址:

  prelogin_url =';callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&client=ssologin.js(v1.4.4)'% username

  使用get方法获取如下类似内容:

  sinaSSOController.preloginCallBack({ “RETCODE”:0 “servertime”:1362041092, “PCID”: “GZ-6664c3dea2bfdaa3c94e8734c9ec2c9e6a1f”, “随机数”: “IRYP4N”, “PUBKEY”: “EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC2533E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443”, “rsakv”: "1330428213","exectime":1})

  然后从中提取我们想要的servertime、nonce、pubkey和rsakv。当然,pubkey和rsakv的值可以写在代码里,都是固定值。

  2、在用户名由BASE64计算之前:

  复制代码代码如下:

  用户名_ = urllib.quote(用户名)

  username = base64.encodestring(username)[:-1]

  密码是SHA1加密3次,加上servertime和nonce值来干扰。即:经过两次SHA1加密,结果加上servertime和nonce的值,然后SHA1算一次。

  在最新的rsa加密方式中,username还是像以前一样处理;

  密码加密方式与原来不同:

  2.1 首先创建一个rsa公钥。公钥的两个参数在新浪微博上都是固定值,但都是16进制字符串。第一个是第一步登录的公钥,第二个是js加密文件中的'10001'。

  这两个值需要从十六进制转换为十进制,但也可以写在代码中。这里10001直接写成65537,代码如下:

  复制代码代码如下:

  rsaPublickey = int(pubkey, 16)

  key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥

  message = str(servertime) +'\t' + str(nonce) +'\n' + str(password) #从拼接明文js加密文件中获取

  passwd = rsa.encrypt(message, key) #encryption

  passwd = binascii.b2a_hex(passwd) #将加密后的信息转换为十六进制。

  2.2 请求pass url: login_url =‘(v1.4.4)'

  要发送的头信息

  复制代码代码如下:

  postPara = {

  'entry':'微博',

  '网关': '1',

  '来自':'',

  'savestate': '7',

  '用户票':'1',

  'ssosimplelogin': '1',

  'vsnf': '1',

  'vsnval':'',

  'su': 编码用户名,

  'service':'miniblog',

  'servertime': serverTime,

  'nonce':随机数,

  'pwencode':'rsa2',

  'sp': 编码密码,

  'encoding':'UTF-8',

  'prelt': '115',

  'rsakv': rsakv,

  'url':';callback=parent.sinaSSOController.feedBackUrlCallBack',

  'returntype':'META'

  }

  在请求的内容中加入RSakv,pwencode的值改为rsa2,其他和之前一样。

  整理参数,POST请求。检查是否登录成功,可以参考一句location.replace(";callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=101&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3% in POST DC%C2%EB%B4%ED%CE%F3后得到的内容");

  如果retcode=101,表示登录失败。登录成功后的结果类似,只是retcode的值为0。

  3、登录成功后,body中替换信息中的url就是我们下一步要使用的url。然后对上面的URL使用GET方法向服务器发送一个请求,并保存这个请求的cookie信息,也就是我们需要的登录cookie。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线