Skip to content

Commit 9468ada

Browse files
authored
Add files via upload
1 parent 5221588 commit 9468ada

1 file changed

Lines changed: 134 additions & 0 deletions

File tree

Python/reptile/weibo_login.py

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
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

Comments
 (0)