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

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

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

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

ただ、基本的な仕様はLINEが提供してる仕様書（<a href="https://developers.line.biz/ja/reference/messaging-api/">こちら</a>）が分かりやすく
また、分かりやすい記事も色々あるので
自分は少しコアな部分を書こうかなって思います。

個人的には<a href="https://qiita.com/kakakaori830/items/52e52d969800de61ce28">こちら</a>の記事で凄い詳しく書かれています。


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


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

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

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

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

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

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

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

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

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

```php:結果

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)
のコードはこれです。分かりやすいですね。そう、この通りなのです。

```php

$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に登録するのも容易にできます。

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

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


```json
{
  "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/
![FireShot Capture 725 - Flex Message Simulator - developers.line.biz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133672/f4a56c77-f096-7be6-6deb-9a7475cbfd18.png)


・GUIバリバリ
https://developers.line.biz/console/fx-beta/
![FireShot Capture 724 - Flex Message Simulator [β] - developers.line.biz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133672/470cae81-be5e-f101-9aea-70d5384dca8d.png)


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

プラコレではエンジニア、デザイナーも幅広く募集しています！！
<a href="https://pla-cole.co">プラコレ</a>は<a href="https://pla-cole.wedding/">プラコレWedding</a>以外にもウェディングのメディア<a href="https://dressy.pla-cole.wedding/">Dressy</a>や<a href="https://www.farny.jp/">farny</a>なども運営しています。ぜひ見ていってもらえると嬉しいです！

**閲覧サンキュ！**

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