【python脚本】写一个刷b站评论区的脚本

【python脚本】写一个刷b站评论区的脚本,第1张

文章目录
  • 一、脚本介绍 && 网站分析
    • 1.1 获取视频列表
    • 1.2 发评论
  • 二、完整代码
  • 三、如何使用
  • 四、打包程序(百度网盘)


一、脚本介绍 && 网站分析

b站up主盗号,举报没用?
md,干他!

实现功能:在盗号up的所有视频下,每隔一段时间,发一条评论。

实现步骤

  1. 应该通过up主的mid获取全部视频列表。并且,视频列表是要即时更新的。
  2. 通过步骤1拿到的视频列表,发评论

mid,就是点进up主页,url的那串数字

比如这个b(我小号)的mid,就是网址里面的
https://space.bilibili.com/435951708/video
435951708
懂伐?

1.1 获取视频列表

首先,这是个动态网页(数据不在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 的值,获取到全部视频。

1.2 发评论

在评论区,打开 检查->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

咳咳,明示一下,点个关注

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/789629.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存