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

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

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

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

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

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

記事内容

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

まずは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',
))

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

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

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

$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/
FireShot Capture 725 - Flex Message Simulator - developers.line.biz.png

・GUIバリバリ
https://developers.line.biz/console/fx-beta/
FireShot Capture 724 - Flex Message Simulator [β] - developers.line.biz.png

最後に

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

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

閲覧サンキュ!

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account