文档章节

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

ok嘣
 ok嘣
发布于 2017/06/03 19:04
字数 831
阅读 54
收藏 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嘣
粉丝 3
博文 122
码字总数 56244
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周三乱弹 —— 我居然在 osc 里追剧

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @舆情风控小组 :分享王菲的单曲《笑忘书》 《笑忘书》- 王菲 手机党少年们想听歌,请使劲儿戳(这里) @艾尔库鲁斯:如果给大家一个选择的机...

小小编辑
37分钟前
45
4
rabbitMq的客户端使用笔记

1、channel声明队列的queueDeclare方法的参数解析 durable: 是否持久化, 队列的声明默认是存放到内存中的,如果rabbitmq重启会丢失,如果想重启之后还存在就要使队列持久化,保存到Erlang自...

DemonsI
45分钟前
0
0
“全新” 编程语言 Julia开箱体验

本文共 851字,阅读大约需要 3分钟 ! 概 述 Julia 是一个 “全新”的高性能动态编程语言,前两天迎来了其 1.0 正式版的重大更新。Julia集 Python、C、R、Ruby 之所长,感觉就像一种脚本语言...

CodeSheep
今天
11
0
软件自动化测试初学者忠告

题外话 测试入门 很多受过高等教育的大学生经常问要不要去报测试培训班来入门测试。 答案是否。 高等教育的合格毕业生要具备自学能力,如果你不具备自学能力,要好好地反省一下,为什么自己受...

python测试开发人工智能安全
今天
5
0
java并发备忘

不安全的“先检查后执行”,代码形式如下: if(条件满足){ //这里容易出现线程安全问题//doSomething}else{//doOther} 读取-修改-写入 原子操作:使用CAS技术,即首先从V中读取...

Funcy1122
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部