import rsa
import re
import json
import time
import requests
import base64
import urllib3
import binascii
urllib3.disable_warnings()
class Weibo_login():
def __init__(self,username,password):
self.user_name = username
self.pass_word = password
self.session = requests.session()
def login(self):
json_data = self.get_json_data() #第一次请求, 获取服务端返回的参数
if not json_data:
return False
pass_word = self.get_password(json_data['servertime'],json_data['nonce'],json_data['pubkey'])
post_data = {
'entry': 'weibo',
'gateway': '1',
'from': '',
'savestate': '7',
'qrcode_flag': 'false',
'useticket': '1',
#'pagerefer': 'https://www.baidu.com/',
'vsnf': '1',
'su': self.username, #通过bs64加密后的得到的
'service': 'miniblog',
'servertime': json_data['servertime'],
'nonce': json_data['nonce'],
'pwencode': 'rsa2',
'rsakv': json_data['rsakv'],
'sp': pass_word, #通过rsa加密过的pass_word
'sr': '1920*1080',
'encoding': 'UTF-8',
'prelt': 28,
'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)'
response_data = self.session.post(login_url,data=post_data,verify=False)
print(response_data.content.decode('gbk')) #先转成二进制, 然后转成dbk
#第一次跳转
url1 = re.findall(r'location.replace\("(.*?)"\)',response_data.content.decode('gbk'))[0] #加上[0]就会变的 只剩下想要的数据
print("要打印的url:",url1)
#打印,获取第二次跳转的url
result = self.session.get(url1).content.decode('gbk')
print("result",result)
#第三次跳转
url1 = re.findall(r"location.replace\('(.*?)'\)",result)[0]
print("打印url1******************:",url1)
#访问url1
self.session.get(url1,verify=False)
print(self.session.get("https://weibo.com/u/6382564064/home",verify=False).content.decode()) #可以随意访问已经登录的网页
def get_password(self,servertime,nonce,pubkey):
s = str(servertime)+'\t'+str(nonce)+'\n'+str(self.pass_word)
public_key = rsa.PublicKey(int(pubkey,16),int('10001',16))
password = rsa.encrypt(s.encode(),public_key)
#print(binascii.b2a_hex(password))
return binascii.b2a_hex(password).decode()
def get_username(self):
self.username = base64.b64encode(self.user_name.encode()) #对传进去的进行编码
def get_json_data(self,):
'''
#这个就是按下tab以后, 产生的get请求
前面的请求就是为了给后面的post请求铺路
'''
params = {
'entry':'weibo',
'callback':'sinaSSOController.preloginCallBack',
'su':self.username,
'rsakt':'mod',
'checkpin':'1',
'client':'ssologin.js(v1.4.19)',
'_':int(time.time()*1000),
}
response = self.session.get('https://login.sina.com.cn/sso/prelogin.php?',params = params,verify=False) #?号后面的都是一些参数
#这个正则表达式很棒
'''
preloginCallBack\( 开始
(.*?)这里面的都要
\) 为结束
json.loads 转成字典格式
'''
try:
json_loads = json.loads(re.findall(r'preloginCallBack\((.*?)\)',response.text)[0]) #****重点来了\(的意思是从preloginCallBack(开始 ,到\)结束的所有都要 (.*?)匹配全部
except:
json_loads = {}
#print(json_loads)
return json_loads
if __name__ == '__main__':
login = Weibo_login('手机号','密码') #先设置账号密码
login.get_username() #给传过去的账号密码进行加密
login.get_json_data() #开始请求
login.login()