Skip to content

Commit a54aa4f

Browse files
authored
Add files via upload
1 parent e112609 commit a54aa4f

1 file changed

Lines changed: 100 additions & 0 deletions

File tree

Python/reptile/WeiboLogin.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import requests
2+
import base64
3+
import rsa
4+
import re
5+
import json
6+
import binascii
7+
8+
class WeiBoLogin(object):
9+
10+
def __init__(self):
11+
self.request = requests.Session()
12+
self.username = "" # 用户名
13+
self.password = "" # 密码
14+
self.information = {}
15+
self.headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"}
16+
17+
def baseUsername(self):
18+
su = base64.b64encode(bytes(self.username, encoding="utf-8")).decode("utf-8")
19+
return su
20+
21+
def rsaPassword(self, **kw):
22+
serevrtime, nonce, rsakv, pubkey = kw['servertime'], kw['nonce'], kw['rsakv'], kw['pubkey']
23+
# 'RSAKey.setPublic(me.rsaPubkey,"10001");password=RSAKey.encrypt([me.servertime,me.nonce].join("\\t")+"\\n"+password)' # 原js加密
24+
pw_string = "\t".join([str(serevrtime), nonce]) + '\n' + self.password
25+
key = rsa.PublicKey(int(pubkey, 16), 65537)
26+
pw_encrypt = rsa.encrypt(pw_string.encode("utf-8"), key)
27+
sp = binascii.b2a_hex(pw_encrypt)
28+
self.password = "" # 清空密码
29+
return sp
30+
31+
def getPrelogin(self, *args):
32+
re_preloginCallBack = re.compile('sinaSSOController.preloginCallBack(.*)')
33+
url = "https://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su={}&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_=1577269910313".format(args[0])
34+
responses = self.request.get(url, headers=self.headers)
35+
re_responses = json.loads(re_preloginCallBack.search(responses.text).group(1)[1:-1])
36+
return re_responses
37+
38+
def login(self, *args, **kw):
39+
location_replace = re.compile('location.replace(.*)')
40+
userdomain = re.compile('"userdomain":"(.*)"')
41+
re_uid = re.compile("CONFIG\['uid'\]='.*?';") # id号
42+
re_nick = re.compile("CONFIG\['nick'\]='.*?';") # 用户名
43+
re_sex = re.compile("CONFIG\['sex'\]='.*?';") # 性别
44+
re_watermark = re.compile("CONFIG\['watermark'\]='.*?';") # 主页域名
45+
url = "https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)"
46+
post_data = {
47+
'entry': 'weibo',
48+
'gateway': '1',
49+
'from': '',
50+
'savestate': '7',
51+
'qrcode_flag': 'false',
52+
'useticket': '1',
53+
"pagerefer":"http://passport.weibo.com/visitor/visitor?entry=miniblog&a=enter&url=http%3A%2F%2Fweibo.com%2F&domain=.weibo.com&ua=php-sso_sdk_client-0.6.14",
54+
'vsnf': '1',
55+
'su': args[0],
56+
'service':'miniblog',
57+
'servertime': kw["servertime"],
58+
'nonce': kw["nonce"],
59+
'pwencode': 'rsa2',
60+
'rsakv': kw["rsakv"],
61+
'sp': args[1],
62+
'sr': '1920 * 1080',
63+
'ncoding': 'UTF - 8',
64+
'prelt': '912',
65+
'url': "http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack",
66+
'returntype': 'META'
67+
}
68+
69+
post_request = self.request.post(url, headers=self.headers, data=post_data).content.decode("GBK") # 第一层重定向!
70+
get_location_replace_url = location_replace.search(post_request).group(1)[2:-3]
71+
get_location_replace_request = self.request.get(get_location_replace_url, headers=self.headers).content.decode("GBK") # 第二层重定向!!
72+
if location_replace.search(get_location_replace_request) == None:
73+
print("账号或者密码有误")
74+
else:
75+
get_location_replace_url2 = location_replace.search(get_location_replace_request).group(1)[2:-7]
76+
get_location_replace_request2 = self.request.get(get_location_replace_url2, headers=self.headers).content.decode("GBK") # 第三层重定向!!!
77+
get_userdomain_url = "http://weibo.com/" + userdomain.search(get_location_replace_request2).group(1)
78+
get_home = self.request.get(get_userdomain_url, headers=self.headers).content.decode("utf-8")
79+
uid = re_uid.search(get_home).group().split("=")[1][1:-2]
80+
nick = re_nick.search(get_home).group().split("=")[1][1:-2]
81+
sex = re_sex.search(get_home).group().split("=")[1][1:-2]
82+
watermark = re_watermark.search(get_home).group().split("=")[1][1:-2]
83+
self.information['uid'] = uid
84+
self.information['nick'] = nick
85+
self.information['sex'] = sex
86+
self.information['watermark'] = watermark
87+
88+
def printInformation(self, **kw):
89+
print("登录成功!\nid: {}\nusername: {}\nsex: {}\nwatermark: {}".format(kw['uid'], kw['nick'], kw['sex'], kw['watermark']))
90+
91+
def main(self):
92+
username = self.baseUsername()
93+
prelogin = self.getPrelogin(username)
94+
password = self.rsaPassword(**prelogin)
95+
self.login(username, password, **prelogin)
96+
self.printInformation(**self.information)
97+
98+
if __name__ == "__main__":
99+
login = WeiBoLogin()
100+
login.main()

0 commit comments

Comments
 (0)