【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
  • このエントリーをはてなブックマークに追加

関連記事

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

特定のURLからRSSやATOMのフィードを抽出する方法をメモ。 流れとしては指定のWebページH

記事を読む

TwitterAPIの仕様変更【2014年1月】

TwitterAPIの仕様が2014/1/15未明から変更されたようで一部のJanetter

記事を読む

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

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

記事を読む

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

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

記事を読む

ソーシャルボタンをブログやサイトに設置する方法

TwitterやFacebookなどのソーシャルボタンを付ける方法です。ソーシャルボタンを付けるには

記事を読む

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

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

記事を読む

【Laravel5】既存のDBからデータを取得して表示する

はじめに 今まで作ったWebサイトをLaravel5で見れるようにしたのでその時のメモです。

記事を読む

【PHP】Twitterのツイート数やはてぶ数を取得する

指定URLのTweet数の取得 Twitterでツイート数を取得するには指定のURLにアクセスする

記事を読む

【PHP】file_get_contentsでリンク元などのヘッダ情報を変更する

file_get_contentsで他サイトの情報を読み取る際などでリンク元を明記したい場合は以下の

記事を読む

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

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

記事を読む

【Laravel5】既存のDBからデータを取得して表示する

はじめに 今まで作ったWebサイトをLaravel5で見れるようにし

【C++/OpenCV】cv::Matの画像にインパルスノイズを付加する

OpenCVで画像にノイズを付け足したいと思って調べたところ、Pyth

Intel Corei7-7700TでHTC Viveの動作確認

はじめに HTC ViveというVRヘッドセットで遊んでみたのでその

【Python】フォルダ内のカッコ付き数字ファイルを一括でリネームするスクリプト

はじめに タイトルどおりなのですが、指定フォルダ内のファイルのファイ

OpenCV3.1のTracking APIでトラッキングを試す

はじめに 先日OpenCV3.1をopencv_contrib付きで

パソコンを複数台使う際便利なツール

はじめに 先日、機械学習用にGPUを積んだBTOパソコンを購入しまし

OpenCV3.1をopencv_contrib付きでVisual Studio2013でビルドしてインストールする

はじめに OpenCV3.1でトラッキングがしたいと思いインストーラ

→もっと見る

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