Skip to content

Commit

Permalink
New model; UX improvements; natural commands.
Browse files Browse the repository at this point in the history
  • Loading branch information
reycn committed Aug 11, 2020
1 parent 78f1ad6 commit e428d3d
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 104 deletions.
19 changes: 11 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@

## 如何使用?

- 私聊我,发送或转发需要翻译的文字,我会将其翻译为中文
- 群聊中,添加我为管理员,用 "/fy" 命令回复需要翻译的消息
- 任意聊天中 @fanyi_bot 调用翻译
- 自动中译英
- 与我私聊,自动翻译文字消息
- 与我私聊或群聊中,使用翻译命令或起始关键字翻译文本或回复需要翻译的消息;
- 群聊添加"翻译"接文字或回复需翻译的文本;
- 任意聊天中 @fanyi_bot 实时翻译

## 功能预览

Expand All @@ -22,15 +22,18 @@

<img src="https://github.com/reycn/fanyi_bot/blob/master/res/inline.jpg?raw=true" width="300"></img>

## 最近更新 / 2020.2.2
## 最近更新 / 2020.8.11
- [2020.08.11] 修复交互细节
- [2020.08.05] 机器人现已无需管理员权限
- [2020.08.04] 使用最新模型,提升翻译质量
- [2020.08.04] 添加自然语言命令
- [2020.08.04] 更改其他交互细节

## 历史更新
- 更换为 [aiogram](https://github.com/aiogram/aiogram) 异步框架
- 添加行内实时转译
- 更改样式
- 提供指定语言功能

## 历史更新

- 修复群聊判断逻辑
- 修复上游模块的网页问题
- 忽略不带文字的群组命令
Expand Down
9 changes: 5 additions & 4 deletions clean.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
import re
from termcolor import cprint


def output_clean(text):
text = text.replace('(', '(').replace(')', ') ')
text = text.replace('「', '“').replace('」', '”')
text = text.replace('@', ' @')
text = text.replace('://', '://')
text = text.replace('HTTPS:/ /', 'https://')
text = text.replace('/////', '\n')
# text = text.replace('/////', '\n')
text = re.sub('\/{2,}', '', text)
text = text.replace('@fanyi_bot ', '')
return text


def output(result, end_str_id=1):
# end_str = '\n\n`─────`\n🤖 By [中文翻译机器人](https://t.me/fanyi_bot)'
end_str = '\n\n🤖 By @fanyi_bot'
end_str = ''
if end_str_id == 2:
end_str = '\n\n🤖 By @fanyi_bot'
end_str = ''
msg_str = output_clean(result)
try:
cprint(
Expand Down
10 changes: 6 additions & 4 deletions gtrans.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,18 @@ def trans(text, lang='zh-CN', detect=1):
text = text_clean(text)
tr = Translator()
if lang == 'en':
result = '🇺🇸 ' + tr.translate(text, dest='en').text
# result = '🇺🇸 ' + tr.translate(text, dest='en').text
result =tr.translate(text, dest='en').text
elif lang == 'zh':
result = '🇨🇳 ' + tr.translate(text, dest='zh-CN').text
# result = '🇨🇳 ' + tr.translate(text, dest='zh-CN').text
result = tr.translate(text, dest='zh-CN').text
else:
if tr.detect(text).lang == 'zh-CN':
result = '🇨🇳 ' + tr.translate(text, dest='zh-CN').text + '\n\n🇺🇸 ' \
result = tr.translate(text, dest='zh-CN').text + '\n' \
+ tr.translate(text, dest='en').text
# print(result)
else:
result = '🇨🇳 ' + tr.translate(text, dest='zh-CN').text + '\n\n🇺🇸 ' \
result = tr.translate(text, dest='zh-CN').text + '\n' \
+ text
return result

Expand Down
174 changes: 86 additions & 88 deletions main.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import logging
from sys import path as syspath
import re
from clean import output
from configparser import ConfigParser
from gtrans import trans
from termcolor import cprint
from clean import output
from stathat import StatHat
from sys import path as syspath
from termcolor import cprint
from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import InlineQuery, \
InputTextMessageContent, InlineQueryResultArticle


# 初始化 bot
try:
cfg = ConfigParser()
Expand All @@ -23,6 +25,7 @@
print(e)
exit()


logging.basicConfig(level=logging.INFO)
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
Expand All @@ -40,6 +43,22 @@ def trans_c(text, lang='zh-CN', detect=1):
return translated_cleaned


def msg_trans(message: types.Message, offset: int=0, lang: str=None, reg: str=None):
if message.reply_to_message: # 如果是回复则取所回复消息文本
text = message.reply_to_message.text
else: # 如果不是回复则取命令后文本
text = message.text[offset:] # 去除命令文本
text = text.replace('@fanyi_bot', '').strip()
if reg:
text = re.sub(reg, '', text)
if len(text) == 0:
pass
else:
clog(message)
result = trans_c(text, lang)
return(result)


def clog(message):
chat_type = message.chat.type
user = message.from_user.username
Expand All @@ -56,101 +75,82 @@ def clog(message):


####################################################################################################
# 定义处理
# 欢迎词
@dp.message_handler(commands=['start', 'welcome', 'about', 'help'])
async def start(message: types.Message):
intro = '''为全世界语言提供中文翻译。\n
如何使用?
- 私聊我,发送或转发需要翻译的文字;
- 群聊授予消息读取权限,用 "/fy" 后接文字或回复需翻译的文本;
- 在私聊或群聊中,使用 "/en" 或 "/zh" 指定翻译语言;
- 任意聊天中 @fanyi_bot 调用行内请求(inline query) 选择目标语言进行翻译。
\n
最近更新了什么?
- [BETA] 更换了异步框架
- [BETA] 提供了行内请求 (inline query) 实时转译
- [BETA] 提供了指定翻译语言的功能
群聊为何需要管理员权限?
- Telegram 中,不是管理员的机器人无法读取群消息,也就无法翻译。\n
服务掉线请联系 @reycn,反馈请到 @fanyi_group。'''
intro = '''使用说明?
- 与我私聊,自动翻译文字消息;
- 与我私聊或群聊中,使用翻译命令或起始关键字翻译文本或回复需要翻译的消息;
- 群聊添加"翻译"接文字或回复需翻译的文本;
- 任意聊天中 @fanyi_bot 实时翻译。
使用样例:
-
/fy 要翻译的一句话
/zh A sentence to translate
-
翻译 要翻译的一句话
中文 A sentence to translate
-
English 要翻译的一句话
Chinese A sentence to translate
最近更新
- [2020.08.05] 机器人现已无需管理员权限
- [2020.08.04] 使用最新模型,提升翻译质量
- [2020.08.04] 添加自然语言命令
- [2020.08.04] 更改其他交互细节
服务掉线联系 @reycn,反馈到 @fanyi_group。'''
await message.answer(intro)


# 禁止翻译套娃
@dp.message_handler(regexp='(🤖 By @fanyi_bot)')
async def rerere(message: types.Message):
chat_type = message.chat.type
if chat_type == 'private':
await message.reply('🌚 禁止套娃!')
else:
pass


# # 测试命令
# @dp.message_handler(commands=['tp'])
# async def tp(message: types.Message):
# chat_type = message.chat.type
# cprint(chat_type, 'white', 'on_yellow')
# await message.reply(chat_type)


####################################################################################################
# 翻译命令
@dp.message_handler(commands=['fy', 'tr'])
async def fy(message: types.Message):
if message.reply_to_message: # 如果是回复则取所回复消息文本
text = message.reply_to_message.text
else: # 如果不是回复则取命令后文本
text = message.text[3:]
text = text.replace('@fanyi_bot', '').replace('@fanyi_bot', '').strip()
if len(text) == 0:
pass
else:
clog(message)
result = trans_c(text)
await message.reply(result)


# 指定翻译为英文
####################################################################################################
# 中英文
@dp.message_handler(commands=['fy', 'tr', '翻译' ])
async def fy_command(message: types.Message):
result = msg_trans(message, 3) # None -> Chinese + English
await message.reply(result)
# 中文
@dp.message_handler(commands=['zh'])
async def zh(message: types.Message):
result = msg_trans(message, 3, 'zh')
await message.reply(result)
# 英文
@dp.message_handler(commands=['en'])
async def en(message: types.Message):
if message.reply_to_message: # 如果是回复则取所回复消息文本
text = message.reply_to_message.text
else: # 如果不是回复则取命令后文本
text = message.text[3:]
text = text.replace('@fanyi_bot', '').replace('@fanyi_bot', '').strip()
if len(text) == 0:
pass
else:
clog(message)
result = trans_c(text, 'en')
await message.reply(result)
result = msg_trans(message, 3, 'en')
await message.reply(result)


# 指定翻译为中文
@dp.message_handler(commands=['zh'])
async def zh(message: types.Message):
if message.reply_to_message: # 如果是回复则取所回复消息文本
text = message.reply_to_message.text
else: # 如果不是回复则取命令后文本
text = message.text[3:]
text = text.replace('@fanyi_bot', '').replace('@fanyi_bot', '').strip()
if len(text) == 0:
pass
else:
clog(message)
result = trans_c(text, 'zh')
await message.reply(result)
####################################################################################################
# 自然指令
####################################################################################################
@dp.message_handler(regexp='^(translate|trans|tran|翻译) .')
async def fy_keyword_zh(message: types.Message):
result = msg_trans(message, reg='^(translate|trans|tran|翻译) .')
await message.reply(result)

@dp.message_handler(regexp='^(英文|English|en) ')
async def en_keyword_zh(message: types.Message):
result = msg_trans(message, lang='en', reg='^(英文|English|en) ')
await message.reply(result)

@dp.message_handler(regexp='^(中文|Chinese|zh) ')
async def zh_keyword(message: types.Message):
result = msg_trans(message, lang='zh', reg='^(中文|Chinese|zh) ')
await message.reply(result)

####################################################################################################
# 私聊自动检测语言并翻译
####################################################################################################
@dp.message_handler(content_types=types.message.ContentType.TEXT)
async def text_message(message: types.Message):
chat_type = message.chat.type
if chat_type == 'private':
clog(message)
result = trans_c(message.text).replace('\n\n🤖 By @fanyi_bot', '')
result = trans_c(message.text)
await message.reply(result)
else: # 过滤所有群聊、频道
pass
Expand All @@ -175,9 +175,9 @@ async def inline(inline_query: InlineQuery):
user = inline_query.from_user.username
user_id = inline_query.from_user.id
if len(text) >= 256:
end_str = '\n\n(达到行内查询长度限制,请私聊 bot 翻译全文)\n🤖 By @fanyi_bot'
end_str = '\n\n(达到长度限制,请私聊翻译全文)'
else:
end_str = '\n\n🤖 By @fanyi_bot'
end_str = ''
if text == '翻译…':
pass
else:
Expand All @@ -187,8 +187,8 @@ async def inline(inline_query: InlineQuery):
items = [
InlineQueryResultArticle(
id=0,
title=f'检测并翻译到中英文 / Auto detection',
description=f'{zh_str[2:40]}... {en_str[2:40]}...'.replace(
title=f'自动检测 / Auto detection',
description=f'{zh_str[:40]}... {en_str[:40]}...'.replace(
'🇨🇳', '').replace('🇺🇸', '').strip(),
thumb_width=0,
input_message_content=InputTextMessageContent(
Expand All @@ -198,17 +198,15 @@ async def inline(inline_query: InlineQuery):
InlineQueryResultArticle(
id=1,
title='英文 / English',
description=f'{en_str}'.replace('🇨🇳', '').replace('🇺🇸',
'').strip(),
description=f'{en_str}'.strip(),
thumb_width=0,
input_message_content=InputTextMessageContent(
f'{en_str}{end_str}', disable_web_page_preview=True),
),
InlineQueryResultArticle(
id=2,
title='中文 / Simplefiled Chinese',
description=f'{zh_str}'.replace('🇨🇳', '').replace('🇺🇸',
'').strip(),
description=f'{zh_str}'.strip(),
thumb_width=0,
input_message_content=InputTextMessageContent(
f'{zh_str}{end_str}', disable_web_page_preview=True),
Expand Down

0 comments on commit e428d3d

Please sign in to comment.