Twitter API 1.0から1.1 検索結果取得での変更点

実際のソースはすでに修正しておきました。
下のページのソースをそのままコピペすればすぐに使えるはずです。

PHPでTwitter API 1.1 ツイート検索結果を取得 その2

API 1.1移行を発表してから、ずいぶんとタイムラグがあってのTwitter側での対応となりました。
ソース自体は作っておいたのですが、2013年3月時点でもまだ動きませんでしたからね、どうなることやらって感じでした。

新仕様どおりに1月の時点で作っておいたソースが6月14日の時点で動作せず、右往左往している様子は昨日の記事で見ることができます。

この2つはわかっていたことですが要修正で変わらずでした。
修正しておきましょう。

(1)リクエストURLを
https://api.twitter.com/1.1/search/tweets.json に変更
(2)パラメータのrppをcountに変更

そんなこったろうとは思っていたのですが、やはり仕様で他に変更が出ていました。

まず検索結果取得で「page」が使えなくなってますね。
代替案はあるのかもしれませんが、正直自分は「もうイイヤ・・・」って感じです。
Twitter側が「ウィジェットを使え」と言っていますし、単純に検索結果を表示したいのならウィジェットで十分なので。

Twitter ウィジェットの付け方
(検索結果の表示もできます)

今まで1ページ100ツイートを15ページまで、1度に1500ツイートは取得できたと思うのですが、API 1.1からは1回のアクセスにつき100ツイートまでとなっています。
これは以前から発表されていたのかな。。。

1時間に180アクセスまでとかどこかに書いてあったような気がしますが、オフィシャルサイトで確認したわけではないので何とも言えないです、スミマセン。

イヤらしい変更点は、jsonで取得するときキーの名前が変わってました。
ソースで言うところの、この部分↓

//オブジェクトを展開
$oObj=$oObj->{'results'};

この「results」が「statuses」に変更されてました。
それとscreen_name、user_name、profile_image_urlあたりも少し書き方が変わったので、実際のソースでご確認ください。

それからアナウンスどおり、アクセストークンと秘密鍵を入れないと取得できなくなっていたので入れました。
ディベロッパー向けサイトのマイページから、簡単に取得できるようになっています。

My applications
https://dev.twitter.com/apps

twitteroauthが何年かぶりにバージョンアップしたので、ダウンロードし直しておいたほうがいいと思います。

twitteroauth
https://github.com/abraham/twitteroauth

以上を修正したらいつものようにツイートを取得できるようになりました。
ただし取得ツイート数は激減ですが。。。

これで意味のないツイートばかりするbotが減ってくれれば、自分はウィジェットに変更したいです。

2013/08/19 追記:
アクセストークンを無効にされてしまい、ツイートの取得ができなくなってしまいました。
こちらで記事にしています。
 

PHP:Twitter API 規約におけるレイアウト

API 1.1でいろいろと制約が多くなったTwitterですが、1.0以前からレイアウトのガイドラインはあったみたいです。

それが2013年3月5日にmustになると。

こちらもぜひ参照してください。
PHPでTwitter API 1.1 ツイート検索結果を取得 その2

開発時にいろいろ探していて印象に残っていた情報を書いておきますが、情報源をメモっていないので気になった部分は公式の規約で確かめてみてください。

規約によると、TLのそれぞれのパーツは以下のように配置しないといけません。

・プロフィール画像を左に必ず置いて、プロフィールにリンクすること。
・プロフィール画像の右側に「名前@ユーザー名」を1行か2行で入れてリンクすること。
・時間は右上に、24時間以内なら相対時間で表示すること。そして各ツイートにリンクすること。
・本文の下に「返信」「リツート」「お気に入りに登録」アイコンを置いてリンクすること。
 (指定のアイコンは下を参照のこと)
・他、余計なものは入れないこと。 ←ここでひっかかるサイトが多いはず。うちもですが。
・Twitterロゴを必ず載せて、Twitterにリンクすること。

うちの場合、そもそも表示の順番が逆(昇順)なのでアウトだと思います。
3.5までには直します。
 →すみません。どのサイトも全然規約を守っていないので何もしていません(3/9現在)

それとうちの場合フォーマットを掲示板に合わせているため、相対時間の他に絶対日時も入れているので要修正です。
すぐ直せるのでまだ放ってます。

相対時間の具体的なPHPコードはこちらに書いたので参考にしてください。

基本的に「自分のサイトにツイートを載せたい時は、埋込み型の公式ウィジェットを使ってね」と言っているようです。

下の方にソースがあるので、おそらくそれをコピペして貼り付ければ表示されるのでしょう。
その際リンク先URLのID部分と「YOUR-WIDGET-ID-HERE」とある部分を書き直す必要があるみたいです。

そのままコピペしても「Tweets by @自分のID」というテキストが表示されるだけでした。
WIDGET-IDなるものを取得しないといけないみたいですね〜。

ちょっと面倒です。

————————————2013/2/1 追加–
先日Twitterにログインしたら公式ウィジェットへのリンクが貼られてまして、自分のツイートなら簡単に貼り付けられるようになったっぽいです。
https://twitter.com/settings/widgets
————————————————–

学生っぽい人が古い規約全文を日本語訳しているサイトがあったのですが、機会訳っぽいし信頼性薄いので紹介しないです。
気になったら探してみてください。

その翻訳で気になったのはTwitter側が「そもそも人のサイトのコンテンツを転載するのってどーよ?」と書かれていた部分です。

「人のコンテンツ」って、ツイートそのものの著作権は本来ユーザーさんにあると思うのですが、自分たちのものだと主張したいのかな〜と。。。

APIに制限をかけるのはコンサルティングなどの「ビジネスツールとして使用するには賛成だけど、遊びで使うのはそろそろやめてね」という意図だと、どこかに書いてありました。

RSSを一方的にやめたり、JSONを押し付けるやり方にディベロッパーが怒って別のSNSを始めたようです。
自由がなくなるとユーザーは離れていくのがこの業界の常ですので、Twitterはもうオワコンなのかもしれません。

PHP:Twitter用、相対時間表示

Twitter API 1.1の規約によると、つぶやかれて24時間以内は相対時間で表示しないといけません。

3秒、3分、3時間という感じ。
1日以上だと1月1日のように日付になります。

これ、1秒ごとに読みに行ったらサーバー負荷が高くなって現実的じゃないと、ディベロッパーからむっちゃ不評なところですよねw
だから守ってる人いないし。

どこまで厳密にやるかはTwitterさんのご機嫌によるのですが、うちの場合は表示の瞬間に出してその後放置です。
ユーザーさんがページをリロードすれば、時間も更新されます。

ではその表示の部分のコードです。

うちの場合ツイートをドドドと一気に収集しDBに溜め込んでいるので、MySQLの「2013-01-01 00:00:00」のような形で入っています。
仮にその時間を$nitijiとすると、

<?php
//相対時間表示
$tweet_time=strtotime($nitiji);//Unixタイムスタンプ形式に変換
$now_time=time();//現在の時刻をUnixタイムスタンプで取得
$relative_time=$now_time-$tweet_time;//つぶやかれたのが何秒前か

if($relative_time<60){//ss
 	print $relative_time.'秒';
}elseif($relative_time>=60 && $relative_time<(60*60)){//mm
 	print floor($relative_time/60).'分';
}elseif($relative_time>=(60*60) && $relative_time<(60*60*24)){//hh
 	print floor($relative_time/(60*60)).'時間';
}elseif($relative_time>=(60*60*24)){//日付
	print date('n月j日',$tweet_time);
}
?>

PHP:掲示板やTwitterでニコ動、YouTubeのサムネールを表示

掲示板やツイートに動画のURLをペタペタと貼られることが多いと思います。
そのときニコ動なら「動画のサムネイルと詳細情報」を、YouTubeならサムネール画像を自動的に表示する方法です。

ちなみに、YouTubeのサムネールURLを探している方が来られるみたいなので貼っておきます。
http://i2.ytimg.com/vi/動画ID/mqdefault.jpg

以下ヒントだけです。
$textに本文があって、その中のURLをいったん$linkに格納した後の書き方です。
本文のURLだけ取得の具体的なソースはここら↓辺が参考になります。
http://www.phppro.jp/qa/detail.php?id=3881

それと定型URLを前提にしているので、仕様が変われば使えません。
これは自分も困るのですが、その時がきたら書き直すしかないですね。
各動画IDの桁も年々増えていくみたいだし、いつまで使えるかな〜(遠い目。

preg_match()とpreg_replace()を使って、特定のURLがあれば画像に置換しているだけです。

$text='ここに本文とかツイートが入ります';
$link='本来なら本文からURLだけを抽出してあります';

//ニコ動
if(preg_match('/http:\/\/www.nicovideo.jp\/watch\/[a-zA-Z0-9]+/u',$link)){
	$nico_id=substr($link,30,10); //31文字目から10桁の文字を取得
	$nico_img='<iframe width="312" height="176" src="http://ext.nicovideo.jp/thumb/'.$nico_id.'" scrolling="no" style="border:solid 1px #CCC;" frameborder="0"></iframe>';
	$text=preg_replace($link,$nico_img,$text,1);
}

//以下YouTube(2パターン)
if(preg_match('/http:\/\/www.youtube.com\/watch/u',$link)){
	if(strpos($link,'watch?v=')===false){//余計なパラメータが付いている場合
		$youtube_id=substr($link,-11,11); //パラメータがない場合は後ろから11桁
	}else{
		$youtube_id=substr($link,31,11); //パラメータがある場合は頭から数える
	}
	$youtube_img='<img src="http://i2.ytimg.com/vi/'.$youtube_id.'/mqdefault.jpg" width="312" />';
	$text=preg_replace($link,$youtube_img,$text,1);
}

//短縮URLの場合
if(preg_match('/h?ttp:\/\/youtu.be\//u',$link)){
	$youtube_id=substr($link,-11,11); //後ろから11桁を取得
	$youtube_img='<img src="http://i2.ytimg.com/vi/'.$youtube_id.'/mqdefault.jpg" width="312" />';
	$text=preg_replace($link,$youtube_img,$text,1);
}

print $text;

これはうちで使っているコードの一部抜粋なので、コピペで使うというより参考程度にしておいてください。
実際はもっと複雑なことをしているので、上で動くのかちょっと心配です。

substr()関数は“0”から数えるので要注意です。
つまり30文字目が欲しい時は“29”と指定します。

ニコ動は割と素直に置換できるのですが、問題はYouTubeです。
複雑なことばかりするのでw

そもそもサムネール画像を表示するにも裏技が必要で、それをやると動画のタイトルが取得できないのですよね。
YouTubeには動画をダイレクトに埋め込むソースが用意されていますが、3つもあると表示がドコっと重くなるので、早く仕様をニコ動と同じにして欲しいですね〜。

そしてYouTubeは余計なパラメーターが付いたり、付かなかったり、統一してくれていません。

URLの文字数を頭から数えたり、尻尾から数えて11桁拾っているのは、YouTubeが仕様をコロコロ変えるので、httpがhttpsになったりしたときに、尻尾から数えている素直なURLだけは死なないようにしているからです。

とにかく仕様が変わると使えないやり方なので、あまりオススメはできません。
あくまでヒントとしてお使いください。

PHP:ニコ動ランキングのサムネール取得記事を追加しました。
PHP:ニコ動ランキングのサムネールを取得はこちら
 

PHP:Twitterの#ハッシュタグに自動リンク

Twitterのツイート取得で意外に情報が少なかったのが、ハッシュタグを自動リンクする方法。

情報が少ないというか、間違っているのが多くて探すのに苦労しました。
日本語ハッシュに対応していなかったり、日本語には対応しているのに記号が抜けていたり、何故か動かなかったり・・・。

みんなサクサク書けちゃうからいらないのかな〜と思ったのですが、あると便利ですよね。

preg_replace関数を使います。

このままコピペすれば使えると思います。
ツイート本文にハッシュがあれば自動でリンクしてくれます。

$text='ツイート本文 #ハッシュ付き';

$text=preg_replace("/\s#(w*[一-龠_ぁ-ん_ァ-ヴーa-zA-Za-zA-Z0-9]+|[a-zA-Z0-9_]+|[a-zA-Z0-9_]w*)/u", " <a href=\"https://twitter.com/search/%23\\1\" target=\"twitter\">#\\1</a>", $text);

Twitterの規約ではハッシュタグは必ず検索結果にリンクすることになっています。

 
とはいえ、これも完璧ではありません。
#の前に全角スペースが入っていたり、全角#だとリンクしてくれません。

最初、一律半角#ならリンクしようと思い頭の「\s」(半角スペース)を入れずにいたのですが、URLに「#」があると自動リンクがおかしくなってしまうので、仕方なく入れました。

あとハッシュがすべて数字だとリンクしちゃダメなんですよね〜。
また余裕が出てきたら修正します。。。