B站动态转发抽奖脚本+教程

此版本可能不兼容了,推荐使用下面这个文章的新版本(暂时保持维护的版本)

🧐🧐🧐 推荐 python b站动态转发、动态评论区抽奖(已打包成exe,可以下载食用)
如果是python3可以参考底部的源码

重要提醒!!!

经过大数据量测试后发现,程序不能爬取多转发人数的所有数据。原因是程序内API的数据不全,并没有提供所有的转发人员数据,导致数据的缺失。
测试数据量 转发人数6w+,而https://api.live.bilibili.com/dynamic_repost/v1/dynamic_repost/view_repost?dynamic_id=346409930135375313&offset= 只能到五百多就停了(即只能获取到最后转发的五百多人,不排除重复)。

中英版程序已打包exe

下载地址:传送门(点我)
采用pyinstaller打包
在这里插入图片描述

运行python脚本需要的条件:

1、连通的网络
2、已安装Python2并配置环境变量
3、Python脚本源码

环境搭建:

网络就不用我说了(〃‘▽’〃) 那么下面我们来安装python吧。
Python官网有2个版本2和3,我们选择2,因为语法等方面会有所不同。
Python2下载:https://www.python.org/downloads/windows/
在这里插入图片描述
具体安装教学可百度,或参考 教程:https://www.runoob.com/python/python-install.html
记得要配置环境变量。

环境变量配置方法

“计算机”右键-> “属性”->“高级系统设置”->“环境变量”-> 系统变量中找到“Path”->“编辑”->“新建”-> 将你python安装的路径粘贴进去-> 全部“确认”。
在这里插入图片描述
在这里插入图片描述

测试python是否配置完成。
按Win+R 键,输入“cmd”,“确认”。
在这里插入图片描述

成功运行python命令即表示成功。
在这里插入图片描述

编写脚本:

桌面右键 -> “新建”-> “文本文档” -> 取名为 “抽奖.py”(不要隐藏文件扩展名)
修改正确后的图标是在这里插入图片描述,而不是在这里插入图片描述

补充 取消隐藏文件扩展名的方法(win10):

1、打开 “计算机”
2、点击这个箭头
在这里插入图片描述
3、选择 “查看”
在这里插入图片描述
4、勾上 “文件扩展名”
在这里插入图片描述
5、回到“桌面”,再次修改文件名。

感谢 Hack Inn大佬的脚本,下载网址:https://www.hackinn.com/index.php/archives/112/
文件建好后,我们贴入已经写好的代码:

中文版源码:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
    Bilibili动态转发抽奖脚本 V1.1
    Auteur:Poc Sir   Bilibili:鸟云厂商
    Mon site Internet:https://www.hackinn.com
    Weibo:Poc-Sir Twitter:@rtcatc
    更新内容: 1.增加了对画册类型动态的支持。
"""
import os
import urllib2
import json
import sqlite3
import random
import webbrowser
import re
import time
from urlparse import *
def GetMiddleStr(content,startStr,endStr):
    startIndex = content.index(startStr)
    if startIndex>=0:
        startIndex += len(startStr)
    endIndex = content.index(endStr)
    return content[startIndex:endIndex]
def GetUsers():
    global Bilibili_Key
    GetTotalRepost()
    Tmp_count = 0
    Bilibili_Key = 0
    DynamicAPI = "https://api.live.bilibili.com/dynamic_repost/v1/dynamic_repost/view_repost?dynamic_id="+ Dynamic_id + "&offset="
    conn = sqlite3.connect('Bilibili_TMP.db')
    c = conn.cursor()
    while Tmp_count<Total_count:
        Tmp_DynamicAPI = DynamicAPI + str(Tmp_count)
        try:
            BiliJson = json.loads(GetMiddleStr(urllib2.urlopen(Tmp_DynamicAPI).read(),"comments\":",",\"total"))
            for BiliJson_dict in BiliJson:
                Bilibili_UID = str(BiliJson_dict['uid'])
                Bilibili_Uname = BiliJson_dict['uname']
                Bilibili_Comment = BiliJson_dict['comment']
                Bilibili_Sql = "INSERT or REPLACE into Bilibili (UID,Uname,Comment,ID) VALUES (" + Bilibili_UID + ", '" + Bilibili_Uname + "', '" + Bilibili_Comment + "', " + str(Bilibili_Key) + ")"
                c.execute(Bilibili_Sql)
                conn.commit()
                Bilibili_Key = Bilibili_Key + 1
        except:
            break
        Tmp_count = Tmp_count + 20
    else:
        Tmp_count = 0
    conn.close()
def GetTotalRepost():
    global Total_count
    global UP_UID
    DynamicAPI = "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail?dynamic_id=" + Dynamic_id
    BiliJson = json.loads(urllib2.urlopen(DynamicAPI).read())
    Total_count = BiliJson['data']['card']['desc']['repost']
    UP_UID = BiliJson['data']['card']['desc']['user_profile']['info']['uid']
def GetLuckyDog():
    Bilibili_Doge = random.randint(0,Bilibili_Key)
    conn = sqlite3.connect('Bilibili_TMP.db')
    c = conn.cursor()
    cursor = c.execute("SELECT UID from Bilibili where ID=" + str(Bilibili_Doge))
    res = cursor.fetchall()
    suc = True
    if len(res) > 0 :
        suc = True
        cursor.close()
        conn.close()
        conn2 = sqlite3.connect('Bilibili_TMP.db')
        c2 = conn2.cursor()
        info_cursor = c2.execute("SELECT UID,Uname,Comment from Bilibili where ID=" + str(Bilibili_Doge))
        for row in info_cursor:
            print " 用户ID: ", row[0]
            print " 用户名: ", row[1]
            print " 转发详情: ", row[2], "\n"
            bilibili_open = raw_input(TellTime() + " 是否打开网页给获奖用户发送私信: (Y/N) ");
            if bilibili_open == "Y":
                webbrowser.open("https://message.bilibili.com/#/whisper/mid" + str(row[0]))
            elif bilibili_open == "y":
                webbrowser.open("https://message.bilibili.com/#/whisper/mid" + str(row[0]))
            elif bilibili_open == "Yes":
                webbrowser.open("https://message.bilibili.com/#/whisper/mid" + str(row[0]))
            elif bilibili_open == "yes":
                webbrowser.open("https://message.bilibili.com/#/whisper/mid" + str(row[0]))
            elif bilibili_open == "是":
                webbrowser.open("https://message.bilibili.com/#/whisper/mid" + str(row[0]))
            elif bilibili_open == "是的":
                webbrowser.open("https://message.bilibili.com/#/whisper/mid" + str(row[0]))
        conn2.close()
    else:
        suc = False
        cursor.close()
        conn.close()
        GetLuckyDog()
def DeleteDatabase():
    DB_path = os.getcwd() + os.sep + "Bilibili_TMP.db"
    try:
        os.remove(DB_path)
        print TellTime() + " 正在清理缓存..."
    except:
        print TellTime() + " 正在清理缓存..."
def CreateDatabase():
    conn = sqlite3.connect('Bilibili_TMP.db')
    c = conn.cursor()
    c.execute('''CREATE TABLE Bilibili
       (UID INT PRIMARY KEY     NOT NULL,
       Uname           TEXT    NOT NULL,
       Comment           TEXT    NOT NULL,
       ID            INT      NOT NULL);''')
    conn.commit()
    conn.close()
def GetDynamicid():
    s = raw_input(" 请粘贴您获取到的网址: ")
    nums = re.findall(r'\d+', s)
    try:
       bilibili_domain = urlparse(s)[1]
       if bilibili_domain == "t.bilibili.com":
           print TellTime() + " 为纯文本类型动态 "
           return str(nums[0])
       elif bilibili_domain == "h.bilibili.com":
           bilibili_docid = "https://api.vc.bilibili.com/link_draw/v2/doc/dynamic_id?doc_id=" + str(nums[0])
           Dynamic_id = GetMiddleStr(urllib2.urlopen(bilibili_docid).read(),"dynamic_id\":\"","\"}}")
           print TellTime() + " 为画册类型动态 "
           return str(Dynamic_id)
    except:
       print TellTime() + " 您输入的网址有误! "
       exit()
def TellTime():
    localtime = "[" + str(time.strftime('%H:%M:%S',time.localtime(time.time()))) + "]"
    return localtime
if __name__ == '__main__':
    DeleteDatabase()
    print "+------------------------------------------------------------+"
    print "|在电脑端登录Bilibli,点击进入个人主页,再点击动态,进入动态页面|"
    print "|点击对应的动态内容,将获取到的网址复制,并粘贴在下方:       |"
    print "+------------------------------------------------------------+\n"
    Dynamic_id = str(GetDynamicid())
    TellTime()
    print TellTime() + " 获取动态成功,ID为: " + Dynamic_id
    print TellTime() + " 正在获取转发数据中......"
    CreateDatabase()
    GetUsers()
    print TellTime() + " 获取数据成功! "
    print TellTime() + " 中奖用户信息: \n"
    GetLuckyDog()
    DeleteDatabase()

以上就是源码部分。
贴入文件后 “保存” 退出。

按Win+R 键,输入 “cmd”,进入命令提示符,我们默认路径不在桌面,所以需要修改路径。输入“cd Desktop”,来到桌面,输入“chcp 65001”,再输入
“set PYTHONIOENCODING=utf-8”。然后输入“python 抽奖.py”运行程序。
在这里插入图片描述

然后贴入你的动态页面的网址。进入“b站”-> “动态” -> 找到自己要抽奖的那条动态 -> 复制网址 -> 粘贴到命令行中 -> “回车”即可
在这里插入图片描述

运行效果如下:
在这里插入图片描述

可能会碰到如下错误,是因为中文字符的原因,可以使用英文版。
提供下解决思路,将中文字符串前后都加个英文空格。
然后命令行依然需要输入
“chcp 65001”
“set PYTHONIOENCODING=utf-8”
然后运行程序 “python 文件名.py”
在这里插入图片描述

英文版源码:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
    Bilibili动态转发抽奖脚本 V1.1
    Auteur:Poc Sir   Bilibili:鸟云厂商
    Mon site Internet:https://www.hackinn.com
    Weibo:Poc-Sir Twitter:@rtcatc
    更新内容:1.增加了对画册类型动态的支持。
"""
import os
import urllib2
import json
import sqlite3
import random
import webbrowser
import re
import time
from urlparse import *
def GetMiddleStr(content,startStr,endStr):
    startIndex = content.index(startStr)
    if startIndex>=0:
        startIndex += len(startStr)
    endIndex = content.index(endStr)
    return content[startIndex:endIndex]
def GetUsers():
    global Bilibili_Key
    GetTotalRepost()
    Tmp_count = 0
    Bilibili_Key = 0
    DynamicAPI = "https://api.live.bilibili.com/dynamic_repost/v1/dynamic_repost/view_repost?dynamic_id="+ Dynamic_id + "&offset="
    conn = sqlite3.connect('Bilibili_TMP.db')
    c = conn.cursor()
    while Tmp_count<Total_count:
        Tmp_DynamicAPI = DynamicAPI + str(Tmp_count)
        try:
            BiliJson = json.loads(GetMiddleStr(urllib2.urlopen(Tmp_DynamicAPI).read(),"comments\":",",\"total"))
            for BiliJson_dict in BiliJson:
                Bilibili_UID = str(BiliJson_dict['uid'])
                Bilibili_Uname = BiliJson_dict['uname']
                Bilibili_Comment = BiliJson_dict['comment']
                Bilibili_Sql = "INSERT or REPLACE into Bilibili (UID,Uname,Comment,ID) VALUES (" + Bilibili_UID + ", '" + Bilibili_Uname + "', '" + Bilibili_Comment + "', " + str(Bilibili_Key) + ")"
                c.execute(Bilibili_Sql)
                conn.commit()
                Bilibili_Key = Bilibili_Key + 1
        except:
            break
        Tmp_count = Tmp_count + 20
    else:
        Tmp_count = 0
    conn.close()
def GetTotalRepost():
    global Total_count
    global UP_UID
    DynamicAPI = "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail?dynamic_id=" + Dynamic_id
    BiliJson = json.loads(urllib2.urlopen(DynamicAPI).read())
    Total_count = BiliJson['data']['card']['desc']['repost']
    UP_UID = BiliJson['data']['card']['desc']['user_profile']['info']['uid']
def GetLuckyDog():
    Bilibili_Doge = random.randint(0,Bilibili_Key)
    conn = sqlite3.connect('Bilibili_TMP.db')
    c = conn.cursor()
    cursor = c.execute("SELECT UID from Bilibili where ID=" + str(Bilibili_Doge))
    res = cursor.fetchall()
    suc = True
    if len(res) > 0 :
        suc = True
        cursor.close()
        conn.close()
        conn2 = sqlite3.connect('Bilibili_TMP.db')
        c2 = conn2.cursor()
        info_cursor = c2.execute("SELECT UID,Uname,Comment from Bilibili where ID=" + str(Bilibili_Doge))
        for row in info_cursor:
            print "user ID:", row[0]
            print "user name:", row[1], "\n"
            bilibili_open = raw_input(TellTime() + "Do you want to open a web page to send private messages to the winning users?:(Y/N)");
            if bilibili_open == "Y":
                webbrowser.open("https://message.bilibili.com/#/whisper/mid" + str(row[0]))
            elif bilibili_open == "y":
                webbrowser.open("https://message.bilibili.com/#/whisper/mid" + str(row[0]))
            elif bilibili_open == "Yes":
                webbrowser.open("https://message.bilibili.com/#/whisper/mid" + str(row[0]))
            elif bilibili_open == "yes":
                webbrowser.open("https://message.bilibili.com/#/whisper/mid" + str(row[0]))
            elif bilibili_open == "是":
                webbrowser.open("https://message.bilibili.com/#/whisper/mid" + str(row[0]))
            elif bilibili_open == "是的":
                webbrowser.open("https://message.bilibili.com/#/whisper/mid" + str(row[0]))
        conn2.close()
    else:
        suc = False
        cursor.close()
        conn.close()
        GetLuckyDog()
def DeleteDatabase():
    DB_path = os.getcwd() + os.sep + "Bilibili_TMP.db"
    try:
        os.remove(DB_path)
        print TellTime() + "Cleaning up cache..."
    except:
        print TellTime() + "Cleaning up cache..."
def CreateDatabase():
    conn = sqlite3.connect('Bilibili_TMP.db')
    c = conn.cursor()
    c.execute('''CREATE TABLE Bilibili
       (UID INT PRIMARY KEY     NOT NULL,
       Uname           TEXT    NOT NULL,
       Comment           TEXT    NOT NULL,
       ID            INT      NOT NULL);''')
    conn.commit()
    conn.close()
def GetDynamicid():
    s = raw_input("Please paste the website you get:")
    nums = re.findall(r'\d+', s)
    try:
       bilibili_domain = urlparse(s)[1]
       if bilibili_domain == "t.bilibili.com":
           print TellTime() + "Dynamic for plain text type"
           return str(nums[0])
       elif bilibili_domain == "h.bilibili.com":
           bilibili_docid = "https://api.vc.bilibili.com/link_draw/v2/doc/dynamic_id?doc_id=" + str(nums[0])
           Dynamic_id = GetMiddleStr(urllib2.urlopen(bilibili_docid).read(),"dynamic_id\":\"","\"}}")
           print TellTime() + "Dynamic for album type"
           return str(Dynamic_id)
    except:
       print TellTime() + "The URL you entered is incorrect!"
       exit()
def TellTime():
    localtime = "[" + str(time.strftime('%H:%M:%S',time.localtime(time.time()))) + "]"
    return localtime
if __name__ == '__main__':
    DeleteDatabase()
    print "+---------------------------------------------------------------------------------------+"
    print "|PC login Bilibli,in home page,Click on the news again,Enter the dynamic page          |"
    print "|Click the corresponding dynamic content, copy and paste the obtained URL below:       |"
    print "+---------------------------------------------------------------------------------------+\n"
    Dynamic_id = str(GetDynamicid())
    TellTime()
    print TellTime() + "Get dynamic success with ID:" + Dynamic_id
    print TellTime() + "Getting forwarding data......"
    CreateDatabase()
    GetUsers()
    print TellTime() + "Data acquisition successful!"
    print TellTime() + "Winning user information:\n"
    GetLuckyDog()
DeleteDatabase()

使用操作是不需要修改编码,直接win+R,运行cmd,然后cd到桌面,运行python文件,粘贴入你的动态页面网址,就可以完成抽奖了。之后可以选择是否私信,很方便。再次感谢Hack Inn大佬提供的源码。

在这里插入图片描述

补充说明:

动态转发抽奖.py 是英文版
动态转发抽奖2.py 是中文版

查看所有转发者的信息

如果想看所有转发者的数据,可以下载SQLiteSpy可视化工具sqlitebrowser或安装SQLite数据库,打开Bilibili_TMP.db文件(存储数据的数据库文件)
sqlitebrowser官网:http://www.sqlitebrowser.org/
SQLite官网:https://www.sqlite.org/index.html
SQLite安装教程:https://www.runoob.com/sqlite/sqlite-installation.html
在这里插入图片描述
此时不要继续操作。在运行路径下可以看到文件Bilibili_TMP.db。在这里插入图片描述
SQLiteSpy为例(sqlitebrowser使用方法类似)
在这里插入图片描述
file -> open database
在这里插入图片描述
打开我们的 Bilibili_TMP.db
在这里插入图片描述
双击table下的bilibili
在这里插入图片描述
数据库中的数据就可以看到了
在这里插入图片描述
现在可以自行进行筛选,如运用SQL语句进行筛选。
比如:select * from Bilibili where Comment!="转发动态"
除去只转发没有说多余话的人。效果如下:
在这里插入图片描述
执行SQL语句的方法是在上面的框中输入SQL语句,然后按F9(execute->execute sql)运行SQL语句。
在这里插入图片描述
就可以看到执行效果了。
SQL语句的学习参考数据库的相关知识—学习笔记SQL数据查询语言—实际运用参考

还可以使用 DB Browser for SQLite 下载链接: https://pc.qq.com/detail/13/detail_22493.html

如需帮助可联系up
b站:Love丶伊卡洛斯

侵删同样联系方式如上。

python3版本(不兼容请跳转最新页)

# -*- 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("*********************************************************************************")
# 获取抽奖类型
draw_type = input("请输入抽奖类型(1评论 0转发):")
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"]
    repost = json1["data"]["card"]["desc"]["repost"]
    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, 'repost':repost, '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]))

# 获取转发用户的数据
def get_repost_user_info(referer, base_info):
    print("开始获取用户信息...")
    dynamic_id = referer[23:len(referer) - 6]
    temp_num = 0
    # 根据转发数进行循环
    while temp_num < int(base_info["repost"]):
        url = "https://api.live.bilibili.com/dynamic_repost/v1/dynamic_repost/view_repost?dynamic_id="+ \
              str(dynamic_id) + "&offset=" + str(temp_num);
        req = urllib.request.urlopen(url)
        ret = req.read().decode()

        # print(ret)

        json1 = json.loads(ret)
        len1 = 0
        if "comments" in ret:
            len1 = len(json1["data"]["comments"])
            # print(len1)
        else:
            print("可获取的数据结束!\n")
            break
        for i in range(len1):
            uid = json1["data"]["comments"][i]["uid"]
            uname = json1["data"]["comments"][i]["uname"]
            comment = json1["data"]["comments"][i]["comment"]

            # 数据插入集合
            # name_set.add(uname)
            id_set.add(uid)
            # 数据插入数据库
            sql = "replace into user(mid, uname, message) values (?, ?, ?)"
            cur.execute(sql, (uid, uname, comment))
            con.commit()
        temp_num += 20
        time.sleep(0.5)
    print("数据获取完毕!\n")
    while len(lucky_set) < int(lucky_num):
        num = 0
        if len(id_set) > 1:
            num = random.randint(0, (len(id_set) - 1))
            lucky_set.add(num)
        else:
            print('用户数据不足2个,数据异常,程序结束')
            return
    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]))

# 配置数据库
config_db()
# 获取oid、转发数、评论数
base_info = get_oid(referer)
print("oid=" + str(base_info["oid"]))
print("转发数=" + str(base_info["repost"]))
print("评论数=" + str(base_info["comment"]))

# 根据抽奖类型进行抽奖
if(int(draw_type) == 1):
    # 获取用户信息并抽取幸运用户
    get_user_info(referer, base_info)
else:
    get_repost_user_info(referer, base_info)

# 关闭游标
cur.close()
# 断开数据库连接
con.close()

print("\n程序运行完毕!")
quit = 0
while quit != "1":
    quit = input("是否关闭程序(是1,否0):")

  • 11
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
你可以使用 Python 的 requests 库和 BeautifulSoup 库来实现这个爬虫。首先,你需要使用 requests 库向哔哩哔哩动态页面发送 GET 请求,获取动态页面的 HTML 代码。然后,你可以使用 BeautifulSoup 库解析 HTML 代码,找到抽奖相关的信息,比如抽奖的标题、抽奖的链接等等。最后,你可以使用 requests 库向抽奖链接发送 POST 请求,完成自动转发抽奖的操作。 具体的代码实现可以参考以下的示例: ```python import requests from bs4 import BeautifulSoup # 设置请求头,模拟浏览器访问 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 发送 GET 请求,获取动态页面的 HTML 代码 url = 'https://t.bilibili.com/' response = requests.get(url, headers=headers) html = response.text # 使用 BeautifulSoup 解析 HTML 代码,找到抽奖相关的信息 soup = BeautifulSoup(html, 'html.parser') lottery_title = soup.find('div', class_='card-title').text lottery_link = soup.find('a', class_='card-image')['href'] # 发送 POST 请求,完成自动转发抽奖的操作 data = { 'title': lottery_title, 'link': lottery_link, 'action': 'enter', 'csrf': 'xxxxxxxxxxxxxxxxxxxxx' # 这里需要填写你的 CSRF token } response = requests.post('https://t.bilibili.com/lottery/handler/Join', headers=headers, data=data) ``` 需要注意的是,这个示例中的 CSRF token 需要你自己从哔哩哔哩动态页面中获取。你可以使用浏览器的开发者工具,在 Network 标签页中找到抽奖链接对应的请求,然后在 Headers 标签页中找到 CSRF token。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Love丶伊卡洛斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值