はじめに
discord.pyにて、「DeepL APIを使って英 ↔ 日翻訳してくれるdiscord bot」を作りました。
記事を書くのもコードを書くのもほぼ初心者ですが
温かい目で見ていただけると幸いです。
既にbotがある前提で進めていきます。
そのため、discord botの具体的な説明や導入は省略させていただきます。
deeplライブラリのインストール
pip install deepl
エラーが出るかもしれませんが何ら問題ないと思います。たぶん。
コード全文
import discord
import re
import deepl
TOKEN = "Your bot's token"
client = discord.Client()
def is_japanese(str):
return True if re.search(r'[ぁ-んァ-ン]', str) else False
@client.event
async def on_ready():
print('start.')
@client.event
async def on_message(message):
@client.event
async def on_reaction_add(reaction, user):
if reaction.emoji == "❓":
msg = message.content
if is_japanese(msg) == True:
lang = "EN-US"
else:
lang = "JA"
translator = deepl.Translator("Your DeepL API key")
result = translator.translate_text(msg, target_lang=lang)
result_txt = result.text
embed = discord.Embed(description=result,color=discord.Colour.from_rgb(130, 219, 216))
await message.channel.send(embed=embed)
client.run(TOKEN)
ということで、いくつか解説していきます。
1つ目
def is_japanese(str):
return True if re.search(r'[ぁ-んァ-ン]', str) else False
ここで文章が日本語かそうでないかという判定をしてくれる関数の定義をしています。
このコードはこちらの記事を参考にさせていただきました。
尚、漢字だけでは英語扱いされます。詳しい説明はこちらの記事を参照ください。
2つ目
@client.event
async def on_message(message):
@client.event
async def on_reaction_add(reaction, user):
if reaction.emoji == "❓":
msg = message.content
メッセージを受け取った上で、特定のリアクションが付き、かつ特定のリアクションであった場合。。。
という風にしています。
今回は"❓"というリアクションが付けられた場合、という風にしました。
if is_japanese(msg) == True:
lang = "EN-US"
else:
lang = "JA"
translator = deepl.Translator("Your DeepL API key")
result = translator.translate_text(msg, target_lang=lang)
result_txt = result.text
下から2行目の引数に翻訳する文と翻訳先の言語を指定することで翻訳してくれます。
そのため、1つ目の関数で文字列を判断してもらい、翻訳先の言語を決めています。
細かい仕様等はこちらをご参照ください。
ちょっとした余談
ここで余談ですが、実はもともと最後の行を書いていなかったんです。
この記事を書いていて公式のページをもう一度読むとこの行が記述されていたことに気づいたので
焦って追加したんですけど、一応確認してみたら
print(type(result), result)
print(type(result.text), result.text)
<class 'deepl.translator.TextResult'> ハローワールド
<class 'str'> ハローワールド
と、独自の型になってました。
なぜエラーが出ないんだろう。。。(オチなし)
おまけ
embed = discord.Embed(description=result,color=discord.Colour.from_rgb(130, 219, 216))
こちらはembed(エンベッド)といって、
出力例のように左に線をいれて見やすくしてくれるDiscordの機能です。
こちらの記事を参考にさせていただきました。
さいごに
ここまで読んでいただきありがとうございました。
Python勉強中のひよっこ灰coderですが、
自分で色々調べてこうして形にできたのはすごく達成感がありました。
また新しいものを作ったら投稿してみます。
それでは。