首页 > 其他分享 >B站协议登录到实现各种功能完整代码(专栏总结)

B站协议登录到实现各种功能完整代码(专栏总结)

时间:2024-10-21 09:46:30浏览次数:3  
标签:登录 url 代码 bilibili qrcode 专栏 print data response

B站协议登录、点赞、收藏、转发实现及代码

关注、动态转发实现动态抽奖实现及代码

直播预约抽奖实现及代码

本文为本专栏的总结文章

一、扫码登录

请求获取二维码包,得到二维码链接和qrcode_key参数之后,利用qrcode_key循环GET请求登录状态包即可,扫码成功时的响应中还会有一个URL和Cookie,只需要带Cookie访问这个URL即可成功登录

详细分析请看以下文章

B站扫码登录协议

获取二维码包

get请求  

https://passport.bilibili.com/x/passport-login/web/qrcode/generate?source=main-fe-header&go_url=https://www.bilibili.com/

登录状态包

get请求

https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key=e4bc73831b372f8fcd2a1e35e67ff981&source=main-fe-header

未扫码 

已扫码未确认

登录成功 

实现代码

def login_account(index):
    url = 'https://passport.bilibili.com/x/passport-login/web/qrcode/generate?source=main_web&go_url=https://space.bilibili.com&web_location=333.1228'
    response, cookies = get_url(url)
    if response:
        qrcode_url = response['data']['url']
        qrcode_key = response['data']['qrcode_key']
        print(f'QR Code URL: {qrcode_url}')
        print(f'QR Code Key: {qrcode_key}')
        print(f'Cookies: {cookies}')
        # 生成二维码并保存为图片文件
        qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_L,
            box_size=10,
            border=4,
        )
        qr.add_data(qrcode_url)
        qr.make(fit=True)
 
        img = qr.make_image(fill='black', back_color='white')
        qrcode_filename = f"qrcode_{index}.png"
        img.save(qrcode_filename)  # 保存二维码图片到文件
        print(f"二维码已生成并保存为 {qrcode_filename}")
        # 启动线程每隔5秒获取一次二维码状态
        polling_thread = threading.Thread(target=poll_qrcode_status, args=(qrcode_key, index))
        polling_thread.start()
    else:
        print("未能获取二维码信息")

def poll_qrcode_status(qrcode_key, index):
    while True:
        try:
            print(f"开始获取二维码状态,index: {index}")
            poll_url = f"https://passport.bilibili.com/x/passport-login/web/qrcode/poll?qrcode_key={qrcode_key}&source=navUserCenterLogin"
            print(f"Poll URL: {poll_url}")
            response, cookies = get_url(poll_url)
            print("二维码状态响应:")
            print(response)
            if response and 'data' in response and response['data'].get('url'):
                print(f"登录成功,跳转URL: {response['data']['url']}")
                login_response, login_cookies = get_url(response['data']['url'])
                print(f"登录后Cookies: {login_cookies}")
                cookie_string = save_cookies_as_string(login_cookies)
                dedeuserid = login_cookies.get("DedeUserID", "Unknown")
                bili_jct = login_cookies.get("bili_jct", "Unknown")
                login_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                save_login_data(dedeuserid, bili_jct, cookie_string, "1", login_time)
                print(f"登录数据已保存到 {csv_file}")
                # 执行deal_data.py
                #subprocess.run(["python", "deal_data.py"])
                break
        except Exception as e:
            print(f"获取二维码状态时出错, index: {index}, 错误: {e}")
        time.sleep(5)  # 每隔5秒获取一次状态

二、视频点赞|投币|收藏实现

获取收藏的aid,再通过Cookie以及Cookie中的csrf参数即可实现这三个功能

详细分析请看以下文章

b站视频点赞收藏投币协议实现

2.1点赞包 

POST请求   https://api.bilibili.com/x/web-interface/archive/like

原始表单数据aid=113173461999500&like=1&eab_x=1&ramval=7&source=web_normal&ga=1&csrf=46378a87cb7283a133e9c32b9c09bee7 

2.2收藏

POST 请求    https://api.bilibili.com/x/v3/fav/resource/deal

原始表单数据rid=113173461999500&type=2&add_media_ids=773769484&del_media_ids=&platform=web&eab_x=2&ramval=440&ga=1&gaia_source=web_normal&csrf=46378a87cb7283a133e9c32b9c09bee7

2.3投币

GET 请求   https://api.bilibili.com/x/v3/fav/folder/created/list-all?type=2&rid=113173461999500&up_mid=484733984

 实现代码

import requests
 #这是点赞的代码,其他两个改一下url和表单数据即可
def post_bilibili_like(cookie, aid, csrf_token):
    url = 'https://api.bilibili.com/x/web-interface/archive/like'
    # 表单数据
    data = {
        'aid': aid,
        'like': 1,
        'eab_x': 1,
        'ramval': 7,
        'source': 'web_normal',
        'ga': 1,
        'csrf': csrf_token
    }
    headers = {
        'Host': 'api.bilibili.com',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0',
        'Accept': 'application/json, text/plain, */*',
        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Accept-Encoding': 'gzip, deflate, br, zstd',
        'Referer': f'https://www.bilibili.com/video/BV{aid}',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Origin': 'https://www.bilibili.com',
        'Connection': 'keep-alive',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-site',
        'Pragma': 'no-cache',
        'Cache-Control': 'no-cache',
        'Cookie': cookie  #cookie
    }
    # 发送POST请求
    response = requests.post(url, headers=headers, data=data)
    # 返回请求结果
    if response.status_code == 200:
        return response.json()  # 返回JSON格式的数据
    else:
        return '点赞失败'
 

三、直播预约抽奖

通过搜索包搜索获取B站所有的动态抽奖文章,然后GET请求这些文章,得到reserve_id、dynamic_id_str、reserve_total即可成功实现批量直播预约抽奖

详细分析请看以下文章

B站直播预约抽奖协议

直播预约包

POST 请求  https://api.bilibili.com/x/dynamic/feed/reserve/click?csrf=46378a87cb7283a133e9c32b9c09bee7

原始表单数据 {"reserve_id":4073369,"cur_btn_status":1,"dynamic_id_str":"976127207527153680","reserve_total":25439,"spmid":""}

四、动态抽奖|关注|动态转发实现

通过搜索包搜索B站的动态抽奖链接、通过关注包以及转发包即可实现自动动态抽奖

具体分析请看以下文章

B站动态抽奖关注转发协议实现

4.1关注包

POST请求  https://api.bilibili.com//x/relation/modify

请求表单数据act=1&csrf=46378a87cb7283a133e9c32b9c09bee7&extend_content=%7B%22entity%22:%22dt%22,%22entity_id%22:%22977045888118554640%22,%22show_detail%22:1%7D&fid=1575718735&gaia_source=native_h5_main&platform=1&spmid=333.1330.join-btn.0

4.2转发包

POST请求 https://api.bilibili.com//x/dynamic/feed/create/dyn?csrf=46378a87cb7283a133e9c32b9c09bee7&platform=web&x-bili-device-req-json={"platform":"web","device":"pc"}&x-bili-web-req-json={"spm_id":"333.1330"}

 请求表单数据:{"dyn_req":{"content":{"contents":[]},"scene":4,"attach_card":null},"web_repost_src":{"dyn_id_str":"977045888118554640"}

实现代码

#转发
def post_url(uid, url, data=None, headers=None, cookie_string=None):
    try:
        if cookie_string:
            headers['Cookie'] = cookie_string
        session = requests.Session()
        response = session.post(url, data=data, headers=headers)
        print(f'状态码: {response.status_code}')
        if response.status_code == 200:
            try:
                if 'gzip' in response.headers.get('Content-Encoding', ''):
                    response_data = gzip.decompress(response.content).decode('utf-8')
                else:
                    response_data = response.text
                print("参与成功")
                try:
                    json_data = json.loads(response_data)
                    print("响应数据:", json_data)
                except json.JSONDecodeError:
                    pass
            except Exception as e:
                print("处理响应数据时出错:", e)
        else:
            print(f'请求失败,状态码:{response.status_code}')
            print("响应内容:", response.text)
    except Exception as e:
        print("请求过程中发生错误:", e)
 
data = {
    "dyn_req": {
        "content": {
            "contents": []
        },
        "scene": 4,
        "attach_card": None
    },
    "web_repost_src": {
        "dyn_id_str": article_id
    }
}
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0',
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
    'Accept-Encoding': 'gzip, deflate, br, zstd',
    'Content-Type': 'application/json',
    'Referer': 'https://www.bilibili.com/',
    'Origin': 'https://www.bilibili.com',
    'Connection': 'keep-alive',
}
post_url(uid,
         f'https://api.bilibili.com/x/dynamic/feed/create/dyn?csrf={bili_jct}&platform=web&x-bili-device-req-json=%7B%22platform%22:%22web%22,%22device%22:%22pc%22%7D&x-bili-web-req-json=%7B%22spm_id%22:%22333.1330%22%7D',
         json.dumps(data), headers, cookie_string)


#关注
def post_url(uid, url, data=None, headers=None, cookie_string=None):
    try:
        if cookie_string:
            headers['Cookie'] = cookie_string
        session = requests.Session()
        response = session.post(url, data=data, headers=headers)
        print(f'状态码: {response.status_code}')
        if response.status_code == 200:
            try:
                if 'gzip' in response.headers.get('Content-Encoding', ''):
                    response_data = gzip.decompress(response.content).decode('utf-8')
                else:
                    response_data = response.text
                print("参与成功")
                try:
                    json_data = json.loads(response_data)
                    print("响应数据:", json_data)
                except json.JSONDecodeError:
                    pass
            except Exception as e:
                print("处理响应数据时出错:", e)
        else:
            print(f'请求失败,状态码:{response.status_code}')
            print("响应内容:", response.text)
    except Exception as e:
        print("请求过程中发生错误:", e)
 
 
uid = result['uid']
data = {
    'fid': uid,
    'act': '1',
    're_src': '0',
    'csrf': bili_jct,
    'spmid': '333.1368',
}
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0',
    'Accept': 'application/json, text/plain, */*',
    'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
    'Accept-Encoding': 'gzip, deflate, br, zstd',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Referer': 'https://www.bilibili.com/read/cv34766197/',
    'Origin': 'https://www.bilibili.com',
    'Connection': 'keep-alive',
}
post_url(uid, 'https://api.bilibili.com/x/relation/modify', data, headers, cookie_string)

标签:登录,url,代码,bilibili,qrcode,专栏,print,data,response
From: https://blog.csdn.net/qq_37454479/article/details/143103168

相关文章

  • 看看硬件工程师是如何写代码的(二),榨干CPU的性能
     更多电路设计,PCB设计分享及分析,可关注本人微信公众号“核桃设计分享”!目前本人已经不再写代码了,只是想把自己走过的弯路,踩过的坑分享出来,希望更多的小伙伴能看到,少走弯路,仅供参考哈!这章重点给新手们提供一个能最大利用CPU性能的程序架构思路,具体程序就不再展示了。前言......
  • 前言——25机械考研复试专业面试问题汇总 机械复试超全流程攻略 机械复试看这一个专栏
    一、开篇寄语:在准备考研复试的关键时期,许多学弟学妹们往往会寻求各种资料来辅助复习,市面上也因此涌现了大量的“考研复试全流程全攻略”。然而,这些攻略往往存在以下问题:1、内容不完整性遗漏关键信息:许多攻略在描述考研复试流程时,未能全面覆盖所有关键环节,导致考生可能忽视某......
  • 深度学习代码结构分析(之常见文件夹的作用)
    记录一下小白对深度学习论文代码的分析对于初次接触开源项目代码的人来说,看不明白这些众多的文件夹和文件是干什么的,其实很多文件夹和文件有自己比较固定的内容,以下整理一些常见的文件夹的含义。1.__pycache__文件夹:(编译自动产生)__pycache__文件夹是什么,是缓存文件吗,可以删除......
  • 手写Java代码生成工具(五)生成service和serviceImpl文件
    目录前言一、创建service文件以及导入所需的类二、生成service类需要的方法三、创建ServiceImpl文件以及生成导入语句四、生成的ServiceImpl类文件中添加内容五、遍历索引,生成基础增删改查前言写博客是为了记录和分享自己的学习,所分享内容是网上的资源,由于非原创项......
  • 10.19 窗口1.0(之后会完善代码,学到哪完善到哪)
    JFrame类的实例是一个底层容器(窗口)其他组件必须被添加到底层容器中,以便借助这个容器和操作系统进行信息交互。Jframe类是Container类的间接子类。当需要一个窗口时,可使用JFrame或其子类创建一个对象。窗口不能添加到另一个容器中JFrame()创建一个无标题窗口JFrame(Strings)创......
  • 使用 JavaScript (Node.js) 实现验证码识别与自动化登录
    安装所需依赖首先,确保你已经安装了Node.js。然后,使用npm安装所需的库:bashnpminstallaxiosjimptesseract.js2.下载验证码图片使用axios下载验证码图片并保存到本地:更多内容联系1436423940javascriptconstfs=require('fs');constaxios=require('axios');......
  • 代码随想录算法训练营 | 739. 每日温度,496.下一个更大元素 I ,503.下一个更大元素II
    739.每日温度题目链接:739.每日温度文档讲解︰代码随想录(programmercarl.com)视频讲解︰每日温度日期:2024-10-20想法:遍历一遍数组,用栈来存数组下标做记录,因为要找更高得温度,当当前遍历的温度大于栈头存储(存的下标)的温度时,就可以知道栈头要过多少天遇到高温,低的时候直接入栈。J......
  • 生命游戏串行代码实现(Java)
    目录生命游戏介绍一、效果展示1.初始界面2.启动游戏二、代码实现三、代码解释1.常量设置2.图形化3.计算“生死”情况与统计邻居细胞数量结语生命游戏介绍        生命游戏,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。        一......
  • 微信小程序毕业设计-基于springboot+协同过滤推荐算法的成都美食分享系统设计和实现,基
    博主介绍:✌️码农一枚,专注于大学生项目实战开发、讲解和毕业......
  • 读《代码大全》有感
    在老师的推荐以及指导下,我对《代码大全》进行了拜读,这本经典著作不仅是一本技术手册,更是一本指南,给我带来了深刻的启发。通过这本书,我知道了,代码质量的重要性,书中反复强调代码的可读性,可维护性和可拓展性,这让我意识到,一个真正合格的代码,他不仅是能工作,解决目前的需求,能理解,能维护......