LoginSignup
4
4

More than 3 years have passed since last update.

GASとLINEAPIでハマったときの対処法

Posted at

※初投稿により改善等あればご指摘お願いします。

現状

・プログラミング好きだけど、そこまで何かやったというものは特になし
・Python,Matlabを大学の授業で使用する程度
・あることからGASを使い始め、GASの便利さに気付きもっといろんなことをしたいと思うようになった。
・そこでLINEmesseagingAPIを使ったプログラミングをすることにした。

使用参考書:「独学プログラマーであるためのAIアプリ開発がわかる本」/著 河合 大 2019年3月18日出版

この本にした理由

・使用言語がGASであること
・API通信があったこと
・50行程度のプログラミングの中にいろんな知識が含まれていたこと
・単純に面白そうだったから

行ったこと

・本に書いてあったプログラミングコードの写経
・実行してエラー出たら、プログラムの見直し、ウェブサイトで解決法の検索

実際のプログラミングコード

qiita moji.gs
function doPost(e) {
  const LINE_ACCESS_TOKEN = "YOUR_LINE_TOKEN";
  const lineJson = JSON.parse(e.postData.contents);
  const replyToken = lineJson.events[0].replyToken;
  const messageId = lineJson.events[0].message.id;
  const lineImageUrl = "https://api.line.me/v2/bot/message/" + messageId + "/content/";
  const lineImageResponse = UrlFetchApp.fetch(lineImageUrl, {
    'headers':{
      'Content-Type': 'application/json; charset=UTF-8',
      "Authorization": "Bearer " + LINE_ACCESS_TOKEN
    },
    'method': 'get'
  })
  .getContent();

  const lineImageBlob = Utilities.base64Encode(lineImageResponse);
  const API_KEY = 'YOUR_API_KEY';
  const visionRequestUrl = 'https://vision.googleapis.com/v1/images:annotate?key=' + API_KEY;
  const payload = JSON.stringify({
    "requests":[
      {
        "image":{
          "content":lineImageBlob
        },
        "features":[
          {
            "type":"TEXT_DETECTION",
            "maxResults": 1
          }
         ]
        }
      ]
    });
  const visionTextResponse = UrlFetchApp.fetch(visionRequestUrl,{
    method:"POST",
    contentType:"application/json",
    payload:payload,
  })
  .getContentText();
  const visionTextJson = JSON.parse(visionTextResponse);
  const visionText = visionTextJson.responses[0].fullTextAnnotation.text;
  Logger.log(visionText);
  const messages = [
    {
      "type":"text",
      "text":visionText,
      "muteHttpExceptions":true
    }
   ]
  UrlFetchApp.fetch("https://api.line.me/v2/bot/message/reply", {
    "headers": {
      "Content-Type": "application/json; charset=UTF-8",
      "Authorization": "Bearer " + LINE_ACCESS_TOKEN,
    },
    "method":"post",
    "payload": JSON.stringify({
      "replyToken": replyToken,
      "messages": messages,
    })
  });
}       

実際に出たエラーと対処法

TypeError: Cannot read property 'postData' of undefined at doPost

→調べてみ見ると、これはLINEmessageingAPIからPOSTデータの送信から得られるもので、エディタ内部で実行してしまうと、
JSON.parse(e.postData.contents)
の部分でundefinedと返ってくるらしい。
そのため以後無視することにした。

Webhookイベントオブジェクトを送信したときにエラーが発生しました

これはLINEmessagingAPIと上記のプログラムを紐づける際に起こったエラー
→要は、LINEのAPI側からWebhookに指定したURLを送る

エディタのdoPost関数にたどり着かずに追い返される

上記のようなエラーが出る

解決方法:プログラムコードを新たに書き直した
しかしこのようなことはしなくてもいいと、ウェブサイト探し回ってたら発見した。

Webhookに紐づける際のURLはスクリプトを書き直したら必ず、
GASの「公開」→「ウェブアプリケーションとして導入」から
プロジェクトバージョンの部分を「NEW」にしてから更新しないといけないのに、
ずっと「1」のまま、「更新」ボタンを押していたため、URLが変わることなく、古いプログラミングコードのままWebhookに指定していたことが原因だと考えられる。

実際に、そこを直して解決した。

https://uncle-atsushi.com/gas_first-execute_dopost-doget/
↑の補足部分を見れば解決するはず。

スペルミス

本書と照らし合わせた。

この本で得られたこと

・API通信の理解と心的ハードルの軽減
・JSON形式の通信方法を理解
・エラー対処力
・LINEのAPIの使いやすさ

最後に

Logger.log()でエラー部分を確かめる方法もありやってみたが、なぜか実行できず結局は一個一個探し回っていた羽目に、、

自分はエラーの二つ目のWebhook設定によりかなり時間を食っていた。
(一番タチが悪かったのが、「Webhhok設定での接続確認で「成功」と出ていたのに画僧を送ってもうまく作動しなかったこと」)かなりむかつく!!

少しでも同じ罠にはまっている人がなるべく時間をかけずに解決できるように今回この記事を書いた。

自分も同様、エラーが長時間見つからないということになるとプログラミング初心者にはかなり精神的苦痛が出てきて「自分には向いていない」という思いが芽生えてくる。

自分もこのエラーループに陥り2,3日別のことをやっていた。
しかし、解決して実行できた時の達成感と感動は考えられないくらいうれしいものである。

今回のこのプログラミング自体はそこまで長くないし、初学者にとっても少し大変かもしれないができたときの成長した感じがたまらなく好きなのでまた随時更新していこうと思う。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4