SQLの窓

2013年06月02日


PHP + cURL で、Twitter API 1.1 の search/tweets を呼び出して、RSS に変換する

自分のアプリケーションで検索するなら、制限的には 450 となっているので、『自分専用』として運用も可能なので、他のアプリから呼び出す為のテスト用として作成しました。

search.twitter.com/search は、https://dev.twitter.com/blog/api-v1-retirement-date-extended-to-june-11 では、6月11日には、使えなくなるとの事です。
Requests to search.twitter.com/search.* will receive HTTP 410 Gone. Use GET search/tweets instead.
<?php
// **********************************************************
// Twitter API 1.1 search/tweets => RSS
// **********************************************************
header( "Content-Type: text/xml; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

// **********************************************************
// OAuth 用の urlencode 関数
// **********************************************************
function url_rfc3986( $str ) {
	// php 5.3.x 〜 ではこの変換は必要無く、rawurlencode で OK
	return str_replace('%7E', '~', rawurlencode($str));
}

// **********************************************************
// API
// **********************************************************
$twitter_url = 'https://api.twitter.com/1.1/search/tweets.json';

// **********************************************************
// 認証データ
// **********************************************************
$oauth_consumer_key = "";
$oauth_consumer_secret = "";
$oauth_token = "";
$oauth_secret = "";

// 毎回変化するランダムな文字列
$mt = microtime();
$rand = mt_rand();
$oauth_nonce = md5($mt . $rand);

$oauth_signature_method = "HMAC-SHA1";
$oauth_timestamp = time();
$oauth_version = "1.0";

if ( $_POST['q'] != '' ) {
	$query = $_POST['q'];
}
else {
	$query = "進撃の巨人";
}
if ( $_POST['c'] != '' ) {
	$count = $_POST['c'];
}
else {
	$count = 20;
}

// *********************************************************
// シグネチャ用ベース文字列作成
// *********************************************************
$base_string = "GET";
$base_string .= "&" . url_rfc3986($twitter_url);
$base_string .= "&count%3D{$count}%26";

$base_string .= url_rfc3986("oauth_consumer_key")."%3D".url_rfc3986($oauth_consumer_key)."%26";
$base_string .= url_rfc3986("oauth_nonce")."%3D".url_rfc3986($oauth_nonce)."%26";
$base_string .= url_rfc3986("oauth_signature_method")."%3D".url_rfc3986($oauth_signature_method)."%26";
$base_string .= url_rfc3986("oauth_timestamp")."%3D".url_rfc3986($oauth_timestamp)."%26";
$base_string .= url_rfc3986("oauth_token")."%3D".url_rfc3986($oauth_token)."%26";
$base_string .= url_rfc3986("oauth_version")."%3D".url_rfc3986($oauth_version)."%26";
$base_string .= "q%3D". url_rfc3986(url_rfc3986($query));

// *********************************************************
// シグネチャ作成
// *********************************************************
$oauth_signature = 
base64_encode( hash_hmac(
	"sha1",
	$base_string,
	url_rfc3986($oauth_consumer_secret) . "&" . url_rfc3986($oauth_secret),
	true
));

// *********************************************************
// curl 処理
// *********************************************************
$curl = curl_init();
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);
curl_setopt($curl, CURLOPT_URL, $twitter_url . "?q=". url_rfc3986($query) . "&count={$count}" );

// *********************************************************
// http ヘッダ作成
// *********************************************************
$header = array();
//$header[] = 'Expect:';
$header[] = 'Authorization: OAuth '.
url_rfc3986("oauth_consumer_key")."=\"".url_rfc3986($oauth_consumer_key)."\",".
url_rfc3986("oauth_nonce")."=\"".url_rfc3986($oauth_nonce)."\",".
url_rfc3986("oauth_signature")."=\"".url_rfc3986($oauth_signature)."\",".
url_rfc3986("oauth_signature_method")."=\"".url_rfc3986($oauth_signature_method)."\",".
url_rfc3986("oauth_timestamp")."=\"".url_rfc3986($oauth_timestamp)."\",".
url_rfc3986("oauth_token")."=\"".url_rfc3986($oauth_token)."\",".
url_rfc3986("oauth_version")."=\"".url_rfc3986($oauth_version)."\"";

curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

// *********************************************************
// https 用
// *********************************************************
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1);

// *********************************************************
// 送信
// *********************************************************
//curl_setopt($curl, CURLOPT_VERBOSE, true);	// デバッグ
//$handle = fopen("./debug.txt", "w");
//curl_setopt($curl, CURLOPT_STDERR, $handle);
//$handle2 = fopen("./ret_header.txt", "w");
//curl_setopt($curl, CURLOPT_WRITEHEADER, $handle2);

$result = curl_exec($curl);


// *********************************************************
// 結果
// *********************************************************
if($result === false) {
	// $json = 'Curl error: ' . curl_error($curl);
	$json = json_decode("{}");
}
else {
	// echo 'Operation completed without any errors';
	$json = json_decode($result);
}
curl_close($curl);
//fclose($handle2);
//fclose($handle);


print '<?xml version="1.0" encoding="UTF-8"?>';
?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
<channel>
<?php

if ( $json->statuses ) {
foreach($json->statuses as $tweet) {

$str = <<<ITEM
<item>
	<title>{$tweet->user->name}</title>
	<link/>
	<description>{$tweet->text}</description>
	<pubDate>{$tweet->created_at}</pubDate>
	<guid>{$tweet->id_str}</guid>
	<dc:creator>{$tweet->user->screen_name}</dc:creator>
	<dc:date>{$dc_date}</dc:date>
	<media:thumbnail url="{$tweet->user->profile_image_url}" />
	<media:content url="{$tweet->user->profile_image_url}" />
</item>
ITEM;

	print $str;

}
}
else {

$str = <<<ITEM
<item>
	<title>error</title>
	<link/>
	<description/>
	<pubDate/>
	<guid/>
	<dc:creator/>
	<dc:date/>
	<media:thumbnail url="" />
	<media:content url="" />
</item>
ITEM;

	print $str;
}

?>
</channel>
</rss>



posted by lightbox at 2013-06-02 01:28 | PHP + Twitter | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり