質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

431閲覧

GASでdocomo雑談対話のAPI keyが通らない

ISATAKU

総合スコア14

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2018/06/21 13:34

編集2018/06/21 23:29

実現したい事

タイトルのとうりなんですが、GASでdocomoの「自然対話:雑談対話」APIで、
雑談できるslackbotを作る

発生している問題

実行すると、slack側では何も応答を返さず
原因を調べると、API実行でエラーを吐いてました。

画像の赤線の場所 API Keyを
イメージ説明

この、URLのxxxxxxxに入れたのですが

js

1//APIのURL 2var var dialogueUrl = "https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 3 4// API実行 5var response = UrlFetchApp.fetch(dialogueUrl, options);

GAS側で実行すると、

https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx のリクエストに失敗しました(エラー: 401)。サーバー応答の一部: {"requestError":{"policyException":{"messageId":"POLSLA009","text":"Unable to perform ApiKey based Authentication"}}}(応答の全文を見るには muteHttpExceptions オプションを使用してください)

とエラーを吐いてしまいます。

正しく、APIKeyをコピぺでいれたのですが何が原因でエラーを吐いたのか知りたいです。

※docomo APIの部分だけのソース全文

js

1function getDialogueMessage(mes) { 2 var dialogue_options = { 3 'utt': mes 4 } 5 var options = { 6 'method': 'POST', 7 'contentType': 'text/json', 8 'payload': JSON.stringify(dialogue_options) 9 }; 10 11 // APIのURL 12 var dialogueUrl = "https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 13 14 // API実行 15 var response = UrlFetchApp.fetch(dialogueUrl, options); 16 17 // 回答を受信する 18 var content = JSON.parse(response.getContentText()); 19 20 return content.utt; 21}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macaron_xxx

2018/06/22 09:07

エラーに出ている通り、optionsに"muteHttpExceptions": trueを追加してください。responseにエラー内容が返ってくるはずです。
ISATAKU

2018/06/22 11:00

optionsに"muteHttpExceptions": true を追加し、GASで getDialogueMessage 関数を実行したらエラーは でなくなりましたが、slackのbotからは undefined と返ってきました
guest

回答1

0

ベストアンサー

てきとーなソース持って来ても動きませんよ。

  • POLSLA009

これは認証エラーで、なぜコピペしてるのにエラーかというと、APIが違うから。雑談対話API時代のソースをコピペしているのに、取得したキーは自然対話APIのものだから。

  • パラメータが全然違う

APIの変更により、問い合わせパラメータも返却値もかわっています。ちゃんと仕様を読みましょう。仕様が読めないなら、普及するまで待つしかない。

javascript

1function getDialogueMessage(mes) { 2 var key = "コピペしたと噂のキー"; 3 4 var requestOption = { 5 language: "ja-JP", 6 botId: "Chatting", 7 appId: getUserId(), // 仕様を深く追ってないが、毎回取得するものでもない気がする。 8 voiceText: mes, 9 appRecvTime: "20180601 00:00:00", // 時刻もちゃんとセットしたほうがいい 10 appSendTime: "20180601 00:00:00", // 時刻もちゃんとセットしたほうがいい 11 }; 12 var options = { 13 method: 'POST', 14 contentType: "application/json", 15 payload: JSON.stringify(requestOption) 16 }; 17 18 var dialogueUrl = "https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/dialogue?APIKEY="+key; 19 var response = UrlFetchApp.fetch(dialogueUrl, options); 20 21 // 回答を受信する 22 var content = JSON.parse(response.getContentText()); 23 24 return content.systemText.expression; 25} 26 27function getUserId() { 28 var key = "コピペしたと噂のキー"; 29 const option = { 30 method: "post", 31 contentType: "application/json", 32 payload: JSON.stringify({ 33 botId: "Chatting", 34 appKind: "slack_bot", 35 }), 36 }; 37 var registerUrl = "https://api.apigw.smt.docomo.ne.jp/naturalChatting/v1/registration?APIKEY="+key; 38 const res = UrlFetchApp.fetch(registerUrl, option); 39 var json = JSON.parse(res.getContentText()); 40 return json.appId; 41}

投稿2018/06/22 17:10

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2018/06/22 17:15

ちゃんと仕様を読むこと前提なので、appIdとかテキトーですし、必須じゃないパラメータは無視してますので、この辺ちゃんとやらないと、自然な対話を返してくれないものと想定されます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問