Giter Site home page Giter Site logo

sk-415 / harukabot Goto Github PK

View Code? Open in Web Editor NEW
826.0 6.0 110.0 8.49 MB

将 B 站的动态和直播信息推送至 QQ,基于 NoneBot2 开发

Home Page: https://haruka-bot.sk415.icu

License: GNU Affero General Public License v3.0

Python 87.50% Dockerfile 0.41% JavaScript 12.09%
bot bilibili qqbot nonebot nonebot2 vup qq vtuber

harukabot's Introduction

HarukaBot

HarukaBot——优雅的 B 站推送 QQ 机器人

名称来源:@白神遥Haruka

Logo 画师:@Ratto

VERSION qq group time tracker

简介

一款将哔哩哔哩 UP 主的直播与动态信息推送至 QQ 的机器人。基于 NoneBot2 开发,前身为 dd-bot

特色功能

HarukaBot 针对不同的推送场景(粉丝群、娱乐群、直播通知群),提供了个性化设置:

  • 自定义推送内容,每位 UP 主可限制仅动态、仅直播。
  • 群内开启权限限制,仅管理员以上可以使用机器人。
  • 指定推送内容@全体成员,次数用光自动忽略。
  • 同时连接多个 QQ 号,避免@全体成员次数不够。

部分功能展示

demo

特别感谢

支持与贡献

觉得好用可以给这个项目点个 Star 或者去 爱发电 投喂我。

有意见或者建议也欢迎提交 IssuesPull requests

许可证

本项目使用 GNU AGPLv3 作为开源许可证。

harukabot's People

Contributors

17theword avatar akarinnnnn avatar aurorataro avatar boxie123 avatar dependabot[bot] avatar dezhishen avatar djkcyl avatar lgc2333 avatar mnixry avatar seth2333 avatar shoucandanghehe avatar sk-415 avatar sunshineboyzj avatar well2333 avatar wosiwq avatar zclkkk avatar zhaozuohong avatar zhzhongshi avatar zzjjbb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

harukabot's Issues

AttributeError: 'NoneType' object has no attribute 'get'

大佬好,bot正常运行一段时间后发生错误,重启bot无法解决,nonebot2版本2.0.0a11,python3.9,日志如下:
04-14 09:31:30 [ERROR] apscheduler | Job "dy_sched (trigger: cron[second='*/10']
, next run at: 2021-04-14 09:31:40 CST)" raised an exception
Traceback (most recent call last):
File "c:\users\administrator\appdata\local\programs\python\python39\lib\runpy.
py", line 197, in _run_module_as_main
return run_code(code, main_globals, None,
File "c:\users\administrator\appdata\local\programs\python\python39\lib\runpy.
py", line 87, in run_code
exec(code, run_globals)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\Scripts\nb
.exe_main
.py", line 7, in
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-p
ackages\click\core.py", line 829, in call
return self.main(*args, **kwargs)
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-p
ackages\click\core.py", line 782, in main
rv = self.invoke(ctx)
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-p
ackages\click\core.py", line 1259, in invoke
return process_result(sub_ctx.command.invoke(sub_ctx))
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-p
ackages\click\core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-p
ackages\click\core.py", line 610, in invoke
return callback(*args, **kwargs)
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-p
ackages\nb_cli_init
.py", line 46, in run
run_bot(file, app)
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-p
ackages\nb_cli\handlers.py", line 52, in run_bot
nonebot.run(app=f"{module_name}:{app}")
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-p
ackages\nonebot_init
.py", line 227, in run
get_driver().run(host, port, *args, **kwargs)
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-p
ackages\nonebot\drivers\fastapi.py", line 160, in run
uvicorn.run(app or self.server_app,
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-p
ackages\uvicorn\main.py", line 386, in run
server.run()
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-p
ackages\uvicorn\server.py", line 49, in run
loop.run_until_complete(self.serve(sockets=sockets))
File "c:\users\administrator\appdata\local\programs\python\python39\lib\asynci
o\base_events.py", line 629, in run_until_complete
self.run_forever()
File "c:\users\administrator\appdata\local\programs\python\python39\lib\asynci
o\base_events.py", line 596, in run_forever
self._run_once()
File "c:\users\administrator\appdata\local\programs\python\python39\lib\asynci
o\base_events.py", line 1890, in _run_once
handle._run()
File "c:\users\administrator\appdata\local\programs\python\python39\lib\asynci
o\events.py", line 80, in _run
self._context.run(self._callback, *self._args)

File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-p
ackages\apscheduler\executors\base_py3.py", line 30, in run_coroutine_job
retval = await job.func(*job.args, **job.kwargs)
File "src/plugins\haruka_bot\dynamic_pusher.py", line 25, in dy_sched
dynamics = (await b.get_user_dynamics(uid)).get('cards', []) # 获取最近十二
条动态
AttributeError: 'NoneType' object has no attribute 'get'

优化日志内容

  • playwright 安装检查
  • 风控无法发送消息
  • 检测到推送
  • 检查版本更新
  • 更新数据库

新功能意见收集

这里汇总一些可以考虑但是优先级不是很高的功能,等到计划开发的时候会单独创一个 issue 并从这里删除。

有什么想法都欢迎在这里讨论。

  • 批量添加删除主播
  • 批量开启关闭动态/直播
  • 通过私聊编辑别的群的主播列表
  • 可以查看/管理全局的推送列表
  • @全体 失败时,自动去除 @全体 并重新发送
  • 考虑改用 SQLite 数据库
  • 尝试用 Playwright 代替 Pyppeteer
  • 捕获 -412 异常,每天早晨不再打印 5M 的错误日志
  • 修改动态监测算法,需要考虑B站审核可能导致后发的动态先被捕获的问题(B 站自己客户端都不会推,什么时候改版了再考虑适配)
  • 自动更新(牡蛎,牡蛎得斯)

提示导入失败

01-14 11:14:55 [INFO] nonebot | NoneBot is initializing...
01-14 11:14:55 [INFO] nonebot | Current Env: prod
01-14 11:14:55 [INFO] nonebot | Succeeded to import "nonebot.plugins.base"
01-14 11:14:55 [INFO] nonebot | Succeeded to import "nonebot_plugin_apscheduler"
01-14 11:14:55 [ERROR] nonebot | Failed to import "haruka_bot"
Traceback (most recent call last):
File "/usr/local/python3/bin/hb", line 8, in
sys.exit(main())
File "/usr/local/python3/lib/python3.8/site-packages/click/core.py", line 829, in call
return self.main(*args, **kwargs)
File "/usr/local/python3/lib/python3.8/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/usr/local/python3/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/local/python3/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/local/python3/lib/python3.8/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/usr/local/python3/lib/python3.8/site-packages/haruka_bot/cli/init.py", line 13, in run
from .bot import run
File "", line 991, in _find_and_load
File "", line 975, in _find_and_load_unlocked
File "", line 671, in _load_unlocked
File "", line 783, in exec_module
File "", line 219, in _call_with_frames_removed
File "/usr/local/python3/lib/python3.8/site-packages/haruka_bot/cli/bot.py", line 21, in
nonebot.load_plugin("haruka_bot")
File "/usr/local/python3/lib/python3.8/site-packages/nonebot/plugin.py", line 877, in load_plugin
return context.run(_load_plugin, module_path)

File "/usr/local/python3/lib/python3.8/site-packages/nonebot/plugin.py", line 861, in _load_plugin
module = importlib.import_module(module_path)
File "/usr/local/python3/lib/python3.8/importlib/init.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 1014, in _gcd_import
File "", line 991, in _find_and_load
File "", line 975, in _find_and_load_unlocked
File "", line 671, in _load_unlocked
File "", line 783, in exec_module
File "", line 219, in _call_with_frames_removed
File "/usr/local/python3/lib/python3.8/site-packages/haruka_bot/init.py", line 5, in
from . import config_manager
File "/usr/local/python3/lib/python3.8/site-packages/haruka_bot/config_manager.py", line 3, in
from nonebot.permission import GROUP_ADMIN, SUPERUSER, GROUP_OWNER
ImportError: cannot import name 'GROUP_ADMIN' from 'nonebot.permission' (/usr/local/python3/lib/python3.8/site-packages/nonebot/permission.py)
01-14 11:14:55 [INFO] nonebot | Running NoneBot...
01-14 11:14:55 [INFO] uvicorn | Started server process [6092]
01-14 11:14:55 [INFO] uvicorn | Waiting for application startup.
01-14 11:14:55 [INFO] nonebot_plugin_apscheduler | Scheduler Started
01-14 11:14:55 [INFO] uvicorn | Application startup complete.
01-14 11:14:55 [INFO] uvicorn | Uvicorn running on http://127.0.0.1:8080 (Press CTRL+C to quit)
这里提示Failed to import "haruka_bot"导入失败,是按照说明配置,可正常收到消息,但bot不做回应,看了issues20的方式试了也没有用,请教一下是什么问题导致的?

希望能用文字来代替新动态的截图

网不好,图经常裂。

D的群正好有这个机器人,然后我正好也有做过关注B站UP动态的机器人,希望能用文字来代替一下截图。(PS:B站空间动态的API返回的JSON乱得一批,我人都给整吐了)

以下是我整理出来的逻辑,应该挺全的_(:з」∠)_

cc = []
for card in cards:
        #动态的ID
        did = card['desc'].get('dynamic_id')
        #UTC的timestamp
        ltime = card['desc'].get('timestamp')
        cd = json.loads(card.get('card'))
        
        #发送普通动态,以及转发消息
        item = cd.get('item')
        if item:
            #动态内容
            description = item.get('description')
            content = item.get('content')
            
            if description:
                #发送带图片的动态
                pic = item.get('pictures')
                cc.append({"id": did, "type": "update_picture_dynamic", "content": description, "pic": pic, "time":ltime})
            else:
                #转发动态,ouser为原动态的用户名
                if cd.get('origin'):
                    #原动态
                    origin = json.loads(cd.get('origin'))
                    oitem = origin.get('item')
                    
                    #转发动态
                    if oitem:
                        odesc = oitem.get('description')
                        ocont = oitem.get('content')
                        if odesc:
                            ouser = origin.get('user').get('name')
                            opic = oitem.get('pictures')
                            cc.append({"id": did, "type": "update_forward_picture_dynamic", "content":content,"o_content": odesc, "pic": opic,"time":ltime, "ouser":ouser})
                        else:
                            ouser = origin.get('user').get('uname')
                            cc.append({"id": did, "type": "update_forward_dynamic", "content":content,"o_content": ocont, "time":ltime, "ouser":ouser})
                    
                    #转发课程,更换头像框之类的饰品的信息(vest),转发专栏,转发视频。
                    else :
                        course = origin.get('url')
                        id_ = origin.get('id')
                        vest = origin.get('vest')
                        if course:
                            ouser = origin.get('up_info').get('name')
                            title = origin.get('title')
                            cc.append({"id": did, "type": "update_forward_course", "title": title, "url": course,"time":ltime, "ouser":ouser})
                        elif vest:
                            ouser = origin.get('user').get('uname')
                            o_content = vest.get('content')
                            cc.append({"id": did, "type": "update_forward_vest", "content":content, "o_content": o_content,"time":ltime, "ouser":ouser})
                        elif id_:
                            ouser = origin.get('author').get('name')
                            title = origin.get('title')
                            cc.append({"id": did, "type": "update_forward_column", "title": title, "url": "https://www.bilibili.com/read/cv{}".format(id_),"time":time, "ouser":ouser})
                        else:
                            ouser = origin.get('owner').get('name')
                            video = origin.get('jump_url')
                            ee = enc(int(re.match(avReg, video).group('av')))
                            if not ee:
                                #视频被删除
                                continue
                            video = "https://www.bilibili.com/video/{}".format(ee)
                            title = origin.get('title')
                            cc.append({"id": did, "type": "update_forward_video", "content":content,"title": title, "url": video,"time":ltime, "ouser":ouser})
                else:
                    #发送普通的,不带图片的动态
                    cc.append({"id": did, "type": "update_dynamic", "content": content, "time":ltime})

        else :
            #更换饰品,发新专栏,发新视频
            id_ = cd.get('id')
            vest = cd.get('vest')
            if vest:
                content = vest.get('content')
                cc.append({"id": did, "type": "update_vest", "content": content,"time":ltime})
            elif id_:
                title = cd.get('title')
                cc.append({"id": did, "type": "update_column", "title": title, "url": "https://www.bilibili.com/read/cv{}".format(id_),"time":ltime})
            else:
                content = cd.get('dynamic')
                video = cd.get('jump_url')
                ee = enc(int(re.match(avReg, video).group('av')))
                if not ee:
                    continue
                video = "https://www.bilibili.com/video/{}".format(ee)
                title = cd.get('title')
                cc.append({"id": did, "type": "update_video", "content":content,"title": title, "url": video,"time":ltime})
    return cc

然后我这段代码里用到的avReg:avReg = r'^bilibili\:\/\/video\/(?P<av>[0-9]+)\/\?.*?'

enc()用来把av转bv的代码(也是copy来的):

table='fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'
tr={}
for i in range(58):
	tr[table[i]]=i
s=[11,10,3,8,4,6]
xor=177451812
add=8728348608

def enc(x):
    try:
        x=(x^xor)+add
        r=list('BV1  4 1 7  ')
        for i in range(6):
            r[s[i]]=table[x//58**i%58]
        return ''.join(r)
    except:
        return False

具体的能直接执行的代码的话,可以看一下我的xiaobai-bot里bili文件夹下的info.py,最后一行后边加上

cs = asyncio.get_event_loop().run_until_complete(getCards(uid, SESSDATA, CSRF))
for c in cs:
    print(c)

就能直接看返回的list了_(:з」∠)_

希望能改进一下_(:з」∠)_

防止“帮助”被挡

提高“帮助”指令的优先级,防止被其他插件拦截。block 也要改成 False,不要拦到别的插件。

运行hb run报错

安装方式

image

环境

win10专业版 64位
python版本 3.9.0
pip版本 20.2.3
go-cqhttp v0.9.40-fix2-windows-amd64

已安装依赖

appdirs                    1.4.4
APScheduler                3.7.0
certifi                    2020.12.5
click                      7.1.2
colorama                   0.4.4
fastapi                    0.63.0
h11                        0.9.0
haruka-bot                 1.2.0
httpcore                   0.12.3
httpx                      0.16.1
idna                       3.1
loguru                     0.5.3
nonebot-plugin-apscheduler 0.1.2
nonebot2                   2.0.0a10
packaging                  20.9
Pillow                     8.1.0
pip                        20.2.3
pyasn1                     0.4.8
pydantic                   1.7.3
pyee                       8.1.0
pygtrie                    2.4.2
pyparsing                  2.4.7
pyppeteer                  0.2.5
python-dotenv              0.15.0
pytz                       2021.1
qrcode                     6.1
rfc3986                    1.4.0
rsa                        4.7.1
setuptools                 49.2.1
six                        1.15.0
sniffio                    1.2.0
starlette                  0.13.6
tinydb                     4.4.0
tqdm                       4.57.0
tzlocal                    2.1
urllib3                    1.26.3
uvicorn                    0.11.8
websockets                 8.1
win32-setctime             1.0.3

根据 #78 修改了时区
image

报错信息

Traceback (most recent call last):
  File "c:\users\administrator\appdata\local\programs\python\python39\lib\runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "c:\users\administrator\appdata\local\programs\python\python39\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\Scripts\hb.exe\__main__.py", line 4, in <module>
  File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-packages\haruka_bot\__init__.py", line 1, in <module>
    import nonebot
ModuleNotFoundError: No module named 'nonebot'
PS C:\Users\Administrator> hb run
Traceback (most recent call last):
  File "c:\users\administrator\appdata\local\programs\python\python39\lib\runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "c:\users\administrator\appdata\local\programs\python\python39\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\Scripts\hb.exe\__main__.py", line 4, in <module>
  File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-packages\haruka_bot\__init__.py", line 1, in <module>
    import nonebot
ModuleNotFoundError: No module named 'nonebot'

即使用fixurl+分片也可能收不到消息的问题 附建议

已经在群里反馈过 应群主要求提issue
具体现象为 :go-cqhttp fix3 对应开播主播开播时日志显示消息已发送,fixurl和分片都是开启状态,但是有人收的到消息有人收不到消息,手机端两个系统都有收到的 电脑端没有人收到

经过分析收到的截图发现是切开的链接后半段被杀了
故提出建议

1.将开播提醒链接改为短链接
2.将开播提醒的链接替换为房间号 或者干脆开播提醒就不发链接
3.通过QQ的卡片消息分享开播连接(群主提的)

更新文档

  • README,修改功能说明,增加截图展示
  • 重写主页 features(多开,)
  • 优化部署教程
  • 更新教程中 go-cqhttp 的配置文件
  • 增加 go-cqhttp 多开教程
  • 更新功能列表

bilibiliApi请求失败

自律人偶3rd 13:34:18
@自律人偶4th-Bot 添加主播 517746113

自律人偶4th-Bot 13:34:18
请输入有效的uid

在群内添加主播uid时,显示“请输入有效的uid”
服务器能够正常ping api.bilibili.com

centos7.4.5+宝塔页面:
阿里云和宝塔页面的安全组已放行8082 3000端口

nonebot2:
[2021-01-02 13:34:18] [INFO]: 收到群 自律人偶2nd、自律人…(288xxx590) 内 自律人偶3rd(35xxx55776) 的消息: [CQ:at,qq=252xxx7646] 添加主播 517xxx113 (11049xxx33)
[2021-01-02 13:34:18] [INFO]: 发送群 28812xxx0(2881xxx90) 的消息: [{"type": ... (-657066301)
[2021-01-02 13:37:02] [INFO]: 收到群 自律人偶2nd、自律人…(28xxx6590) 内 自律人偶3rd(353xxx5776) 的消息: [CQ:at,qq=252xxx7646] 帮助 (-1345141163)
[2021-01-02 13:37:03] [INFO]: 发送群 28812xx90(28812xxx0) 的消息: [{"type": ... (834032630)

haruka-bot:

[root@iZ2zeguyozsg68898avs04Z haruka-bot]# hb run
01-02 13:34:00 [INFO] nonebot | NoneBot is initializing...
01-02 13:34:00 [INFO] nonebot | Current Env: prod
01-02 13:34:00 [INFO] nonebot | Succeeded to import "nonebot.plugins.base"
01-02 13:34:00 [INFO] nonebot | Succeeded to import "nonebot_plugin_apscheduler"
01-02 13:34:00 [WARNING] nonebot | Duplicated prefix rule "关闭动态"
01-02 13:34:00 [WARNING] nonebot | Duplicated prefix rule "开启动态"
01-02 13:34:00 [WARNING] nonebot | Duplicated prefix rule "主播列表"
01-02 13:34:00 [WARNING] nonebot | Duplicated prefix rule "开启权限"
01-02 13:34:00 [WARNING] nonebot | Duplicated prefix rule "关闭直播"
01-02 13:34:00 [WARNING] nonebot | Duplicated prefix rule "关闭全体"
01-02 13:34:00 [WARNING] nonebot | Duplicated prefix rule "开启全体"
01-02 13:34:00 [WARNING] nonebot | Duplicated prefix rule "删除主播"
01-02 13:34:00 [WARNING] nonebot | Duplicated prefix rule "添加主播"
01-02 13:34:00 [WARNING] nonebot | Duplicated prefix rule "关闭权限"
01-02 13:34:00 [WARNING] nonebot | Duplicated prefix rule "版本信息"
01-02 13:34:00 [WARNING] nonebot | Duplicated prefix rule "开启直播"
01-02 13:34:00 [INFO] nonebot | Succeeded to import "haruka_bot"
01-02 13:34:00 [INFO] nonebot | Running NoneBot...
01-02 13:34:00 [INFO] uvicorn | Started server process [11745]
01-02 13:34:00 [INFO] uvicorn | Waiting for application startup.
01-02 13:34:00 [INFO] nonebot_plugin_apscheduler | Scheduler Started
01-02 13:34:00 [INFO] uvicorn | Application startup complete.
01-02 13:34:00 [INFO] uvicorn | Uvicorn running on http://127.0.0.1:8082 (Press CTRL+C to quit)
01-02 13:34:01 [INFO] uvicorn | ('127.0.0.1', 35528) - "WebSocket /cqhttp/ws" [accepted]
01-02 13:34:01 [INFO] nonebot | WebSocket Connection from CQHTTP Bot 25xxxx7646 Accepted!
01-02 13:34:18 [INFO] nonebot | CQHTTP | 2522147646 [message.group.normal]: Message 1104979833 from 3535755776@[群:288xxx90]: "添加主播 517xxx113"
01-02 13:34:18 [INFO] nonebot | Event will be handled by <Matcher from haruka_bot, type=message, priority=5, temp=False>
01-02 13:34:18 [INFO] nonebot | Matcher <Matcher from haruka_bot, type=message, priority=5, temp=False> running complete

.env.prod:
HOST=127.0.0.1
PORT=8082
SECRET=
ACCESS_TOKEN=
SUPERUSERS=[xxxxxx]
COMMAND_START=[""]
HARUKA_DIR=./data/

config.hjson:
{
"uin": xxxxx,
"password": "xxxxx",
"encrypt_password": false,
"password_encrypted": "",
"enable_db": true,
"access_token": "",
"relogin": {
"enabled": true,
"relogin_delay": 3,
"max_relogin_times": 0
},
"_rate_limit": {
"enabled": false,
"frequency": 1,
"bucket_size": 1
},
"ignore_invalid_cqcode": false,
"force_fragmented": false,
"heartbeat_interval": 0,
"http_config": {
"enabled": false,
},
"ws_config": {
"enabled": false,
},
"ws_reverse_servers": [
{
"enabled": true,
"reverse_url": "ws://127.0.0.1:8082/cqhttp/ws",
"reverse_api_url": "",
"reverse_event_url": "",
"reverse_reconnect_interval": 3000
}
],
"post_message_format": "array",
"web_ui": {
"enabled": false,
}
}

直播间被封后可能存在的查询直播间状态的问题

在直播间被封后,调用api查询直播间信息,如果只查这个被封了直播间的uid,例如uids = [1329612]则返回的数据形式如下:
{'code': 0, 'msg': 'success', 'message': 'success', 'data': []}

如果查包含这个被封了直播间的uid的多个uid,例如uids = [1329612,698438232]则返回的数据形式如下:

{'code': 0,
'msg': 'success',
'message': 'success',
'data': {
'698438232': {
'title': '【歌回】扇宝快餐店营业啦',
'room_id': 22673512,
'uid': 698438232,
'online': 181772,
'live_time': 0,
'live_status': 2,
'short_id': 0,
'area': 6,
'area_name': '生活娱乐',
'area_v2_id': 371,
'area_v2_name': '虚拟主播',
'area_v2_parent_name': '虚拟主播',
'area_v2_parent_id': 9,
'uname': '扇宝',
'face': 'https://i0.hdslb.com/bfs/face/583ea185eaf66caf05aa37c3a8a09906cef98853.jpg',
'tag_name': '日常,学习,萌宠,厨艺,手机直播',
'tags': '清楚系vup,扇宝,vup,新人vup',
'cover_from_user': 'https://i0.hdslb.com/bfs/live/new_room_cover/38abc307f928bf4c310fd59f59c60be0f6b83861.jpg',
'keyframe': 'https://i0.hdslb.com/bfs/live-key-frame/keyframe06202207000022673512wsga3f.jpg',
'lock_till': '0000-00-00 00:00:00',
'hidden_till': '0000-00-00 00:00:00', 'broadcast_type': 0
}
}
}
即,返回的信息里边,并没有UID为1329612的房间的信息,这个时候去查data["1329612"]["live_status“]可能会报错

centos7 下 -bash: hb: command not found

前景:
1、系统使用python3调用Python3.8
2、使用pip3 install haruka-bot --target=/usr/haruka-bot/
或者是pip3 install haruka-bot
(已限定nonebot2版本)

报错:
[root@iZ2zeguyozsg68898avs04Z haruka-bot]# hb run
-bash: hb: command not found
[root@iZ2zeguyozsg68898avs04Z haruka-bot]# sudo hb run
sudo: hb: command not found

常见问题收集

这里将收集大家使用中遇到的问题,整理并更新至文档的 常见问题

这里只做收集汇总,需要帮助请单独开一个 issue。觉得有什么比较好的问题(已解决)也欢迎在下面补充。

  • 如何从 dd-bot 迁移(谁还用这玩意儿啊)
  • 风控相关
  • pip 是什么
  • 错误分类,判断问题来自 HarukaBot,NoneBot2 还是 go-cqhttp(如 Pydantic 降级)
  • 不要在同一目录下创建 hb 和 gocq
  • 我应该下载哪个版本的 go-cqhttp?

关于go-cqhttp连接不上bot问题

是不是原来dd-bot的go-cqhttp的config文件不适用了,go-cqhttp连接不上bot
go-cqhttp报错
“连接到反向Websocket Universal服务器 ws://127.0.0.1:8080/ws 时出现错误: websocket: bad handshake”
bot报错
“('127.0.0.1', 50168) - "WebSocket /ws" 403
go-cqhttp版本为go-cqhttp-v0.9.29-fix2-windows-amd64.zip

优化日志

封装目前的已知问题,使用文字表述情况,使日志输出更加友好。(打消用户不必要的焦虑)

关于直播推送

如果我关注的人转生了,我关注她的新号的时候她还没有开通直播间那会报错吗?我看添加的时候貌似自动就是直播推送开

更新文档

  • 校对 dev 中的 pr
  • 更新 go-cqhttp 配置部分
  • 添加 “版本信息” 介绍
  • 延迟问题说明修改

运行报错:OSError 无法执行 chrome

检测到有新动态后,后台(NoneBot)报错如下:
OSError: [Errno 8] Exec format error: '/root/.local/share/pyppeteer/local-chromium/588429/chrome-linux/chrome'
并且会长时间一直报错,机器人发不出去消息

系统:Linux Ubuntu 18.04 LTS aarch64
Python 版本:3.8.8
NoneBot 版本:2.0.0
HarukaBot 版本:应该是最新(pip3 install haruka-bot)

我猜测是系统的架构与下载的 chrome 架构不一样
我用 windows 运行的 HB 一切正常,可以检测动态、视频、直播

私聊消息图片丢失 但群聊正常

这两天开始突然出现私聊发出去图片丢失 日志报错“消息图片上传失败” 但群聊一切正常情况

[2021-06-08 13:14:46] [WARNING]: 警告: 私聊 消息图片上传失败.
[2021-06-08 13:14:46] [INFO]: 发送好友 的消息: 小鱼_Sakana发 ... (-896840831)
[2021-06-08 13:14:47] [INFO]: 发送群 的消息: 小鱼_Sakana发 ... (-1303058255)

上机器人号测试了私聊发图文字带图 都可以正常发
QQ截图20210608132726

启动bot失败,已经确定python版本和无其他bot冲突

Failed to import "nonebot_plugin_apscheduler"

Traceback (most recent call last):
File "c:\users\cicidoll\appdata\local\programs\python\python38-32\lib\runpy.py", line 193, in _run_module_as_main
return _run_code(code, main_globals, None,
File "c:\users\cicidoll\appdata\local\programs\python\python38-32\lib\runpy.py", line 86, in run_code
exec(code, run_globals)
File "C:\virtualProject\production\Scripts\hb.exe_main
.py", line 7, in
File "c:\virtualproject\production\lib\site-packages\click\core.py", line 829, in call
return self.main(*args, **kwargs)
File "c:\virtualproject\production\lib\site-packages\click\core.py", line 782, in main
rv = self.invoke(ctx)
File "c:\virtualproject\production\lib\site-packages\click\core.py", line 1259, in invoke
return process_result(sub_ctx.command.invoke(sub_ctx))
File "c:\virtualproject\production\lib\site-packages\click\core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "c:\virtualproject\production\lib\site-packages\click\core.py", line 610, in invoke
return callback(*args, **kwargs)
File "c:\virtualproject\production\lib\site-packages\haruka_bot\cli_init
.py", line 13, in run
from .bot import run
File "", line 991, in _find_and_load
File "", line 975, in _find_and_load_unlocked
File "", line 671, in _load_unlocked
File "", line 783, in exec_module
File "", line 219, in _call_with_frames_removed
File "c:\virtualproject\production\lib\site-packages\haruka_bot\cli\bot.py", line 18, in
nonebot.load_plugin('nonebot_plugin_apscheduler')
File "c:\virtualproject\production\lib\site-packages\nonebot\plugin.py", line 877, in load_plugin
return context.run(_load_plugin, module_path)

File "c:\virtualproject\production\lib\site-packages\nonebot\plugin.py", line 861, in load_plugin
module = importlib.import_module(module_path)
File "c:\users\cicidoll\appdata\local\programs\python\python38-32\lib\importlib_init
.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 1014, in _gcd_import
File "", line 991, in _find_and_load
File "", line 975, in _find_and_load_unlocked
File "", line 671, in _load_unlocked
File "", line 783, in exec_module
File "", line 219, in call_with_frames_removed
File "c:\virtualproject\production\lib\site-packages\nonebot_plugin_apscheduler_init
.py", line 11, in
scheduler = AsyncIOScheduler()
File "c:\virtualproject\production\lib\site-packages\apscheduler\schedulers\base.py", line 87, in init
self.configure(gconfig, **options)
File "c:\virtualproject\production\lib\site-packages\apscheduler\schedulers\base.py", line 126, in configure
self._configure(config)
File "c:\virtualproject\production\lib\site-packages\apscheduler\schedulers\asyncio.py", line 48, in _configure
super(AsyncIOScheduler, self)._configure(config)
File "c:\virtualproject\production\lib\site-packages\apscheduler\schedulers\base.py", line 697, in _configure
self.timezone = astimezone(config.pop('timezone', None)) or get_localzone()
File "c:\virtualproject\production\lib\site-packages\tzlocal\win32.py", line 93, in
get_localzone
_cache_tz = pytz.timezone(get_localzone_name())
File "c:\virtualproject\production\lib\site-packages\tzlocal\win32.py", line 84, in
get_localzone_name
raise pytz.UnknownTimeZoneError('Can not find timezone ' + tzkeyname)
pytz.exceptions.UnknownTimeZoneError: 'Can not find timezone '
01-01 18:11:21 [ERROR] nonebot | Failed to import "haruka_bot"
Traceback (most recent call last):
File "c:\users\cicidoll\appdata\local\programs\python\python38-32\lib\runpy.py", line 193, in _run_module_as_main
return _run_code(code, main_globals, None,
File "c:\users\cicidoll\appdata\local\programs\python\python38-32\lib\runpy.py", line 86, in run_code
exec(code, run_globals)
File "C:\virtualProject\production\Scripts\hb.exe_main
.py", line 7, in
File "c:\virtualproject\production\lib\site-packages\click\core.py", line 829, in call
return self.main(*args, **kwargs)
File "c:\virtualproject\production\lib\site-packages\click\core.py", line 782, in main
rv = self.invoke(ctx)
File "c:\virtualproject\production\lib\site-packages\click\core.py", line 1259, in invoke
return process_result(sub_ctx.command.invoke(sub_ctx))
File "c:\virtualproject\production\lib\site-packages\click\core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "c:\virtualproject\production\lib\site-packages\click\core.py", line 610, in invoke
return callback(*args, **kwargs)
File "c:\virtualproject\production\lib\site-packages\haruka_bot\cli_init
.py", line 13, in run
from .bot import run
File "", line 991, in _find_and_load
File "", line 975, in _find_and_load_unlocked
File "", line 671, in _load_unlocked
File "", line 783, in exec_module
File "", line 219, in _call_with_frames_removed
File "c:\virtualproject\production\lib\site-packages\haruka_bot\cli\bot.py", line 21, in
nonebot.load_plugin("haruka_bot")
File "c:\virtualproject\production\lib\site-packages\nonebot\plugin.py", line 877, in load_plugin
return context.run(_load_plugin, module_path)
File "c:\virtualproject\production\lib\site-packages\nonebot\plugin.py", line 861, in load_plugin
module = importlib.import_module(module_path)
File "c:\users\cicidoll\appdata\local\programs\python\python38-32\lib\importlib_init
.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "", line 1014, in _gcd_import
File "", line 991, in _find_and_load
File "", line 975, in _find_and_load_unlocked
File "", line 671, in _load_unlocked
File "", line 783, in exec_module
File "", line 219, in call_with_frames_removed
File "c:\virtualproject\production\lib\site-packages\haruka_bot_init
.py", line 5, in
from . import config_manager
File "c:\virtualproject\production\lib\site-packages\haruka_bot\config_manager.py",
line 3, in
from nonebot.permission import GROUP_ADMIN, SUPERUSER, GROUP_OWNER
ImportError: cannot import name 'GROUP_ADMIN' from 'nonebot.permission' (c:\virtualproject\production\lib\site-packages\nonebot\permission.py)

关于dd-bot的配置迁移问题

可以把dd-bot里的conf文件直接复制到这个bot的文件夹里完成配置的迁移吗?如果要重新在各个群再添加一遍感觉挺麻烦和尴尬的

Linux 动态推送失效(pyppeteer.errors.BrowserError: Browser closed unexpectedly)

系统centos8
python3.8.3
harukabot1.2.1

02-28 21:35:24 [ERROR] apscheduler | Job "dy_sched (trigger: cron[second='*/10'], next run at: 2021-02-28 21:35:30 CST)" raised an exception
Traceback (most recent call last):
File "", line 1, in
File "/usr/local/python3/lib/python3.8/multiprocessing/spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "/usr/local/python3/lib/python3.8/multiprocessing/spawn.py", line 129, in _main
return self._bootstrap(parent_sentinel)
File "/usr/local/python3/lib/python3.8/multiprocessing/process.py", line 315, in _bootstrap
self.run()
File "/usr/local/python3/lib/python3.8/multiprocessing/process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "/usr/local/python3/lib/python3.8/site-packages/uvicorn/subprocess.py", line 62, in subprocess_started
target(sockets=sockets)
File "/usr/local/python3/lib/python3.8/site-packages/uvicorn/main.py", line 390, in run
loop.run_until_complete(self.serve(sockets=sockets))
File "/usr/local/python3/lib/python3.8/site-packages/apscheduler/executors/base_py3.py", line 30, in run_coroutine_job
retval = await job.func(*job.args, **job.kwargs)
File "/usr/local/python3/lib/python3.8/site-packages/haruka_bot/dynamic_pusher.py", line 41, in dy_sched
await dynamic.get_screenshot()
File "/usr/local/python3/lib/python3.8/site-packages/haruka_bot/dynamic.py", line 40, in get_screenshot
browser = await launch(args=['--no-sandbox'])
File "/usr/local/python3/lib/python3.8/site-packages/pyppeteer/launcher.py", line 306, in launch
return await Launcher(options, **kwargs).launch()
File "/usr/local/python3/lib/python3.8/site-packages/pyppeteer/launcher.py", line 167, in launch
self.browserWSEndpoint = get_ws_endpoint(self.url)
File "/usr/local/python3/lib/python3.8/site-packages/pyppeteer/launcher.py", line 228, in get_ws_endpoint
with urlopen(url) as f:
File "/usr/local/python3/lib/python3.8/urllib/request.py", line 222, in urlopen
return opener.open(url, data, timeout)
File "/usr/local/python3/lib/python3.8/urllib/request.py", line 525, in open
response = self._open(req, data)
File "/usr/local/python3/lib/python3.8/urllib/request.py", line 542, in _open
result = self._call_chain(self.handle_open, protocol, protocol +
File "/usr/local/python3/lib/python3.8/urllib/request.py", line 502, in _call_chain
result = func(*args)
File "/usr/local/python3/lib/python3.8/urllib/request.py", line 1379, in http_open
return self.do_open(http.client.HTTPConnection, req)
File "/usr/local/python3/lib/python3.8/urllib/request.py", line 1354, in do_open
r = h.getresponse()
File "/usr/local/python3/lib/python3.8/http/client.py", line 1332, in getresponse
response.begin()
File "/usr/local/python3/lib/python3.8/http/client.py", line 303, in begin
version, status, reason = self._read_status()
File "/usr/local/python3/lib/python3.8/http/client.py", line 285, in _read_status
raise BadStatusLine(line)
http.client.BadStatusLine: GET /json/version HTTP/1.1

使用 Pillow 渲染动态图片

动态内容直接使用 Pillow 库生成,不再依赖 Chromium 无头浏览器截图。

经过两天的研究,初步确认了可行性,之后在这里汇总的进度。

PS:该方法性能依然成迷,有待进一步验证。

  • 字体选择(支持显示中文,emoji 和颜文字)
  • 自动区分 emoji,中文和其他语言并选择合适字体
  • 自动换行
  • 计算段落末尾位置
  • 单独渲染表情包和 emoji,并在适当位置插入
    • 表情包
    • emoji
  • 标点符号不在行首
  • 图片
  • 头像
  • 头饰
  • 粉丝牌
  • 大会员

预发布版本似乎没有及时上传到pypi

因为看到预发布版支持了nonebot2-2.0.0a8,想去pip install下来测试一下,结果发现获取不到这个版本
在Ubuntu 18.04 - Python3.7环境下

  • pip3 install haruka-bot获取到的默认版本是haruka-bot-1.0.7(gayhub最后一个发布版已经是1.1.1了)
  • pip3 install --upgrade --pre haruka-bot更新到的版本是haruka-bot-1.1.0a0(gayhub最后一个预发布版是v1.2.0-alpha.3)
  • pip3 install haruka-bot==1.2.0a3会提示获取不到这个版本

另外经过测试,只有haruka-bot==1.1.0a0配合nonebot2==2.0.0a7可以正常工作,其他组合均有各种问题

关于动态推送失败问题

经过测试,在所订阅的主播发表动态的时候bot会出现
[W:pyppeteer.chromium_downloader] start chromium download.
Download may take a few minutes.
的提示,然后就报错,报错之后bot就没反应了。也就是说在群里at并发送信息不再会有回应。 chromium是否可以手动下载??

错误日志如下:
[ERROR] apscheduler | An error has been caught in function 'run_coroutine_job', process 'MainProcess' (704), thread 'MainThread' (3272):
Traceback (most recent call last):
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 670, in urlopen
httplib_response = self._make_request(
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 381, in _make_request
self._validate_conn(conn)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 978, in validate_conn
conn.connect()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connection.py", line 362, in connect
self.sock = ssl_wrap_socket(
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\util\ssl
.py", line 386, in ssl_wrap_socket
return context.wrap_socket(sock, server_hostname=server_hostname)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\ssl.py", line 500, in wrap_socket
return self.sslsocket_class._create(
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\ssl.py", line 1040, in _create
self.do_handshake()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\ssl.py", line 1309, in do_handshake
self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1122)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\bot\HarukaBot-master\bot.py", line 31, in
nonebot.run(app="bot:app")
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\nonebot_init_.py", line 226, in run
get_driver().run(host, port, *args, **kwargs)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\nonebot\drivers\fastapi.py", line 119, in run
uvicorn.run(app or self.server_app,
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\uvicorn\main.py", line 362, in run
server.run()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\uvicorn\main.py", line 390, in run
loop.run_until_complete(self.serve(sockets=sockets))
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 629, in run_until_complete
self.run_forever()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 596, in run_forever
self._run_once()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py", line 1890, in _run_once
handle._run()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\asyncio\events.py", line 80, in _run
self._context.run(self._callback, *self._args)

File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\apscheduler\executors\base_py3.py", line 29, in run_coroutine_job
retval = await job.func(*job.args, **job.kwargs)
File "src/plugins\haruka_bot\dynamic.py", line 48, in dy_sched
await dynamic.get_screenshot()
File "src/plugins\haruka_bot\utils.py", line 54, in get_screenshot
browser = await launch(args=['--no-sandbox'])
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\pyppeteer\launcher.py", line 305, in launch
return await Launcher(options, **kwargs).launch()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\pyppeteer\launcher.py", line 119, in init
download_chromium()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\pyppeteer\chromium_downloader.py", line 146, in download_chromium
extract_zip(download_zip(get_url()), DOWNLOADS_FOLDER / REVISION)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\pyppeteer\chromium_downloader.py", line 85, in download_zip
data = http.request('GET', url, preload_content=False)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\request.py", line 75, in request
return self.request_encode_url(
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\request.py", line 97, in request_encode_url
return self.urlopen(method, url, **extra_kw)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\poolmanager.py", line 336, in urlopen
response = conn.urlopen(method, u.request_uri, **kw)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 754, in urlopen
return self.urlopen(
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 754, in urlopen
return self.urlopen(
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 754, in urlopen
return self.urlopen(
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 726, in urlopen
retries = retries.increment(
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\util\retry.py", line 446, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='storage.googleapis.com', port=443): Max retries exceeded with url: /chromium-browser-snapshots/Win_x64/588429/chrome-win32.zip (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1122)')))

运行中报错AttributeError: 'list' object has no attribute 'items'

02-24 12:23:21 [INFO] uvicorn | Application startup complete.
02-24 12:23:21 [INFO] uvicorn | Uvicorn running on http://127.0.0.1:8080 (Press CTRL+C to quit)
02-24 12:23:24 [INFO] uvicorn | ('127.0.0.1', 59082) - "WebSocket /cqhttp/ws" [accepted]
02-24 12:23:24 [INFO] nonebot | WebSocket Connection from CQHTTP Bot 340*****67 Accepted!
02-24 12:23:30 [ERROR] apscheduler | Job "live_sched (trigger: cron[second='
/10'], next run at: 2021-02-24 12:23:40 CST)" raised an exception
Traceback (most recent call last):
File "/usr/local/bin/hb", line 8, in
sys.exit(main())
File "/usr/local/lib/python3.8/dist-packages/click/core.py", line 829, in call
return self.main(*args, **kwargs)
File "/usr/local/lib/python3.8/dist-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/usr/local/lib/python3.8/dist-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/usr/local/lib/python3.8/dist-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/local/lib/python3.8/dist-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/usr/local/lib/python3.8/dist-packages/haruka_bot/cli/init.py", line 14, in run
run()
File "/usr/local/lib/python3.8/dist-packages/haruka_bot/cli/bot.py", line 35, in run
nonebot.run(app="haruka_bot.cli.bot:app")
File "/usr/local/lib/python3.8/dist-packages/nonebot/init.py", line 219, in run
get_driver().run(host, port, *args, **kwargs)
File "/usr/local/lib/python3.8/dist-packages/nonebot/drivers/fastapi.py", line 160, in run
uvicorn.run(app or self.server_app,
File "/usr/local/lib/python3.8/dist-packages/uvicorn/main.py", line 362, in run
server.run()
File "/usr/local/lib/python3.8/dist-packages/uvicorn/main.py", line 390, in run
loop.run_until_complete(self.serve(sockets=sockets))

File "/usr/local/lib/python3.8/dist-packages/apscheduler/executors/base_py3.py", line 30, in run_coroutine_job
retval = await job.func(*job.args, **job.kwargs)
File "/usr/local/lib/python3.8/dist-packages/haruka_bot/live_pusher.py", line 22, in live_sched
for uid, info in r.items():
AttributeError: 'list' object has no attribute 'items'

关于部分拥有2个房间号主播的推送地址问题

有的主播有两个直播房间号,除了自己本身的号之后还拥有一个官方奖励的3位数房间号,例如
新月冰冰:
https://live.bilibili.com/5275
https://live.bilibili.com/399
C酱:
https://live.bilibili.com/47867
https://live.bilibili.com/213

BOT会推送原本的房间号地址,虽然点进去会自动转跳到3位数房间号的地址。但是由于地址不一样在群内引来不必要的讨论。
如何能让BOT推送3位号房间地址?

如果目前没有此功能,希望能增加切换推送3位数房间号的功能。
或者是能在配置文件内增加能自定义的覆盖推送地址的项

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.