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 ("登录成功!\n id: {}\n username: {}\n sex: {}\n watermark: {}" .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