{"id":46457375,"url":"https://github.com/amchii/tg-signer","last_synced_at":"2026-03-06T02:47:06.314Z","repository":{"id":239993951,"uuid":"801396753","full_name":"amchii/tg-signer","owner":"amchii","description":"电报自动执行（签到、发送消息、点击键盘、AI回复等）；个人、群组、频道消息监控、转发与自动回复。Automated Telegram tasks (check-ins, sending messages, keyboard clicks, AI replies, etc.); monitoring, forwarding, and auto-replying to private, group, and channel messages.","archived":false,"fork":false,"pushed_at":"2026-03-03T12:43:28.000Z","size":251,"stargazers_count":783,"open_issues_count":13,"forks_count":149,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-03-03T16:22:44.240Z","etag":null,"topics":["telegram","telegram-bot"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/amchii.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-05-16T06:40:51.000Z","updated_at":"2026-03-03T14:46:54.000Z","dependencies_parsed_at":"2024-05-16T07:18:20.876Z","dependency_job_id":"476a3ff3-93e8-4d79-bd0c-32b4273d55e6","html_url":"https://github.com/amchii/tg-signer","commit_stats":null,"previous_names":["amchii/tg-signer"],"tags_count":41,"template":false,"template_full_name":null,"purl":"pkg:github/amchii/tg-signer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amchii%2Ftg-signer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amchii%2Ftg-signer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amchii%2Ftg-signer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amchii%2Ftg-signer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amchii","download_url":"https://codeload.github.com/amchii/tg-signer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amchii%2Ftg-signer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30159969,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T22:39:40.138Z","status":"online","status_checked_at":"2026-03-06T02:00:08.268Z","response_time":250,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["telegram","telegram-bot"],"created_at":"2026-03-06T02:47:05.809Z","updated_at":"2026-03-06T02:47:06.302Z","avatar_url":"https://github.com/amchii.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Telegram每日自动签到/个人、群组、频道消息监控与自动回复\n\n[English](./README_EN.md)\n\n### 功能\n\n- 每日定时和随机误差时间签到\n- 根据配置的文本点击键盘\n- 调用AI进行图片识别并点击键盘\n- 个人、群组、频道消息监控、转发与自动回复\n- 根据配置执行动作流\n\n  **...**\n\n### 安装\n\n需要Python3.10及以上\n\n```sh\npip install -U tg-signer\n```\n\n或者为了提升程序速度：\n\n```sh\npip install \"tg-signer[speedup]\"\n```\n#### WebUI\ntg-signer附带了一个WebUI，安装命令:\n```sh\npip install \"tg-signer[gui]\"\n```\n\n![webgui](./assets/webui.jpeg)\n\n\n### Docker\n\n未上传直接使用的镜像，可以自行build镜像，见 [docker](./docker) 目录下的Dockerfile和 [README](./docker/README.md) 。\n\n### 使用方法\n\n```\nUsage: tg-signer [OPTIONS] COMMAND [ARGS]...\n\n  使用\u003c子命令\u003e --help查看使用说明\n\n子命令别名:\n  run_once -\u003e run-once\n  send_text -\u003e send-text\n\nOptions:\n  -l, --log-level [debug|info|warn|error]\n                                  日志等级, `debug`, `info`, `warn`, `error`\n                                  [default: info]\n  --log-file PATH                 日志文件路径, 可以是相对路径  [default: logs/tg-\n                                  signer.log]\n  --log-dir PATH                  日志文件目录, 可以是相对路径  [default: logs]\n  -p, --proxy TEXT                代理地址, 例如: socks5://127.0.0.1:1080,\n                                  会覆盖环境变量`TG_PROXY`的值  [env var: TG_PROXY]\n  --session_dir PATH              存储TG Sessions的目录, 可以是相对路径  [default: .]\n  -a, --account TEXT              自定义账号名称，对应session文件名为\u003caccount\u003e.session  [env\n                                  var: TG_ACCOUNT; default: my_account]\n  -w, --workdir PATH              tg-signer工作目录，用于存储配置和签到记录等  [default:\n                                  .signer]\n  --session-string TEXT           Telegram Session String,\n                                  会覆盖环境变量`TG_SESSION_STRING`的值  [env var:\n                                  TG_SESSION_STRING]\n  --in-memory                     是否将session存储在内存中，默认为False，存储在文件\n  --help                          Show this message and exit.\n\nCommands:\n  export                  导出配置，默认为输出到终端。\n  import                  导入配置，默认为从终端读取。\n  list                    列出已有配置\n  list-members            查询聊天（群或频道）的成员, 频道需要管理员权限\n  list-topics             列出群组话题ID（message_thread_id）\n  list-schedule-messages  显示已配置的定时消息\n  llm-config              配置大模型API\n  login                   登录账号（用于获取session）\n  logout                  登出账号并删除session文件\n  monitor                 配置和运行监控\n  multi-run               使用一套配置同时运行多个账号\n  reconfig                重新配置\n  run                     根据任务配置运行签到\n  run-once                运行一次签到任务，即使该签到任务今日已执行过\n  schedule-messages       批量配置Telegram自带的定时发送消息功能\n  send-dice               发送一次DICE消息, 请确保当前会话已经\"见过\"该`chat_id`。...\n  send-text               发送一次文本消息, 请确保当前会话已经\"见过\"该`chat_id`\n  version                 Show version\n  webgui                  启动一个WebGUI（需要通过`pip install \"tg-signer[gui]\"`安装相关依赖）\n\n```\n\n例如:\n\n```sh\ntg-signer run\ntg-signer run my_sign  # 不询问，直接运行'my_sign'任务\ntg-signer run-once my_sign  # 直接运行一次'my_sign'任务\ntg-signer send-text 8671234001 /test  # 向chat_id为'8671234001'的聊天发送'/test'文本\ntg-signer send-text --message-thread-id 1 -- -1003763902761 checkin  # 发送到群组话题(message_thread_id=1)\ntg-signer send-text -- -10006758812 浇水  # 对于负数需要使用POSIX风格，在短横线'-'前方加上'--'\ntg-signer send-text --delete-after 1 8671234001 /test  # 向chat_id为'8671234001'的聊天发送'/test'文本, 并在1秒后删除发送的消息\ntg-signer list-members --chat_id -1001680975844 --admin  # 列出频道的管理员\ntg-signer list-topics --chat_id -1003763902761 --limit 50  # 列出群组话题及message_thread_id\ntg-signer schedule-messages --crontab '0 0 * * *' --next-times 10 -- -1001680975844 你好  # 在未来10天的每天0点向'-1001680975844'发送消息\ntg-signer schedule-messages --crontab '0 0 * * *' --next-times 3 --message-thread-id 1 -- -1003763902761 你好  # 配置群组话题的定时消息\ntg-signer monitor run  # 配置个人、群组、频道消息监控与自动回复\ntg-signer multi-run -a account_a -a account_b same_task  # 使用'same_task'的配置同时运行'account_a'和'account_b'两个账号\ntg-signer webgui --auth-code averycomplexcode  # 启动一个WebGUI\n```\n\n### 配置代理（如有需要）\n\n`tg-signer`不读取系统代理，可以使用环境变量 `TG_PROXY`或命令参数`--proxy`进行配置\n\n例如：\n\n```sh\nexport TG_PROXY=socks5://127.0.0.1:7890\n```\n\n### 登录\n\n```sh\ntg-signer login\n```\n\n根据提示输入手机号码和验证码进行登录并获取最近的聊天列表，确保你想要签到的聊天在列表内。\n对于开启话题的超级群，登录输出中会额外打印每个话题的 `message_thread_id`，可直接用于 `--message-thread-id`。\n\n### 获取群组话题 ID\n\n```sh\ntg-signer list-topics --chat_id -1003763902761\n```\n\n会输出该群组可见话题的 `message_thread_id`、标题及状态，便于配置签到到指定话题。\n\n### 发送一次消息\n\n```sh\ntg-signer send-text 8671234001 hello  # 向chat_id为'8671234001'的聊天发送'hello'文本\n```\n\n### 运行签到任务\n\n```sh\ntg-signer run\n```\n\n或预先执行任务名：\n\n```sh\ntg-signer run linuxdo\n```\n\n根据提示进行配置即可。\n\n#### 示例：\n\n```\n开始配置任务\u003clinuxdo\u003e\n第1个签到\n一. Chat ID（登录时最近对话输出中的ID）: 7661096533\n二. Chat名称（可选）: jerry bot\n三. 是否发送到话题（message_thread_id）？(y/N)：y\n四. message_thread_id: 1\n五. 开始配置\u003c动作\u003e，请按照实际签到顺序配置。\n  1: 发送普通文本\n  2: 发送Dice类型的emoji\n  3: 根据文本点击键盘\n  4: 根据图片选择选项\n  5: 回复计算题\n\n第1个动作:\n1. 输入对应的数字选择动作: 1\n2. 输入要发送的文本: checkin\n3. 是否继续添加动作？(y/N)：y\n第2个动作:\n1. 输入对应的数字选择动作: 3\n2. 键盘中需要点击的按钮文本: 签到\n3. 是否继续添加动作？(y/N)：y\n第3个动作:\n1. 输入对应的数字选择动作: 4\n图片识别将使用大模型回答，请确保大模型支持图片识别。\n2. 是否继续添加动作？(y/N)：y\n第4个动作:\n1. 输入对应的数字选择动作: 5\n计算题将使用大模型回答。\n2. 是否继续添加动作？(y/N)：y\n第5个动作:\n1. 输入对应的数字选择动作: 2\n2. 输入要发送的骰子（如 🎲, 🎯）: 🎲\n3. 是否继续添加动作？(y/N)：n\n在运行前请通过环境变量正确设置`OPENAI_API_KEY`, `OPENAI_BASE_URL`。默认模型为\"gpt-4o\", 可通过环境变量`OPENAI_MODEL`更改。\n六. 等待N秒后删除签到消息（发送消息后等待进行删除, '0'表示立即删除, 不需要删除直接回车）, N: 10\n╔════════════════════════════════════════════════╗\n║ Chat ID: 7661096533                            ║\n║ Name: jerry bot                                ║\n║ Message Thread ID: 1                           ║\n║ Delete After: 10                               ║\n╟────────────────────────────────────────────────╢\n║ Actions Flow:                                  ║\n║ 1. [发送普通文本] Text: checkin                ║\n║ 2. [根据文本点击键盘] Click: 签到              ║\n║ 3. [根据图片选择选项]                          ║\n║ 4. [回复计算题]                                ║\n║ 5. [发送Dice类型的emoji] Dice: 🎲              ║\n╚════════════════════════════════════════════════╝\n第1个签到配置成功\n\n继续配置签到？(y/N)：n\n每日签到时间（time或crontab表达式，如'06:00:00'或'0 6 * * *'）:\n签到时间误差随机秒数（默认为0）: 300\n```\n\n### 配置与运行监控\n\n```sh\ntg-signer monitor run my_monitor\n```\n\n根据提示进行配置。\n\n#### 示例：\n\n```\n开始配置任务\u003cmy_monitor\u003e\n聊天chat id和用户user id均同时支持整数id和字符串username, username必须以@开头，如@neo\n\n配置第1个监控项\n1. Chat ID（登录时最近对话输出中的ID）: -4573702599\n2. 匹配规则('exact', 'contains', 'regex', 'all'): contains\n3. 规则值（不可为空）: kfc\n4. 只匹配来自特定用户ID的消息（多个用逗号隔开, 匹配所有用户直接回车）: @neo\n5. 默认发送文本: V Me 50\n6. 从消息中提取发送文本的正则表达式:\n7. 等待N秒后删除签到消息（发送消息后等待进行删除, '0'表示立即删除, 不需要删除直接回车）, N:\n继续配置？(y/N)：y\n\n配置第2个监控项\n1. Chat ID（登录时最近对话输出中的ID）: -4573702599\n2. 匹配规则('exact', 'contains', 'regex'): regex\n3. 规则值（不可为空）: 参与关键词：「.*?」\n4. 只匹配来自特定用户ID的消息（多个用逗号隔开, 匹配所有用户直接回车）: 61244351\n5. 默认发送文本:\n6. 从消息中提取发送文本的正则表达式: 参与关键词：「(?P\u003ckeyword\u003e(.*?))」\\n\n7. 等待N秒后删除签到消息（发送消息后等待进行删除, '0'表示立即删除, 不需要删除直接回车）, N: 5\n继续配置？(y/N)：y\n\n配置第3个监控项\n1. Chat ID（登录时最近对话输出中的ID）: -4573702599\n2. 匹配规则(exact, contains, regex, all): all\n3. 只匹配来自特定用户ID的消息（多个用逗号隔开, 匹配所有用户直接回车）:\n4. 总是忽略自己发送的消息（y/N）: y\n5. 默认发送文本（不需要则回车）:\n6. 是否使用AI进行回复(y/N): n\n7. 从消息中提取发送文本的正则表达式（不需要则直接回车）:\n8. 是否通过Server酱推送消息(y/N): n\n9. 是否需要转发到外部（UDP, Http）(y/N): y\n10. 是否需要转发到UDP(y/N): y\n11. 请输入UDP服务器地址和端口（形如`127.0.0.1:1234`）: 127.0.0.1:9999\n12. 是否需要转发到Http(y/N): y\n13. 请输入Http地址（形如`http://127.0.0.1:1234`）: http://127.0.0.1:8000/tg/user1/messages\n继续配置？(y/N)：n\n\n```\n\n#### 示例解释：\n\n1. 聊天`chat id`和用户`user id`均同时支持整数**id**和字符串**username**, username**必须以@开头** 如\"neo\"输入\"@neo\"，注意*\n   *username** 可能不存在，示例中`chat id`为-4573702599表示规则只对-4573702599对应的聊天有效。\n\n2. 匹配规则，目前皆**忽略大小写**：\n\n    1. `exact` 为精确匹配，消息必须精确等于该值。\n\n    2. `contains` 为包含匹配，如contains=\"kfc\"，那么只要收到的消息中包含\"kfc\"如\"I like MacDonalds rather than KfC\"\n       即匹配到（注意忽略了大小写）\n\n    3. `regex` 为正则，参考  [Python正则表达式](https://docs.python.org/zh-cn/3/library/re.html) ，在消息中有**搜索到该正则即匹配\n       **，示例中的 \"参与关键词：「.*?」\" 可以匹配消息： \"新的抽奖已经创建...\n       参与关键词：「我要抽奖」\n\n       建议先私聊机器人\"\n\n    4. 可以只匹配来自特定用户的消息，如群管理员而不是随便什么人发布的抽奖消息\n\n    5. 可以设置默认发布文本， 即只要匹配到消息即默认发送该文本\n\n    6. 提取发布文本的正则，例如 \"参与关键词：「(.*?)」\\n\" ，注意用括号`(...)` 捕获要提取的文本，\n       可以捕获第3点示例消息的关键词\"我要抽奖\"并自动发送\n\n3. 消息Message结构参考:\n\n```json\n{\n    \"_\": \"Message\",\n    \"id\": 2950,\n    \"from_user\": {\n        \"_\": \"User\",\n        \"id\": 123456789,\n        \"is_self\": false,\n        \"is_contact\": false,\n        \"is_mutual_contact\": false,\n        \"is_deleted\": false,\n        \"is_bot\": false,\n        \"is_verified\": false,\n        \"is_restricted\": false,\n        \"is_scam\": false,\n        \"is_fake\": false,\n        \"is_support\": false,\n        \"is_premium\": false,\n        \"is_contact_require_premium\": false,\n        \"is_close_friend\": false,\n        \"is_stories_hidden\": false,\n        \"is_stories_unavailable\": true,\n        \"is_business_bot\": false,\n        \"first_name\": \"linux\",\n        \"status\": \"UserStatus.ONLINE\",\n        \"next_offline_date\": \"2025-05-30 11:52:40\",\n        \"username\": \"linuxdo\",\n        \"dc_id\": 5,\n        \"phone_number\": \"*********\",\n        \"photo\": {\n            \"_\": \"ChatPhoto\",\n            \"small_file_id\": \"AQADBQADqqcxG6hqrTMAEAIAA6hqrTMABLkwVDcqzBjAAAQeBA\",\n            \"small_photo_unique_id\": \"AgADqqcxG6hqrTM\",\n            \"big_file_id\": \"AQADBQADqqcxG6hqrTMAEAMAA6hqrTMABLkwVDcqzBjAAAQeBA\",\n            \"big_photo_unique_id\": \"AgADqqcxG6hqrTM\",\n            \"has_animation\": false,\n            \"is_personal\": false\n        },\n        \"added_to_attachment_menu\": false,\n        \"inline_need_location\": false,\n        \"can_be_edited\": false,\n        \"can_be_added_to_attachment_menu\": false,\n        \"can_join_groups\": false,\n        \"can_read_all_group_messages\": false,\n        \"has_main_web_app\": false\n    },\n    \"date\": \"2025-05-30 11:47:46\",\n    \"chat\": {\n        \"_\": \"Chat\",\n        \"id\": -52737131599,\n        \"type\": \"ChatType.GROUP\",\n        \"is_creator\": true,\n        \"is_deactivated\": false,\n        \"is_call_active\": false,\n        \"is_call_not_empty\": false,\n        \"title\": \"测试组\",\n        \"has_protected_content\": false,\n        \"members_count\": 4,\n        \"permissions\": {\n            \"_\": \"ChatPermissions\",\n            \"can_send_messages\": true,\n            \"can_send_media_messages\": true,\n            \"can_send_other_messages\": true,\n            \"can_send_polls\": true,\n            \"can_add_web_page_previews\": true,\n            \"can_change_info\": true,\n            \"can_invite_users\": true,\n            \"can_pin_messages\": true,\n            \"can_manage_topics\": true\n        }\n    },\n    \"from_offline\": false,\n    \"show_caption_above_media\": false,\n    \"mentioned\": false,\n    \"scheduled\": false,\n    \"from_scheduled\": false,\n    \"edit_hidden\": false,\n    \"has_protected_content\": false,\n    \"text\": \"test, 测试\",\n    \"video_processing_pending\": false,\n    \"outgoing\": false\n}\n```\n\n#### 示例运行输出：\n\n```\n[INFO] [tg-signer] 2024-10-25 12:29:06,516 core.py 458 开始监控...\n[INFO] [tg-signer] 2024-10-25 12:29:37,034 core.py 439 匹配到监控项：MatchConfig(chat_id=-4573702599, rule=contains, rule_value=kfc), default_send_text=V me 50, send_text_search_regex=None\n[INFO] [tg-signer] 2024-10-25 12:29:37,035 core.py 442 发送文本：V me 50\n[INFO] [tg-signer] 2024-10-25 12:30:02,726 core.py 439 匹配到监控项：MatchConfig(chat_id=-4573702599, rule=regex, rule_value=参与关键词：「.*?」), default_send_text=None, send_text_search_regex=参与关键词：「(?P\u003ckeyword\u003e(.*?))」\\n\n[INFO] [tg-signer] 2024-10-25 12:30:02,727 core.py 442 发送文本：我要抽奖\n[INFO] [tg-signer] 2024-10-25 12:30:03,001 core.py 226 Message「我要抽奖」 to -4573702599 will be deleted after 5 seconds.\n[INFO] [tg-signer] 2024-10-25 12:30:03,001 core.py 229 Waiting...\n[INFO] [tg-signer] 2024-10-25 12:30:08,260 core.py 232 Message「我要抽奖」 to -4573702599 deleted!\n```\n\n### 版本变动日志\n\n#### 0.8.5\n- \"kurigram\u003e=2.2.19,\u003c2.3.0\"\n- 单账户多任务时进行并发请求限流\n\n#### 0.8.4\n- 新增 WebGUI\n- 新增`--log-dir`选项，更改日志默认目录为`logs`，warning和error分为单独文件\n\n#### 0.8.2\n- 支持持久化OpenAI API和模型配置\n- Python最小版本要求：3.10\n- 支持处理编辑后的消息（如键盘）\n\n#### 0.8.0\n- 支持单个账号同一进程内同时运行多个任务\n\n#### 0.7.6\n- fix: 监控多个聊天时消息转发至每个聊天 (#55)\n\n#### 0.7.5\n- 捕获并记录执行任务期间的所有RPC错误\n- bump kurigram version to 2.2.7\n\n#### 0.7.4\n- 执行多个action时，支持固定时间间隔\n- 通过`crontab`配置定时执行时不再限制每日执行一次\n\n#### 0.7.2\n- 支持将消息转发至外部端点，通过：\n  - UDP\n  - HTTP\n- 将kurirogram替换为kurigram\n\n#### 0.7.0\n- 支持每个聊天会话按序执行多个动作，动作类型：\n  - 发送文本\n  - 发送骰子\n  - 按文本点击键盘\n  - 通过图片选择选项\n  - 通过计算题回复\n\n#### 0.6.6\n- 增加对发送DICE消息的支持\n\n#### 0.6.5\n- 修复使用同一套配置运行多个账号时签到记录共用的问题\n\n#### 0.6.4\n- 增加对简单计算题的支持\n- 改进签到配置和消息处理\n\n#### 0.6.3\n- 兼容kurigram 2.1.38版本的破坏性变更\n\u003e Remove coroutine param from run method [a7afa32](https://github.com/KurimuzonAkuma/pyrogram/commit/a7afa32df208333eecdf298b2696a2da507bde95)\n\n\n#### 0.6.2\n- 忽略签到时发送消息失败的聊天\n\n#### 0.6.1\n- 支持点击按钮文本后继续进行图片识别\n\n#### 0.6.0\n- Signer支持通过crontab定时\n- Monitor匹配规则添加`all`支持所有消息\n- Monitor支持匹配到消息后通过server酱推送\n- Signer新增`multi-run`用于使用一套配置同时运行多个账号\n\n#### 0.5.2\n- Monitor支持配置AI进行消息回复\n- 增加批量配置「Telegram自带的定时发送消息功能」的功能\n\n#### 0.5.1\n- 添加`import`和`export`命令用于导入导出配置\n\n#### 0.5.0\n- 根据配置的文本点击键盘\n- 调用AI识别图片点击键盘\n\n\n\n### 配置与数据存储位置\n\n数据和配置默认保存在 `.signer` 目录中。然后运行 `tree .signer`，你将看到：\n\n```\n.signer\n├── latest_chats.json  # 获取的最近对话\n├── me.json  # 个人信息\n├── monitors  # 监控\n│   ├── my_monitor  # 监控任务名\n│       └── config.json  # 监控配置\n└── signs  # 签到任务\n    └── linuxdo  # 签到任务名\n        ├── config.json  # 签到配置\n        └── sign_record.json  # 签到记录\n\n3 directories, 4 files\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famchii%2Ftg-signer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famchii%2Ftg-signer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famchii%2Ftg-signer/lists"}