IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> b站动态评论区抽奖 python版(已打包成exe,可以下载食用) -> 正文阅读

[Python知识库]b站动态评论区抽奖 python版(已打包成exe,可以下载食用)

前言

b站动态评论+视频评论区 抽奖2合1 JS版本发布后,计划了这次的python版本,本来的预期是实现同功能的python版并挂我服务器上免费提供抽奖服务来着。不过写着写着突然发现了之前对API的解析有所漏洞,导致我发现了一个新bug。。。(居然没人提醒我)
在这里插入图片描述
旧程序将全部的自发型动态归为type=11,今天测试时发现居然还有type=17的情况
请添加图片描述
于是乎 我就把原来的JS版的也改了,顺便把python的动态评论区抽奖给写了。

代码/exe下载

代码下载:GitHub 码云
exe程序下载:GitHub 码云(温馨提示:请勿随意执行来历不明的程序)
在这里插入图片描述

效果图

请添加图片描述

使用说明

1、双击运行bat文件

在这里插入图片描述

2、粘贴入 动态页面的链接 然后“回车”

在这里插入图片描述

3、输入中奖人数(要是数字) 然后“回车”

因为我没做校验(懒)
直接就运行完成了。会爬取所有评论人的数据到数据库(自动去重)
数据库文件在同一文件夹下“user_data.db
然后会直接抽取中奖用户并打印,复制中奖信息即可。
最后输入数字1,退出程序。
在这里插入图片描述

所有评论人员数据查看

评论人员数据存储于同一文件夹的“user_data.db”中
在这里插入图片描述
sqlite数据库,我使用 sqlitebrowser打开这个db文件
可以看到我们的user表
在这里插入图片描述
点击“浏览数据”,选择我们要查看的user表,即可看到所有用户数据
在这里插入图片描述
当然你也可以用网上的 随机数程序生成随机数,然后进行抽奖,问题不大0.0

源码

# -*- coding: utf-8 -*-
import json
import time
import random
import urllib.request
import urllib.parse
import sqlite3

print("*********************************************************************************")
print("***  欢迎使用 UP:Love丶伊卡洛斯 开发的b站抽奖程序 本程序开源免费          ")
print("***  请勿使用非本人仓库下载的程序,否则无法保证安全,未知程序谨慎使用        ")
print("***  本程序目前只支持动态评论的抽奖,视频评论区抽奖有待开发。。。           ")
print("***  使用注意:因为涉及本地文件的操作,如果失败,则需要\"超级管理员\"权限运行   ")
print("***  温馨提示:如果以下内容输错,请重新运行程序,异常数据处理懒得做了0.0     ")
print("*********************************************************************************")
referer = input("请输入动态链接:")
lucky_num = input("请输入中奖人数:")
have_pic = 1

id_set = set()
name_set = set()
lucky_set = set()

headers1 = {
    'Accept': 'application/json, text/plain, */*',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'Content-Type': 'text/plain;charset=UTF-8',
    'Referer': referer,
    'origin': 'https://t.bilibili.com',
    #'cookie': 'l=v',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3875.400 QQBrowser/10.8.4492.400'
}

# 配置数据库
def config_db():
    global con, cur
    con = sqlite3.connect("user_data.db")
    cur = con.cursor()
    # 创建表user
    sql = "CREATE TABLE IF NOT EXISTS user(mid TEXT PRIMARY KEY,uname TEXT,message TEXT)"
    cur.execute(sql)
    # 情况表数据
    sql = "delete from user"
    cur.execute(sql)


# 获取oid和评论数函数
def get_oid(referer):
    if(referer[8] == 't'):
        print('解析为动态页面')
    else:
        print('解析为视频页面')

    dynamic_id = referer[23:len(referer)-6]
    print("dynamic_id=" + dynamic_id)
    payload = {'dynamic_id': dynamic_id}
    data = urllib.parse.urlencode(payload)

    req = urllib.request.urlopen('https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail?%s'%data)
    ret = req.read().decode()

    # print(ret)
    json1 = json.loads(ret)
    oid = json1["data"]["card"]["desc"]["rid"]
    comment = json1["data"]["card"]["desc"]["comment"]
    # 判断动态类型
    type = json1["data"]["card"]["desc"]["type"]
    global have_pic
    if int(type) == 2:
        have_pic = 1
    else:
        have_pic = 0
    # print("oid=" + str(oid))
    base_info = {'oid': oid, 'comment': comment}
    return base_info

# 获取用户信息函数
def get_user_info(referer, base_info):
    print("开始获取用户信息...")
    if int(have_pic) == 1:
        type = 11
    else:
        type = 17
        base_info["oid"] = referer[23:len(referer)-6]
    end = 0
    for i in range(int((base_info["comment"] - 1) / 20) + 1):
        if i == 0:
            url = "https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next=0&type=" + str(type) + \
                  "&oid=" + str(base_info["oid"]) + "&mode=3&plat=1&_=" + str((int(round(time.time() * 1000)) + 1));
        else:
            url = "https://api.bilibili.com/x/v2/reply/main?jsonp=jsonp&next=" + str(i + 1) + "&type=" + str(type) + \
                  "&oid=" + str(base_info["oid"]) + "&mode=3&plat=1&_=" + str((int(round(time.time() * 1000)) + 1));

        if i == int((base_info["comment"] - 1) / 20):
            end = 1
        get_data(url, end)
        time.sleep(0.5)

# 获取数据函数
def get_data(url, end):
    req = urllib.request.urlopen(url)
    ret = req.read().decode()
    # print(ret)
    json1 = json.loads(ret)
    len1 = len(json1["data"]["replies"])
    # print(len1)
    for i in range(len1):
        mid = json1["data"]["replies"][i]["member"]["mid"]
        uname = json1["data"]["replies"][i]["member"]["uname"]
        message = json1["data"]["replies"][i]["content"]["message"]

        # 数据插入集合
        # name_set.add(uname)
        id_set.add(mid)
        # 数据插入数据库
        sql = "replace into user(mid, uname, message) values (?, ?, ?)"
        cur.execute(sql, (mid, uname, message))
        con.commit()

    # print("插入一组数据组")

    if end == 1:
        print("数据获取完毕!\n")
        # print(name_set)
        # print(id_set)
        while len(lucky_set) < int(lucky_num):
            num = random.randint(0, (len(id_set) - 1))
            lucky_set.add(num)
            # print(lucky_set)
        # id_list = list(id_set)
        # name_list = list(name_set)
        # for i in range(int(lucky_num)):
        #     print("昵称:" + name_list[i] + "  id:" + id_list[i] + "\n")

        for i in range(int(lucky_num)):
            lucky_list = list(lucky_set)
            # print("lucky_num=" + str(lucky_list[i]))
            sql = "select * from user limit " + str(lucky_list[i]) + ",1"
            cur.execute(sql)
            rows = cur.fetchall()
            for row in rows:
                print('\nid:%s  昵称:%s  评论:%s' % (row[0], row[1], row[2]))


# print(int(round(time.time() * 1000)))
# 获取oid和评论数
base_info = get_oid(referer)
print("oid=" + str(base_info["oid"]))
print("评论数=" + str(base_info["comment"]))
# 配置数据库
config_db()
# 获取用户信息并抽取幸运用户
get_user_info(referer, base_info)
# 关闭游标
cur.close()
# 断开数据库连接
con.close()

print("\n程序运行完毕!")
quit = 0
while quit != "1":
    quit = input("是否关闭程序(是1,否0):")
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-13 11:24:31  更:2021-10-13 11:25:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 20:07:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码