yuanjia8888

新浪微博登陆




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()

分类:

技术点:

相关文章: