重要提醒!!!

经过大数据量测试后发现,程序不能爬取多转发人数的所有数据。原因是程序内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()

以上就是源码部分。

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

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

B站动态转发抽奖脚本+教程的更多相关文章

  1. 第一百一十八节,JavaScript,动态加载脚本和样式

    JavaScript,动态加载脚本和样式 一动态脚本 当网站需求变大,脚本的需求也逐步变大.我们就不得不引入太多的JS脚本而降低了整站的性能,所以就出现了动态脚本的概念,在适时的时候加载相应的脚本. ...

  2. 【转载】BAT 批处理脚本教程

    来源:http://www.cnblogs.com/glaivelee/archive/2009/10/07/1578737.html BAT 批处理脚本 教程   第一章 批处理基础第一节 常用批处 ...

  3. JavaScript的DOM_动态加载脚本和样式

    一.动态加载脚本 当网站需求变大,脚本的需求也逐步变大.我们就不得不引入太多的 JS 脚本而降低了整站的性能,所以就出现了动态脚本的概念,在适时的时候加载相应的脚本. 1.动态加载js文件 比如:我们 ...

  4. BAT 批处理脚本 教程 【转】

    BAT 批处理脚本 教程 第一章 批处理基础 第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD.这些命令 ...

  5. 转:windows BAT 批处理脚本教程

    转自:http://www.cnblogs.com/mq0036/p/3412171.html BAT 批处理脚本教程 第一章 批处理基础第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文 ...

  6. ssh动态转发小记

    ssh,一般常用来做远程登录管理,也就是连上远程机器,得到一个shell,然后交互式地在上面敲命令-看结果-再敲命令. 偶尔也会用在脚本里,做些自动化批处理上传下载的操作,但本质上也是用shell来执 ...

  7. 服务器端-W3Chool:服务器脚本教程

    ylbtech-服务器端-W3Chool:服务器脚本教程 1.返回顶部 1. 服务器脚本教程 从左侧的菜单选择你需要的教程! SQL SQL 是用于访问和处理数据库的标准的计算机语言. 在本教程中,您 ...

  8. 动态执行python脚本

    前言 存在许多独立的python脚本,这些脚本可能会增加,也可能会减少,现在需要按照某种顺序调度这些程序.在python的standard library中,有一个模块imp可以实现动态的调用ptho ...

  9. Linux Shell脚本教程

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

随机推荐

  1. A*G#C001

    AGC001 A BBQ Easy 贪心. https://agc001.contest.atcoder.jp/submissions/7856034 B Mysterious Light 很nb这个 ...

  2. 一起学Makefile(二)

    Makefile基本概念示例 新建一个Code文件夹来测试一个简单的makefile 目录结构如下: 源码如下: makefile依赖: 一般在编写makefile之前都需要先分析清楚整个工程各个模块 ...

  3. JavaScript 箭头函数

    ES6新标准增加了一种新的函数,箭头函数. x=>x*x 相当于: function (x){ return x*x; } 如果参数不是一个,就需要用括号()括起来: // 两个参数:var t ...

  4. shell 脚本接收参数

    test.sh #!/bin/bash echo "脚本名$0" echo "第1个参数$1" echo "第2个参数$2" echo &q ...

  5. xshell && xftp 下载

    链接:https://pan.baidu.com/s/1aLdgOSshytIYhArkB7tghQ 提取码:fqjb

  6. 一条简单的 SQL 执行超过 1000ms,纳尼?

    阅读本文大概需要 2.8 分钟. MySQL 对我说 “Too young, too naive!" ▌大概过程 在测试环境 Docker 容器中,在跨进程调用服务的时候,A 应用通过 Du ...

  7. win10+py3.6+cuda9.0安装pytorch1.1.0

    参考:清华源失效后如何安装pytorch1.01 GPU版本的安装指令为: conda install pytorch torchvision cudatoolkit=9.0 -c pytorch 这 ...

  8. 在 RPA10.X 运行异常,RPA9 却正常的问题处理

    一.现象 RPA10.X 在一些极少数 win7/win10 环境中一运行就崩溃或无运行结果. 二.原因 出现上述现象已经确定是OPenGL 驱动兼容性造成的. 三.解决方法 方法一 只要把流程的管理 ...

  9. annotation processor 为啥没有被调用?

    Android Studio 3.5 使用@AutoService(Processor.class)注册annotation processor Android Plugin for Gradle:  ...

  10. ES6 - 数组扩展(扩展运算符)

    扩展运算符 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算(函数),将一个数组转为用逗号分隔的参数序列. rest: 变量将多余的参数放入数组中. spread(扩展): ...