【TwitterOauth】特定のつぶやきを取得してリツイート数順やランダム順にする【PHP】

公開日: : 最終更新日:2014/08/14 PHP, Twitter

スポンサーリンク

TwitterOauthを利用して特定のワードをつぶやいたデータを取得してそれをリツイート順なりに並び替えます。

つぶやき取得ソース

まずはつぶやきを取得するたたき台を紹介します。詳細はこちらの記事を参考にしてください。

<?php
//date関数を使う場合(設定していないとき書く)
date_default_timezone_set('Asia/Tokyo');
//twitteroauth.phpの読み込み
require_once dirname(__FILE__) . "/twitteroauth/twitteroauth.php";

// 「Consumer key」値
$ck = "**********";
// 「Consumer secret」値
$cs = "**********";
// 「Access Token」値
$at = "**********";
// 「Access Token Secret」値
$ats = "**********";


$to = new TwitterOAuth($ck, $cs, $at, $ats);

//検索ワード配列
$keyword_list = array("ジバニャン");
//最大検索数(100が最大値。デフォルトの15に加算される様子)
$countmax = 100;

//Twitterで検索するワード
//複数の場合はORかANDを使う
//「ポケモン OR パズドラ」のような形になればいい
$key = "";
$size = count($keyword_list);
for ($i = 0; $i < $size; $i++) {
    $keyword = $keyword_list[$i];
    $key .= $keyword;
    if ($i < $size - 1) {
        $key .= " AND ";
    }
}

//オプション設定
//countは最大検索数
$options = array(
    'q' => $key,
    'count' => $countmax, 
    'lang' => 'ja', 
    'result_type' => 'mixed'
    );

//検索
$json = $to->OAuthRequest(
        'https://api.twitter.com/1.1/search/tweets.json', 'GET', $options
);
$jset = json_decode($json, true);

//リツイートの多い順
function retweetsort($a, $b) {
    if ($a['retweet_count'] > $b['retweet_count']) {
        return false;
    }
    return true;
}
//お気に入り順
function favoritesort($a, $b) {
    if ($a['favorite_count'] > $b['favorite_count']) {
        return false;
    }
    return true;
}
//最新順
function timesort($a, $b) {
    if ($a['created_at'] > $b['created_at']) {
        return false;
    }
    return true;
}

//並び替え
//usort($jset['statuses'], "retweetsort");
//ランダム
//shuffle($jset['statuses']);


//tweetidを取得
foreach ($jset['statuses'] as $result) {
    //ローマ字の名前
    $screen_name = $result['user']['screen_name'];
    //ユーザーID(数字)
    $id = $result['user']['id'];
    //ユーザー名
    $name = $result['user']['name'];
    //ユーザーアイコン画像URL
    $link = $result['user']['profile_image_url'];
    //フォロワー数
    $follow = $result['user']['followers_count'];
    //フォロー数
    $follow = $result['user']['friends_count'];
    //ユーザーのお気に入り数
    $userfavoritecount = $result['user']['favourites_count'];    
    //お気に入り数
    $favoritecount = $result['favorite_count'];    
    //該当ツイート
    $content = $result['text'];
    //リツイート数
    $retweetcount = $result['retweet_count'];
    //更新日
    $updated = $result['created_at'];
    $time = date("Y-m-d H:i:s", strtotime($updated));

    //不明なものはvar_dumpで見ればいい
//    echo "<pre>";
//    var_dump($result);
//    echo "</pre>";
    
    echo "リツイート数:".$retweetcount." 時間:".$time."<br>";
    echo "<img src='" . $link . "''>" . " | " . $screen_name . " | " . $id . " | " . $name . " | " . $content . " | " . $time . " | リツイート数:" . $retweetcount . " | お気に入り数:".$favoritecount."<br>";
}
?>

この例では「ジバニャン」というワードについてつぶやき検索をかけています。
これをもとに並び替える方法について検討します。

並び替えたデータを取得する

並び替える方法としては元々取得するデータを並び替えられた状態でもってこれれば一番いいのですが、APIのドキュメント(https://dev.twitter.com/docs/api/1.1/get/search/tweets)によると、並び替えに関してはoptionのresult_type(途中の$optionsの配列の部分)をrecent変更すれば新着順はできるようですが、リツイート順などはちょっとわかりませんでした。(デフォルトではmixedになっており、人気順と新着順が混ざっているようでした)

result_type

* mixed: Include both popular and real time results in the response.
* recent: return only the most recent results in the response
* popular: return only the most popular results in the response.

「popular」が一番の人気順となっていてもっとも人気のツイート群のみを取得してくるので、取得件数は最大値よりも少なくなっている場合が多いと思います。その他の「recent」、「mixed」に関しては指定の件数だけ取得するようになっており、デフォルトでは「mixed」になっています。
単純に時間順で取得したい場合はここの値をrecentに変更します。

$options = array(
    'q' => $key,
    'count' => $countmax, 
    'lang' => 'ja', 
    'result_type' => 'recent' //←ここを変更する
    );

取得したデータをソートする

取得したつぶやきをソートするのが一番妥当なのではないかと思います。特定の要素を指定してソートさせたい場合にはusortを使います。

該当部分を抜粋すると次の部分になります

//リツイートの多い順
function retweetsort($a, $b) {
    if ($a['retweet_count'] > $b['retweet_count']) {
        return false;
    }
    return true;
}
//お気に入り順
function favoritesort($a, $b) {
    if ($a['favorite_count'] > $b['favorite_count']) {
        return false;
    }
    return true;
}
//最新順
function timesort($a, $b) {
    if ($a['created_at'] > $b['created_at']) {
        return false;
    }
    return true;
}

//並び替え
usort($jset['statuses'], "retweetsort");
//ランダム
//shuffle($jset['statuses']);

usortを使う場合引数としては並び替える配列と並び替えの方法を記述した関数を文字列としたものが入ります。なので今回に関しては、第一引数は「$jset['statuses']」となり、第2引数はここでは自分で書いた「"retweetsort"」や「"favoritesort"」、「"timesort"」という関数名の文字列となります。
このretweetsort関数ではリツイートの多い順にソートし、favoritesort関数はお気に入り数順、timesort関数では最新順にソートしています。

そして、次にランダム順ですがこれは単純に「shuffle」関数に配列を放り込むだけで実現できます。

デモ

$countmaxを10件にしてリツイート順にしてソートさせました。出力はリツイート数とお気に入り数とつぶやいた時間だけ表示させています。

リツイート数:1257 お気に入り数:645 時間:2014-07-19 10:40:49
リツイート数:1122 お気に入り数:493 時間:2014-07-18 12:01:38
リツイート数:527 お気に入り数:1038 時間:2014-07-22 09:35:55
リツイート数:520 お気に入り数:1055 時間:2014-07-22 14:28:04
リツイート数:200 お気に入り数:100 時間:2014-07-18 13:15:34
リツイート数:197 お気に入り数:483 時間:2014-07-19 01:09:46
リツイート数:185 お気に入り数:119 時間:2014-07-15 13:13:45
リツイート数:169 お気に入り数:168 時間:2014-07-20 09:41:56
リツイート数:136 お気に入り数:18 時間:2014-07-15 20:27:52
リツイート数:113 お気に入り数:200 時間:2014-07-19 11:14:39
リツイート数:102 お気に入り数:17 時間:2014-07-21 23:44:45
リツイート数:33 お気に入り数:11 時間:2014-07-21 00:02:29
リツイート数:30 お気に入り数:37 時間:2014-07-22 07:46:06
リツイート数:24 お気に入り数:0 時間:2014-07-22 17:19:00
リツイート数:24 お気に入り数:22 時間:2014-07-22 16:33:00
リツイート数:18 お気に入り数:10 時間:2014-07-22 11:36:10
リツイート数:8 お気に入り数:0 時間:2014-07-22 17:19:29
リツイート数:8 お気に入り数:0 時間:2014-07-22 17:19:57
リツイート数:1 お気に入り数:0 時間:2014-07-22 17:20:24
リツイート数:0 お気に入り数:0 時間:2014-07-22 17:19:24
リツイート数:0 お気に入り数:0 時間:2014-07-22 17:19:39
リツイート数:0 お気に入り数:0 時間:2014-07-22 17:19:44
リツイート数:0 お気に入り数:0 時間:2014-07-22 17:19:17
リツイート数:0 お気に入り数:0 時間:2014-07-22 17:20:37
リツイート数:0 お気に入り数:0 時間:2014-07-22 17:18:39

最後に

ソースはあくまで叩き台なので自由に関数化やクラス化して使ってください。

スポンサーリンク
Amazon
  • このエントリーをはてなブックマークに追加

関連記事

任意URLのTweetボタンを複数設置する

TwitterのTweetボタンをWebサイトやブログに複数設置する方法です。複数設置するということ

記事を読む

【twitteroauth】TwitterAPIで検索して特定のつぶやきをしたユーザーを取得する方法【PHP】

twitteroauthを利用してワード検索して特定のつぶやきをしたユーザーを取得する方法です。tw

記事を読む

TwitterAPIでデベロッパー登録しようとすると携帯情報を追加しろと出る件について

TwitterAPIのデベロッパー登録ページ(https://dev.twitter.com)でアプ

記事を読む

ニコニコ動画のURLリンクから外部プレイヤーのスクリプトに正規表現で置換する

ニコニコ動画の動画のアドレスを抽出して外部プレイヤー貼りつけソースのスクリプトに変換するソースです。

記事を読む

【PHP】usortのfunctionでCannot redeclare(再定義)される

初心者なのでusortがいいものかどうなのかよくわからないのですが、usortの関数定義をするとたま

記事を読む

スクレイピングをサポートしてくれるAPI【kimono】

kimonoというスクレイピングをAPI化してくれるという素晴らしいサービスがあります。

記事を読む

PHPでページリロードをしようと思ったができなかったので

header("Location: ".$_SERVER); とすればページをリロードでき

記事を読む

【CakePHP3】無関係な複数テーブルのデータを一つのコントローラで扱う

CakePHP3で一つのコントローラないでお互い独立したテーブルを扱うには単純にTableRegis

記事を読む

【PHP・MySQL】Fatal error: Class ‘mysqli’ not found

Fatal error: Class 'mysqli' not found このエラーはmys

記事を読む

【PHP】headerでContent-Typeを指定したのに効かない場合の対処法

PHPでサイトマップを作ろうと思い、XML形式のファイルを出力しようとしてheaderを指定したのに

記事を読む

Windowsユーザが初めてMacBookを購入したときの注意点や感想

最近12インチのMacBookを購入しました。今までWindowsしか

Redmine3.2をUbuntu14.04にインストールして躓いた所についてメモ

はじめに Ubuntu14.04 ServerにRedmine3.2

UWSCを使ったソフト自動立ち上げ【SoftEther VPN Server】

やりたいこと 最近SoftEtherという筑波大学発のベンチャー企業

【PHP】headerでContent-Typeを指定したのに効かない場合の対処法

PHPでサイトマップを作ろうと思い、XML形式のファイルを出力しようと

スマホ向け幅固定サイトの回転時の幅対応方法

幅固定サイトでのスマホ回転時Webサイトの横幅を合わせる方法のメモ。

【PHP】特定のURLからそのAtomやRSSのフィードを抽出する方法

特定のURLからRSSやATOMのフィードを抽出する方法をメモ。 流

フィード抽出ツール(RSS1.0、RSS2.0、atom)

任意URL サイト名 サイトURL RSS1.0

→もっと見る

  • Author : ががんぼ
    プログラミングやWeb関係で気付いたことについてメモしていく予定。だいたいが備忘録ですが、自分でサンプルを作って動かしてみたりしています。
PAGE TOP ↑