B站動態轉發抽獎腳本+教程


重要提醒!!!

  經過大數據量測試后發現,程序不能爬取多轉發人數的所有數據。原因是程序內API的數據不全,並沒有提供所有的轉發人員數據,導致數據的缺失。
  測試數據量 轉發人數6w+,而https://api.live.bilibili.com/dynamic_repost/v1/dynamic_repost/view_repost?dynamic_id=346409930135375313&offset= 只能到五百多就停了(即只能獲取到最后轉發的五百多人,不排除重復)。

運行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()
View Code

 

 


 

以上就是源碼部分。

貼入文件后 “保存” 退出。

 

 

按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大佬提供的源碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM