Python模拟登陆 —— 征服验证码 2 B站

简介: B站的登录密码用了rsa加密(两个大质数的乘积很难进行逆向分解,所以可以用这个乘积来做公钥)。所以运行py文件之前,使用镜像,先用pip安装rsa库:pip install rsa -i https://pypi.

B站的登录密码用了rsa加密(两个大质数的乘积很难进行逆向分解,所以可以用这个乘积来做公钥)。
所以运行py文件之前,使用镜像,先用pip安装rsa库:

pip install rsa -i https://pypi.tuna.tsinghua.edu.cn/simple/

运行:

import requests
import re
import time
import sys
import json  
import rsa
import os.path
import binascii
import datetime
from bs4 import BeautifulSoup
try:
    import cookielib
except:
    import http.cookiejar as cookielib

try:
    from PIL import Image
except:
    pass
    
session = requests.Session()
session.headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0',
    'Connection': 'keep-alive',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
}

# 使用登录cookie信息
session = requests.session()
session.cookies = cookielib.LWPCookieJar(filename='cookies')
try:
    session.cookies.load(ignore_discard=True)
except:
    print("Cookie 未能加载")

def rsaEncrypt(password):
    url = 'http://passport.bilibili.com/login?act=getkey'
    try:
        getKeyRes = session.get(url)
        token = json.loads(getKeyRes.content.decode('utf-8'))
        pw = str(token['hash'] + password).encode('utf-8')

        key = token['key']
        key = rsa.PublicKey.load_pkcs1_openssl_pem(key)

        pw = rsa.encrypt(pw, key)
        password = binascii.b2a_base64(pw)
        return password
    except:
        return False

def get_vdcode():
    t = str(int(time.time()*1000))
    captcha_url = 'https://passport.bilibili.com/captcha.gif?r=' + t + "&type=login"
    r = session.get(captcha_url)
    with open('captcha.jpg', 'wb') as f:
        f.write(r.content)
        f.close()
    # 用pillow 的 Image 显示验证码
    # 如果没有安装 pillow 到源代码所在的目录去找到验证码然后手动输入
    try:
        im = Image.open('captcha.jpg')
        im.show()
        im.close()
    except:
        print(u'请到 %s 目录找到captcha.jpg 手动输入' % os.path.abspath('captcha.jpg'))
    captcha = input("please input the captcha\n>")
    return captcha
    
def login(user, password):
    post_url = 'https://passport.bilibili.com/login/dologin'
    payload = {
        'act': 'login',
        'gourl': '',
        'keeptime': '2592000',
        'userid': user,
        'pwd': password,
        'vdcode': get_vdcode(),
    }
    if payload["vdcode"] == None:
        return False

    try:
        resp = session.post(post_url, data=payload)
        session.cookies.save()

        soup = BeautifulSoup(resp.content, 'lxml')
        s = str(soup.select('center')[0])
        s = s.replace('\n', '')
        s = s.replace('\r', '')
        s = s.replace(' ', '')
        s = s.split('>')
        s = s[2]
        s = s.replace('<br/', '')
        flash(s)
        return False
    except requests.exceptions.ConnectionError as e:
        flash(e)
        return False
    except:
        return True

def isLogin():
    url = 'https://account.bilibili.com/home/userInfo'
    resp = session.get(url, allow_redirects=False)
    if  resp.status_code == 200 and resp.json()['code'] == 0:
        return True
    else:
        return False

if __name__ == '__main__':
    if isLogin():
        print('您已经登录')
    else:
        account = input('请输入你的用户名:')
        password = input('请输入密码:')
        login(account, rsaEncrypt(password))

滑块验证见http://www.jianshu.com/p/7623ff64ee54

img_d4b83a1a114a9e45d25ece176723087e.png
登录界面

img_640c74f4bb49089767bbc3aec946b7ab.jpe
一张有趣的合照
目录
相关文章
|
23天前
|
数据采集 自然语言处理 API
Python反爬案例——验证码的识别
Python反爬案例——验证码的识别
28 2
|
27天前
|
数据采集 自然语言处理 Python
用 Python 生成并识别图片验证码
用 Python 生成并识别图片验证码
23 1
|
24天前
|
数据采集 消息中间件 API
Python爬虫验证码识别——手机验证码的自动化处理
Python爬虫验证码识别——手机验证码的自动化处理
32 0
|
27天前
|
文字识别 开发者 iOS开发
Python反爬机制-验证码(一)
Python反爬机制-验证码(一)
17 0
|
27天前
|
人工智能 文字识别 API
Python反爬机制-验证码(二)
Python反爬机制-验证码(二)
14 0
|
文字识别 Python
关于利用python进行验证码识别的一些想法
转载请注明:@小五义http://www.cnblogs.com/xiaowuyi         用python加“验证码”为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章。我大体看了一下,主要方法有几类:一类是通过对图片进行处理,然后利用字库特征匹配的方法,一类是图片处理后建立字符对应字典,还有一类是直接利用ocr模块进行识别。
1027 0
|
6天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
1天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
6天前
|
弹性计算 安全 小程序
编程之美:Python让你领略浪漫星空下的流星雨奇观
这段代码使用 Python 的 `turtle` 库实现了一个流星雨动画。程序通过创建 `Meteor` 类来生成具有随机属性的流星,包括大小、颜色、位置和速度。在无限循环中,流星不断移动并重新绘制,营造出流星雨的效果。环境需求为 Python 3.11.4 和 PyCharm 2023.2.5。
26 9