🌏

DeepLを使ってslackのメッセージをリアクションで翻訳できるbotを作った

2021/09/13に公開

こんにちはしかじろうです。今月から Ubie Discovery に入社してソフトウェアエンジニアをやってます。

Ubie DiscoveryではGlobal事業も展開しており、英語でのコミュニケーションも活発に行なっています。「slackのやりとりが即座に翻訳できると嬉しい」という声があったので、slack botとして作ってみました。

https://github.com/shikajiro/deepl-bot

このbotはリアクションによる翻訳に機能を絞っています。
slackのリアクションで

をつけるとbotが翻訳した文章を投稿してくれます。

この手のbotはすでにいくつかあり、一番代表的なのがこちらです。
https://github.com/seratch/deepl-for-slack
「じゃあそれを使えば良かったじゃん」って言われそうですが、

  • herokuを使いたくない(弊社k8sで管理したい)
  • ドメインを作りたくない

など、もっと簡単に動かしたい気持ちがありました。

SlackにはSocket Modeがあり、Redirect URLが無くてもWebAPIと連携する仕組みがあるので、Socket Modeを使った実装をしてみました。

pythonでslackapi/bolt-python: A framework to build Slack apps using Pythonというめっちゃ便利なライブラリが出てたのでこれを使って実装してみました。以下が色々端折った大体のコードです。(TODO コードはあとできれいにする)

@app.event("reaction_added")
def show_datepicker(event, say: Say):
    # リアクションしたメッセージテキストを抜き出す
    replies = say.client.conversations_replies(channel=event["item"]["channel"], ts=event["item"]["ts"])
    message = replies["messages"][0]["text"]
    reaction = event["reaction"]

    # 重複リアクションの除外
    counts = [x["count"] for x in replies["messages"][0]["reactions"] if x["name"] == reaction]
    if counts and counts[0] > 1:
        return

        # 言語の特定
    if reaction == "jp":
        target_lang = "JA"
    elif reaction == "us":
        target_lang = "EN-US"
    elif reaction == "gb":
        target_lang = "EN-GB"
    elif reaction == "cn":
        target_lang = "ZH"
    else:
        return
    result = translator.translate_text(message, target_lang=target_lang)
    query = ""
    for m in message.split("\n"):
        query += f">{m}\n"
    say(text=f"{query}{result.text}", thread_ts=replies["messages"][0].get("thread_ts"))

リアクションしたメッセージを抜き出して言語を特定してDeepLAPIに投げて返すだけ。という簡単なものです。

DockerとしてPackage deepl-botに公開しているので、docker run -d ghcr.io/shikajiro/deepl-bot:latest とかで動きます。ローカルで実行してもちゃんと動作するので、気軽に動かせます。

よかったらお試しください〜。

注意

DeepL は無料アカウントだと翻訳に使った元文章が流用される可能性があります。
社内でやりとりするSlackではProアカウントを使うことをおすすめします。

DeepL翻訳で機密は保持される?セキュリティは? | ブログ | 株式会社ヒューマンサイエンス

Discussion