文档章节

【Scrapy】 采用 requests 模拟 Oauth2.0 登录 开源中国社区

ok嘣
 ok嘣
发布于 2017/06/03 19:04
字数 831
阅读 59
收藏 0

本文采用 requests 模拟 oauth2.0 新浪微博接口登录 开源中国社区, 新浪微博的登录 密码采用 AES 进行加密 ,用户名采用 base64 进行编码加密

#! -*- coding:utf-8 -*-
import base64
import urllib
import requests
import re
import rsa
import time
import binascii
import json
from requests.packages import urllib3

def get_username(username):
	username_base64 = base64.b64encode(username)
	return username_base64

def get_password(pass_word,servertime,nonce,spubkey):
	rsaPublickey = int(spubkey, 16)
	key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥
	message = str(servertime) + '\t' + str(nonce) + '\n' + str(pass_word) #拼接明文js加密文件中得到
	passwd = rsa.encrypt(message, key) #加密
	passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。
	return passwd

def gen_url(oriurl,params):
	url = oriurl + '?' + urllib.urlencode(params)
	return url

def get_state(url):
	pattern = "href=\'(.*?)\';</"
	url = re.findall(pattern,url)
	state_loc = url[0].find('state')
	state = url[0][state_loc+6:]
	return state

def get_code(url):
	pattern = "href=\'(.*?)\';</"
	url = re.findall(pattern,url)
	code_loc = url[0].find('code')
	code = url[0][code_loc:code_loc+4]
	return code

headers = {'content-type': 'application/json',
           'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}

oschina_loginurl = 'https://www.oschina.net/home/login'
ori_params = {
	'goto':'https://www.oschina.net/'
}

login_ori_weibo_url = 'https://www.oschina.net/action/openid/before_bind'
choose_params = {
	'op':'weibo'
}

client_id = 582509177
resonse_type = ''
redirect_uri = 'http://www.oschina.net/action/openid/after_bind'
state = ''
scope = ''

choose_weibo_url = gen_url(login_ori_weibo_url,choose_params)

login_page_url = gen_url(oschina_loginurl,ori_params)
res = requests.Session()
"""
开源中国的登录界面
"""
login_page_content = res.get(login_page_url,headers=headers,verify=False)
# print login_page_content.content
"""
选择微博登录,调用api
"""
choose_weibo_content = res.get(choose_weibo_url,headers=headers,verify=False)
#print choose_weibo_content.content

state = get_state(choose_weibo_content.content)
code = get_code(choose_weibo_content.content)
# print state
"""
微博开始验证  
"""
pattern = "href=\'(.*?)\';</"

url = re.findall(pattern,choose_weibo_content.content)
auth_url = url[0]

after_auth = res.get(auth_url,headers=headers,verify=False)
#print after_auth.content

username = get_username('你的用户名')
login_ori_pre_url = 'https://login.sina.com.cn/sso/prelogin.php'
pre_params = {
	'entry':'openapi',
	'callback':'sinaSSOController.preloginCallBack',
	'su':username,
	'rsakt':'mod',
	'checkpin':'1',
	'client':'ssologin.js(v1.4.18)',
	'_':int(time.time()*1000)
}
login_pre_url = gen_url(login_ori_pre_url,pre_params)
#print login_pre_url
login_pre_result = res.get(login_pre_url,headers=headers,verify=False)
s = (login_pre_result.content)

# p = re.compile('ck(.*)')
# json_data = p.search(s).group(1)
# json_data = json_data[1:-1]

# data = json.loads(json_data)  
# servertime = str(data['servertime'])  
# nonce = data['nonce']  
# pubkey = data['pubkey']  
# rsakv = data['rsakv'] 
# print pubkey

pattern_retcode = 'retcode":(.*?),"'
pattern_servertime = 'servertime":(.*?),"'
pattern_pcid = 'pcid":(.*?),"'
pattern_nonce = 'nonce":(.*?),"'
pattern_pubkey = 'pubkey":(.*?),"'
pattern_rsakv = 'rsakv":(.*?),"'
pattern_is_openlock = 'is_openlock":(.*?),"'
pattern_lm = 'lm":(.*?),"'
pattern_smsurl = 'smsurl":(.*?),"'
pattern_showpin = 'showpin":(.*?),"'
pattern_exectime = 'exectime":(.*?),"'

retcode = re.findall(pattern_retcode,s)[0][1:-1]
servertime = re.findall(pattern_servertime,s)[0]
pcid = re.findall(pattern_pcid,s)[0][1:-1]
nonce = re.findall(pattern_nonce,s)[0][1:-1]
pubkey = re.findall(pattern_pubkey,s)[0][1:-1]
rsakv = re.findall(pattern_rsakv,s)[0][1:-1]
is_openlock = re.findall(pattern_is_openlock,s)[0][1:-1]
lm = re.findall(pattern_lm,s)[0][1:-1]
smsurl = re.findall(pattern_smsurl,s)[0][1:-1]
showpin = re.findall(pattern_showpin,s)[0][1:-1]
# exectime = re.findall(pattern_exectime,s)[0]
password = '你的密码'

password = get_password(password,str(servertime),str(nonce),str(pubkey))

post_formdata = {
	'entry':'openapi',
	'gateway':'1',
	'from':'',
	'savestate':'0',
	'userticket':'1',
	'pagerefer':'https://www.oschina.net/action/openid/before_bind?op=weibo',
	'ct':'1800',
	's':'1',
	'vsnf':'1',
	'vsnval':'',
	'door':'',
	'appkey':'WawKB',
	'su':username,
	'service':'miniblog',
	'servertime':servertime,
	'nonce':nonce,
	'pwencode':'rsa2',
	'rsakv':'1330428213',
	'sp':password,
	'sr':'1366*768',
	'encoding':'UTF-8',
	'cdult':'2',
	'domain':'weibo.com',
	'prelt':'206',
	'returntype':'TEXT'
}

login_weibo_url = 'https://login.sina.com.cn/sso/login.php'
login_weibo_url_params = {
	'client':'ssologin.js(v1.4.18)',
	'_':int(time.time()*1000),
	'openapilogin':'qrcode'
}
login_weibo_url = gen_url(login_weibo_url,login_weibo_url_params)
#print login_weibo_url

after_auth_login_content = res.post(login_weibo_url,data=post_formdata)
# cookies =  requests.utils.dict_from_cookiejar(after_auth_login_content.cookies)



pattern_ticket = 'ticket":"(.*?)","'
ticket = re.findall(pattern_ticket,after_auth_login_content.content)[0]
# print ticket
last_auth_url = 'https://api.weibo.com/oauth2/authorize'

last_formdata = {
	'action':'login',
	'display':'default',
	'withOfficalFlag':'0',
	'quick_auth':'false',
	'withOfficalAccount':'',
	'scope':'',
	'ticket':ticket,
	'isLoginSina':'',
	'response_type':'code',
	'regCallback':'https%3A%2F%2Fapi.weibo.com%2F2%2Foauth2%2Fauthorize%3Fclient_id%3D582509177%26response_type%3Dcode%26display%3Ddefault%26redirect_uri%3Dhttp%253A%252F%252Fwww.oschina.net%252Faction%252Fopenid%252Fafter_bind%253Fgoto%253D%26from%3D%26with_cookie%3D',
	'redirect_uri':'http://www.oschina.net/action/openid/after_bind?goto=',
	'client_id':'582509177',
	'appkey62':'WawKB',
	'state':state,
	'verifyToken':'null',
	'from':'',
	'switchLogin':'0',
	'userId':'',
	'passwd':''
}


refer_url = 'https://api.weibo.com/oauth2/authorize?client_id=582509177&response_type=code&redirect_uri=http%3A%2F%2Fwww.oschina.net%2Faction%2Fopenid%2Fafter_bind%3Fgoto%3D&scope=&state='+state
print refer_url
myheaders = {
        "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0",
        "Referer":refer_url,
        "Connection":"keep-alive"
    }
success = res.post(last_auth_url,last_formdata,headers=myheaders)
print success.cookies
print success.url
#print success.request.headers['Cookie']
# print cookies
# print success.cookies

home_page = res.get('https://www.oschina.net/news/85180/open-source-software-will-drive-the-future-of-auto-innovations',headers=headers,verify=False)
#print home_page.content
# print home_page.headers
new_headers = home_page.request.headers
# print new_headers
cookies =  home_page.request.headers['Cookie']
# print cookies
new_cookies = {}
pattern_user_behavior = 'ior_=(.*?); '
_user_behavior = re.findall(pattern_user_behavior,cookies)[0]
oscid_loc = cookies.find('oscid')
new_cookies['_user_behavior'] = _user_behavior
new_cookies['oscid'] = cookies[oscid_loc+6:]
print new_cookies
headers['Cookie'] = cookies
#print headers
new_res = requests.Session()
cookies = requests.utils.cookiejar_from_dict(new_cookies, cookiejar=None, overwrite=True)
test_page = new_res.get('https://www.oschina.net/',headers=headers,verify=False)
#print test_page.request.headers
f = open(u'E:\中国开源社区.txt','wb')
f.write(test_page.content)
f.close()
# print success.content
# print success.headers
# print success.cookies
# print success.url

© 著作权归作者所有

共有 人打赏支持
ok嘣
粉丝 4
博文 124
码字总数 56831
作品 0
海淀
私信 提问
jxlgzwh/android-hao

#android-hao 2013年底,完全采用开源中国客户端的UI,修改了个腾讯微博客户端, 需要熟悉腾讯开放平台API的同学可以看看,算是对社区的回馈吧! 相关学习资料请参考我的博客: http://my.os...

jxlgzwh
2014/10/21
0
0
腾讯微博android客户端 (开源软件)

2013年底,完全采用开源中国客户端的UI,修改了个腾讯微博客户端, 需要熟悉腾讯开放平台API的同学可以看看,算是对社区的回馈吧! 项目介绍:http://www.oschina.net/p/android-hao 相关学习...

jxlgzwh
2014/10/29
0
1
腾讯微博android客户端

采用开源中国客户端的UI,修改了个腾讯微博客户端,需要熟悉腾讯开放平台API的同学可以看看,算是对社区的回馈吧!运行源程序需要到腾讯微博开发平台申请账号! 相关学习资料请参考我的博客:...

jxlgzwh
2014/10/21
2.2K
1
爬虫入门之scrapy模拟登陆(十四)

注意:模拟登陆时,必须保证settings.py里的COOKIESENABLED(Cookies中间件) 处于开启状态 或 策略一:直接POST数据(比如需要登陆的账户信息) 只要是需要提供post数据的,就可以用这种方法。...

诚实善良小郎君
07/12
0
0
获取微信用户信息

微信公众平台开发(76) 获取用户基本信息 本文介绍如何获得微信公众平台关注用户的基本信息,包括昵称、头像、性别、国家、省份、城市、语言。 本文的方法将囊括订阅号和服务号以及自定义菜单...

bengozhong
2016/03/18
89
0

没有更多内容

加载失败,请刷新页面

加载更多

WebSocketdemo

WebSocket是html5提供的一种在单个tcp连接上进行全双工通讯的协议。 Http协议是无状态、无连接的、单向的应用层协议,采用了请求响应模型,通信请求智能有客户端发起,服务端对请求做出应答处...

qiang123
26分钟前
0
0
谷歌推迟公布Google+漏洞遭参议员不满

参议院商务委员会主席约翰·图恩和另外两位参议员杰瑞·莫兰和罗杰·维克发出信函,要求谷歌解释推迟披露此问题的原因。信中称:“谷歌如果要保持或重获用户对其服务的信任,就必须在公众和立...

linuxCool
33分钟前
0
0
最重要的是做什么,而不是怎么做。

最重要的是做什么,而不是怎么做。 做什么是战略,怎么做是战术。将军下令说,天黑前拿下这座山头,这是战略。手下的士兵可以不知道为什么要拿下这座山头,还非得是天黑之前,但士兵必须知道...

我是菜鸟我骄傲
今天
6
0
w, vmstat, top, sar, nload命令查看系统状态信息

w/uptime 查看系统负载 cat /proc/cpuinfo 查看cpu核数 vmstat 监控系统状态,用法 vmstat 1,关键的几列: r, b, swpd, si, so, bi, bo, us, wa top 查看进程使用资源情况 top -c 显示详细的...

野雪球
今天
2
0
小白创建一个spring boot项目

进入 https://start.spring.io/

lilugirl
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部