業務でTwitterAPIを使う機会があったのでメモ程度に記載
twitter API ver1.1を使用
apiで取得したデータをjsonファイルでサーバ内に格納し、その内容を表示するようにしてます。
そんなに頻繁に見られるものでもなかったのでapi制限とか無いと思うんですけど、用心に越した事はないと思ってそうしてますw
取得するタイミングはアクセス毎に現在時間とファイルの更新時間を比べて、1時間以上経過していたらapiで取得するようにしてます。
取得タイミングは任意で変更できるようにしました。
下準備
アプリケーションの登録
詳しくは以下のサイトを参考に
https://syncer.jp/Web/API/Twitter/REST_API/#application
アクセストークンの取得
詳しくは以下のサイトを参考に
https://syncer.jp/Web/API/Twitter/REST_API/#access_token
TwitterOAuth認証
これをダウンロードする
https://github.com/abraham/twitteroauth
それをダウンロード!!
一部、上手く動かないような情報もありましたが僕の環境では問題ありませんでした。
そんな時はこちらをご参考に
https://qiita.com/yokoh9/items/760e432ebd39040d5a0f#twitteroauth
取得するスクリプト
<?php
// jsonのパス
define( "FILE_NAME", "XXXXXXXXXXXXX.json" );
$filename = 'XXXXXXXXXXXXX.json';
// jsonを生成するタイミング(1時間)
$check_minute = 60 * 60;
// ファイルの存在を確認
if (file_exists(FILE_NAME)) {
$file_time = filemtime(FILE_NAME);
$cur_time = time();
$dif_time = $cur_time - $file_time;
if ($check_minute < $dif_time) {
get_tweet();
}
} else {
get_tweet();
}
function get_tweet() {
//twitter認証
$consumerKey = "XXXXXXXXXXXXX";
$consumerSecret = "XXXXXXXXXXXXX";
$accessToken = "XXXXXXXXXXXXX";
$accessTokenSecret = "XXXXXXXXXXXXX";
//TwitterOAuth認証
require_once('twitteroauth/twitterOAuth.php');
$twObj = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
//取得するときのオプションを設定
$options = array(
"count" => 100, //取得するツイート数
);
$tlRequest=$twObj->OAuthRequest(
"https://api.twitter.com/1.1/statuses/home_timeline.json",
"GET",
$options
);
//オープン
$fp = fopen(FILE_NAME,'w+');
//jsonファイルを上書き
fwrite($fp, $tlRequest);
//クローズ
fclose($fp);
}
?>
取得する時は特に整形とかせずにそのまま保存しています。
本当は必要な情報だけパースするのが良いんだろうけど、パフォーマンスにそこまで影響なかったのでそのままです。
上記ではエンドポイントをhome_timeline
にしています。
他にもいろいろあるみたいです。
https://syncer.jp/Web/API/Twitter/REST_API/GET/statuses/home_timeline/
$tlRequest=$twObj->OAuthRequest(
"https://api.twitter.com/1.1/statuses/home_timeline.json",
"GET",
$options
);
表示するスクリプト
<?php
// ファイルからjsonを読み込み
$json = file_get_contents("XXXXXXXXXXXXX.json");
// 文字化けするかもしれないのでUTF-8に変換
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
// オブジェクト毎にパース
// trueを付けると連想配列として分解して格納してくれます。
$oObj = json_decode($json, true);
// パースに失敗した時は処理終了
if ($oObj === NULL) {
echo 'エラー';
return;
}
// 表示
if (!empty($oObj)) {
foreach($oObj as $key => $val){
$name = $oObj[$key]['user']['name'];
$screen_name = $oObj[$key]['user']['screen_name'];
$text = $oObj[$key]['text'];
// パターン
$pattern = '/((?:https?|ftp):\/\/[-_.!~*\'()a-zA-Z0-9;\/?:@&=+$,%#]+)/u';
// 置換後の文字列
$replacement = '<a href="\1" target="_blank">\1</a>';
// 置換
$text = preg_replace($pattern,$replacement,$text);
echo'<div class="twitter_box">';
if (empty($oObj[$key]['extended_entities']['media'][0]['media_url'])) { // Twitterでアップした画像がなければ
} else { // Twitterでアップした画像があれば
echo '<div style="width:100%; height:100%; margin:0 auto; background:url('.$oObj[$key]['extended_entities']['media'][0]['media_url'].') no-repeat center top; background-size: cover;"></div>';
echo '<img src="'.$oObj[$key]['extended_entities']['media'][0]['media_url'].'" alt="'.$oObj[$key]['extended_entities']['media'][0]['media_url'].'" width="100%">';
}
echo'<dl>';
echo'<dt><a href="https://twitter.com/'.$screen_name.'" target="_blank">'.$name.'</a></dt>';
echo'<dd>'.$text.'</dd>';
echo'</dl>';
echo'</div>';
}
}
?>
サンプルとしてgithubにソースを公開しましたのでご自由にお使いください。
https://github.com/t-niiru/get-tweet