微博机器人登陆

爬虫:微博登陆的js代码调试

  设置鼠标单击事件断点调试之后,js代码中光标运行到 f 函数,我们执行下一步直到 g 函数,执行完 g 函数之后又循环

到 f 函数,这时候再次单步进入 g 函数,执行到 k 函数,单步进入。在执行 k 函数的return时,单步进入,执行完里面的

码,这个时候一定要注意,出来之后光标任然在return处,所以我们要再次进入。

 通过js代码调试之后,登陆代码如下:

  1 # !/usr/bin/env python
  2 # -*- coding:utf-8 -*-
  3 import requests
  4 import rsa
  5 import binascii
  6 import base64
  7 import time
  8 import re
  9 import json
 10 import urllib3
 11 
 12 
 13 class WeiBoLogin(object):
 14 
 15     def __init__(self, name, pwd):
 16         urllib3.disable_warnings()
 17         self.name = name
 18         self.pwd = pwd
 19         self.session = requests.session()
 20         self.session.headers = {
 21             'User - Agent': 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; ServiceUI 11) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299',
 22         }
 23         self.session.verify = False
 24 
 25     def get_username(self):
 26         user_name = base64.b64encode(self.name.encode())
 27         return user_name.decode()
 28 
 29     @staticmethod
 30     def get_time(n=10):
 31         if n == 10:
 32             new_time = int(time.time())
 33         else:
 34             new_time = int(time.time()*1000)
 35         return new_time
 36 
 37     def get_response_1(self):
 38         users_name = self.get_username()
 39         print(users_name)
 40         get_data = {
 41             'entry': 'weibo',
 42             'callback': 'sinaSSOController.preloginCallBack',
 43             'su': users_name,
 44             'rsakt': 'mod',
 45             'checkpin': '1',
 46             'client': 'ssologin.js(v1.4.19)',
 47             '_': self.get_time(13)
 48         }
 49         user_url = 'https://login.sina.com.cn/sso/prelogin.php'
 50         response = self.session.get(user_url, params=get_data)
 51         result = json.loads(re.findall(r'preloginCallBack\((.*?)\)', response.text)[0])
 52         result['users_name'] = users_name
 53         return result
 54 
 55     def get_password(self):
 56         result = self.get_response_1()
 57         if not result:
 58             return False
 59         server_time = result['servertime']
 60         pubkey = result['pubkey']
 61         nonce = result['nonce']
 62         s = str(server_time) + '\t' + str(nonce) + '\n' + str(self.pwd)
 63         public_key = rsa.PublicKey(int(pubkey, 16), 65537)
 64         pass_word = binascii.b2a_hex(rsa.encrypt(s.encode(), public_key))
 65         result['pass_word'] = pass_word.decode()
 66         return result
 67 
 68     def login(self):
 69         result = self.get_password()
 70         url = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)'
 71         data = {
 72             'entry': 'weibo',
 73             'gateway': '1',
 74             'from': '',
 75             'savestate': '7',
 76             'qrcode_flag': 'false',
 77             'useticket': '1',
 78             'vsnf': '1',
 79             'su': result['users_name'],
 80             'service': 'miniblog',
 81             'servertime': result['servertime'],
 82             'nonce': result['nonce'],
 83             'pwencode': 'rsa2',
 84             'rsakv': result['rsakv'],
 85             'sp': result['pass_word'],
 86             'sr': '1536*864',
 87             'encoding': 'UTF-8',
 88             'prelt': 18,
 89             'url': 'https://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
 90             'returntype': 'META',
 91         }
 92         # 第一次登陆请求 提交用户账号密码
 93         response = self.session.post(url, data=data, headers = self.session.headers)
 94         login_url_1 = re.findall(r'location.replace\("(.*?)"\);', response.content.decode('gbk'))[0]
 95         # 第二次登陆请求 请求返回的链接对账号密钥进行验证
 96         response_login_2 = self.session.get(login_url_1)
 97         response_login_2.encoding = 'GBK'
 98         login_url_2 = re.findall(r"location.replace\('(.*?)'\);", response_login_2.text)[0]
 99         # 第三次登陆请求  对上面返回的链接再次请求,获取用户id等信息
100         response_login_3 = self.session.get(login_url_2)
101         response_login_3.encoding = 'GBK'
102         res = r'parent.sinaSSOController\.feedBackUrlCallBack\((.*?)\)'
103         id_data = json.loads(re.findall(res, response_login_3.text)[0])
104         if id_data['result']:
105             unique_id = id_data['userinfo']['uniqueid']
106         else:
107             return '用户信息获取识别失败'
108         # 请求微博首页 验证登陆是否成功
109         url = 'https://www.weibo.com/u/{}/home?wvr=5&lf=reg'.format(unique_id)
110         weibo_response = self.session.get(url).content.decode()
111         if '<title>我的首页 微博-随时随地发现新鲜事</title>' in weibo_response:
112             print('微博登陆成功')
113             return weibo_response
114         else:
115             self.login()
116             return
117 
118 
119 if __name__ == '__main__':
120     sina = WeiBoLogin('********', '*******')
121     print(sina.login())

 

posted @ 2018-04-12 10:41  巴蜀秀才  阅读(156)  评论(0编辑  收藏  举报