docomo自然対話APIを利用して、雑談するLINEbotを作ってみました。
AWS Lambda + Pythonでサーバレスで簡単な構成を目指します。
*2018年9月現在、docomo自然対話APIは無償提供されていますが、10月より有償化されるようです。
(2019.4.5 追記)
2019年6月28日を以って自然対話APIは提供終了されます。
一部のサービスは、雑談対話サービス「かたらい」(https://www.katar.ai/ )に移行されるようです。
開発環境
- MacOS High Sierra 10.13.3
- Python3.6
- AWS Lambda
- LINE Messaging API
- Docomo 自然対話API(雑談API)
事前準備
必要な情報として、
- LINEbotのアクセストークン
- 雑談対話APIのAPI key、appID
を取得します。
1. AWSへの登録
登録方法は割愛しますが、Lambdaは1Mリクエスト/月まで無料で利用できます。
2. LINE botの準備
LINE Messaging APIを利用するために、LINEのアカウント(普段使っているアカウントでOK)で
LINE Developersへの登録が必要です。
登録後は、
- プロバイダーの新規作成
- 新規チャネルでMessaging APIの利用登録
- プランはDeveloper Trial
チャンネルが作成できたら基本情報の設定で以下を実行
- アクセストークンの発行
- Webhook送信 -> 利用する
- 自動応答メッセージ -> 利用しない
3. 雑談対話APIの準備
docomo Developer supportのアカウント登録(個人利用でOK)
- マイページより新規API利用申請
- 自然対話APIの雑談対話を利用する
- 利用申請後、承認されるとマイページにAPI keyが表示される
雑談の対話情報はappIDで管理されるようなので、各利用ユーザごとにappIDを取得するべきなのですが、
今回はとりあえず動かすために、1つのappIDを取得して、それを直接Lambdaの環境変数に入れ込みました。。。
appIDは以下のcurlをターミナルで叩くことで取得できました。
curl -d '{"botId": "Chatting","appKind": "Smart Phone"}' -H "Content-Type: application/json" -X POST https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/registration?APIKEY=YOUR_API_KEY
以上で準備は完了です。
ソースコード
lambdaにデプロイするコードを書いていきます。
LINE側からtextが送られてきた場合は、雑談対話APIに渡してリプライをする、
スタンプが送られてきた場合は同じものを返すようにしました。(デフォルトのスタンプに限る)
# -*- Coding: utf-8 -*-
import os
import urllib.request
import json
def lambda_handler(request, context):
for event in request['events']:
# endpoint
url = 'https://api.line.me/v2/bot/message/reply'
# request header
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + os.environ['CHANNEL_ACCESS_TOKEN']
}
# text or sticker
message_type = event['message']['type']
text = ""
stickerId = ""
packageId = ""
if message_type == "text":
text = docomo_chatting(event)
elif message_type == "sticker":
stickerId = event['message']['stickerId']
packageId = event['message']['packageId']
# request body
body = {
'replyToken': event['replyToken'],
'messages': [
{
"type": message_type,
"text": text,
"stickerId": stickerId,
"packageId": packageId
}
]
}
# post
req = urllib.request.Request(url, data=json.dumps(body).encode('utf-8'), method='POST', headers=headers)
with urllib.request.urlopen(req) as res:
response_body = res.read().decode("utf-8")
return {'statusCode': 200, 'body': '{}'}
def docomo_chatting(event):
# endpoint
endpoint = 'https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/dialogue?APIKEY=REGISTER_KEY'
url = endpoint.replace('REGISTER_KEY', os.environ['DOCOMO_API_KEY'])
# request json
text = event['message']['text']
headers = {"Content-Type":"application/json"}
body ={
"language":"ja-JP",
"botId":"Chatting",
"appId":os.environ['DOCOMO_APP_ID'],
"voiceText": text,
"clientData":{
"option":{
"mode":"dialog",
"t":"kansai"
}
},
"appRecvTime":"2018-09-01 00:00:00",
"appSendTime":"2018-09-01 00:00:00"
}
# post
r = urllib.request.Request(url, data=json.dumps(body).encode('utf-8'), method='POST', headers=headers)
with urllib.request.urlopen(r) as r:
response_body_str = r.read().decode("utf-8")
response_body = json.loads(response_body_str)
response = response_body['systemText']['expression']
return response
Lambdaへコードをデプロイする
上記のコードをLambdaに記載します。
'新しい関数を作成'で関数を作成します。
諸々の設定は以下のようにしました。
関数が作成できたら、ウィンドウ部分にコードを記載します。
pythonファイルをmain.pyとしたので、ハンドラはmain.lambda_handler
とします。
事前準備で取得したAPI keyとトークンを環境変数にキーと値をセットします。
API Gateway, Webhookの設定
次にLINE APIと繋げるためにAPIGatewayの設定をします。
'トリガーの追加'からAPIGatewayを選択します。
追加をすると、APIエンドポイントが取得できるのでコピーしておきます。
作成したAPI(myChatting-API)の設定画面に移動します。
'アクション' -> 'メソッドの作成' からPOSTメソッドを作成します。
Lambda関数は今回作成したlambda関数の名前を入れておきます。
メソッドリクエストの設定画面を開き、HTTPリクエストヘッダにX-Line-Signature
を追加します。
以上の設定が終わったら'アクション' -> 'APIのデプロイ'をして、API Gatewayの設定は完了です。
最後にLINE DevelopersのWebhookURLにAPIエンドポイントを記載します。
接続確認で成功すればデプロイ完了です。
結果
雑談対話APIのoptionでkansaiとしたので、だいぶフランクなbotができました。
標準語・関西弁・赤ちゃん語に対応しているようです。
対話内容はちょっと不自然な場合もありますが、とりあえず何か喋り返して欲しいbotを作りたいときに便利ですね。
参考
大変参考にさせて頂きました!感謝です!