新浪正常
This commit is contained in:
Vendored
BIN
Binary file not shown.
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -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()
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user