papago APIを使ってSlack翻訳アプリを作成してみました!

NAVERの翻訳サービスpapagoのオープンAPIを使ってAPI GatewayとLambdaでSlackのアプリを作成したブログ
2020.08.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、ソン・ヨンジンです。

NAVERの翻訳サービスpapagoのオープンAPIを使ってAPI GatewayとLambdaでSlackのアプリを作成してみました。

papagoは?

papagoはNAVER無料で提供する機械翻訳サービスで、NAVER LABSが独自開発した人工神経網(Artificial Neural Network)ベースの翻訳サービスです。

使用可能な言語は韓国語、英語、日本語、中国語、フランス語、スペイン語、ベトナム語、タイ語、インドネシア語、ロシア語、ドイツ語、イタリア語です。

韓国では翻訳サービスとしてGoogle translaterより頻繁に使われています。

構成

構成は次になります

 

 

 

 

 

 

 

 

 

 

 

使ったサービスは全部5つです。サービスと役割は次となります。

  • Slack : エンコードされたURLを送信する
  • Amazon API Gateway : エンコードされたURLをJSONに変換しLambdaへ送る
  • Amazon Comprehend : テキストからどんな言語かを確認してLanguageCodeを返す
  • papago API : テキストとSource Language, Target Languageで翻訳したテキストを返す
  • AWS Lambda : JSONデータをParseしてテキストをComprehendとpapago APIに送って翻訳されたテキストをSlackにPOSTする

 

papago API

papago APIのレファレンスはここでみる事が出来ます。(韓国語のみ)

papago APIを使うにはアプリケーション登録が必要になります。1日10000文字まで無料で翻訳する事ができます。

登録するとAPIコールに必要なClient IDとClient Secretが発給されます。

Lambda

LambdaのコードはPython3.7で作成しました。コードの内容は次になります。

from botocore.vendored import requests
import boto3
import json

def create_slack_payload(text):
    return {
    "blocks": [
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": text
            }
        }
    ]
    }

def get_translate(text):
    client_id = "?????????????" # papago API Client ID 
    client_secret = "?????????????" # papago API Client Secret 
    
    header = {"X-Naver-Client-Id":client_id,
              "X-Naver-Client-Secret":client_secret}
    
    url = "https://openapi.naver.com/v1/papago/n2mt" # API url
    
    client = boto3.client('comprehend')
    res = client.detect_dominant_language(Text = text) 
    source = res['Languages'][0]['LanguageCode'] # get LanguageCode for source language
    print("source : ", source)
    
    data = {'text' : text,
            'source' : source,
            'target': 'ko'} # translate to Korean

    response = requests.post(url, headers=header, data=data)
    rescode = response.status_code

    if(rescode==200):
        t_data = response.json()
        print(t_data['message']['result']['translatedText'])
        return t_data['message']['result']['translatedText']
    else:
        print("n2mt Error Code:" , rescode)

def lambda_handler(event, context):
    msg = event['message']['text']
    response_url = event['response_url']
     
    print("original text:" + msg)
    print("response_url:" + response_url)
    print(json.dumps(create_slack_payload(msg)))
    
    translated_text = get_translate(msg)
    
    print("translated text:" + translated_text)
    r = requests.post(response_url, data=json.dumps(create_slack_payload(translated_text))) # post to slack
    return r.json()

テストはJSON形式に変換されたSlackメッセージです。

{
    "type": "message_action",
    "token": "ABCDEFGHIJKabcdefghijk",
    "action_ts": "123456789.012345",
    "team": {
        "id": "ABCDE12345",
        "domain": "slack-domain"
    },
    "user": {
        "id": "ZZAABBCC12",
        "name": "username"
    },
    "channel": {
        "id": "ABCDEFG123",
        "name": "directmessage"
    },
    "callback_id": "callback_id",
    "trigger_id": "123412341234.123412341234.12341234asdf1234asdf",
    "message_ts": "123412341234.0000000",
    "message": {
        "client_msg_id": "a1b2c3-a123-b456-b631-1191f49ab175",
        "type": "message",
        "text": "こんにちは!このメッセージを韓国語にしたいです!",
        "user": "ZZAABBCC12",
        "ts": "123412341234.0000000",
        "team": "ABCDEFG1234"
    },
    "response_url": "https://hooks.slack.com/app/ABCDE/12312341234/12341234asdfaf"
}

テストをする前にroleでComprehendReadOnlyをポリシーをアタッチする必要があります。

API Gateway

REST APIを作成します。

[アクション] -> [メソッドの作成]で[POST]メソッドを作成します。

作成したLambda関数を選びます。

エンコードされたURLデータをJSONに変換するために、マッピングテンプレートを作成する必要があります。

[統合リクエスト] -> [マッピングテンプレート]で次のように書きます。

application/x-www-form-urlencoded

#set ($test = $input.body.substring(0,8))
#if ($test == "payload=")
#set ($encodedJSON = $input.body.substring(8))
$util.urlDecode(${encodedJSON})
#end

次に[アクション] -> [APIのデプロイ]でデプロイしてステージを指定します。 作られたURLをSlack APIで作るアプリに使います。

Slack app

https://api.slack.com/appsでアプリを作成できます。

[Create an App]でアプリの名前とWorkspaceを決めたら、[Interactivity & Shortcuts]でスイッチをOnにしてAPI Gatewayで作られたURLを[Request URL]に入れます。

[Create New Shortcut] -> [On messages]で見えるボタンの名前と説明、Callback IDを決めます。

[Save Chances]でセーブしたらSlackにショットカットが作られます。

こんな感じで翻訳したメッセージが自分だけみる事ができます。

感想

実は同期の石橋さんが先に作ったアプリで、ただ韓国語の翻訳性能が満足できなかったので翻訳のAPIをpapago APIにしたものです。でも実際に作ってみればすごく勉強ができて良かったと思いました。Lambdaがどんなサービスかは頭の中では知っていましたけど、今回で作りながらもっと理解できたものではないかなって思います。

レファレンス

API GatewayとLambdaでSlack翻訳アプリを作成してみました

Amazon Comprehend Developer Guide

AWS Lambda Developer Guide

(python)파파고 API 이용해서 번역기 만들기>