python模拟登录新浪微博

之前接触爬虫的时候,常常会看到模拟登陆这个词眼,然后也很想去尝试一下,但是又不知道要post的数据是什么?还有就是post的地址怎么来的?说实话,现在我也还不太清楚,只不过今天去模拟登录的时候居然成功了!
首先去模拟登录的是豆瓣,这个简单,根据我前一篇帖子查看需要post数据,主要是用户名和密码的信息,有了这两个信息之后,就可以直接post了。

loginurl='https://accounts.douban.com/login'
formData={'form_email':'[email protected]',
          'form_password':'xxxxxx'}
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1'}
res=req.post(loginurl,data=formData,headers=headers)#成功

在这里还是不得不赞叹requests库的简单便捷,比urllib和urllib2好使多了!
成功登录豆瓣之后就想可不可以用这种方式登录新浪微博呢?虽然我知道新浪微博的登录很麻烦,但是还是尝试了一下,结果跟预想的一样,登录失败!
之后就百度python模拟登录微博的方法,发现还真不少人写相关的帖子,但是大多数都是两三年前的帖子,也不知道方法失效了没有,不过我还是尝试了一下。
看了这些帖子才知道,原来新浪微博要登录还真是麻烦!

  • 首先利用get方式get下面的地址得到servertim和nonce
    http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.18)
  • 然后需要把用户名和密码进行加密:
    username:经过base64计算得到
    password:先经过两次SHA1加密后,加上刚才获取的servertime和nonce再进行一次SHA1加密得到。
    得到加密后的username和password还有servertime、nonce后就可以添加post头文件了。其中需要post的数据可以通过firefox浏览器的httpfox工具进行查看,如下图:

    su为刚才加密后的username,sp为刚才加密后的password
  • 最后是结合上一步得到的表头post下方地址
    http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)
    关于这条链接,也可以直接在httpfox查看到。

    上面的要点就是根据看到的第一个帖子结合自己现在成功登录后获得的信息得到的。登录过程大体上是正确的,但是如今新浪微博的加密方式也在更新,原来的密码加密方式由原来的SHA1加密改成了rsa方式进行加密!而ssologin.js版本也会进行更新。密码加密方式多了个pubkey进行干扰,而pubkey也是由一开始get到的。
    于是最新的新浪微博模拟登录方式为:

  • 首先利用get方式从下方地址得到servertimenoncepubkeyrsakv
    http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.18)

  • 接着对username和password进行加密。其中username是BASE64方式加密,password是结合servertime、nonce、pubkey利用rsa方式加密。
    具体加密方式为:

 #加密密码 
def getsu(self):
  su=base64.encodestring(urllib2.quote(self.username))[:-1]
  return su   
 #加密密码 
 def getpw(self,servertime,nonce,spubkey):
   rsaPublickey = int(spubkey, 16)
   key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥
   message = str(servertime) + '\t' + str(nonce) + '\n' +   str(self.password) #拼接明文js加密文件中得到
   passwd = rsa.encrypt(message, key) #加密
   passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。
   return passwd
  • 至此所需数据基本已经获得,填写post表头,其中的su填写加密后的username,而sp则是加密后的password。然后post下面地址:
    http://login.sina.com.cn/sso/login.php?client=su
    su为加密后的用户名

完成上面的三步后,查看post回来的数据,查看retcode,如果retcode=0,则说明模拟登录成功,否则失败。

Q:模拟登录成功后怎么办?
A:结合cookies进行操作。比如上方最后post成功之后会获得cookies,那么要进行操作,则利用requests.get(url,cookies=cookies)方式。之所以要加cookies是因为要告诉对方现在进行操作的是刚才登录的用户blabla。。。。。。

你可能感兴趣的:(python,微博,模拟登陆)