新浪正常

This commit is contained in:
criseLYJ
2019-03-07 00:00:43 +08:00
parent 7ef908bf49
commit c425dae7b0
7 changed files with 42 additions and 2701 deletions
BIN
View File
Binary file not shown.
+42
View File
@@ -0,0 +1,42 @@
import requests
import hashlib
import time
"""
info:
author:CriseLYJ
github:https://github.com/CriseLYJ/
update_time:2019-3-7
"""
def get_login(phone, pwd):
new_time = str(int(time.time()))
sign = new_time+'_'+hashlib.md5((phone + pwd + new_time).encode("utf-8")).hexdigest()
print(sign)
url = "https://appblog.sina.com.cn/api/passport/v3_1/login.php"
data = {
"cookie_format": "1",
"sign": sign,
"pin": "e3eb41c951f264a6daa16b6e4367e829",
"appver": "5.3.2",
"appkey": "2546563246",
"phone": phone,
"entry": "app_blog",
"pwd": pwd
}
headers = {
"User-Agent": "Mozilla/5.0 (Linux; Android 5.1.1; nxt-al10 Build/LYZ28N) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36 sinablog-android/5.3.2 (Android 5.1.1; zh_CN; huawei nxt-al10/nxt-al10)",
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
}
r = requests.post(url=url, data=data, headers=headers)
print(r.json())
if __name__ == '__main__':
phone = input("你输入你的账号:")
pwd = input("请输入你的密码:")
get_login(phone, pwd)
-62
View File
@@ -1,62 +0,0 @@
import re
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
def login(account, passwd, url):
# 如果driver没加入环境变量中,那么就需要明确指定其路径
# 验证于2017年4月11日
# 直接登陆新浪微博
driver = webdriver.Chrome(executable_path='/Users/resolvewang/Documents/program/driver/chromedriver')
driver.maximize_window()
# locator = (By.)
driver.get(url)
print('开始登陆')
name_field = driver.find_element_by_id('loginname')
name_field.clear()
name_field.send_keys(account)
password_field = driver.find_element_by_class_name('password').find_element_by_name('password')
password_field.clear()
password_field.send_keys(passwd)
submit = driver.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[3]/div[6]/a/span')
ActionChains(driver).double_click(submit).perform()
time.sleep(5)
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'WB_miniblog')))
source = driver.page_source
if is_login(source):
print('登录成功')
sina_cookies = driver.get_cookies()
driver.quit()
return sina_cookies
def is_login(source):
rs = re.search("CONFIG\['islogin'\]='(\d)'", source)
if rs:
return int(rs.group(1)) == 1
else:
return False
if __name__ == '__main__':
url = 'http://weibo.com/login.php'
name_input = input('请输入你的账号\n')
passwd_input = input('请输入你的密码\n')
cookies = login(name_input, passwd_input, url)
-104
View File
@@ -1,104 +0,0 @@
# 这种登陆方式是参考别的网友的,虽然效率很高,但我觉得普适性不强
import time
import base64
import rsa
import binascii
import requests
import re
from urllib.parse 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"
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)&_="
prelogin_url = pre_url + str(int(time.time() * 1000))
pre_data_res = session.get(prelogin_url, headers=headers)
sever_data = eval(pre_data_res.content.decode("utf-8").replace("sinaSSOController.preloginCallBack", ''))
return 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 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"]
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)'
login_page = session.post(login_url, data=postdata, headers=headers)
login_loop = (login_page.content.decode("GBK"))
pa = r'location\.replace\([\'"](.*?)[\'"]\)'
loop_url = re.findall(pa, login_loop)[0]
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'<title>(.*?)</title>'
userName = re.findall(weibo_pa, weibo_page.content.decode("utf-8", 'ignore'), re.S)[0]
print('登陆成功,你的用户名为:'+userName)
if __name__ == "__main__":
username = input(u'用户名:')
password = input(u'密码:')
login(username, password)
-43
View File
@@ -1,43 +0,0 @@
import requests
import random
session = requests.session()
user_agents = [
'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 '
'Mobile/13B143 Safari/601.1]',
'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/48.0.2564.23 Mobile Safari/537.36',
'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/48.0.2564.23 Mobile Safari/537.36']
headers = {
'User_Agent': random.choice(user_agents),
'Referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F',
'Origin': 'https://passport.weibo.cn',
'Host': 'passport.weibo.cn'
}
post_data = {
'username': '',
'password': '',
'savestate': '1',
'ec': '0',
'pagerefer': 'https://passport.weibo.cn/signin/welcome?entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F&wm=3349&vt=4',
'entry': 'mweibo'
}
login_url = 'https://passport.weibo.cn/sso/login'
def login():
username = input('请输入用户名:\n')
password = input('请输入密码:\n')
post_data['username'] = username
post_data['password'] = password
r = session.post(login_url, data=post_data, headers=headers)
if r.status_code != 200:
raise Exception('模拟登陆失败')
else:
print("模拟登陆成功,当前登陆账号为:" + username)
if __name__ == '__main__':
login()
-123
View File
@@ -1,123 +0,0 @@
import execjs
import requests
import json
import re
def get_session():
return requests.session()
def get_runntime(path):
"""
:param path: 加密js的路径,注意js中不要使用中文!估计是pyexecjs处理中文还有一些问题
:return: 编译后的js环境,不清楚pyexecjs这个库的用法的请在github上查看相关文档
"""
phantom = execjs.get('PhantomJS') # 这里必须为phantomjs设置环境变量,否则可以写phantomjs的具体路径
with open(path, 'r') as f:
source = f.read()
return phantom.compile(source)
# 获取经base64编码的用户名
def get_encodename(name, runntime):
return runntime.call('get_name', name)
# 获取加密后的密码
def get_pass(password, pre_obj, runntime):
"""
:param password: 登陆密码
:param pre_obj: 返回的预登陆信息
:param runntime: 运行时环境
:return: 加密后的密码
"""
nonce = pre_obj['nonce']
pubkey = pre_obj['pubkey']
servertime = pre_obj['servertime']
return runntime.call('get_pass', password, nonce, servertime, pubkey)
# 获取预登陆返回的信息
def get_prelogin_info(prelogin_url, session):
json_pattern = r'.*?\((.*)\)'
repose_str = session.get(prelogin_url).text
m = re.match(json_pattern, repose_str)
return json.loads(m.group(1))
# 使用post提交加密后的所有数据,并且获得下一次需要get请求的地址
def get_redirect(data, post_url, session):
"""
:param data: 需要提交的数据,可以通过抓包来确定部分不变的
:param post_url: post地址
:param session:
:return: 服务器返回的下一次需要请求的url
"""
logining_page = session.post(post_url, data=data)
login_loop = logining_page.content.decode("GBK")
pa = r'location\.replace\([\'"](.*?)[\'"]\)'
return re.findall(pa, login_loop)[0]
# 获取成功登陆返回的信息,包括用户id等重要信息
def do_login(session, url):
return session.get(url).text
if __name__ == '__main__':
name = input('请输入登录用户名:\n')
password = input('请输入登录密码:\n')
session = get_session()
runntime = get_runntime('./sinalogin.js')
su = get_encodename(name, runntime)
post_url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)'
prelogin_url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&' \
'su=' + su + '&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)'
pre_obj = get_prelogin_info(prelogin_url, session)
sp = get_pass(password, pre_obj, runntime)
# 提交的数据可以根据抓包获得
data = {
'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': pre_obj['servertime'],
'nonce': pre_obj['nonce'],
'pwencode': 'rsa2',
'rsakv': pre_obj['rsakv'],
'sp': sp,
'sr': '1366*768',
'encoding': 'UTF-8',
'prelt': '115',
'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
'returntype': 'META',
}
url = get_redirect(data, post_url, session)
login_info = do_login(session, url)
print("你当前使用的是rookiefly实现的微博登陆方式,登陆返回信息为:\n"+login_info)
-2369
View File
File diff suppressed because it is too large Load Diff