imcys.com
遵从中二的召唤,来吧少年!

B站机器人搭建 LastOrderBot

前言

本文将教你去搭建一个B站的机器人,具备私信文本和图片的功能,下面本文将教大家完成自己的机器人。

首先我先来说我们用的开源项目 LastOrderBot 这个是我在最近写的一个开源项目,算是一个B站私信机器人框架吧,项目介绍你可以去B站看。

搭建准备

首先让我们先下载源码,这次语言是python

进入GitHub,下载最新的项目源码,我们进行使用

在这里求一个Star星星

下载源码后让我们首先打开 config文件夹下的 config.py

#在这里配置你的机器人操作类中需要的东西,图方便就不写JSON了,大家这样也好理解
class Config:

    #机器人发信headers
    headers = {
    "referer": "https://message.bilibili.com/",
    'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)',
    'cookie' : "cookie"
    }
    #B站账号鉴权 -> cookie 的 bili_jct
    csrf_token = 'bili_jct'

    #机器人UID
    robot_uid = 10086

    # TODO 消息刷新心跳 -> 秒数 建议 在 0.5 ~ 3 之内 如果设置为 1 代表每位用户1秒内最多可以发送1条消息,可以同时发送 根据需求加快心跳 太低可能会给B站造成负担,请不要低于0.5
    heartbeat_interval = 1

根据注释填写,如果你不会找csrf_token,也就是bili_jct,请看下图,在网页按F12出现调试台,找到bili_jct的值输入。

运行机器人

下面我介绍两种系统运行方式

Windows

下载源码后,请确认自己安装了python环境,版本在3.7及以上,我们这里推荐使用VSCODE来进行编写机器人

我们使用了如下模块

requests demjson PIL 请自行使用pip下载补全模块,如果不会,请百度,我有可能漏写,按照确少的模块自行安装。

我们回到文件根目录 LastOrderBot 在这个目录下,有_init_.py,运行这个文件,你的机器人就大功告成,并且在运行了,下面我会讲机器人词库如何匹配用户命令。

宝塔 ->CentOS->Linux

我们来看看,首先确定你是CentOS系统,接下来在宝塔应用商店安装 Python项目管理器 ,接着请去安装python3.7及以上的版本。

如果完成了这些操作,请上传下载的源代码到你的一个文件夹,在这个文件夹下新建一个文件,名为 requirements.txt

这个文件里需要填写我们使用的第三方模块,也就是让大家使用pip下载的模块

我给大家写个我用的

altgraph==0.17     
autopep8==1.5.4    
certifi==020.12.5
chardet==4.0.0    
demjson==2.2.4    
et-xmlfile==1.0.1    
future==0.18.2
idna==2.10
jdcal==1.4.1
pefile==019.4.18
Pillow==8.1.0
pip==21.0.1
pycodestyle==2.6.0
pyinstaller==4.1
pyinstaller-hooks-contrib==2020.11
pywin32-ctypes==0.2.0
requests==2.25.1
selenium==3.141.0
setuptools==49.2.1
toml==0.10.2
urllib3==1.26.2

这里面有许多可能你用不上,后面可以删掉

如果完成了这些步骤,回到python项目管理器

新建项目,按照要求填写,这个目录就是 LastOrderBot ,启动文件为LastOrderBot目录里的_init_.py

完成后你的机器人就在运行当中了

机器人识别用户消息

请找到plugin文件夹里的dic.py,在这里是机器人的词库,匹配用户消息,并且做出回应。

#-*-coding:utf-8-*-
import re
import requests
from plugin.msgutil import MsgUtil
from config.config import Config
from plugin.fileutil import FileUtil

headers = Config.headers
csrf_token = Config.csrf_token
robotUid = Config.robot_uid
msgutil = MsgUtil(headers,csrf_token,robotUid)
fileutil = FileUtil()

#DIC词库内容
def sendText(userMsg,robotUid,senderUid):

    if userMsg == "菜单":
        Msg = '来份萝莉\n你好 聊天内容'
        print(msgutil.sendMsg(Msg,robotUid,senderUid))
        msgutil.updateAck(senderUid,csrf_token)

        
    #字符串匹配
    if userMsg == "你好":
        Msg = "你也好"
        #发送者UID 接受UID
        print(msgutil.sendMsg(Msg,robotUid,senderUid))
        msgutil.updateAck(senderUid,csrf_token)

    if userMsg == "你是不是萝莉":
        Msg = '不不不,我想不是'
        print(msgutil.sendMsg(Msg,robotUid,senderUid))
        msgutil.updateAck(senderUid,csrf_token)

    if userMsg =="来份萝莉":
        imageUrl = msgutil.captureIamgeUrl("https://api.dongmanxingkong.com/suijitupian/acg/1080p/index.php")
        imageFormat = msgutil.getImageFormat(imageUrl)
        imageWidth = imageFormat[0]
        imageHeight = imageFormat[1]
        imageFormat = imageFormat[2]
        print(msgutil.sendImage(imageUrl,robotUid,senderUid,imageWidth,imageHeight,imageFormat))
        msgutil.updateAck(senderUid,csrf_token)

    

    #正则表达式区域
    re1 = re.search('^你好 ?(.*?)$', userMsg)
    if re1:
        MsgRe = re.compile('^你好 ?(.*?)$')
        MsgReArray = MsgRe.findall(userMsg)
        print(MsgReArray[0])
        getMsg = requests.get("http://i.itpk.cn/api.php?question="+str(MsgReArray[0])+"&api_key=45c0866382610cbee9bbbffaef5aa943&api_secret=ffnzr6hrzzaj&limit=8")
        getMsg.encoding = 'utf-8'
        getMsg = getMsg.text
        print(msgutil.sendMsg(getMsg,robotUid,senderUid))
        msgutil.updateAck(senderUid,csrf_token)
        pass


    re2 = re.search('^写入 .*? .*? .*?$', userMsg)
    if re2:
        MsgRe = re.compile('^写入 (.*?) (.*?) (.*?)$')
        MsgReArray = MsgRe.match(userMsg)
        fileutil.write(MsgReArray.group(1),MsgReArray.group(2),MsgReArray.group(3))
        print(msgutil.sendMsg("写入成功",robotUid,senderUid))
        msgutil.updateAck(senderUid,csrf_token)


    re3 = re.search('^读出 .*? .*?$', userMsg)
    if re3:
        MsgRe = re.compile('^读出 (.*?) (.*?)$')
        MsgReArray = MsgRe.match(userMsg)
        Msg = fileutil.read(MsgReArray.group(1),MsgReArray.group(2))
        print(msgutil.sendMsg(Msg,robotUid,senderUid))
        msgutil.updateAck(senderUid,csrf_token)
    pass

这里我写了一些简单的处理,你可以参照扩充。

文末

这里就教到这个地方了,请大家自己摸索,我的python瞎玩的,没有系统学,写的烂,当你规范后请毫不犹豫的提交分支到GitHub,我将学习大家的经验。

使用请参照 GitHub项目里的开源协议 严禁滥用 使用者自行承担后果。

萌新杰少

文章作者

I im CYS,一个热爱二次元的高中生开发者

发表评论

textsms
account_circle
email

萌新杰少の秘密基地

B站机器人搭建 LastOrderBot
本文将教你去搭建一个B站的机器人,具备私信文本和图片的功能,下面本文将教大家完成自己的机器人。 B站私信机器人搭建
扫描二维码继续阅读
2021-02-19