@ibarakitarou123456

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

INE Bot + Rinna API 連携の Google Apps Script Codeを作成

LINE Bot + Rinna API 連携の Google Apps Script Codeを作成しています。
以下のようなエラーが表示され実行することできません。

Google Apps Script Code
エラー	
Exception: Request failed for https://api.rinna.co.jp returned code 401. Truncated server response: { "statusCode": 401, "message": "Access denied due to missing subscription key. Make sure to include subscription key when making requests to an AP... (use muteHttpExceptions option to examine full response)
makeCCERequest	@ コード.gs:71

LINE
ボットサーバーから200以外のHTTPステータスコードが返されました。(302 Found)
LINEプラットフォームから送信されたHTTP POSTリクエストに対してボットサーバーがステータスコード200を返すことを確認してください。詳しくは、Messaging APIリファレンスのレスポンスを参照してください。

Started on
11/29/2023
Primary key
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Show | Regenerate
Secondary key
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Primary keyとSecondary key入力してもエラーが表示されます。

以下がコードとなります。

// LINE Bot + Rinna API 連携の Google Apps Script Code

function doPost(e) {
  var json = JSON.parse(e.postData.contents);

  if (json.events) {
    for (var i = 0; i < json.events.length; i++) {
      var event = json.events[i];
      if (event.type == "message" && event.message.type == "text") {
        var user_input = event.message.text;
        var rawInput = "A: " + user_input;

        var cceResponse = makeCCERequest(rawInput);

        if (cceResponse) {
          var replyToken = event.replyToken;
          var replyMessage = cceResponse.answer;
          replyLine(replyToken, replyMessage);
        }
      }
    }
  }

  return ContentService.createTextOutput();
}

function replyLine(replyToken, replyMessage) {
  var url = "https://api.line.me/v2/bot/message/reply";
  var headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer **********"
  };

  var data = {
    "replyToken": replyToken,
    "messages": [
      {
        "type": "text",
        "text": replyMessage
      }
    ]
  };

  var options = {
    "method": "post",
    "headers": headers,
    "payload": JSON.stringify(data)
  };

  UrlFetchApp.fetch(url, options);
}

function makeCCERequest(rawInput, outputLength = 25) {
  var url = "https://api.rinna.co.jp/models/cce";
  var headers = {
    "Content-Type": "application/json",
    "subscription-key": "**********" // 主キーを使用しています
  };

  var data = {
    "rawInput": rawInput,
    "outputLength": outputLength
  };

  var options = {
    "method": "post",
    "headers": headers,
    "payload": JSON.stringify(data)
  };

  var response = UrlFetchApp.fetch(url, options);

  if (response.getResponseCode() == 200) {
    return JSON.parse(response.getContentText());
  } else {
    console.error("Error " + response.getResponseCode() + ": " + response.getContentText());
    return null;
  }
}
0 likes

1Answer

ヘッダ名は subscription-key ではなく Ocp-Apim-Subscription-Key のようです。

1Like

Comments

  1. 返信ありがとうございます、ヘッダ名を直して行ったのですが以下のエラーが表示されました。

    エラー
    Exception: Request failed for https://api.rinna.co.jp returned code 400. Truncated server response: {"type":"https://tools.ietf.org/html/rfc7231#section-6.5.1","title":"One or more validation errors occurred.","status":400,"traceId":"00-707e5c0346... (use muteHttpExceptions option to examine full response)
    makeCCERequest @ コード.gs:71

  2. makeCCERequest 内で optionsmakeCCERequest: true muteHttpExceptions: true を追加してエラーレスポンス全文を表示させてください。

  3. makeCCERequest 内で optionsにmuteHttpExceptions: trueを追加した結果、以下のエラーが表示されました。

    Error 400: {"type":"https://tools.ietf.org/html/rfc7231#section-6.5.1","title":"One or more validation errors occurred.","status":400,"traceId":"00-d1d6a06c65eeef6d47bfe81e9762c118-8310c2070171d4e7-00","errors":{"RawInput":["The RawInput field is required."]}}

  4. rawInput フィールドが含まれていないエラーのようです。フィールドの値が null か undefined でも起きます。質問のコードでは必ず文字列が入るように見えますが、手元で動かしているコードに相違がないか確認してください。

    なお、質問のコードを改変した以下のコードを Apps Script で実行したところ、正常なレスポンスを得ることができました。

    function myFunction() {
      var url = "https://api.rinna.co.jp/models/cce";
      var headers = {
        "Content-Type": "application/json",
        "Ocp-Apim-Subscription-Key": "****" // 主キーを使用しています
      };
    
      var data = {
        "rawInput": "こんにちは",
        "contentLength": 25
      };
    
      var options = {
        "method": "post",
        "muteHttpExceptions": true,
        "headers": headers,
        "payload": JSON.stringify(data)
      };
    
      var response = UrlFetchApp.fetch(url, options);
    
      if (response.getResponseCode() == 200) {
        console.log(JSON.parse(response.getContentText()));
      } else {
        console.error("Error " + response.getResponseCode() + ": " + response.getContentText());
      }
    }
    
  5. 同じく質問のコードを改変した以下のコードを Apps Script で実行したところ、正常なレスポンスを得ることができました!!
    しかし、Webhook URLで実行したところ以下のエラーが表示されました。

    ボットサーバーから200以外のHTTPステータスコードが返されました。(302 Found)

    LINEプラットフォームから送信されたHTTP POSTリクエストに対してボットサーバーがステータスコード200を返すことを確認してください。詳しくは、Messaging APIリファレンスのレスポンスを参照してください。

Your answer might help someone💌