代码基于 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 |