片源录制机器人
封装了基于字符串解析的通用机器人交互框架command_handler,本工具仍为通用框架,需要进一步接入具体的机器人。
需要python>=3.7,否则可选参数的解析顺序可能会出错。
-
requirements of dumb_bot
pip install python-telegram-bot[webhooks]
-
requirements for scheduled jobs ability
pip install git+https://github.com/python-telegram-bot/ptbcontrib.git@mainpython-telegram-bot[job-queue]~=20.3SQLAlchemy==1.4.46pymongo>=4.1,<5- Set up a Mongodb server listening at 27017 (default port)
-
requirements of tvsubscriber:
pydantic==2.0.3
see example_bot.py and example_submitter.py
逻辑:设置要录制的节目名和所在的频道,指定轮询时间,到时间后搜索该节目,如果存在则询问用户是否要录制,然后进行录制。
-
<...>表示必须参数,如包含空格必须用英文双引号"括起来。 -
[...]表示可选参数,如果按顺序传递可以不设置参数名,否则需要通过参数名=参数值传递,如参数值包含空格必须用英文双引号"括起来。 -
所有关键字相关参数(
channel、program、excludeProgram、detail):均支持半角字符;
?可匹配单个字符,*可匹配多个字符;如包含空格必须用英文双引号
"括起来;开头或结尾加
/(在双引号内)匹配边界,如フジテレビ/匹配フジテレビ,但不匹配フジテレビONE。 -
登陆
默认记住用户名和密码,如需更换用户只需重新执行login指令。
/sub login <username> <password> -
搜索节目(只检查节目是否存在,不订阅)
/sub search <channel> <program> [excludeProgram] [detail] [startDate] [startTime] [findFirstMatch]示例:
/sub search TBS1 東大王- 搜索频道名包含TBS1,标题包含東大王的节目。示例2:
/sub search * * 上白石萌音- 搜索所有频道中,详细信息包含上白石萌音的所有节目。示例3:
/sub search "011 NHK総合1" うたコン- 搜索频道名包含011 NHK総合1,标题包含うたコン的节目。已订阅的节目仍会显示,且有“已订阅”字样。
channel(str) - 频道关键字。program(str) - 节目标题关键字。excludeProgram(str, 可选) - 节目标题排除关键字,如再可以排除重播。默认为空。detail(str, 可选) - 节目详细信息关键字。默认为*。startDate(str, 可选) - 限制节目开始播出日期(日本)。格式yyyymmdd,如20230613。默认为空表示不限制。startTime(str, 可选) - 限制节目开始播出时间(日本)。格式HHMM或HHMMSS(24小时制),如0630、230500。默认为空表示不限制。findFirstMatch(bool, 可选) - 直接返回首个匹配到的结果,确定节目唯一时可以加快查找速度。取值true/1、false/0,其他取值将视为false。
-
执行单次订阅任务
/sub now <channel> <program> [excludeProgram] [detail] [startDate] [startTime] [findFirstMatch]示例:
/sub now TBS1 東大王- 立刻订阅频道名包含TBS1,标题包含東大王的节目。示例2:
/sub now * * 上白石萌音- 立刻订阅所有频道中,详细信息包含上白石萌音的所有节目。已订阅的节目不会显示。
channel(str) - 频道关键字。program(str) - 节目标题关键字。excludeProgram(str, 可选) - 节目标题排除关键字,如[再]可以排除重播。默认为空。detail(str, 可选) - 节目详细信息关键字。默认为*。startDate(str, 可选) - 限制节目开始播出日期(日本)。格式yyyymmdd,如20230613。默认为空表示不限制。startTime(str, 可选) - 限制节目开始播出时间(日本)。格式HHMM或HHMMSS(24小时制),如0630、230500。默认为空表示不限制。findFirstMatch(bool, 可选) - 直接返回首个匹配到的结果,确定节目唯一时可以加快查找速度。取值true/1、false/0,其他取值将视为false。默认为false。
频道关键字匹配:获取频道信息需要指定所在地区(
network参数),频道所在地区是固定的,因此可以提前建一个cache保存频道所在的地区信息。匹配频道时先找本地cache,没有的话调直接遍历所有
network,再进行查找。匹配结果:如果有至少一个匹配,则直接触发检查预约事件,询问用户订阅哪一个(见后文),如果无匹配则报错
触发单次查询任务:
[bot]
共找到2个结果
序号:1
频道:フジテレビ
所属网络:关东广域
播出时间:2023/05/07 23:15:00(日)
节目:テレビアニメ「鬼滅の刃」刀鍛冶の里編[字][解][デ]
节目说明:第五話『赫刀』
时长:30分钟
价格:3.5元
分辨率:1080i
序号:2
频道:フジテレビ
所属网络:关东广域
播出时间:2023/05/14 23:15:00(日)
节目:テレビアニメ「鬼滅の刃」刀鍛冶の里編[字][解][デ]
节目说明:第六話『柱になるんじゃないのか!』
时长:30分钟
价格:3.5元
分辨率:1080i
请输入需要订阅的序号,0表示全选,多个序号必须用英文逗号','隔开。
输入/sub cancel或/sub cancel now终止订阅。
[user]
1,2
(如果是非预期的其他回复则再次输出最后一句话)
[bot]
预约成功:1,2
余额:xxx
[或]
预约成功:1
预约失败:2 (错误信息从ApiException获取)
余额:xxx
[或]
预约失败 (错误信息从ApiException获取)
-
添加每日定时检查任务(后续会根据需求添加其他时间间隔的定时任务)
/sub daily <channel> <program> [excludeProgram] [detail] [checkTime] [days] [startTime]示例:
/sub daily TBS1 東大王 days=1- 每周一的当前时间订阅频道名包含TBS1,标题包含東大王的节目。示例2:
/sub daily * * 上白石萌音 checkTime=103000- 每天上午十点半,订阅所有频道中,详细信息包含上白石萌音的所有节目。示例3:
/sub daily フジテレビ 鬼滅の刃 checkTime=120000 days=6- 每周六中午订阅フジテレビ的鬼滅の刃。输入指令后会预览匹配结果,方便确认指令是否有误;到了触发时间才是真正可以订阅的时候。
-
channel(str) - 频道关键字。 -
program(str) - 节目标题关键字。 -
excludeProgram(str, 可选) - 节目标题排除关键字,如[再]可以排除重播。默认为空。 -
detail(str, 可选) - 节目详细信息关键字。默认为*。 -
checkTime(str, 可选) - 触发检查的时间(中国)。默认为消息发送的时间(由于处理延迟,本次不会触发)。格式:
HHMMSS- 时分秒(24小时制),如:100000表示每天上午十点整。 -
days(int | List[int], 可选) - 触发检查的星期数,多个数字必须用英文逗号,隔开。默认为每一天。格式:
0-6依次表示周日-周六,如:1,2,3,4,5表示周一到周五。 -
startTime(str, 可选) - 限制节目开始播出时间(日本)。格式HHMM或HHMMSS(24小时制),如0630、230500。默认为空表示不限制。
-
<channel>和<program>不一定要输入全名,作为关键字进行匹配频道关键字匹配:同上
节目关键字匹配:如果有多个匹配,则提示用户所有节目,否则提示没有匹配到,但均视为添加成功
成功后把这条记录加入一个配置文件(记录Channel对象和节目名)
并且开始执行定时任务(触发定时任务时从该频道搜索是否有匹配的节目,如果有则提示用户是否预约(见后文))
目前匹配结果:(已订阅的节目仍会显示,且有“已订阅”字样。) xxx 是否添加任务?(是/否) 输入/sub cancel或/sub cancel daily终止此会话。
触发定时任务(定时任务触发或手动触发): (已订阅的节目不会显示。)
[bot]
jobid: 1
共找到2个结果
序号:1
频道:フジテレビ
所属网络:关东广域
播出时间:2023/05/07 23:15:00(日)
节目:テレビアニメ「鬼滅の刃」刀鍛冶の里編[字][解][デ]
节目说明:第五話『赫刀』
时长:30分钟
价格:3.5元
分辨率:1080i
序号:2
频道:フジテレビ
所属网络:关东广域
播出时间:2023/05/14 23:15:00(日)
节目:テレビアニメ「鬼滅の刃」刀鍛冶の里編[字][解][デ]
节目说明:第六話『柱になるんじゃないのか!』
时长:30分钟
价格:3.5元
分辨率:1080i
请输入需要订阅的序号和jobid,二者用空格隔开,如1,2 1
序号可以用0表示全选,多个序号必须用英文逗号','隔开。
如果只有一个未处理定时任务则可省略jobid
输入/sub cancel或/sub cancel <jobid>取消本次订阅。
[user]
1,2 1
或
1,2
(如果是非预期的其他回复则再次输出最后一句话)
[bot]
jobid: 1
预约成功:1,2
余额:xxx
[或]
预约成功:1
预约失败:2 (错误信息从ApiException获取)
余额:xxx
[或]
预约失败 (错误信息从ApiException获取)
- 查看当前账户信息
/sub userinfo
- 查看已添加的定时任务
/sub list
[bot]
jobid: 1
已启用
channel: TBS1
program: 東大王
excludeProgram: ''
detail: *
checkTime: 221431
startTime: 无
days: 1
jobid: 2
已禁用
channel: *
program: *
excludeProgram: ''
detail: 上白石萌音
checkTime: 103000
startTime: 无
days: 0,1,2,3,4,5,6
-
修改单个定时任务
/sub edit <jobid> [channel] [program] [excludeProgram] [detail] [checkTime] [days] [startTime]一次只能修改一条。需要修改哪些项就指定对应的可选参数。
示例:
/sub edit 2 days=0,6jobid(int) - 任务序号
-
禁用(多个)定时任务
/sub disable <jobids>jobids(int | List[int]) - 任务序号,多个数字必须用英文逗号,隔开。
示例:
/sub disable 1,2 -
重启(多个)定时任务
/sub enable <jobids>jobids(int | List[int]) - 任务序号,多个数字必须用英文逗号,隔开。
示例:
/sub enable 1 -
删除(多个)定时任务
/sub remove <jobids>jobids(int | List[int]) - 任务序号,多个数字必须用英文逗号,隔开。
-
手动触发单个定时任务
/sub check <jobid>jobid(int) - 任务序号。
备注:
-
TVSubscriber使用了git submodule,其中的改动需要推送到TVSubscriber。
使用参考:https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%AD%90%E6%A8%A1%E5%9D%97
-
还要添加一些权限管理,在配置文件里指定对部分QQ号开放。
- (TODO) 交互式添加定时任务:
/sub start
交互期间输入/sub cancel中断交互过程
[user]
/sub start
[bot]
开始交互式录入,输入/sub cancel终止录入。
请输入频道名
[user]
フジテレビ
###################
[如果匹配到多个频道]
[bot]
关东广域
1. 081 フジテレビ
CS110
2. 307 フジテレビONE
3. 308 フジテレビTWO
4. 309 フジテレビNEXT
CS124
5. 613 フジテレビNEXT
6. 614 フジテレビONE
7. 615 フジテレビTWO
请输入序号
[user]
1
###################
[bot]
请输入节目名
[user]
鬼滅の刃
[如果匹配不到则提示重新输入]
[bot]
###################
[如果匹配到,则输出所有匹配]
匹配到以下节目,是否继续?[是/否]
序号:1
播出时间:2023/05/7 23:15:00
频道:フジテレビ
节目:テレビアニメ「鬼滅の刃」刀鍛冶の里編[字][解][デ]
第五話『赫刀』
价格:3.5
序号:2
播出时间:2023/05/14 23:15:00
频道:フジテレビ
节目:テレビアニメ「鬼滅の刃」刀鍛冶の里編[字][解][デ]
第六話『柱になるんじゃないのか!』
价格:3.5
###################
[如果不匹配,则提示]
无匹配节目,是否继续?[是/否]
[user]
是
[bot]
是否需要配置其他参数?[detail/time/days/否]
[user]
time=120000
[bot]
是否需要配置其他参数?[detail/days/否]
[user]
否
[bot]
已添加任务:
id enabled channel program detail time days
1 true "081 フジテレビ" "テレビアニメ「鬼滅の刃」刀鍛冶の里編[字][解][デ]" * 120000 1