にわかサーバー屋さんの覚書

サーバー系を担当しているけど、設計などは日々勉強中のプログラマの覚書

LINE BOT API Trial で引っかかったところ

いや、まだ絶賛苦戦中なんですが。。。 ひとまず、落ち着きました。

まぁ、LINEのBOTが話題に上がったので、試そうとしたんですが、 スキル不足でつまずいたところを書いておきます。

linecorp.com

調子こいてAWS API GatewayとLambdaでやろうとした

これができたらサーバー管理いらずにプログラムだけで完結できるんですが、

残念ながら、LINE BOTにWHITE LISTという形で許可するIPアドレスを指定しないといけなく、 LambdaはIPアドレスが不明なので、上手く許可できませんでした。

適当にAWSのリージョンのIPアドレス調べて入れようかと思ったんですが、 残念ながらマスクが24-30のレンジでしか受け付けてくれなかったので断念。。。

(2016/05/19) これに関しては改善されたようで、サーバーレスで構築できるようになりました。

コールバックの書き方が判らなかった

設定でCallback URLが必要なのですが、 https://mydomain.com/sample/callbackとやってもダメで、 ただしくは https://example.com:443/sample/callback と、SSLのポート番号を入れてあげる必要がありました。

コールバックはSSL必須、そしてSSLきちんと張っているドメイン持っていなかった

当初、AWS API Gatawayでって考えてたのでxxxxxxxxx.execute-api.region.amazonaws.com的なドメイン使ったら良いわ、 って思っていたのですが、Lambdaの夢破れてしまい、個人ドメインの無料証明書をStartSSLで作りました。

https://www.startssl.com/

この後、問題が発生?するので、これで解決するかどうかは疑問です。

なぜかJSONパースエラーがでる

{
  "statusCode": "400",
  "statusMessage": "Failed to parse json data. Please check json data is well-formed."
}

投稿のフォーマットの"to"の項目を配列にし忘れていた。。。

{
    "to":["{$from}"],
    "toChannel":1383378250,
    "eventType":"{$event_type}",
    "content":{
        "toType":1,
        {$content}
     }
}

投稿する際の"to"の項目ですが、to自体を配列として渡さないといけないので、

誤)$post["to"] = $content->from

正)$post["to"][] = $content->from

上記の様に配列に入れた後、json変換すればOKでした。

なんだかコンテンツタイプで怒られる

{
  "statusCode": "422",
  "statusMessage": "contentType is not valid : 0"
}

結局、原因は判らなかったのですが、上記のJSONエラーを修正していたら、エラーが消えていた。。。 でも、結局、JSONフォーマットが悪かったのかな。

どうもLINE BOTのコールバック指定したURLにメッセージ飛んでこない

アクセスログを見てもどうも来ない。LINE BOTが来たよっていう足跡が残らない。。。

そこで、API Gatewayをプロキシにして、プログラムを叩くと、ログにも残ったし、返事のメッセージもきちんと送れました。

LINE BOT -> (☓) ->おいらのサーバーのプログラム

LINE BOT -> (○) ->API Gateway ->おいらのサーバーのプログラム

うーん、証明書は入れたつもりなんですけどね。

f:id:xev:20160409031643p:plain