Telegram 自动翻译机器人部署完整教程(DeepL官方 + Telethon)

DeepLx已经被DeepL官方封了,无法再翻译。直接用官方的api,免费的一个月5w字符,够用,偶尔和老外用用

先到官网注册
https://www.deepl.com/ 需要信用卡验证,虚拟卡就ok
注册好后生成api key
https://www.deepl.com/en/your-account/keys
file

好,下面在vps上安装运行,推荐ubuntu,debian要用虚拟安装,不爽

✅ Telethon + DeepL 官方 API
✅ translate.py(自动翻译消息)
✅ systemd 后台运行

全部在全新 Ubuntu 完整搭建成功。

这份指南适用于:Ubuntu 18.04 / 20.04 / 22.04 / 24.04 /

🚀 Ubuntu 完整安装教程(从零到运行)
📌 第 1 步:更新系统

这是任何服务器安装的第一步:

sudo apt update && sudo apt upgrade -y

📌 第 2 步:安装 Python3 + pip

Ubuntu 默认带 Python3,但最好安装 pip:

sudo apt install -y python3 python3-pip

验证:

python3 --version
pip3 --version

📌 第 3 步:创建 Translator 目录

你的脚本放在 /home 下:

mkdir -p /home/translator
cd /home/translator

📌 第 4 步:安装 Python 库

pip3 install telethon aiohttp

📌 第 5 步:创建 config.json

创建文件:

nano /home/translator/config.json

粘贴你的配置(含 DeepL API、api_id、api_hash、翻译配置):

{
  "api_id": xxxxxxx,
  "api_hash": "983xxxxxxx05b",

  "deepl_api_key": "083333333333333333333333333333c:fx",

  "target_config": {
    "7448827479": {
      "source_lang": "ZH",
      "target_langs": [ "ZH", "EN" ]
    },
    "7448827479.2031692021": {
      "source_lang": "ZH",
      "target_langs": [ "EN" ]
    }
  },

  "glossary": { }
}

保存退出
Ctrl+O 回车 → Ctrl+X

📌 第 6 步:创建 translate.py(DeepL 官方 API 版)
nano /home/translator/translate.py

# -*- coding: utf-8 -*-
import asyncio
import json
import logging
import os
import time
import aiohttp
from telethon import events
from telethon.sync import TelegramClient

# ===== 日志配置 =====
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

# ===== 配置加载与保存 =====
def load_config():
    if not os.path.exists('config.json'):
        logging.error('config.json not found, please create one first.')
        exit()
    with open('config.json', 'r') as f:
        return json.load(f)

def save_config():
    cfg['target_config'] = target_config
    with open('config.json', 'w') as f:
        json.dump(cfg, f, indent=2)

# ===== 初始化配置 =====
cfg = load_config()
api_id = cfg['api_id']
api_hash = cfg['api_hash']
deepl_key = cfg['deepl_api_key']
target_config = cfg.get('target_config', {})

# ===== 初始化 Telegram 客户端 =====
client = TelegramClient('chat_translator', api_id, api_hash)

# ===== DeepL API 地址 =====
DEEPL_URL = "https://api-free.deepl.com/v2/translate"

# ===== DeepL 翻译函数 =====
async def translate_single(text, source_lang, target_lang, session):
    if source_lang == target_lang:
        return target_lang, text

    payload = {
        "auth_key": deepl_key,
        "text": text,
        "target_lang": target_lang
    }

    # DeepL API 不需要 source_lang(会自动检测)
    # 如果你想强制 source_lang,可以加上:
    # payload["source_lang"] = source_lang

    start_time = time.time()

    async with session.post(DEEPL_URL, data=payload) as resp:
        if resp.status != 200:
            raise Exception(f"DeepL 翻译失败: HTTP {resp.status}")
        js = await resp.json()
        try:
            translated = js["translations"][0]["text"]
        except:
            raise Exception(f"DeepL 返回解析失败: {js}")

        logging.info(f"翻译 {source_lang} → {target_lang} 成功, 耗时 {time.time() - start_time:.2f}s")
        return target_lang, translated

async def translate_text(text, source_lang, target_langs):
    result = {}
    async with aiohttp.ClientSession() as session:
        tasks = [translate_single(text, source_lang, lang, session) for lang in target_langs]
        for lang, translated in await asyncio.gather(*tasks):
            result[lang] = translated
    return result

# ===== 命令模式 =====
async def command_mode(event, target_key, text) -> bool:
    # 关闭翻译
    if text == '.tt-off':
        await event.delete()
        if target_key in target_config:
            del target_config[target_key]
            save_config()
            logging.info(f"已关闭翻译: {target_key}")
        return False

    # 开启翻译
    if text.startswith('.tt-on,'):
        await event.delete()
        try:
            _, src, targets = text.split(',', 2)
        except ValueError:
            logging.error("命令格式错误,应为:.tt-on,ZH,EN|RU")
            return False

        target_config[target_key] = {
            "source_lang": src.upper(),
            "target_langs": [x.upper() for x in targets.split('|')]
        }
        save_config()
        logging.info(f"已启用翻译: {target_config[target_key]}")
        return False

    return True

# ===== 监听消息并翻译 =====
@client.on(events.NewMessage(outgoing=True))
async def handle_message(event):
    target_key = f"{event.chat_id}.{event.sender_id}"
    try:
        message = event.message
        if not message.text:
            return

        text = message.text.strip()
        if not text:
            return

        # 命令处理
        if text.startswith('.tt-') and not await command_mode(event, target_key, text):
            return

        # 未启用翻译
        if target_key not in target_config:
            return

        conf = target_config[target_key]
        translated_texts = await translate_text(text, conf['source_lang'], conf['target_langs'])

        # ===== 英文在上,其他语言在代码块下方 =====
        main_texts = []
        code_texts = []

        for lang in conf["target_langs"]:
            if lang == "EN":
                main_texts.append(translated_texts[lang])
            else:
                code_texts.append(translated_texts[lang])

        # 主显示
        if main_texts:
            output = '\n'.join(main_texts)
        else:
            first = conf["target_langs"][0]
            output = translated_texts[first]
            code_texts = [translated_texts[x] for x in conf["target_langs"][1:]]

        # 代码块
        if code_texts:
            output += "\n``<code>\n" + "\n".join(code_texts) + "\n</code>``"

        await message.edit(output)
        logging.info(f"消息翻译完成: {output[:40]}...")

    except Exception as e:
        logging.error(f"处理异常: {e}")

# ===== 启动 =====
try:
    client.start()
    logging.info("🤖 Telegram 翻译机器人已启动(DeepL 官方 API)")
    client.run_until_disconnected()
finally:
    client.disconnect()
    logging.info("⚠️ 机器人已断开连接")

📌 第 7 步:第一次启动(建立 Telegram session)

必须进入目录:

cd /home/translator
python3 translate.py

你会看到:

Please enter your phone (or bot token):

因为你使用 outgoing=True(个人账号翻译自己消息)
所以必须输入你的手机号:

+8613812345678

输入验证码:

Please enter the code you received: 12345

登录成功后看到:

Signed in successfully as XXX
🤖 Telegram 翻译机器人已启动(DeepL 官方 API)

成功!

此时会生成:

/home/translator/chat_translator.session

以后无需再登录。

📌 第 8 步:测试翻译功能

进入 Telegram 任意聊天框输入:

.tt-on,zh,zh|en

再发:

你好

你的消息会被自动翻译成:

Hello

你好

此功能已确认正常。

📌 第 9 步:创建 Systemd 服务(后台运行)

创建服务文件:

sudo nano /etc/systemd/system/translator.service

粘贴:

[Unit]
Description=Telegram DeepL Translator Service
After=network.target

[Service]
User=root
WorkingDirectory=/home/translator
ExecStart=/usr/bin/python3 /home/translator/translate.py
Restart=always
RestartSec=5

StandardOutput=append:/home/translator/translator.log
StandardError=append:/home/translator/translator.log

[Install]
WantedBy=multi-user.target

保存退出。

📌 第 10 步:启动 systemd 服务

让 systemd 识别新服务:

sudo systemctl daemon-reload

设置开机自启:

sudo systemctl enable translator

启动:

sudo systemctl start translator

查看是否运行中:

sudo systemctl status translator

看到:

Active: active (running)

即可。