# !user/bin/env python3
# -*-coding: utf-8 -*-
__author__ = '闻名'
import time
import base64
import requests
import json
import re
import rsa
import binascii
class Weibo_login(object):
def __init__(self, username, password):
self.session = requests.Session()
self.headers = {
'Referer': 'https://weibo.com/',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36'
}
self.username = username
self.password = password
def get_username(self):
'''
通过base64编码 获取su的值
:return:
'''
username_base64 = base64.b64encode(self.username.encode())
return username_base64.decode()
def get_json_data(self, su):
'''
获取pubkey servertime nonce
:param su:
:return:
'''
url = 'https://login.sina.com.cn/sso/prelogin.php'
params = {
'entry': 'weibo',
'callback': 'sinaSSOController.preloginCallBack',
'su': su,
'rsakt': 'mod',
'checkpin': '1',
'client': 'ssologin.js(v1.4.19)',
'_': int(time.time() * 1000)
}
response = self.session.get(url, params=params, headers=self.headers)
# print(response.text)
json_data = json.loads(re.findall(r'\((.*?)\)', response.text)[0])
# print(json_data['nonce'], json_data['pubkey'])
return json_data
def get_password(self, servertime, nonce, pubkey):
'''
对密码进行rsa加密
:param servertime:
:param nonce:
:param pubkey:
:return:
'''
str_pass = (str(servertime) + '\t' + str(nonce) + '\n' + str(self.password)).encode()
pub_key = rsa.PublicKey(int(pubkey, 16), int('10001', 16))
password = rsa.encrypt(str_pass, pub_key)
# 真正的密码有一个16进制的过程
password = binascii.b2a_hex(password)
return password.decode()
def login(self):
su = self.get_username()
json_data = self.get_json_data(su)
sp = self.get_password(json_data['servertime'], json_data['nonce'], json_data['pubkey'])
# print(sp)
data = {
'entry': 'weibo',
'gateway': '1',
'from': '',
'savestate': '7',
'qrcode_flag': 'false',
'useticket': '1',
'pagerefer': '',
'vsnf': '1',
'su': su,
'service': 'miniblog',
'servertime': json_data['servertime'],
'nonce': json_data['nonce'],
'pwencode': 'rsa2',
'rsakv': json_data['rsakv'],
'sp': sp,
'sr': '1680 * 1050',
'encoding': 'UTF-8',
'prelt': '74',
'url': 'https://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
'returntype': 'META'
}
# 加一个判断 是否存在验证码
login_url = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)'
res = self.session.post(login_url, data=data, headers=self.headers).content.decode('gbk')
# print(res)
login_url2 = re.findall(r'replace\("(.*?)"\)', res)[0]
# print(login_url2)
req = self.session.get(login_url2, headers=self.headers).content.decode('gbk')
# print(req)
arr_urls = json.loads(re.findall(r'setCrossDomainUrlList\((.*?)\)', req)[0])['arrURL']
self.session.get(arr_urls[0])
print(self.session.get('https://www.weibo.com').content.decode('utf-8'))
if __name__ == '__main__':
weibo = Weibo_login('你的微博账号', '你的微博密码')
weibo.login()
模拟登陆微博 主函数中输入自己微博的账号和密码 User-Agent也要改
最新推荐文章于 2024-04-20 16:55:37 发布