微博模拟登陆

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)的更多相关文章

  1. 验证码破解 | Selenium模拟登陆微博

    模拟登陆微博相对来说,并不难.验证码是常规的5个随机数字字母的组合,识别起来也比较容易.主要是用到许多Selenium中的知识,如定位标签.输入信息.点击等.如对Selenium的使用并不熟悉,请先移 ...

  2. Python模拟登陆万能法-微博|知乎

    Python模拟登陆让不少人伤透脑筋,今天奉上一种万能登陆方法.你无须精通HTML,甚至也无须精通Python,但却能让你成功的进行模拟登陆.本文讲的是登陆所有网站的一种方法,并不局限于微博与知乎,仅 ...

  3. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

  4. Python模拟登陆新浪微博

    上篇介绍了新浪微博的登陆过程,这节使用Python编写一个模拟登陆的程序.讲解与程序如下: 1.主函数(WeiboMain.py): import urllib2 import cookielib i ...

  5. python 模拟登陆,请求包含cookie信息

    需求: 1.通过GET方法,访问URL地址一,传入cookie参数 2.根据地址一返回的uuid,通过POST方法,传入cooki参数 实现思路: 1.理解http的GET和POST差别 (网上有很多 ...

  6. 【教程】手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程

    [前提] 想要实现使用某种语言,比如Python,C#等,去实现模拟登陆网站的话,首先要做的事情就是使用某种工具,去分析本身使用浏览器去登陆网页的时候,其内部的执行过程,内部逻辑. 此登陆的逻辑过程, ...

  7. 【教程】模拟登陆百度之Java代码版

    [背景] 之前已经写了教程,分析模拟登陆百度的逻辑: [教程]手把手教你如何利用工具(IE9的F12)去分析模拟登陆网站(百度首页)的内部逻辑过程 然后又去用不同的语言: Python的: [教程]模 ...

  8. python-微博模拟登陆

    微博的的模拟登陆是比较坑的,看了网上很多大神的帖子,自己又看了微博的登陆时的json数据:1.发现登陆时在输入账号时用chrome可以看到会有一个prelogin之类的网址,网址后面会有大串的随机数. ...

  9. python模拟登陆 pixiv

    ##---author:wuhao##在QQ群看到有群友在模拟登陆 pivix.cn 这个网站,闲来无事,我也写了一个测试一下,起初我把它想的复杂了,认为我需要获取服务器返回过来的Set-Cookie ...

随机推荐

  1. 微软为.NET程序员带来了最优的跨平台开发体验-WSL

    前言 在前几个Visual Studio Code更新中发现有一个重要得特性,就是nodejs可以使用VS Code在WSL中进行Debug了(WSL是指Win10中的Linux子系统),之前写过一篇 ...

  2. PHP基础 windows环境下安装Apache Mysql PHP

    本篇文章主要是讲一下我自己安装wamp环境的一些步骤和见解,前方多图预警,慎入!!!!! PHP运行环境  : Linux下的三种安装方式:源码包安装.rpm包安装.集成环境安装(lnmp) wind ...

  3. Openssl 生成证书server.key and server.crt

    1.key的生成 openssl genrsa -des3 -out server.key 2048 这样是生成rsa私钥,des3算法,openssl格式,2048位强度.server.key是密钥 ...

  4. python之 json里字典中的value去重

    import simplejson as json with open(r'C:\Users\Desktop\test.txt', 'r' ) as f1, open(r'C:\Users\Deskt ...

  5. centos yum install redis

    linux下yum安装redis以及使用 1.yum install redis      --查看是否有redis   yum 源 [root@localhost ~]# yum install r ...

  6. java 之 命令模式(大话设计模式)

    命令模式,笔者一直以为当我们开发的过程中基本上很难用到,直到维护阶段或者重构阶段,我们会发现有些撤销命令和追加命令比较频繁时,自然而然就用到命令模式. 先看下类图 大话设计模式-类图 简单说下类图,最 ...

  7. python入门基础

    Python 入门 变量 什么是变量?变量就是变化的量,核心是"变"和"量"两个字,变就是变化,量就是衡量状态. 为什么需要变量?程序执行的本质就是一系列状态的 ...

  8. HDU 1908 Double Queue(set)

    Problem Description The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in B ...

  9. 重要经验五:block作为属性的注意事项

    现代ios应用的开发.不使用GCD和block,效率会减少非常多,在今年3月份之前,我在block的学习和使用方面,精力和经验都明显不足,在SF有个牛逼同事.不仅自己积累了一套库,并且对这个库持续进行 ...

  10. 【SqlServer系列】语法定义符号解析

    1   概述 在数据库函数定义中,经常用到这些符号:<>,::=,[],{},|,..,(),!!   .这篇文章简要概述这些符号. 2   具体内容 2.1  <> < ...