From 2843ef72948bc8669d626f9ce5ad1f337ee62a34 Mon Sep 17 00:00:00 2001 From: xchaoinfo Date: Tue, 8 Mar 2016 00:32:08 +0800 Subject: [PATCH] add weibo.com MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加新浪微博网页版的登录 --- 007 weibo.com/weibo.com.py | 170 +++++++++++++++++++++++++++++++++++++ README.md | 3 +- 2 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 007 weibo.com/weibo.com.py diff --git a/007 weibo.com/weibo.com.py b/007 weibo.com/weibo.com.py new file mode 100644 index 0000000..20d9914 --- /dev/null +++ b/007 weibo.com/weibo.com.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +''' +Required +- requests (必须) +- rsa (必须) +- pillow (可选) +Info +- author : "xchaoinfo" +- email : "xchaoinfo@qq.com" +- date : "2016.3.7" +''' +import time +import base64 +import rsa +import binascii +import requests +import re +import random +try: + from PIL import Image +except: + pass +try: + from urllib.parse import quote_plus +except: + from urllib import quote_plus + +''' +如果没有开启登录保护,不用输入验证码就可以登录 +如果开启登录保护,需要输入验证码 + +''' + + +# 构造 Request headers +agent = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0' +headers = { + 'User-Agent': agent +} + +session = requests.session() + +# 访问 初始页面带上 cookie +index_url = "http://weibo.com/login.php" +try: + session.get(index_url, headers=headers, timeout=2) +except: + session.get(index_url, headers=headers) +try: + input = raw_input +except: + pass + + +def get_su(username): + """ + 对 email 地址和手机号码 先 javascript 中 encodeURIComponent + 对应 Python 3 中的是 urllib.parse.quote_plus + 然后在 base64 加密后decode + """ + username_quote = quote_plus(username) + username_base64 = base64.b64encode(username_quote.encode("utf-8")) + return username_base64.decode("utf-8") + + +# 预登陆获得 servertime, nonce, pubkey, rsakv +def get_server_data(su): + pre_url = "http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=" + pre_url = pre_url + su + "&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=" + pre_url = pre_url + str(int(time.time() * 1000)) + pre_data_res = session.get(pre_url, headers=headers) + + sever_data = eval(pre_data_res.content.decode("utf-8").replace("sinaSSOController.preloginCallBack", '')) + + return sever_data + + +# print(sever_data) + + +def get_password(password, servertime, nonce, pubkey): + rsaPublickey = int(pubkey, 16) + key = rsa.PublicKey(rsaPublickey, 65537) # 创建公钥 + message = str(servertime) + '\t' + str(nonce) + '\n' + str(password) # 拼接明文js加密文件中得到 + message = message.encode("utf-8") + passwd = rsa.encrypt(message, key) # 加密 + passwd = binascii.b2a_hex(passwd) # 将加密信息转换为16进制。 + return passwd + + +def get_cha(pcid): + cha_url = "http://login.sina.com.cn/cgi/pin.php?r=" + cha_url = cha_url + str(int(random.random() * 100000000)) + "&s=0&p=" + cha_url = cha_url + pcid + cha_page = session.get(cha_url, headers=headers) + with open("cha.jpg", 'wb') as f: + f.write(cha_page.content) + f.close() + try: + im = Image.open("cha.jpg") + im.show() + im.close() + except: + print(u"请到当前目录下,找到验证码后输入") + + +def login(username, password): + # su 是加密后的用户名 + su = get_su(username) + sever_data = get_server_data(su) + servertime = sever_data["servertime"] + nonce = sever_data['nonce'] + rsakv = sever_data["rsakv"] + pubkey = sever_data["pubkey"] + showpin = sever_data["showpin"] + password_secret = get_password(password, servertime, nonce, pubkey) + + postdata = { + 'entry': 'weibo', + 'gateway': '1', + 'from': '', + 'savestate': '7', + 'useticket': '1', + 'pagerefer': "http://login.sina.com.cn/sso/logout.php?entry=miniblog&r=http%3A%2F%2Fweibo.com%2Flogout.php%3Fbackurl", + 'vsnf': '1', + 'su': su, + 'service': 'miniblog', + 'servertime': servertime, + 'nonce': nonce, + 'pwencode': 'rsa2', + 'rsakv': rsakv, + 'sp': password_secret, + 'sr': '1366*768', + 'encoding': 'UTF-8', + 'prelt': '115', + 'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack', + 'returntype': 'META' + } + login_url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)' + if showpin == 0: + login_page = session.post(login_url, data=postdata, headers=headers) + else: + pcid = sever_data["pcid"] + get_cha(pcid) + postdata['door'] = input(u"请输入验证码") + login_page = session.post(login_url, data=postdata, headers=headers) + login_loop = (login_page.content.decode("GBK")) + # print(login_loop) + pa = r'location\.replace\([\'"](.*?)[\'"]\)' + loop_url = re.findall(pa, login_loop)[0] + # print(loop_url) + # 此出还可以加上一个是否登录成功的判断,下次改进的时候写上 + login_index = session.get(loop_url, headers=headers) + uuid = login_index.text + uuid_pa = r'"uniqueid":"(.*?)"' + uuid_res = re.findall(uuid_pa, uuid, re.S)[0] + web_weibo_url = "http://weibo.com/%s/profile?topnav=1&wvr=6&is_all=1" % uuid_res + weibo_page = session.get(web_weibo_url, headers=headers) + weibo_pa = r'(.*?)' + # print(weibo_page.content.decode("utf-8")) + userID = re.findall(weibo_pa, weibo_page.content.decode("utf-8", 'ignore'), re.S)[0] + print(u"欢迎你 %s, 你在正在使用 xchaoinfo 写的模拟登录微博" % userID) + + +if __name__ == "__main__": + username = input(u'用户名:') + password = input(u'密码:') + login(username, password) + diff --git a/README.md b/README.md index 59e18b4..9c3e895 100644 --- a/README.md +++ b/README.md @@ -17,10 +17,11 @@ 4. [百度](https://www.baidu.com) 5. WebQQ by [opdss](https://github.com//opdss) 还有点问题 6. Webweixin by [opdss](https://github.com//opdss) +7. [微博网页版](http://weibo.com) ##Todolist -1. 增加新浪微博网页版的登录 +1. 增加新浪微博网页版的登录 (已解决) 2. 增加 QQ 空间 和 QQ 邮箱的登录 3. 重新组织文件结构和代码风格,make it esay to read