ã¯ããã« æ°å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ã€ãããŸãã ãŸãïŒã€ç®ã¯ãã€ãŒãURLã§ããããã¯ãã€ãŒããªããžã§ã¯ãã®äžã«çŽæ¥èšèŒãããŠããªãã®ã§ããã®ä»ã®æ
å ±ãçµåããŠäœæããå¿
èŠããããŸãã ïŒã€ç®ã¯ç»åURLã§ããç»åã®URLã¯ïŒçš®é¡ããã 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/