dsh-telegram-bridge · 接管 Telegram
DSH 插件。接管一个真实的 Telegram 账号(用户态 MTProto,不是机器人号), 替你回联系人消息 —— 分层人设、贴纸、防抖、轮询兜底、零 token 自检自愈。
这个插件的重点是三件事:
- 不是机器人:用的是你自己的账号、你自己的身份。对方看到的是你,不是
xxx_bot。 (所以要求:apiId/apiHash+ 手机号登录,登录后 session 存在插件家目录里) - 像人:3~10 秒随机防抖、多条分开发(
|||)、偶尔配一张贴纸、人设分层省 token。 - 不出事也不用管:进程崩了自己拉起、连接断了自己重连、每 5 分钟自检一次 —— 全程只看进程/端口/HTTP/登录态,一个 token 都不花。
装
# 本地目录直接装(开发/自用最省事)
dsh plugin --profile web add link:/绝对/路径/dsh-telegram-bridge
# 或者从 GitHub 装(需要机器上有 git)
dsh plugin --profile web add github:<你的用户名>/dsh-telegram-bridge
装完重启一次 dsh(bundle 层要重启才组装)。
⚠️ 如果安装报
ERR_PNPM_IGNORED_BUILDS(pnpm 12 默认把"跳过的构建脚本"当错误): 三条可选依赖bufferutil/utf-8-validate/es5-ext会触发它 —— 它们都是可选的原生加速件, 不编译也完全能用。加一个开关就行:dsh plugin --profile web add <本仓库地址> --config.strict-dep-builds=false(
dsh plugin会把多余参数原样转给 pnpm。装完dsh plugin --profile web list能看到本包即成功。)
⚠️ 装上不会自动连。没有
session.txt时它就是不连接的空壳,所以不会抢你现有 客户端(官方 App / 桌面版)的 update state。这条很重要:同一个账号同一时间只能有 一个客户端在收消息,两个一起收会双开抢状态,表现是「它突然不说话」而且不报错。
配(三步)
1) tg_config { "account": { "apiId": 123456, "apiHash": "abcdef..." } }
apiId/apiHash 去 https://my.telegram.org → API development tools 申请
2) tg_login_start { "phone": "+8613800138000" }
→ 返回 loginId,Telegram 会给你发验证码
3) tg_login_code { "loginId": "login1", "code": "12345" }
开了两步验证的账号会再要一次:tg_login_password { loginId, password }
4) tg_verify → 应该看到 6/6 通过
连不上 Telegram 的机器(比如国内服务器)要配代理:
tg_config { "socksUrl": "socks5://127.0.0.1:7890" }
本机直连就通的不要填,留空就是直连。
用
| 工具 | 干什么 |
|---|---|
tg_status |
进程/连接/登录人/白名单/在途/人设指纹/贴纸条数 |
tg_verify |
跑一遍自检(零 token),能修的当场修,输出 n/6 通过 |
tg_config |
读/改配置,改完即时生效 |
tg_login_start / _code / _password / _cancel |
登录流程 |
tg_chats |
白名单会话 + 每个会话的上下文轮数 |
tg_send |
用这个账号发一条消息(走 bridge 自己那条连接,不会抢 session) |
tg_pause |
暂停/恢复某个会话的自动回复(消息照记录,只是不回) |
tg_context_clear |
清某个会话的上下文 |
tg_restart |
优雅重启(等在途回复发完) |
tg_log |
看日志最后几十行 |
常见配置:
// 只回这几个人
{ "direct": { "users": ["111111111", "222222222"], "labels": { "111111111": "老朋友" } } }
// 暂停某个人(照记录不回)
{ "direct": { "paused": ["111111111"] } }
// 只看不回(每句都生成,写成 drafts.jsonl)
{ "mode": "draft" }
// 换模型
{ "llm": { "models": ["deepseek-v4.1-flash", "hy3"], "effortFull": "max", "effortShort": "low" } }
人设
人设只有一份,在 <DSH_HOME>/persona/(首次启用会把插件自带的默认值铺过去):
| 文件 | 作用 |
|---|---|
renshe.txt |
性格正文(温柔 / 短句 / 不客服腔…) |
guard.txt |
防注入,{IDENTITY} 由插件填 |
extra-tg.txt |
平台差异(你是谁、对方是谁、被识破怎么办) |
extra-tg-short.txt |
精简版的差异(每轮都发,所以必须短) |
分层发送(省 token 的关键):
| 什么时候 | 发什么 |
|---|---|
首次对话 / 每 reanchorEvery 轮 / 人设文件改动后第一句 |
完整人设 |
| 其余每一轮 | 精简人设(几十字)+ 末尾锚定 |
改完人设文件不用重启:指纹变了,下一个会话自动补发一次完整人设。
贴纸要单独导(索引属于账号,不随插件发):
node scripts/import-stickers.mjs # 会遍历你装了的贴纸集 + 视觉识别(调模型)
node scripts/import-stickers.mjs --no-desc # 只存 emoji,不调模型
自检(零 token)
node scripts/verify.mjs # 只查
node scripts/verify.mjs --fix # 能修的顺手修(拉起进程、轮转日志)
六项:进程 / 桥连接 / 依赖(代理端口)/ 登录态 / 卡死判断 / 家目录。
插件自己也会每 5 分钟跑一遍(selfHeal.everyMin,设 0 关掉),修了才写日志。
结构
index.js 宿主半:托管子进程 + 工具 + 周期自检
lib/ 跨插件复用:deps(optional peer)/ home / supervisor / health / protocol
bridge/ 子进程(**也可以单独跑**)
main.mjs 主循环:连接 → 补漏 → 监听 → 防抖 → 生成 → 发送 → 轮询兜底
config.mjs 配置合并钳位 + 老文件迁移
persona.mjs 分层人设
llm.mjs OpenAI 兼容调用(含"推理档吃满预算"的降级重试)
client.mjs GramJS 工厂(含 SOCKS5 注入)
sockets.mjs SOCKS5 网络层(GramJS 原生 proxy 不支持 SOCKS5)
media.mjs 消息类型 → 文字描述
vision.mjs 图片/贴纸识别
sticker.mjs 贴纸匹配与发送
reply.mjs 生成 + 上下文
backfill.mjs 启动补漏
control.mjs 本机回环控制口(127.0.0.1 + token)
login.mjs 交互式登录(行 JSON)
scripts/ verify / import-stickers
test/run.mjs 零 token 离线测试(npm test)
为什么子进程:GramJS 的 update loop 遇到网络抖动会抛未捕获异常,塞进宿主会把整个 DSH 带下水;
分开之后它崩了宿主不受影响,还能自动重启。同一份 bridge/ 也能被 systemd 直接管:
BRIDGE_HOME=/path/to/home node bridge/main.mjs
依赖说明
只装 telegram(MTProto)、socks(SOCKS5)、sharp(图片/贴纸压缩)、schemastery(配置)。
其中 telegram 会带出 ws 的可选原生加速件(bufferutil / utf-8-validate)和 es5-ext,
它们在 pnpm 12 上会触发 ERR_PNPM_IGNORED_BUILDS —— 见上面「装」那一节的一条命令。
不编译这几个包对本插件没有任何影响。
已知限制
- 一个账号同一时间只能挂一个客户端 —— 用它就别同时开官方桌面版。
- 贴纸
fileReference会过期,发不出去时重跑import-stickers.mjs。 - 没有设置页 UI(v0.1)。配置走
tg_config,写进<家目录>/config.json。 - 群聊默认关(
groups.mode: "off"):接管群比私聊风险高,要用自己开并写白名单。
许可
MIT。
No comments yet. Be the first to write one.