VPS

Pycord(or discordpy) + DeepL + googletrans でDiscordの翻訳botを作った

Discordで国旗でリアクションして翻訳してくれるbot(smoogle)をDiscordのサーバーに入れてもらったのですが、smoogleは特定の言語で働かなくなったしサポートもしてないしでモデレーターがMr. Translateを替わりに導入しました。本来のサーバーの管理者はどこかへ消えたので色々死んでます。別鯖でお世話になっていたRITAは完全に有料モデルになったので、そこまでの義理はないらしい。仕方ないね。

Mr. Translate

Mr.Translateの無料制限

  • 4000 Azure Characters
  • 1000 Google Characters/month per server
  • Premium Support

サポートはどうでもいいとして、100人以上のサーバーでは確実に文字数が足りないだろと思ったら案の定速攻で引っ掛かってました。で、500,000文字いけるDeepLのapiを頑張ってどうにかして、このbotを入れてくれと頼みました。ドイツの企業なのでヨーロッパ系の言語が豊富です。足りない言語をgoogletrans(非公式)で補います(本家で課金されたら怖いから)。

なおbotの精度は好評のようで、知らないうちに色んなサーバーで使われていました。ものすごい横柄な訳をするときもありますが。招待リンクを放置していた私が悪い。

https://py-googletrans.readthedocs.io/en/latest/

googletrans

$ pip install googletrans

これやるとエラーエラーエラー以下略で翻訳できないので

$ pip install googletrans==4.0.0-rc1

です。そしてpipはrootユーザーでやっちゃダメと知った。よく分からない。

Pycordのこと

Discord.pyが完全に終了しました。最初は何も知らずにDiscord.pyについて調べながらやっていましたが、途中で終わっていることに気づき、おっとどうしようというアレでPycordに恋をしています(違う

なおスラッシュコマンドというかコマンドには一切対応していません。翻訳できればいいから。そして国旗でリアクションしても翻訳されないとクレームを受けてから追加するスタンスですが、フランス領とか同じ見た目の国旗やめてくれません??????って思いました。

Welcome to Pycord

やったこと

  • 国旗のemojiでリアクションさせてUnicodeで国を判別する
  • 国旗が多いのでwikipediaで国の言語を調べまくる
  • googletransに翻訳前の文章をぶん投げて言語を検出する
  • DeepLのみで翻訳できる言語はDeepLのapiにぶん投げる
  • 無理ならgoogletransにぶん投げて翻訳する
  • 複数の言語の国にも対応する
  • Embedで翻訳前の文章と翻訳後の文章を出力する

importしたもの

import discord
import deepl
from discord.utils import get
from googletrans import Translator
TOKEN = 'YOUR_BOT_TOKEN'
Deepl_API_KEY = 'YOUR_DEEPL_KEY'
googletranslate = Translator()
client = discord.Client()

とりあえずこんな感じでやりました。

@client.event
async def on_ready():
    channel = client.get_channel(CHANNEL_ID)
    await channel.send('Bot start')

若干どうでもいいけれどbotが起動したよってメッセージを送る。

@client.event
async def on_raw_reaction_add(payload):
    text_channel = client.get_channel(payload.channel_id)
    message = await text_channel.fetch_message(payload.message_id)
    TEXT = message.content
    author = message.author
    useid = author.id
    user = await client.fetch_user(useid)
    avator = author.avatar_url
    color = author.color
    flag = payload.emoji.name
    language = googletranslate.translate(TEXT) #googleにぶん投げる
    lang = language.src
    reaction = get(message.reactions, emoji=payload.emoji.name)

所々スペルがおかしいのは、embedで使う変数とごちゃまぜになって、エラー吐いたときにちょっとパニクるからです。

if reaction and reaction.count == 1:

二回も翻訳されたら嫌なので国旗の数を1個にさせます。文章を編集された場合も、リアクションしなおせば新たに翻訳してくれます。

if lang == 'en' or lang == 'bg' or ...

言語を検出する。DeepLで対応できるものは、


if flag == '\U0001f1ef\U0001f1f5': #日本の国旗のUnicode
    result = translator.translate_text(TEXT,target_lang='JA')

無理なら


if flag == '\U0001f1ef\U0001f1f5':
    result = gtranslator.translate(TEXT,dest='ja')

googletransにぶん投げる

embed

botだしEmbedのほうがいいよね!何故なら翻訳botであると認識してもらえなかったからです。かなしい。Embed自体がbotの特権だしまぁいいかと気持ちを切り替えました。翻訳元のユーザーのアイコン、ユーザー名、翻訳前後の文章を出力させています。ニックネームの取得方法はわからなかったです。PycordからDiscordpyに戻したらニックネームとサーバーのアイコンを取得できるようになりました。更新してくれてありがとうございます。感謝感謝。

embed = discord.Embed(description = result.text, color = color)
embed.set_author(name = user.name, icon_url = avator)
embed.set_footer(text = TEXT)
await channel.send(embed=embed)

こんな感じで終わった。他にもサーバーの入退室、ニックネーム変更を知らせてくれるbotを(自分が楽をするために)作りました。何故か新しいサーバーを用意しろと言われ管理者になっていることをいいことに勝手にbotを追加してはふむふむしながら遊んでいます。そしてBluestacksで遊びたいからまたデスクトップのBTOを買いたいなって思いながら課金しています。してなかったらとっくに買えてるよ。はい。

実際に学ぶというのは意味があるのか

一切行く気がないし行く時間もないのですが、こういう無料相談って意味あるんですかね。本気出せばどうにかこうにかとか系のアレですかね。

私はやりたいことがやれればいいのでそのば限りです。知識が致命的に詰んでます。

discordpyが再開

したので、Pycordやめました。

Tagged , ,

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です