6
8

More than 1 year has passed since last update.

DeepL APIを使って英 ↔ 日翻訳してくれるdiscord botをつくった

Posted at

はじめに

discord.pyにて、「DeepL APIを使って英 ↔ 日翻訳してくれるdiscord bot」を作りました。
記事を書くのもコードを書くのもほぼ初心者ですが
温かい目で見ていただけると幸いです。

既にbotがある前提で進めていきます。
そのため、discord botの具体的な説明や導入は省略させていただきます。

deeplライブラリのインストール

pip install deepl

エラーが出るかもしれませんが何ら問題ないと思います。たぶん。

コード全文

python3.8.3
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)

出力例 ↓
image.png

ということで、いくつか解説していきます。

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ですが、
自分で色々調べてこうして形にできたのはすごく達成感がありました。
また新しいものを作ったら投稿してみます。
それでは。

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8