PC登录新浪微博模拟登录(人人网)(组图)
优采云 发布时间: 2021-06-11 06:22PC登录新浪微博模拟登录(人人网)(组图)
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。