Skip to content

参与开发

提供信息以帮助开发新签到器

欢迎! 很高兴你愿意让这个项目变得更好, 如果你希望 Embykeeper 支持一个新的签到器, 您可以通过 Github Issues 申请.

但是, 该 Emby 可能是邀请制 Emby, 使得开发者难以调试.

对于这类情况, 例如要在机器人 test_bot 处签到, 请运行命令:

bash
embykeeper config.toml -D all@test_bot | tee log.json

Docker 版本需要运行:

bash
docker run -v $(pwd)/embykeeper:/app --rm -it --net=host embykeeper/embykeeper -D message@test_bot -D edited_message@test_bot | tee log.json

保持程序运行, 然后, 您需要手动在 test_bot 进行一次成功的签到, 然后再进行一次签到以显示 '今日已签到' 信息, 程序将记录该过程中的消息日志, 并输出至 log.json.

最后, 结束程序, 并将输出的 log.json 发送至 讨论组高级用户讨论组.

对于有效的日志, 我们将以比视频更高优先级进行处理.

:: tip 提示 日志中的基本个人信息会被隐藏. :::

向 Embykeeper 贡献提交

欢迎! 很高兴你愿意让这个项目变得更好, 你可以通过以下您偏好的方式开始修改代码:

通过 Codesandbox 在线编辑与提交

  1. 进入 Codesandbox: 项目链接
  2. 点击右侧分栏的 Terminal, 点击 Fork and convert, 以启动一个云编辑器.
  3. 在新建的项目中, 等待项目依赖安装完成.
  4. 修改代码, 点击右侧命令列表中的命令, 即可查看效果.
  5. 您也可以点击右上角的 VS Code 按钮, 以查看 VS Code 链接到 Codesandbox 的方法.
  6. 点击最左侧文件树上方的 Git 图标, 即可 Push 到个人仓库.
  7. Pull Requests 提交新 Pull Request.

搭建本地开发环境编辑与提交

  1. Fork 本仓库

  2. 通过 git clone <forked repo> 以将仓库克隆到本地

  3. 创建虚拟环境:

    bash
    make develop
  4. 修改代码以实现需求, 您可以使用如下工具:

    bash
    make run # 运行 embykeeper
    make run/web # 运行 embykeeperweb
    make debugpy # 使用 vscode 的远程调试连接到 embykeeper
  5. 在提交 Pull Request 前, 请检查代码:

    bash
    make lint
    make test
  6. 提交 Commit, 并在 Pull Requests 提交新 Pull Request.

开发案例

主要可以扩展的类位于:

  • embykeeper.telechecker.bots
  • embykeeper.telechecker.monitor
  • embykeeper.telechecker.messager

您在开发过程中, 可以使用多种 调试工具 以方便您的调试.

当您有开发方面的疑问, 您也可以通过 Discord 讨论群 (推荐) 或 Telegram 讨论群 参与开发讨论.

每日签到站点

通常来说, 增加一个机器人的签到非常简单, 您需要在 bots 中增加一个文件 dummy.py:

python
from .base import BotCheckin

class DummyCheckin(BotCheckin):
    name = "Dummy"
    bot_username = "dummy_bot"
    bot_captcha_len = 4

您即增加一个名为 "Dummy" 的签到器, 将会向用户名为 "dummy_bot" 的机器人发送 "/checkin" 并等候一个 4 位的验证码, 识别验证码后将发送.

若您希望识别验证码后点击按钮, 您可以使用 AnswerBotCheckin, 您也可以重写 on_captcha 函数来实现自定义功能:

python
from .base import AnswerBotCheckin

class DummyCheckin(AnswerBotCheckin):
    ....
    async def on_captcha(self, message: Message, captcha: str):
        for l in captcha:
            try:
                await self.message.click(l)
            except ValueError:
                self.log.info(f'未能找到对应 "{l}" 的按键, 正在重试.')
                await self.retry()
                break

上述代码实现每次按对应一个字符按键的功能.

更多签到器配置参加: BotCheckin 类定义AnswerBotCheckin 类定义

当您实现一个新的签到器时, 欢迎您提交 Pull Requests 以帮助更多人使用!

群组监控站点

通常来说, 增加一个群组监控站点非常简单, 您需要在 monitor 中增加一个文件 dummy.py:

python
from .base import Monitor

class DummyMonitor(Monitor):
    name = "Dummy"
    chat_name = "dummy_chat"
    chat_user = "dummy_bot"
    chat_keyword = r"邀请码:\s*(\w+)"
    chat_delay = 1
    bot_username = "dummy_bot"

    async def on_trigger(self, message, key, reply):
        await self.client.send_message(self.bot_username, f"/invite {key}")

更多监控器配置参加: Monitor 类定义

自动水群站点

通常来说, 增加一个自动水群站点非常简单, 您需要在 messager 中增加一个文件 dummy.py:

python
from .base import Messager

class DummyMessager(Messager):
    name = "Dummy"
    chat_name = "dummy_chat"
    default_messages = ["dummy-common-wl@latest.yaml * 100"]

您即增加一个名为 "Dummy" 的水群器, 将会在名为 "dummy_chat" 的群组定期发送消息.

对于 default_messages 和对应的配置文件项目, 详见水群配置文件的详细说明.

更多监控水群器配置参加: Messager 类定义

项目架构

bash
├── deploy
   └── Dockerfile              # 每个版本发布后, 自动更新为最新版, 用于加速部分云平台的构建过程.
├── embykeeper
   ├── __init__.py
   ├── __main__.py
   ├── cli.py                  # 命令行入口模块.
   ├── data.py                 # 额外数据下载模块, 用于从 https://github.com/emby-keeper/emby-keeper-data 下载资源文件.
   ├── embywatcher             # Emby 保活模块.
   ├── __init__.py
   ├── emby.py             # Emby 基础控制模块, 主要是在 embypy 基础上进行修复和增强.
   └── main.py             # Emby 保活入口模块, 负责找到合适长度的有源视频, 模拟播放 (下载视频同时上报播放状态), 最后将进度条设为特定位置.
   ├── log.py                  # 日志初始化模块, 负责格式化 loguru 日志.
   ├── settings.py             # 配置模块, 负责检查配置文件格式, 生成模板配置文件, 用于云部署的交互式配置生成, 准备配置文件.
   ├── telechecker             # Telegram 相关模块.
   ├── __init__.py
   ├── bots                # Telegram 每日签到模块.
   ├── __init__.py
   ├── _base.py        # 定义了两个基础签到器, 分别用于回复模式签到和按钮模式签到.
   ├── test.py         # 测试签到器, 默认不启用且在生成配置文件时忽略.
   ├── terminus.py     # 以下均为各站点签到器, 在该目录增加模块将自动被识别并启用, 在模块变量部分使用 "__ignore__ = True" 以默认禁用.
   └── ...
   ├── messager            # Telegram 自动水群模块.
   ├── __init__.py
   ├── _base.py        # 定义了基础水群器.
   ├── test.py         # 测试水群器, 默认不启用且在生成配置文件时忽略.
   ├── pornemby.py     # 以下均为各站点水群器, 在该目录增加模块将自动被识别并启用, 在模块变量部分使用 "__ignore__ = True" 以默认禁用.
   └── ...
   ├── monitor             # Telegram 群组监控模块.
   ├── __init__.py
   ├── base.py         # 定义了基础监控器.
   ├── test.py         # 测试监控器, 默认不启用且在生成配置文件时忽略.
   ├── pornemby.py     # 以下均为各站点监控器, 在该目录增加模块将自动被识别并启用, 在模块变量部分使用 "__ignore__ = True" 以默认禁用.
   └── ...
   ├─  tele.py             # 在 pyrogram 基础上进行修复和增强, 维护了一个客户端池, 通过 ClientsSession 来访问.
   ├── debug.py            # 定义了多个调试工具, 包括消息列表, 消息历史记录分析, 更新记录器等.
   ├── link.py             # 实现 API 服务, 包括认证, 云任务等.
   ├── lock.py             # 签到器, 水群器, 监控器之间的联动通讯和锁.
   ├── log.py              # Telegram 日志发送, 通过 log.bind(log=True) 标记需要推送的信息.
   └── main.py             # Telegram 签到器, 水群器, 监控器的入口模块.
   ├── utils.py                # 一系列工具函数和类.
   └── var.py                  # 一系列全局变量.
├── Dockerfile                  # Docker 构建文件.
├── LICENSE                     # 版权文件.
├── MANIFEST.in                 # Python 包打包内容标记文件.
├── Makefile                    # Make 文件, 定义了多个便于开发的工作流.
├── README.md                   # 项目自述文件.
├── app.json                    # 用于 Heroku 云部署的信息文件.
├── heroku.yml                  # 用于 Heroku 云部署的信息文件.
├── images                      # README.md 使用的图片.
   ├── ...
├── pyproject.toml              # Python 项目定义文件.
├── render.yaml                 # 用于 Render.com 云部署的信息文件.
├── requirements_dev.txt        # 供开发者使用的额外需安装包.
├── scripts
   ├── docker-entrypoint.sh    # 根据 EK_WEBPASS 变量是否存在决定启动网页模式还是命令行模式的 Docker 入口函数.
├── tests
   └── test_cli.py             # 基础测试文件.
├── tox.ini                     # 多版本测试文件
├── cli.py                      # 入口文件, 在安装包后应该使用 embykeeper 命令而非该文件, 该文件仅供 debugpy 挂载使用.
├── web.py                      # 入口文件, 在安装包后应该使用 embykeepersrv 命令而非该文件, 该文件仅供 debugpy 挂载使用.
└── config.example.toml         # 参考配置文件, 可以通过首次运行 embykeeper 生成, 所有密码密钥为随机生成.

修改代码后 Docker 运行

如果您希望修改部分代码, 并通过 Docker 运行, 请参照以下任一方法.

使用 dev 系列镜像

Embykeeper 提供 dev 系列镜像, 可以实现动态读取代码.

您需要新建一个文件 docker-compose.yml:

yaml
version: '3'
services:
  embykeeper:
    container_name: embykeeper
    image: embykeeper/embykeeper:main-dev
    command: '-I'
    restart: unless-stopped
    volumes:
      - ./embykeeper:/app
      - ./embykeeper-src:/src
    network_mode: host

(network_mode: host 用于连接主机上的代理, 若您不需要可以忽略)

然后运行:

bash
docker-compose up -d

这将在 ./embykeeper-src 目录挂载源码, ./embykeeper/app 目录挂载数据. 您可以直接修改 ./embykeeper-src 中的源码, 重启容器后程序将据此运行.

提示: 如果您需要更新 dev 系列镜像, 您需要直接在 ./embykeeper-src/ 目录中使用 git pull.

使用 docker build

  1. 将此代码库 Clone 到本地的一个文件夹:
bash
git clone embykeeper/embykeeper ./embykeeper-src
  1. 运行 docker build 以构建容器:
bash
docker build ./embykeeper-src -t embykeeper/embykeeper
  1. 运行 docker run 以启动容器:
bash
docker run -v $(pwd)/embykeeper:/app --rm -it --net=host embykeeper/embykeeper

使用 docker-composebuild 方法

  1. 将此代码库克隆到本地的一个文件夹:
bash
git clone embykeeper/embykeeper ./embykeeper-src
  1. 新建或修改当前目录下的 docker-compose.yml:
bash
version: '3'
services:
  embykeeper:
    container_name: embykeeper
    build: ./embykeeper-src
    command: '-I'
    restart: unless-stopped
    volumes:
      - ./embykeeper-data:/app
    network_mode: host
  1. 启动容器:
bash
docker-compose up -d

Released under the GPLv3 License.