改:リツイート数ランキングの作り方【Twitter REST API 1.1編】
オリジナルはこちらです。
リツイート数ランキングの作り方【Twitter REST API 1.1編】 – ウェブソク
WordPress利用でのリツイート数ランキングを出力する便利なコードです。コピペするも動かないのでおかしいなぁと、自分のつたない知識で書きなおしているうちに、ちょこちょこと好みなってきてしまったので、公開したほうが良いのかな…ということで公開です。getTweet.php と disp.php の2ファイルが対象で、その他の設定はウェブソクさんと同じです。
- HTML出力部分でシングル・ダブルクォートの混在と¥が表示されてないのを補足
- data.php の最後に空行しか入らない、よくわからないので暫定的に処理
- APIを user_timeline.json ではなく retweets_of_me.json に変更
- パスを dirname(__FILE__) で管理
- get_the_post_thumbnail を数値指定から thumbnail 指定に変更
getTweet.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
<?php // 2013-03-19. ウェブソク http://news.7zz.jp/js/3233.html // 2013-12-09. みやなび http://company.miyanavi.net/archives/1343 $z_dirname = dirname(__FILE__); // disp.php でも利用 require_once($z_dirname . '/lib/twitteroauth.php'); // 初期設定 $count = 200; // タイムライン ツイート読み込み数 $disp_count = 6; // ツイート表示数。実際に表示される数は、ここで設定した数よりも-1されます(本ファイル後述の rtrim で削除) $delay = 5*60; // データファイルの更新間隔(sec) $twitter_userid = '【ユーザーID】'; // api認証KEY define('CONSUMER_KEY', '【Consumer key】'); define('CONSUMER_SECRET', '【Consumer secret】'); define('ACCESS_TOKEN', '【Access token】'); define('ACCESS_TOKEN_SECRET', '【Access token secret】'); $now = date("Y-m-d H:i:s"); $s_now = strtotime($now); $rwt = fopen($z_dirname . '/timestamp.php','r') or die ('file open error... timestamp.php read'); $writetime = fgets($rwt); $s_writetime = strtotime($writetime); fclose($rwt); // タイムスタンプが空、または更新間隔以上の時間経過で書き込み if ($writetime == "" || $delay < ($s_now - $s_writetime)){ // tweet取得 $twObj = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET); $Request = $twObj -> OAuthRequest( 'https://api.twitter.com/1.1/statuses/retweets_of_me.json', 'GET', array( 'count' => $count, 'include_entities' => 'true', 'user_id' => $twitter_userid) ); // jsonデータ整形 $Req = json_decode($Request, true); // 配列に格納 $Req = sortArray($Req, 'retweet_count'); // リツイート数でソート $Req = cutArray($Req, $disp_count); // 表示する数を調整 for($i = 0; $i < count($Req); $i++){ $retweet_count = $Req[$i]['retweet_count']; // リツイート数 $expanded_url = $Req[$i]['entities']['urls'][0]['expanded_url']; if (preg_match("/【ブログのURL ※ example.com など】/i",$expanded_url)){ $rtData .= $retweet_count . "," . $expanded_url . "\n"; // ブログ記事に関係するツイートのみ追加 } } $rtData = rtrim($rtData, "\n"); // 最後の連続改行を削除 // タイムスタンプ更新 $wwt = fopen ($z_dirname . '/timestamp.php', 'w') or die ('file open error... timestamp.php write'); flock ($wwt, LOCK_EX); fwrite ($wwt, $now); flock ($wwt, LOCK_UN); fclose ($wwt); // データファイル更新 $wd = fopen ($z_dirname . '/data.php', 'w') or die ('file open error... data.php write'); flock ($wd, LOCK_EX); fwrite ($wd, $rtData); flock ($wd, LOCK_UN); fclose ($wd); } function sortArray($array, $sort_key_name) { // 要素を並べ替え foreach($array as $key => $row){ $sort[$key] = $row[$sort_key_name]; } //unset($row[$sort_key_name]); array_multisort($sort, SORT_DESC, $array); return $array; } function cutArray($array, $length){ // 要素抜き出す $return_array = array_splice($array, 0, $length-1); return $return_array; } ?> |
disp.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php //RT数ランキングデータ読み込み $fr = fopen ($z_dirname . '/data.php', 'r') or die ('file open error... data.php'); $count = 0; $twrank .= "<div class='twRankFlame' id='slider00'>\n" . "<ol class='twRankGuide'>\n"; while (! feof ($fr)) { $twdata = fgets ($fr, 4096); $twdata = mb_convert_encoding ($twdata, "utf8", auto); $twdata = preg_replace("/\n/", "", $twdata); // 正規表現で改行を削除 list($tweets, $link) = explode(",", $twdata); $postid = url_to_postid($link); // 記事リンクから記事IDを取得 WordPressテンプレート関数 $title = get_the_title($postid); // 記事IDから記事タイトルを取得 WordPressテンプレート関数 $thumbnail = get_the_post_thumbnail($postid , 'thumbnail'); // 記事IDからアイキャッチ画像を取得 WordPressテンプレート関数 // 表示用整形 $twrank .= "<li class='twRankCell' id='tw" . $count . "'>\n" . "<div class='tweets_flame'>" . $tweets . "<span>RT</span></div>\n" . "<div class='photo_flame'><a href='" . $link . "'>" . $thumbnail . "</a></div>\n" . "<div class='title_flame'><a href='" . $link . "'>" . $title . "</a></div>\n" . "</li>\n"; $count ++; } $twrank .= "</ol>\n" . "</div>\n"; fclose ($fr); echo $twrank; ?> |
【】でくくられている箇所は書換必須です。その後適当なディレクトリに放り込んでウェブソクさんと同じ設定を行えば動く・・・と思います、多分。
よくわかってないんで、変なところがあれば教えてもらえると嬉しいです。Twitterが取得できないときとかにエラーログ吐くようにしたかったんですけど、ちょっと疲れちゃったのでまた追記or書き直しするかもしれないです。