b站up主盗号,举报没用?
md,干他!
实现功能
:在盗号up的所有视频下,每隔一段时间,发一条评论。
实现步骤
:
mid,就是点进up主页,url的那串数字
比如这个b(我小号)的mid,就是网址里面的
https://space.bilibili.com/435951708/video
435951708
懂伐?
首先,这是个动态网页(数据不在html里面,而是动态加载出来的)。所以需要解析真实地址抓取
通过
右键->检查->network->刷新网页->输入视频名字,再手动
可以找到,视频列表在一个json文件里面
接口:
https://api.bilibili.com/x/space/arc/search?mid=435951708&ps=30&tid=0&pn=1&keyword=&order=pubdate&jsonp=jsonp
pn表示翻页,ps表示一页显示的数量。如果那个b站up的视频需要翻页的话,可以用通过修改 ps 和 pn 的值,获取到全部视频。
在评论区,打开 检查->network,输入一条评论,点击发送
可以看到,抓到了个叫 add 的包。如果包太多,不好看,可以选中一个包,然后 ctrl+f 输入你发送的评论,找到 add 包
通过这个包,可以看到,发评论的接口就是
https://api.bilibili.com/x/v2/reply/add
然后发了个post
请求,需要带上 user-agent,cookie
请求附加了个表单
oid 表示up主的mid,type是类型,比如文字,message就是发的内容。
最关键的是 csrf 这个参数。如果你改了密码,那么cookie改了,csrf也要改
import requests
import json
import time
class Bilibili:
def __init__(self):
self.headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36",
"referer":"https://space.bilibili.com/398579071?spm_id_from=333.337.0.0"}
self.cookie()
self.csrf_read()
self.readInfo()
self.refresh()
# 读取cookie
def cookie(self):
with open("cookie.txt", "r", encoding="utf-8") as f:
cookie = f.read()
self.cookies = {}
for c in cookie.split(";"):
a = c.split("=")
self.cookies[a[0]] = a[1]
# 读取 csrf
def csrf_read(self):
with open("csrf.txt", "r", encoding="utf-8") as f:
self.csrf = f.read().strip()
# 读取 info,里面存了发的内容
def readInfo(self):
with open("info.json", "r", encoding="utf-8") as f:
s = json.loads(f.read())
self.times = s['times']
self.message = s['message']
# 写入记录,写入 info.json
def writeInfo(self):
data = {"times":self.times,
"message":self.message}
with open("info.json", "w", encoding="utf-8") as f:
f.write(json.dumps(data, ensure_ascii=False))
# 获取所有视频的bv号
def videoList(self):
result = []
self.vListApi = "https://api.bilibili.com/x/space/arc/search?mid={}&pn=1&ps=25&index=1&jsonp=jsonp"
r = requests.get(self.vListApi.format(self.mid), cookies=self.cookies, headers=self.headers).json()
vlist = r['data']['list']['vlist']
for each in vlist:
result.append([each['bvid'], each['aid']])
return result
# 发送
def send(self, result):
self.sendApi = "https://api.bilibili.com/x/v2/reply/add"
data = {'oid': '',
'type': '1',
'message': '',
'plat': '1',
'ordering': 'heat',
'jsonp': 'jsonp',
'csrf': self.csrf}
for each in result:
data['oid'] = each[1]
data['message'] = self.message.format(self.times)
r = requests.post(self.sendApi, headers=self.headers, cookies=self.cookies, data=data)
try:
print(r.json()['data']['success_toast'], end="\t")
self.times += 1
except:
print(r.json()['message'], end="\t")
# 发送异常,记录
with open("log.txt", "a", encoding="utf-8") as f:
f.write("发送失败:" + time.ctime() + "\n")
f.write("bv号:" + each[0] + "\n")
f.write("aid:" + str(each[1]) + "\n")
f.write("-"*20 + "\n")
f.write(json.dumps(r.json()) + "\n")
f.write("*"*70 + "\n"*5)
print(each[0], "\t", each[1])
# 更新,方便程序在运行时,更新参数
def refresh(self):
with open("配置文件.json", "r", encoding="utf-8") as f:
a = json.loads(f.read())
self.stop = a['stop']
if a['cookie更新']!=False or a['csrf更新']!=False:
self.cookie()
self.csrf_read()
self.mid = a['mid']
if a['writeInfo']==True:
self.writeInfo()
def run(self):
while True:
try:
# 获取所有视频的 aid 和 bv 号
result = self.videoList()
# 发送
self.send(result)
except Exception as e:
print(e)
with open("log.txt", "a", encoding="utf-8") as f:
f.write("异常:" + time.ctime() + "\n")
f.write(str(e))
f.write("*"*70)
f.write("\n"*5)
# 每隔几分钟发一次
self.refresh()
time.sleep(self.stop)
if __name__ == '__main__':
b = Bilibili()
b.run()
cookie.txt
csrf.txt
info.json
配置文件.json
这4个文件
cookie.txt,csrf.txt
里面存放了 cookie 和 csrf。这个要在pc登录b站,然后找到复制过来。怎么找?看第上文。
info.json里面
{
"times": 1008,
"message": "该博主是盗视频的,请勿上当受骗{}"
}
times表示次数,是个数字。作用:避免评论重复,发不出去。如果代码停了,显示请勿重复评论,修改 times 即可。times 在运行中也会自己更新,一般不需要手动改
message就是你要发的内容。加个花括号
配置文件.json
{
"stop":300,
"cookie更新": false,
"csrf更新": false,
"mid": 435951708,
"writeInfo": true
}
stop 表示暂停时间。假如up有10个视频,stop是60,那么每隔1分钟,在10个视频下分别发一次。平均6秒一次
cookie更新 和 csrf 更新,如果你的cookie 或 csrf 失效了,比如运行脚本时你改了密码,别慌!把 cookie 或 csrf 改成 true,并把 cookie csrf 复制到 相应的 txt 文件即可
writeInfo 为 true,意思是,运行脚本时,把 info.json 实时更新进去
运行时,如果报错,会在终端输出错误,同时在 log.txt 中会记录完整报错
链接:https://pan.baidu.com/s/1oJSHdgBF8ZEScAOSaeBtHg
提取码:qj4s
咳咳,明示一下,点个关注