关于模拟登陆微博(PC)
微博模拟登陆
1.基类对象的方法
建立一个类
__init__初始化方法,接收username和password。
class launcher():
def __init__(self, username, password):
self.password = password
self.username = username
2.定义一个函数,目的用于取到nonce , servertime , pubkey信息
伪造一个request用于获取预登陆信息
def get_prelogin_args(self):
json_pattern = re.compile('\((.*)\)') 这个是我输入账号但是没登录得到的一个json文件
url = 'https://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&' + self.get_encrypted_name() + '&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)'
try:
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
raw_data = response.read().decode('utf-8')
json_data = json_pattern.search(raw_data).group(1)
data = json.loads(json_data)
return data
except urllib.error as e:
print("%d" % e.code)
return None
3.定义一个方法,解密rsa加密的密码,其中必须的pubkey , nonce , rsakv等关键字使用一个字典data 传入
def get_encrypted_pw(self, data):
rsa_e = 65537 # 0x10001(转换成10进制)
pw_string = str(data['servertime']) + '\t' + str(data['nonce']) + '\n' + str(self.password)
key = rsa.PublicKey(int(data['pubkey'], 16), rsa_e)
pw_encypted = rsa.encrypt(pw_string.encode('utf-8'), key)
self.password = '' # 清空password
passwd = binascii.b2a_hex(pw_encypted) #换成16进制
print(pw_encypted)
print(passwd)
return passwd
4.定义一个方法,解密base64加密的账号(手机账号会被混淆,%3D是=号,邮箱账号@会变成%40)
def get_encrypted_name(self):
username_urllike = urllib.request.quote(self.username)
username_encrypted = base64.b64encode(bytes(username_urllike, encoding='utf-8'))
return username_encrypted.decode('utf-8')
5.建立一个cookie容器用于整个登录过程的cookie的绑定
def enableCookies(self):
# 建立一个cookies 容器
cookie_container = http.cookiejar.CookieJar()
# 将一个cookies容器和一个HTTP的cookie的处理器绑定
cookie_support = urllib.request.HTTPCookieProcessor(cookie_container)
# 创建一个opener,设置一个handler用于处理http的url打开
opener = urllib.request.build_opener(cookie_support, urllib.request.HTTPHandler)
# 安装opener,此后调用urlopen()时会使用安装过的opener对象
urllib.request.install_opener(opener)
6.POST表单提交
def build_post_data(self, raw):
post_data = {
"entry": "weibo",
"gateway": "1",
"from": "",
"savestate": "7",
"useticket": "1",
"pagerefer": "https://www.baidu.com/link?url=2m74RGf8hzJIXFwGexWMuQWqqmvcpu-nMjK8cyuZIcC&wd=&eqid=85fee59800006e0c000000025a4cbc7b",
"vsnf": "1",
"su": self.get_encrypted_name(),
"service": "miniblog",
"servertime": raw['servertime'],
"nonce": raw['nonce'],
"pwencode": "rsa2",
"rsakv": raw['rsakv'],
"sp": self.get_encrypted_pw(raw),
"sr": "1366*768",
"encoding": "UTF-8",
"prelt": "854",
"url": "https://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack",
"returntype": "MENT"
}
data = urllib.parse.urlencode(post_data).encode('utf-8')
return data
7.开始登录
def login(self):
url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)'
self.enableCookies()
data = self.get_prelogin_args()
post_data = self.build_post_data(data)
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36"
}
try:
request = urllib.request.Request(url=url, data=post_data, headers=headers)
response = urllib.request.urlopen(request)
html = response.read().decode('GBK')
print(html)
except urllib.error as e:
print('-------------------------')
print(e.code)
打印出
html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title>新浪通行证</title>
<script charset="utf-8" src="https://i.sso.sina.com.cn/js/ssologin.js"></script>
</head>
<body>
正在登录 ...
<script>
try{sinaSSOController.setCrossDomainUrlList({"retcode":0,"arrURL":["https:\/\/passport.97973.com\/sso\/crossdomain?action=login&savestate=1546602068","https:\/\/passport.krcom.cn\/sso\/crossdomain?service=krvideo&savestate=1&ticket=ST-NTgxNjY5MjI5NQ%3D%3D-1515066068-tc-85B8AE28E184F1A1E0435DA6D4DFBBA3-1&ssosavestate=1546602068","https:\/\/passport.weibo.cn\/sso\/crossdomain?action=login&savestate=1"]});}
catch(e){
var msg = e.message;
var img = new Image();
var type = 1;
img.src = 'https://login.sina.com.cn/sso/debuglog?msg=' + msg +'&type=' + type;
}try{sinaSSOController.crossDomainAction('login',function(){location.replace('https://passport.weibo.com/wbsso/login?ssosavestate=1546602068&url=https%3A%2F%2Fweibo.com%2Fajaxlogin.php%3Fframelogin%3D1%26callback%3Dparent.sinaSSOController.feedBackUrlCallBack&display=0&ticket=ST-NTgxNjY5MjI5NQ==-1515066068-tc-240ED98A102AB2CF543CA399EF087D0C-1&retcode=0');});}
catch(e){
var msg = e.message;
var img = new Image();
var type = 2;
img.src = 'https://login.sina.com.cn/sso/debuglog?msg=' + msg +'&type=' + type;
}
</script>
</body>
</html>
8.第一次重定向
p = re.compile('location\.replace\([\'"](.*?)[\'"]\)')
try:
login_url = p.search(html).group(1)
print(login_url)
request = urllib.request.Request(login_url)
response = urllib.request.urlopen(request)
page = response.read().decode('GBK')
print(page)
打印出
<html><head><script language='javascript'>parent.sinaSSOController.feedBackUrlCallBack({"result":true,"userinfo":{"uniqueid":"5816692295","userid":null,"displayname":null,"userdomain":"?wvr=5&lf=reg"}});</script></head><body></body></html>
9.第二次重定向
p2 = re.compile(r'"userdomain":"(.*?)"')
try:
login_url = 'http://weibo.com/' + p2.search(page).group(1)
print(login_url)
request = urllib.request.Request(login_url)
response = urllib.request.urlopen(request)
final = response.read().decode('utf-8')
print(final)
完整代码
import urllib.error
import urllib.request
import re
import rsa
import http.cookiejar # 从前的cookielib
import base64
import json
import urllib
import urllib.parse
import binascii # 用于模拟登陆新浪微博 class launcher():
def __init__(self, username, password):
self.password = password
self.username = username def get_prelogin_args(self): '''
该函数用于模拟预登录过程,并获取服务器返回的 nonce , servertime , pub_key 等信息
'''
json_pattern = re.compile('\((.*)\)')
url = 'https://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&' + self.get_encrypted_name() + '&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)'
try:
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
raw_data = response.read().decode('utf-8')
json_data = json_pattern.search(raw_data).group(1)
data = json.loads(json_data)
return data
except urllib.error as e:
print("%d" % e.code)
return None def get_encrypted_pw(self, data):
rsa_e = 65537 # 0x10001
pw_string = str(data['servertime']) + '\t' + str(data['nonce']) + '\n' + str(self.password)
key = rsa.PublicKey(int(data['pubkey'], 16), rsa_e)
pw_encypted = rsa.encrypt(pw_string.encode('utf-8'), key)
self.password = '' # 清空password
passwd = binascii.b2a_hex(pw_encypted)
print(pw_encypted)
print(passwd)
return passwd def get_encrypted_name(self):
username_urllike = urllib.request.quote(self.username)
username_encrypted = base64.b64encode(bytes(username_urllike, encoding='utf-8'))
return username_encrypted.decode('utf-8') def enableCookies(self):
# 建立一个cookies 容器
cookie_container = http.cookiejar.CookieJar()
# 将一个cookies容器和一个HTTP的cookie的处理器绑定
cookie_support = urllib.request.HTTPCookieProcessor(cookie_container)
# 创建一个opener,设置一个handler用于处理http的url打开
opener = urllib.request.build_opener(cookie_support, urllib.request.HTTPHandler)
# 安装opener,此后调用urlopen()时会使用安装过的opener对象
urllib.request.install_opener(opener) def build_post_data(self, raw):
post_data = {
"entry": "weibo",
"gateway": "1",
"from": "",
"savestate": "7",
"useticket": "1",
"pagerefer": "https://www.baidu.com/link?url=2m74RGf8hzJIXFwGexWMuQWqqmvcpu-nMjK8cyuZIcC&wd=&eqid=85fee59800006e0c",
"vsnf": "1",
"su": self.get_encrypted_name(),
"service": "miniblog",
"servertime": raw['servertime'],
"nonce": raw['nonce'],
"pwencode": "rsa2",
"rsakv": raw['rsakv'],
"sp": self.get_encrypted_pw(raw),
"sr": "1366*768",
"encoding": "UTF-8",
"prelt": "854",
"url": "https://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack",
"returntype": "MENT"
}
data = urllib.parse.urlencode(post_data).encode('utf-8')
return data def login(self):
url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)'
self.enableCookies() data = self.get_prelogin_args()
post_data = self.build_post_data(data)
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36"
}
try:
request = urllib.request.Request(url=url, data=post_data, headers=headers)
response = urllib.request.urlopen(request)
html = response.read().decode('GBK')
print(html)
except urllib.error as e:
print('-------------------------')
print(e.code) p = re.compile('location\.replace\([\'"](.*?)[\'"]\)')
p2 = re.compile(r'"userdomain":"(.*?)"') try:
login_url = p.search(html).group(1)
print(login_url)
request = urllib.request.Request(login_url)
response = urllib.request.urlopen(request)
page = response.read().decode('GBK')
print(page)
login_url = 'http://weibo.com/' + p2.search(page).group(1)
print(login_url)
request = urllib.request.Request(login_url)
response = urllib.request.urlopen(request)
final = response.read().decode('utf-8')
print(final)
except Exception as err:
print(err)
# return 0 if __name__ == '__main__':
launcher = launcher('', '') # 邮箱(账号)、密码
if launcher.login() == True:
print("登陆成功!")
关于模拟登陆微博(PC)的更多相关文章
- 验证码破解 | Selenium模拟登陆微博
模拟登陆微博相对来说,并不难.验证码是常规的5个随机数字字母的组合,识别起来也比较容易.主要是用到许多Selenium中的知识,如定位标签.输入信息.点击等.如对Selenium的使用并不熟悉,请先移 ...
- Python模拟登陆万能法-微博|知乎
Python模拟登陆让不少人伤透脑筋,今天奉上一种万能登陆方法.你无须精通HTML,甚至也无须精通Python,但却能让你成功的进行模拟登陆.本文讲的是登陆所有网站的一种方法,并不局限于微博与知乎,仅 ...
- Python 爬虫模拟登陆知乎
在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...
- Python模拟登陆新浪微博
上篇介绍了新浪微博的登陆过程,这节使用Python编写一个模拟登陆的程序.讲解与程序如下: 1.主函数(WeiboMain.py): import urllib2 import cookielib i ...
- python 模拟登陆,请求包含cookie信息
需求: 1.通过GET方法,访问URL地址一,传入cookie参数 2.根据地址一返回的uuid,通过POST方法,传入cooki参数 实现思路: 1.理解http的GET和POST差别 (网上有很多 ...
- 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程
[前提] 想要实现使用某种语言,比如Python,C#等,去实现模拟登陆网站的话,首先要做的事情就是使用某种工具,去分析本身使用浏览器去登陆网页的时候,其内部的执行过程,内部逻辑. 此登陆的逻辑过程, ...
- 【教程】模拟登陆百度之Java代码版
[背景] 之前已经写了教程,分析模拟登陆百度的逻辑: [教程]手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程 然后又去用不同的语言: Python的: [教程]模 ...
- python-微博模拟登陆
微博的的模拟登陆是比较坑的,看了网上很多大神的帖子,自己又看了微博的登陆时的json数据:1.发现登陆时在输入账号时用chrome可以看到会有一个prelogin之类的网址,网址后面会有大串的随机数. ...
- python模拟登陆 pixiv
##---author:wuhao##在QQ群看到有群友在模拟登陆 pivix.cn 这个网站,闲来无事,我也写了一个测试一下,起初我把它想的复杂了,认为我需要获取服务器返回过来的Set-Cookie ...
随机推荐
- Android OpenGL ES 开发(二): OpenGL ES 环境搭建
零:环境搭建目的 为了在Android应用程序中使用OpenGL ES绘制图形,必须要为他们创建一个视图容器.其中最直接或者最常用的方式就是实现一个GLSurfaceView和一个GLSurfaceV ...
- 利用nginx实现负载均衡和动静分离
1.Nginx介绍 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器 . Nginx 是由 ...
- 主流PHP框架间的比较(Zend Framework,CakePHP,CodeIgniter,Symfony,ThinkPHP,FleaPHP)
Zend Framework 优点: Zend Framework大量应用了PHP5中面向对象的新特征:接口.异常.抽象类.SPL等等.这些东西的应用让Zend Framework具有高度的模块化和灵 ...
- oracle中 常用的 join on 相关和 集合运算的总结
sql常用联合查询的 join on . left join(左连接) . right join (右连接).inner join (等值连接)以及常用的集合运算有:union.unionall.mi ...
- Java学习之计算机基础(一)
阅读本文大概需要 4 分钟 想要开始学习Java开发,需要掌握一些必要的计算机基础.如果你是计算机专业的人或者已经学过类似的课程,可以跳过这篇文章的阅读.计算机基础课程有很多,小编在大学里学过的课程就 ...
- 关于C#中函数声明带参数的函数
在C#语言的函数中,有一项至关重要的我们称之为参数. 对于参数的含义:要完成一件事,需要知道的额外条件 其语法: static void 函数名(参数列表){ //注释类容} 而其参数列表的语法为: ...
- mysql中对字符集和校对规则的认识
字符集:指符号和字符编码的集合.校对规则:比较字符编码的方式.GBK2312:主要包括简体中文字符及常用符号,对于中文字符采用双字节编码的格式,也就是说一个汉字字符在存储占两个字节.GBK:包括有中. ...
- Python爬虫Scrapy(二)_入门案例
本章将从案例开始介绍python scrapy框架,更多内容请参考:python学习指南 入门案例 学习目标 创建一个Scrapy项目 定义提取的结构化数据(Item) 编写爬取网站的Spider并提 ...
- Jquery 改变样式
Jquery简单的操作 Jquery 是一个非常好用JS库,有很多的特殊的操作,为了方便,我们都可以引入Jquery. <script src="dist/js/vendor/jque ...
- NFV、DPDK以及部分用户态协议研究
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 对我而言,这是一个新的领域,很有意思. 一.解释名词: NFV(Network Functio ...