Telgram 全自动翻译

Reno 于 2025-01-09 发布

代码基于 Neo 的帖子:将Telegram全自动翻译更进一步

使用 Linux Do 论坛提供的公益 DeeplX 对 Telegram 消息进行翻译

安装依赖

pip install aiohttp telethon

配置文件

文件目录结构如下所示

📂 telegram-translate/
│
├── 📜 config.json
├── 📜 main.py
└── 📜 chat_translator.session

创建 config.json

api_id 和 api_hash 通过申请 Telegram 应用获取:申请地址

api_key 通过访问 Linux Do Connect 复制 DeepLX Api Key 获取:获取地址

{
  "api_id": 123456, 
  "api_hash": "your_api_hash",
  "api_key": "your_api_key"
}

创建 main.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():
    # load config from json file, check if the file exists first
    if not os.path.exists('config.json'):
        logging.error('config.json not found, created an empty one')
        exit()

    with open('config.json', 'r') as f:
        config = json.load(f)

    return config


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']
api_key = cfg['api_key']
target_config = cfg['target_config'] if 'target_config' in cfg else {}

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


async def translate_single(text, source_lang, target_lang, session):
    if source_lang == target_lang:
        return target_lang, text

    url = f"https://api.deeplx.org/{api_key}/translate"
    payload = {
        "text": text,
        "source_lang": source_lang,
        "target_lang": target_lang
    }

    start_time = time.time()
    async with session.post(url, json=payload) as response:
        logging.info(f"翻译从 {source_lang}{target_lang} 耗时: {time.time() - start_time}")
        if response.status != 200:
            logging.error(f"翻译失败:{response.status}")
            raise Exception(f"翻译失败")

        result = await response.json()
        if result['code'] != 200:
            logging.error(f"翻译失败:{result}")
            raise Exception(f"翻译失败")

        return target_lang, result['data']


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

    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("已禁用: %s" % target_key)

        return False

    if text.startswith('.tt-on,'):
        await event.delete()

        _, source_lang, target_langs = text.split(',')
        target_config[target_key] = {
            'source_lang': source_lang,
            'target_langs': target_langs.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 = '%d.%d' % (event.chat_id, event.sender_id)
    try:
        message = event.message

        if not message.text:
            return

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

        if message_content.startswith('.tt-') and not await command_mode(event, target_key, message_content):
            return

        if target_key not in target_config:
            return

        logging.info(f"翻译消息: {message.text}")

        config = target_config[target_key]
        target_langs = config['target_langs']
        if not target_langs:
            return

        start_time = time.time()  # 记录开始时间
        translated_texts = await translate_text(message.text, config['source_lang'], target_langs)
        logging.info(f"翻译耗时: {time.time() - start_time}")

        modified_message = translated_texts[target_langs[0]]

        if len(target_langs) > 1:
            secondary_messages = []
            for lang in target_langs[1:]:
                secondary_messages.append(translated_texts[lang])

            modified_message += '\n```%s\n```' % '\n'.join(secondary_messages)

        await message.edit(modified_message)
    except Exception as e:
        # 记录处理消息时发生的异常。
        logging.error(f"Error handling message: {e}")


# 启动客户端并保持运行。
try:
    client.start()
    client.run_until_disconnected()
finally:
    # 断开客户端连接。
    client.disconnect()

创建 chat_translator.session

试运行服务后自动生成

python3 main.py

按照提示输入手机号(带区号,如+861234567),并输入已登录设备中收到的验证码来登录您的账号,登录成功后会生成chat_translator.session 文件

系统服务

创建服务

sudo bash -c 'cat << EOF > /etc/systemd/system/telegram-translate.service
[Unit]
Description=Telegram Translate Service
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/etc/telegram-translate
ExecStart=/usr/bin/python3 /etc/telegram-translate/main.py
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF'

运行服务

sudo systemctl daemon-reload
sudo systemctl enable --now telegram-translate.service

查看日志

sudo journalctl -u telegram-translate.service

开始使用

开启翻译

将中文翻译成英文和俄文并引用中文原文

.tt-on,zh,zh|en|ru

关闭翻译

.tt-off

支持语言

源语言 目标语言    
Arabic AR Arabic AR
Bulgarian BG Bulgarian BG
Czech CS Czech CS
Danish DA Danish DA
German DE German DE
Greek EL Greek EL
English EN English (unspecified variant for backward compatibility; please select EN-GB or EN-US instead) EN
Spanish ES Spanish ES
Estonian ET Estonian ET
Finnish FI Finnish FI
French FR French FR
Hungarian HU Hungarian HU
Indonesian ID Indonesian ID
Italian IT Italian IT
Japanese JA Japanese JA
Korean KO Korean KO
Lithuanian LT Lithuanian LT
Latvian LV Latvian LV
Norwegian (Bokmål) NB Norwegian (Bokmål) NB
Dutch NL Dutch NL
Polish PL Polish PL
Portuguese (all varieties mixed) PT Portuguese (unspecified variant for backward compatibility; please select PT-BR or PT-PT instead) PT
Romanian RO Romanian RO
Russian RU Russian RU
Slovak SK Slovak SK
Slovenian SL Slovenian SL
Swedish SV Swedish SV
Turkish TR Turkish TR
Ukrainian UK Ukrainian UK
Chinese ZH Chinese (simplified) ZH
    English (British) EN-GB
    English (American) EN-US
    Portuguese (Brazilian) PT-BR
    Portuguese (excluding Brazilian Portuguese) PT-PT

参考链接

Telegram全自动翻译

将Telegram全自动翻译更进一步