Skip to content

zhimengsub/TVSubscribeBot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TVSubscribeBot

片源录制机器人

封装了基于字符串解析的通用机器人交互框架command_handler,本工具仍为通用框架,需要进一步接入具体的机器人。

需要python>=3.7,否则可选参数的解析顺序可能会出错。

Requirments

  • 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@main
    • python-telegram-bot[job-queue]~=20.3
    • SQLAlchemy==1.4.46
    • pymongo>=4.1,<5
    • Set up a Mongodb server listening at 27017 (default port)
  • requirements of tvsubscriber:

    • pydantic==2.0.3

Usage example

see example_bot.py and example_submitter.py

Supported Commands

逻辑:设置要录制的节目名和所在的频道,指定轮询时间,到时间后搜索该节目,如果存在则询问用户是否要录制,然后进行录制。

指令

  • <...>表示必须参数,如包含空格必须用英文双引号"括起来。

  • [...]表示可选参数,如果按顺序传递可以不设置参数名,否则需要通过参数名=参数值传递,如参数值包含空格必须用英文双引号"括起来。

  • 所有关键字相关参数(channelprogramexcludeProgramdetail):

    均支持半角字符;

    ?可匹配单个字符,*可匹配多个字符;

    如包含空格必须用英文双引号"括起来;

    开头或结尾加/(在双引号内)匹配边界,如フジテレビ/匹配フジテレビ,但不匹配フジテレビ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, 可选) - 限制节目开始播出时间(日本)。格式HHMMHHMMSS(24小时制),如0630230500。默认为空表示不限制。
    • findFirstMatch (bool, 可选) - 直接返回首个匹配到的结果,确定节目唯一时可以加快查找速度。取值true/1false/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, 可选) - 限制节目开始播出时间(日本)。格式HHMMHHMMSS(24小时制),如0630230500。默认为空表示不限制。
    • findFirstMatch (bool, 可选) - 直接返回首个匹配到的结果,确定节目唯一时可以加快查找速度。取值true/1false/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, 可选) - 限制节目开始播出时间(日本)。格式HHMMHHMMSS(24小时制),如0630230500。默认为空表示不限制。

<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,6

    • jobid (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) - 任务序号。

备注:

  1. 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

  2. crontab语法说明

  3. 还要添加一些权限管理,在配置文件里指定对部分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

About

片源录制机器人

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors