はじめに 新卒2年目エンジニアのkasuke18と申します。 今回はLINEでメッセージを送信することで Twitter 検索を行うLINE Bot を作成してみましたので、作成の流れや実際のコードを記載します。使用言語は PHP です。 もくじ はじめに 構成 必要なもの 実装例 メッセージの取得 Twitterで検索 検索結果のパース LINEに送信 おわりに 参考文献 構成 今回はLINEの API と Twitter の API を利用します。また、LINEで送信されたテキストに対して処理を行うWebhook スクリプト を設置する SSL 対応のサーバが必要なため、HEROKUを使用しています。 イメージとしては以下のようになります。 必要なもの LINE Messaging API Twitter REST API HEROKU Twitter 連携パッケージ mpyw/cowitter API を利用するまでの流れについては、LINE Messaging API は 公式サイト に詳しい説明が記載されています。 また、 Twitter REST API は公式サイト上のどこに記載されているか発見できませんでしたが、検索すればそのあたりのことが書かれている導入記事が数多くあるので省略します。 HEROKUの使用方法については当ブログに記事がありますので、ぜひそちらをご参照ください。 実装例 メッセージの取得 まずはLINEから送信されたメッセージテキストを受け取る部分です。 LINE Platformから送信されるのは JSON で、以下のような形式となっています。 { " events ": [ { " type ": " message ", " replyToken ": " ********** ", " source ": { " groupId ": " ********** ", " userId ": " ********** ", " type ": " group " } , " timestamp ": 1529822351422 , " message ": { " type ": " text ", " id ": " ********** ", " text ": " 送信メッセージ " } } ] } 上記の JSON をもとにパースして送信されたテキスト情報を取得するコードが以下となります。送信される形式が JSON なので、 $_POST ではデータが取得できないことに注意が必要です。 <?php $ json = json_decode ( file_get_contents ( 'php://input' ) , true ) ; $ message = $ json [ 'events' ][ 0 ][ 'message' ] ; $ messageText = $ message [ 'text' ] ; Twitter で検索 次に受信したテキストをキーワードとして、 Twitter で検索します。 Twitter の連携については自前でやってしまうのもありですが、 面倒なので Twitter 連携パッケージ mpyw/cowitter を使用しています。 <?php $ client = new Client ([ $ consumerKey , $ consumerSecret , $ twitterAccessToken , $ twitterAccessTokenSecret ]) ; $ tweetsParams = [ 'q' => $ q . ' -rt' , 'count' => '10' , 'result_type' => 'recent' , "include_entities" => true ] ; $ tweets = $ client -> get ( 'search/tweets' , $ tweetsParams ) -> statuses; $tweetsParams で検索条件を指定します。 q は検索キーワードで、検索 演算子 も利用できます。今回は リツイート を排除したいので、検索 演算子 -rt を使用しています。 count はそのまま検索結果の取得件数で今回は10件、 result_type は取得するツイートの種類で recent とすることで最新のツイートを取得します。 最後の include_entities は少し特殊で、取得したツイートオブジェクトにentitiesプロパティを含めるかどうかを指定します。entitiesプロパティとはツイート本文を拡張するエンティティで、画像や動画などの本文に付け足すための情報が格納されています。今回はツイートに付随する画像のURLを取得するために使用しています。 他にも設定可能なプロパティがありますが、今回は不要なので省略します。必要に応じて こちら をご参照ください。 検索結果のパース 検索結果から必要な情報を抜き出すときにも、 mpyw/cowitter が当然ながら活躍してくれます。 今回必要とする情報は ツイート本文 ・ ユーザ名 ・ ツイートURL ・ 画像URL です。それぞれの情報は以下のようにして取得します。 <?php foreach ( $ tweets as $ tweet ){ $ text = $ tweet -> text; $ name = $ tweet -> user -> name ; $ url = 'https://mobile.twitter.com/' . $ tweet -> user -> screen_name . '/statuses/' . $ tweet -> id_str; $ img = $ tweet -> extended_entities -> media [ 0 ] -> media_url_https; } ここで注意する点が2つあります。 まず1つ目はツイートURLです。これはツイートオブジェクトの中に直接記載されていないので、その他の情報を結合して作成する必要があります。 2つ目は画像URLです。画像のURLは2種類あり、 media_url と media_url_https があります。見ての通りHTTPか HTTPS かが違うだけなのですが、LINEの API が HTTPS でないとダメなので、 media_url_https のURLを取得する必要があります。 LINEに送信 最後にLINEに送信します。単に動かすだけならプレーンテキストでもよいのですが、今回は少し見た目にこだわって Flex Message という形式にしてみます。 Flex Message では複雑なレイアウトを自由に作成可能です。今回は以下のような見た目にしました。ほかにどのようなレイアウトにできるのかは、サンプルなどもありますので 公式ページ をご参照ください。 以下が今回の見た目を作成するのに必要な情報を設定した配列です。この配列を json_encode して送信します。 function toggleFold(){ if(document.getElementById('fold').style.display=='none'){ document.getElementById('fold').style.display='block'; document.getElementById('link').text='◀クリックで閉じる'; } else { document.getElementById('fold').style.display='none'; document.getElementById('link').text='▶クリックで開く'; } } ▶クリックで開く <?php $ messageData = [ "to" => $ groupId , "messages" => [ [ "type" => "flex" , "altText" => $ altText , "contents" => [ "type" => "bubble" , "hero" => [ "type" => "image" , "url" => $ img , "size" => "full" , "aspectRatio" => "20:13" , "aspectMode" => "cover" , "action" => [ "type" => "uri" , "uri" => $ img ] ] , "body" => [ "type" => "box" , "layout" => "vertical" , "contents" => [ [ "type" => "text" , "text" => $ name , "weight" => "bold" , "size" => "xl" ] , [ "type" => "box" , "layout" => "vertical" , "margin" => "lg" , "spacing" => "sm" , "contents" => [ [ "type" => "box" , "layout" => "baseline" , "spacing" => "sm" , "contents" => [ [ "type" => "text" , "text" => $ text , "wrap" => true , "color" => "#666666" , "size" => "sm" ] ] ] ] ] ] ] , "footer" => [ "type" => "box" , "layout" => "vertical" , "spacing" => "sm" , "contents" => [ [ "type" => "button" , "style" => "link" , "height" => "sm" , "action" => [ "type" => "uri" , "label" => "See Tweet" , "uri" => $ url ] ] ] , "flex" => 0 ] ] ] ] ] ; そして実際に作成したメッセージを送信する部分のコードが以下となります。 改めて説明するまでもなく、 curl をたたいて終わりです。 <?php $ ch = curl_init ( "https://api.line.me/v2/bot/message/push" ) ; curl_setopt ( $ ch , CURLOPT_POST, true ) ; curl_setopt ( $ ch , CURLOPT_CUSTOMREQUEST, 'POST' ) ; curl_setopt ( $ ch , CURLOPT_RETURNTRANSFER, true ) ; curl_setopt ( $ ch , CURLOPT_POSTFIELDS, json_encode ( $ postData )) ; curl_setopt ( $ ch , CURLOPT_HTTPHEADER, array ( 'Content-Type: application/json; charser=UTF-8' , 'Authorization: Bearer ' . $ accessToken )) ; $ result = curl_exec ( $ ch ) ; curl_close ( $ ch ) ; おわりに 特に需要はないでしょうが、今回はLINEから Twitter 検索をしてみました。単に API をたたくだけで多くのことができます。今回はテキストメッセージを検索するということしかしていませんが、もっと面白いものがあれば機能拡張という形で取り込んで行きたいです。 最後までご覧いただきありがとうございます。 参考文献 LINE developers: Messaging API を利用するには https://developers.line.me/ja/docs/messaging-api/getting-started/ Docs — Twitter Developers https://developer.twitter.com/en/docs.html Heroku Dev Center https://devcenter.heroku.com/ GitHub - mpyw/cowitter: Asynchronous Twitter client compatible with mpyw/co Generator-based flows. https://github.com/mpyw/cowitter GET search/tweets - ツイートを検索する https://syncer.jp/Web/API/Twitter/REST_API/GET/search/tweets/ LINE developers: Flex Messageの要素 https://developers.line.me/ja/docs/messaging-api/flex-message-elements/