1+ import urllib
2+ import urllib .request
3+ import urllib .parse
4+ import base64
5+ import rsa
6+ import json
7+ import http .cookiejar
8+ import binascii
9+ import re
10+ from bs4 import BeautifulSoup
11+
12+
13+
14+ class WeiboLogin ():
15+
16+ def __init__ (self ,username ,password ):
17+ self .username = username
18+ self .password = password
19+
20+ def enableCookies (self ):
21+ # 建立一个cookies 容器
22+ cookie_container = http .cookiejar .CookieJar ()
23+ # 将一个cookies容器和一个HTTP的cookie的处理器绑定
24+ cookie_support = urllib .request .HTTPCookieProcessor (cookie_container )
25+ # 创建一个opener,设置一个handler用于处理http的url打开
26+ opener = urllib .request .build_opener (cookie_support , urllib .request .HTTPHandler )
27+ # 安装opener,此后调用urlopen()时会使用安装过的opener对象
28+ urllib .request .install_opener (opener )
29+
30+ # 加密用户名
31+ def getusername (self ):
32+ username_req_qo = urllib .request .quote (self .username )
33+ username_bsencode = base64 .b64encode (bytes (username_req_qo ,encoding = 'utf-8' ))
34+ return username_bsencode .decode ("utf-8" ).split ("=" )[0 ]
35+
36+ # 得到servertime,nonce,pubkey,rsakv
37+ # 输入用户名和密码之后(不登录)会出现一个prologin的预登陆的包
38+ def getprelogin (self ):
39+ prelogin_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)&_=1507974787556" .format (self .getusername ())
40+ pre = re .compile ('sinaSSOController.preloginCallBack(.*)' )
41+ request = urllib .request .Request (prelogin_url )
42+ response = urllib .request .urlopen (request )
43+ read_data = response .read ().decode ("utf-8" )
44+ date = pre .search (read_data ).group (1 )[1 :- 1 ]
45+ date_json = json .loads (date )
46+ servertime = str (date_json ['servertime' ])
47+ nonce = date_json ['nonce' ]
48+ pubkey = date_json ['pubkey' ]
49+ rsakv = date_json ['rsakv' ]
50+ return servertime ,nonce ,pubkey ,rsakv
51+
52+ # 加密密码
53+ def getpassword (self ):
54+ servertime ,nonce ,pubkey ,rsakv = self .getprelogin ()
55+ pw_string = str (servertime ) + '\t ' + str (nonce ) + '\n ' + str (self .password )
56+ key = rsa .PublicKey (int (pubkey ,16 ),65537 ) # 10001 == 65537 转10进制
57+ pw_encrypt = rsa .encrypt (pw_string .encode ('utf-8' ),key )
58+ self .password = '' # 安全起见~清空密码~
59+ passwd = binascii .b2a_hex (pw_encrypt )
60+ return passwd
61+
62+ # POST参数
63+ def build_post_data (self ):
64+ servertime , nonce , pubkey , rsakv = self .getprelogin ()
65+ post_data = {
66+ 'entry' : 'weibo' ,
67+ 'gateway' : '1' ,
68+ 'from' : '' ,
69+ 'savestate' : '7' ,
70+ 'qrcode_flag' : 'false' ,
71+ 'useticket' : '1' ,
72+ "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" ,
73+ 'vsnf' : '1' ,
74+ 'su' : self .getusername (),
75+ 'service' :'miniblog' ,
76+ 'servertime' : servertime ,
77+ 'nonce' : nonce ,
78+ 'pwencode' : 'rsa2' ,
79+ 'rsakv' : rsakv ,
80+ 'sp' : self .getpassword (),
81+ 'sr' : '1920 * 1080' ,
82+ 'ncoding' : 'UTF - 8' ,
83+ 'prelt' : '912' ,
84+ 'url' : "http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack" ,
85+ 'returntype' : 'META'
86+ }
87+ data = urllib .parse .urlencode (post_data ).encode ('utf-8' )
88+ return data
89+
90+ def login (self ):
91+ url = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)'
92+ data = self .build_post_data ()
93+ self .enableCookies ()
94+ headers = {"User-Agent" :"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" }
95+ requests1 = urllib .request .Request (url ,data = data ,headers = headers )
96+ reqopen1 = urllib .request .urlopen (requests1 )
97+ reqread1 = reqopen1 .read ().decode ("GBK" )
98+ bs = BeautifulSoup (reqread1 ,'lxml' )
99+ bfind = bs .find ('script' )
100+ for i in bfind :
101+ p = i .strip ().split ('"' )[1 ]
102+ requests2 = urllib .request .Request (p )
103+ reqopen2 = urllib .request .urlopen (requests2 )
104+ reqread2 = reqopen2 .read ()
105+ bss = BeautifulSoup (reqread2 ,'lxml' )
106+ bff = bss .find_all ('script' )[1 ]
107+ try :
108+ p2 = re .compile (r'location.replace(.*?);}' )
109+ p3 = re .compile (r'"userdomain":"(.*?)"' )
110+ for i in bff :
111+ get_p2 = p2 .findall (i )[0 ][2 :- 2 ]
112+ requests3 = urllib .request .Request (get_p2 )
113+ reqopen3 = urllib .request .urlopen (requests3 )
114+ reqread3 = reqopen3 .read ().decode ('utf-8' )
115+ userdomain = p3 .findall (reqread3 )
116+ login_url = 'http://weibo.com/' + userdomain [0 ]
117+ requests4 = urllib .request .Request (login_url )
118+ reqopen4 = urllib .request .urlopen (requests4 )
119+ reqread4 = reqopen4 .read ().decode ('utf-8' )
120+ bs_date = BeautifulSoup (reqread4 ,'lxml' )
121+ bfind_nick_uid = bs_date .find_all ('script' )
122+ nick_re = re .compile ("CONFIG\['nick'\]='.*?';" )
123+ uin_re = re .compile ("CONFIG\['uid'\]='.*?';" )
124+ for i in bfind_nick_uid [2 ]:
125+ print ("Login success!" )
126+ print ("Usernmae:" ,nick_re .search (i .strip ()).group ().split ('=' )[1 ][1 :- 2 ],"Uin:" ,uin_re .search (i ).group ().split ('=' )[1 ][1 :- 2 ])
127+ except IndexError :
128+ print ("Login Error!" )
129+
130+
131+
132+ if __name__ == '__main__' :
133+ w = WeiboLogin ('' ,'' )
134+ w .login ()
0 commit comments