【関連記事】
Topsyを使う方法はこちらをどうぞ!
リツイート数ランキングの作り方【Topsy編】
目次
概要
全体の流れ
記事のリツイート数・リンク・タイトルを取得(getTweet.php)(Twitter REST APIから取得) ↓
データをテキスト形式で保存(getTweet.php)
↓
ランキングデータ(data.php)
ランキングデータ(data.php)
↓
データとそれを元にWordPressからアイキャッチ画像を取得して表示(disp.php)
リツイート数(RT数)の取得には、Twitter REST API 1.1を使用します。また取得したリンクから、記事のタイトルやアイキャッチ画像を取得するのに、WordPressの関数を使います。
本当はランキングの表示部分はAjaxとかで作りたかったのですが、WordPressの関数を使いますのでphpで作成しています。逆にこのWordPressの関数を別の形にできれば、WordPress以外でも使えると思います。
後はお好みでcssでデザインして表示させれば完成です。jQueryなどで動きをつけるのも面白いです!
Twitter REST API 1.1を使う準備をする
Twitter Developersでアプリケーション登録する
REST API 1.0では必要ありませんでしたが、1.1からはAPIを使用するには、Twitter Developersにてアプリケーション登録を行い、OAuth認証用に下の4つのキーを発行をする必要があります。
Consumer key
Consumer secret
Access token
Access token secret
Twitter Developers
アプリケーションの登録を行います。上のTwitter Developersにて、右上の「Sign in」よりログインして下さい。通常のTwitterと一緒の「Username」「Password」を入力して下さい。
次に右上のアイコンにマウスオーバーすると表示されるメニューから、「My Applications」をクリックして下さい。
My applicationsの画面にて、右上の「Create a new application」をクリックして下さい。
Create an applicationの画面にて、アプリの「Name」「Description」「Website」、画像認証を入力して、「Create your Twitter application」をクリックして下さい。「Callback URL:」は今回は使用しませんので、空欄にして下さい。
これでアプリの登録が完了しました。「Consumer key」「Consumer secret」が現在表示されていると思います。「Access token」「Access token secret」については、下の方にある「Create my access token」をクリックすると生成されると思います。
この4つのキーは後ほどphpに入力しますので、メモしておいて下さい。
OAuth認証用ライブラリ
REST API 1.1のOAuth認証を簡単にしてくれるライブラリを準備します。
・ abraham / twitteroauth
「twitteroauth」というフォルダのなかに、「OAuth.php」と「twitteroauth.php」というファイルがありますので、ダウンロードして下さい。
今回作成するリツイートランキング用のファイルと一緒に使います。
これでREST API 1.1を使う準備は完了しました。
ソース
ファイル構成
data.php データを保存するファイルです。(初期は空です)[666]
disp.php 保存したデータを表示します。[755]
getTweet.php TwitterのAPIにアクセスしてリツイート数順にデータを整形・保存します。[755]
timestamp.php データの保存した日時を記録します。(初期は空です)[666]
流れとしては、2つの仕組みに分けています。
一つはgetTweet.phpで、Twitter REST APIにアクセスして、ツイートを取得、リツイート数順にソートしてdata.phpに保存します。もう一つは保存したデータをdisp.phpに読み込んで、リンクからタイトルとアイキャッチ画像を取得して表示する仕組みです。(このリンクからタイトルなど取得する際に、WordPressの関数を使うのでphpで作成しています)
WordPressのテンプレート内にファイル置く場合、ファイルのパスは絶対パスで書いた方が良さそうです。相対パスで書くとうまく動かない場合がありますので、注意して下さい。
データを記録するdata.phpとtimestamp.phpは、空のファイルを作成してアップロードして下さい。
詳細
【disp.php】
<?php
//RT数ランキングデータ読み込み
$fr = fopen ("data.php", "r") or die ("file open error...n");
$count = 0;
$twrank .= "<div class="twRankFlame" id="slider00">n"
. "<ul class="twRankGuide">n";
while (! feof ($fr)) {
$twdata = fgets ($fr, 4096);
$twdata = mb_convert_encoding ($twdata, "utf8", auto);
$twdata = ereg_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 , array(141,106)); // 記事IDからアイキャッチ画像を取得 WordPressテンプレート関数
// 表示用整形
$twrank .= "<li class="twRankCell">n"
. "<div class="tweets_flame"><p class="tweets">" . $tweets . "<br />RT</p></div>n"
. "<div class="photo_flame"><a href="" . $link . "">" . $thumbnail . "</a></div>n"
. "<div class="title_flame"><a href="" . $link . ""><span class="title" id="tw" . $count . "">" . $title . "</span></a></div>n"
. "</li>n";
$count ++;
}
$twrank .= "</ul>n"
. "</div>n";
fclose ($fr);
echo $twrank;
?>
【getTweet.php】
<?php
require_once('lib/twitteroauth.php');
// 初期設定
$count = 200; // 1回のツイート読み込み数
$disp_count = 10; // ツイート表示数
// api認証KEY
define('CONSUMER_KEY', '【Consumer key】');
define('CONSUMER_SECRET', '【Consumer secret】');
define('ACCESS_TOKEN', '【Access token】');
define('ACCESS_TOKEN_SECRET', '【Access token secret】');
// データファイルの更新間隔(sec)
$delay = 5*60;
$now = date("Y-m-d H:i:s");
$s_now = strtotime($now);
$rwt = fopen("timestamp.php","r") or die ("file open error...n");
$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/user_timeline.json','GET',array('count' => $count, 'include_entities' => 'true', 'user_id' => '【ユーザーID】'));
// 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など】/i",$expanded_url)){
$rtData .= $retweet_count . "," . $expanded_url . "n"; // ブログ記事に関係するツイートのみ追加
}
}
// タイムスタンプ更新
$wwt = fopen ("timestamp.php", "w") or die ("file open error...n");
flock ($wwt, LOCK_EX);
fwrite ($wwt, $now);
flock ($wwt, LOCK_UN);
fclose ($wwt);
// データファイル更新
$wd = fopen ("data.php", "w") or die ("file open error...n");
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];
}
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」を読み込んで下さい。<?php include ('【サーバーに合わせたパス】/getTweet.php'); ?>
<?php include ('【サーバーに合わせたパス】/disp.php'); ?>
これで設置は完了です。あとはcssで見た目を調整します。
「getTweet.php」の読み込む位置はどこでもいいです。ブログが読み込まれた際に、RT数ランキングのデータファイル「data.php」が一定時間で更新されます。
今後の課題
1.過去200件分のツイートのリツイート数しか対象にしていない。
2.非公式リツイートは数に入っていない。
上のサンプルは、自分の発言をAPIから取得しているのですが、最近のツイート200回分のリツイート数しかカウントしていません。APIからは1度に200件分のツイートをリクエスト可能で、それ以上となると複数回リクエストして、配列で結合すれば良さそうに思うのですが、どうにもうまく取得できませんでした。この辺りを改良出来ればと思っています。
次に非公式リツイートについては、APIが公式リツイートしかカウントしていないっぽいので、「記事のアドレス」+「RT」とかでAPIで検索とかでしょうか?それともデータを蓄積していくほうがいいのかな?うーーん。
まあ、暇な時にボチボチ考えてみます。
しかし、data.phpとtimestamp.phpともに何も書き込まれません。パーミッションは666で、ファイル構成も記事と同じにしております。
段階的にチェックする方法などございましたら、ご教示いただけませんでしょうか?
ファイルの指定を相対パスで指定して下さい。
同じフォルダに全てのファイルが入っているなら、
fopen(“timestamp.php”,”r”)
fopen (“timestamp.php”, “w”)
fopen (“data.php”, “w”)
という感じです。
いかがでしょうか?
返答が遅くなりましたが、試してみたのですが、変わらず書き込まれない状態のままでした。
他に、原因など考えられるポイントはありますでしょうか?
全てのファイルのパーミッションが問題ないのであれば、
なんでしょうね。
前にサーバーの容量が一杯で書き込めなかった例がありましたが……
サーバーのエラーログを確認するのが早いかもしれません。
エラーログを確認してみたいと思います!