あの頃、LINE APIと駆け抜けた1年間について


みなさん、アドベント楽しんでますかー!?
どうもオッスンこと、井出です。「で」は手ではなく、出の井出です。

私も記事を書くのが初めてなので
内容があっちこっち行ってるかと思いますが
どうぞお手柔らかに。

記事を書くに辺り、2019年を振り返っていたのですが
ほぼ毎日LINEの事やってたなーって思ったので
題材にすることにしました。

ただ、基本的な仕様はLINEが提供してる仕様書(こちら)が分かりやすく
また、分かりやすい記事も色々あるので
自分は少しコアな部分を書こうかなって思います。

個人的にはこちらの記事で凄い詳しく書かれています。

記事内容

基本的な仕様を説明。その後
レスポンスデータの内容を踏まえて、さらに取得できるデータがあるよ!
という部分。これは解析に少し時間が掛かった部分なので
今後開発するエンジニアさんに少しでも役立てばと思います

まずはMessaging APIを使うための下準備!

1.developer環境に登録してAPIの使えるようにしよう!
https://developers.line.biz/ja/services/messaging-api/

2.SDKを入れてみよう!
https://developers.line.biz/ja/docs/messaging-api/line-bot-sdk/

・phpはこれね!
https://github.com/line/line-bot-sdk-php

APIのメッセージタイプは2つ

1)任意のタイミングでユーザーに送信するプッシュメッセージ(push)
https://developers.line.biz/ja/reference/messaging-api/#send-push-message
2)ユーザーからのメッセージに対して応答する応答メッセージ(reply)
https://developers.line.biz/ja/reference/messaging-api/#send-reply-message

各々で使用できるAPIが異なるのでドキュメントを確認しましょう!

受信データ

developer画面で設定するwebhookのURLをエンドポイントととして
ユーザが何らかのアクションを行うたびにデータ飛んできます。

「テスト送信」とbotに投げてみました

結果

stdClass::__set_state(array(
   'events' => 
  array (
    0 => 
    stdClass::__set_state(array(
       'type' => 'message',
       'replyToken' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',
       'source' => 
      stdClass::__set_state(array(
         'userId' => 'Ub053xxxxxxxxxxxxxxxxxxxx691a5',
         'type' => 'user',
      )),
       'timestamp' => 1576064088143,
       'message' => 
      stdClass::__set_state(array(
         'type' => 'text',
         'id' => '11067136483887',  1兆もデータあるよ!!
         'text' => 'テスト送信',
      )),
    )),
  ),
   'destination' => 'Uc8cd39ebxxxxxxxxxx7c12c1488',
))
```php


さて、上記が生データになるのですが
これ$_POSTで取得しようとしても取れません。

PHPではjson のPOSTデータを$_POSTで取得する事ができない制約があります。
詳しくはこちらを。
https://qiita.com/hidepy/items/42220523cb2b3eb2c451

ということで、こうやって取得しました。

```php
$data = json_decode(file_get_contents('php://input'), true);

さて、本題ですが
このデータを活用して、できることを書いていこうと思います。

messageオブジェクトにあるidというデータはメッセージIDでユニークです。
このIDをキーに取得できるデータがあります。

それはコンテンツ系(画像、動画、音声、ファイル)のデータになります。
実はコンテンツ系は、リクエストデータとして飛んできません。
バイナリデータを毎回飛ばされても、コストも掛かるし
不必要なデータとなるのが大半なのでごもっともな仕様。

それらのデータを取得する時に必要な大事なキーが、先ほどのメッセージIDになります。

仕様書(https://developers.line.biz/ja/reference/messaging-api/#get-content)
のコードはこれです。分かりやすいですね。そう、この通りなのです。


$httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient('<channel access token>');
$bot = new \LINE\LINEBot($httpClient, ['channelSecret' => '<channel secret>']);
$response = $bot->getMessageContent('<messageId>');
if ($response->isSucceeded()) {
    $tempfile = tmpfile();
    fwrite($tempfile, $response->getRawBody());
} else {
    error_log($response->getHTTPStatus() . ' ' . $response->getRawBody());
}

注意事項として、有効期間があるみたいで
仕様書にこのような記載されています。
コンテンツ系が必要な場合は、直ぐ取得しておいた方が良さそうですね。
※メッセージが送信されてから一定期間後に、コンテンツは自動的に削除されます。コンテンツの保存期間は保証されません。

以下については、デベロップアカウント作成時に払出される値です。

<channel access token>
<channel secret>

上記のコードを応用して
S3に登録するのも容易にできます。

$result = $s3client->putObject(array(
    'Bucket'       => S3_BUCKET_NAME,
    'Key'          => $fileName,
    'Body'         => $response->getRawBody(),
    'ContentType'  => $mimeType,
    'ACL'          => 'public-read'
));

mimeTypeについてはmessageオブジェクトのidと同じ階層に存在する「type」の値を参照し

{
  "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
  "type": "message",
  "timestamp": 1462629479859,
  "source": {
    "type": "user",
    "userId": "U4af4980629..."
  },
  "message": {
    "id": "325708",
    "type": "file",
    "fileName": "file.txt",
    "fileSize": 2138
  }
}

以下の内容で拡張子を取得してくださいまし

  • 画像:image(拡張子:jpg)
  • 動画:video(拡張子:mp4)
  • 音声ファイル:audio(拡張子:m4a)
  • ファイル:file(上記の「fileName」の拡張子を取得)

送信されたファイル名については、typeがfileの時だけデータとして取得できますが
その他は取れないので、下記の内容を元に自分なりに解釈しました。
間違ってたらすみませんえん。
https://developers.line.biz/ja/reference/messaging-api/#image-message

ちなみに試して無いですが、仕様書を見ると
LIFFで送信した場合は各々ファイル名取れるみたいです。
LIFFの事はこちらを見てね
https://developers.line.biz/ja/reference/liff/

※その他、webhookのイベントは色々あるのでドキュメント見てね!
https://developers.line.biz/ja/reference/messaging-api/#webhook-event-objects

コンテンツ取得するところしか説明できてませんが
ご要望あれば、他の事もやろうかな。

今回はここまで!!

その他便利なツール

  • Botデザインのシミュレータ ※ログインしてないと見れないよ

・HTML形式
https://developers.line.biz/console/fx/

・GUIバリバリ
https://developers.line.biz/console/fx-beta/

最後に

明日は。フロントからサーバ側まで幅広い知識を持たれてる近藤ayaaaaa!さんになります!
アニメーション系の記事とのことで、私も興味津々です!
乞うご期待!!

プラコレではエンジニア、デザイナーも幅広く募集しています!!
プラコレプラコレWedding以外にもウェディングのメディアDressyfarnyなども運営しています。ぜひ見ていってもらえると嬉しいです!

閲覧サンキュ!

参考記事
https://qiita.com/hidepy/items/42220523cb2b3eb2c451
https://qiita.com/kakakaori830/items/52e52d969800de61ce28