微博html5版登录,新浪微博模拟登录 支持手动处理验证码

[Python] 纯文本查看 复制代码"""

参考https://github.com/CharlesPikachu/DecryptLogin/blob/master/DecryptLogin/platforms/weibo.py

"""

import requests

import base64

import time

import random

# rsa用的是PKCS1_v1_5填充

import rsa

import re

import json

from Crypto.PublicKey import RSA

from Crypto.Cipher import PKCS1_OAEP

from Crypto.Cipher import PKCS1_v1_5

from binascii import b2a_hex

from PIL import Image

import warnings

# 过滤警告信息

warnings.filterwarnings('ignore')

class weibo:

def __init__(self):

self.session = requests.Session()

self.headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'

}

self.prelogin_url = 'https://login.sina.com.cn/sso/prelogin.php'

self.ssologin_url = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.19)'

self.pin_url = 'https://login.sina.com.cn/cgi/pin.php'

self.login_url = 'https://passport.weibo.com/wbsso/login?'

self.home_url = 'https://weibo.com/u/%s/home'

def get_prelogin_info(self,username,password):

""" 请求prelogin_url得到RSA加密的参数 """

su = base64.b64encode(username.encode())

su = str(su,'utf-8')

params = {

'entry': 'account',

# 'callback': 'sinaSSOController.preloginCallBack',

'su': su,

'rsakt': 'mod',

'client': 'ssologin.js(v1.4.15)',

'_': str(int(time.time()*1000))

}

# verify=False 不加也可以返回数据

res = self.session.get(self.prelogin_url, params=params, verify=False)

return res.json()

def get_pin(self):

""" 保存验证码图片 """

r = int(random.random()*100000000)

params = {

'r': str(r),

's': '0',

}

response = self.session.get(self.pin_url,params=params)

if response.status_code ==200:

with open('pin_img.png','wb') as f:

f.write(response.content)

f.close()

print('had saved Captcha.')

# Image好像会调用默认的图片查看器打开图片

I = Image.open('pin_img.png')

I.show()

Captcha_value = input('enter the Captcha value:')

return Captcha_value

def post_login_data(self,username,password,Captcha_value=None):

""" post请求登录 """

p = self.get_prelogin_info(username,password)

# 用不同的库实现RSA加密 都可行

""" RSA库实现 """

# publickey = rsa.PublicKey(int(p['pubkey'], 16), int('10001', 16))

# sp = rsa.encrypt((str(p['servertime'])+'\t'+p['nonce']+'\n'+password).encode(), publickey)

""" 用pycryptodome库实现 """

rsa_public_key = RSA.construct((int(p['pubkey'],16),int('10001',16)))

cipher_rsa = PKCS1_v1_5.new(rsa_public_key)

sp2 = cipher_rsa.encrypt((str(p['servertime'])+'\t'+p['nonce']+'\n'+password).encode())

# 返回的二进制数据的十六进制表示

sp = b2a_hex(sp2)

data_post = {

'entry': 'account',

'gateway': '1',

'from': '',

'savestate': '30',

'useticket': '0',

'pagerefer': '',

'vsnf': '1',

'su': base64.b64encode(username.encode()),

'service': 'account',

'servertime': str(int(p['servertime'])+random.randint(1, 20)),

'nonce':p['nonce'],

'pwencode': 'rsa2',

'rsakv': p['rsakv'],

'sp': sp,

'sr': '1366*768',

'encoding': 'UTF-8',

'cdult': '3',

'domain': 'sina.com.cn',

'prelt': '95',

'returntype': 'TEXT',

}

if Captcha_value:

data_post['door'] = Captcha_value

res = self.session.post(self.ssologin_url, data=data_post,allow_redirects=False, verify=False)

if res.status_code==200:

return res.json()

def check_at_login_url(self,res,username):

ticket, ssosavestate = re.findall(r'ticket=(.*?)&ssosavestate=(.*?)"', res)[0]

# 请求login_url

params = {

'ticket': ticket,

'ssosavestate': str(ssosavestate),

'callback': 'sinaSSOController.doCrossDomainCallBack',

'scriptId': 'ssoscript0',

'client': 'ssologin.js(v1.4.19)',

'_': str(int(time.time() * 1000))

}

params = '&'.join(['%s=%s' % (key, value) for key, value in params.items()])

res = self.session.get(self.login_url+params, verify=False)

uid = re.findall(r'"uniqueid":"(.*?)"', res.text)[0]

res = self.session.get(self.home_url % uid, verify=False)

if '我的首页' in res.text:

print('[INFO]: Account -> %s, login successfully...' % username)

infos_return = {'username': username}

return infos_return, self.session

def login(self,username,password):

res = self.post_login_data(username,password)

while True:

if res['retcode']=='0':

infos_return,login_session = self.check_at_login_url(json.dumps(res),username)

if login_session:

return login_session

break

elif res['retcode']=='101':

# 用户名或密码不正确

print(res['reason'])

break

elif res['retcode']=='4049':

# 需要验证码

print(res['reason'])

res = self.post_login_data(username,password,self.get_pin())

elif res['retcode']=='2070':

# 验证码错误

print(res['reason'])

res = self.post_login_data(username,password,self.get_pin())

else:

print(res)

break

if __name__ == "__main__":

t = weibo()

# t.login('用户名','密码')

login_session = t.login('','')

# print(login_session.cookies)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您想了解如何使用 Python 模拟登录新浪微博。这是一个比较复杂的过程,需要使用到一些网络编程技术。以下是大致的步骤: 1. 打开新浪微博登录页面,获取登录页面的 HTML 代码。 2. 解析登录页面的 HTML 代码,获取登录所需的参数,如登录表单的 action、用户名和密码的 input 标签名称等。 3. 构造 POST 请求,将用户名和密码等参数以表单形式提交给登录表单的 action 地址。 4. 发送 POST 请求,获取登录后的页面 HTML 代码。 5. 解析登录后的页面 HTML 代码,判断登录是否成功。 以下是一个简单的示例代码,可以帮助您更好地理解该过程: ```python import requests from bs4 import BeautifulSoup # 1. 获取登录页面的 HTML 代码 login_url = 'https://weibo.com/login.php' response = requests.get(login_url) html = response.text # 2. 解析登录页面的 HTML 代码,获取登录所需的参数 soup = BeautifulSoup(html, 'html.parser') login_action = soup.find('form', attrs={'name': 'loginform'})['action'] login_username = soup.find('input', attrs={'name': 'username'})['name'] login_password = soup.find('input', attrs={'name': 'password'})['name'] # 3. 构造 POST 请求,将用户名和密码等参数以表单形式提交给登录表单的 action 地址 data = { 'username': 'your_username', 'password': 'your_password', 'savestate': '1', 'r': '', 'ec': '0', 'pagerefer': '', 'entry': 'mweibo', 'mainpageflag': '1' } post_url = f'https://weibo.com/{login_action}' response = requests.post(post_url, data=data) # 4. 发送 POST 请求,获取登录后的页面 HTML 代码 html = response.text # 5. 解析登录后的页面 HTML 代码,判断登录是否成功 soup = BeautifulSoup(html, 'html.parser') if soup.find('a', attrs={'title': '我的首页'}): print('登录成功') else: print('登录失败') ``` 需要注意的是,该示例代码中使用了 requests 库和 BeautifulSoup 库,需要安装后才能运行。此外,登录过程可能会因为验证码等原因而变得更加复杂,需要您自行处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值