pythonurllib登录微博账号_python关于模拟登陆微博(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>

新浪通行证

正在登录 ...

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值