微博机器人登陆
爬虫:微博登陆的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())
清澈的爱,只为中国