文档章节

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

ok嘣
 ok嘣
发布于 2017/06/03 19:04
字数 831
阅读 47
收藏 0
点赞 0
评论 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
博文 115
码字总数 54790
作品 0
海淀
jxlgzwh/android-hao

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

jxlgzwh ⋅ 2014/10/21 ⋅ 0

腾讯微博android客户端 (开源软件)

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

jxlgzwh ⋅ 2014/10/29 ⋅ 1

腾讯微博android客户端

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

jxlgzwh ⋅ 2014/10/21 ⋅ 1

获取微信用户信息

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

bengozhong ⋅ 2016/03/18 ⋅ 0

Python进阶(四十五)-走进requests库

Python进阶(四十五)-走进requests库 前言   Requests is an elegant and simple HTTP library for Python, built for human beings.   Requests 是用Python语言编写,基于 urllib,采用 ......

sunhuaqiang1 ⋅ 2017/04/23 ⋅ 0

采用Requests实现模拟登录

采用firefox 插件httpfox查看系统的登录过程。 发现共有三个参数pwd,username,password; 代码如下: 参考网络部分内容如模拟登录淘宝,模拟登录www.zhihu.com等内容。...

greenblue ⋅ 2015/08/20 ⋅ 0

PJBlog 5 云博客发布,老牌博客程序

采用BootStrap的UI设计框架,响应式后台,兼容最新的PC和手机端操作。内核架构全新升级,继承国际CommonJS规范,语法风格与NodeJS完全相同,IIS端的NodeJS语法。云端数据交互,博客圈等功能让...

oschina ⋅ 2015/01/02 ⋅ 12

resolvewang/smart_login

smart_login 本项目用于研究和分享各大网站的模拟登陆方式,主要使用selenium+phantomjs或者直接登录的方式,语言采用Python 关于 由于工作需要,研究了一段时间的新浪微博登陆方式,在网上也查...

resolvewang ⋅ 2017/05/07 ⋅ 0

开源中国千元悬赏活动结束,感谢@thilong的贡献

上周一,开源中国发布千元悬赏求修复 iPhone 客户端在 iOS 7 下的一个顽疾。发布当天 @thilong 就提交了修复该 Bug 的 Pull Requests。我们经过一周的测试,已经不再出现闪退的情况。 我们将...

红薯 ⋅ 2014/01/13 ⋅ 28

索尼Imageworks发布5个开源项目

索尼图形图像运作公司(索尼imageworks),是索尼图形数字产品的视觉效果和电脑动画制作公司。该公司日前表示将发布开源开发程序。 索尼图形图像运作公司已经使用创新科技来创建照片般真实的效...

红薯 ⋅ 2009/08/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Boot整合模板引擎thymeleaf

项目结构 引入依赖pom.xml <!-- 引入 thymeleaf 模板依赖 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId......

yysue ⋅ 16分钟前 ⋅ 0

ConstraintLayout使用解析

AndroidStudio3.0创建Project默认的布局就是ConstraintLayout。 AndroidStudio3.0前的可以自己修改,使用ConstraintLayout。 为了要使用ConstraintLayout,我们需要在app/build.gradle文件中...

_OUTMAN_ ⋅ 28分钟前 ⋅ 0

OSChina 周三乱弹 —— 这样的女人私生活太混乱了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 胖达panda :你经历过体验到人生的大起大落吗?我一朋友在10秒内体验了,哈哈。@小小编辑 请点一首《almost lover》送给他。 《almost love...

小小编辑 ⋅ 今天 ⋅ 9

自己动手写一个单链表

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对...

公众号_好好学java ⋅ 今天 ⋅ 0

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部