今日自分が誕生日なので何となくやりたくなった、ただそれだけの理由w
ソースコード
「ライブラリに頼らないTwitterAPI入門」 からいくらか引用しています。
<?php
/* 設定 */
const CONSUMER_KEY = '';
const CONSUMER_SECRET = '';
const ACCESS_TOKEN = '';
const ACCESS_TOKEN_SECRET = '';
date_default_timezone_get('Asia/Tokyo');
/* OAuthリクエスト用関数(手抜き) */
function twitter_get($url, array $params = []) {
// 必須パラメータ
$oauth = [
'oauth_consumer_key' => CONSUMER_KEY,
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_timestamp' => time(),
'oauth_version' => '1.0a',
'oauth_nonce' => md5(mt_rand()),
'oauth_token' => ACCESS_TOKEN,
];
// 追加パラメータ
$base = $oauth + $params;
// 自然順ソート
uksort($base, 'strnatcmp');
// シグネチャを生成して必須パラメータに追加
$oauth['oauth_signature'] = base64_encode(hash_hmac(
'sha1',
implode('&', array_map('rawurlencode', [
'GET',
$url,
http_build_query($base, '', '&', PHP_QUERY_RFC3986)
])),
implode('&', array_map('rawurlencode', [
CONSUMER_SECRET,
ACCESS_TOKEN_SECRET
])),
true
));
// ヘッダーを生成
foreach ($oauth as $name => $value) {
$items[] = sprintf('%s="%s"', urlencode($name), urlencode($value));
}
$header = 'Authorization: OAuth ' . implode(', ', $items);
// cURLでGETリクエストを実行し、JSONデコードして返す
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url . '?' . http_build_query($params, '', '&'),
CURLOPT_HTTPHEADER => array($header),
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => 'gzip',
]);
return json_decode(curl_exec($ch));
}
/* 誕生日っぽい人々のIDを取得 */
$max_id = null;
// 10ページ分検索する
for ($i = 0; $i < 10; ++$i) {
$result = twitter_get(
'https://api.twitter.com/1.1/search/tweets.json',
[
'q' => '誕生日 おめでとう -先 -早 -遅',
'count' => 100,
'max_id' => $max_id,
]
);
if (empty($result->statuses)) {
// ヒット件数がゼロもしくはエラーの場合そこで終了する
break;
}
foreach ($result->statuses as $status) {
// 今日のツイートで且つメンションがあるものに限定
if (
date('Y/m/d') === date('Y/m/d', strtotime($status->created_at)) &&
!empty($status->entities->user_mentions)
) {
// 1つ目のメンションのターゲットユーザーIDを配列に追加
$ids[] = $status->entities->user_mentions[0]->id_str;
}
}
// ページネーション用パラメータ
$max_id = bcsub($status->id_str, 1);
}
/* IDからユーザー情報を取得 */
if (!empty($ids)) {
$users = [];
// 100件ずつ実行
foreach (array_chunk($ids, 100) as $group) {
$result = twitter_get(
'https://api.twitter.com/1.1/users/lookup.json',
['user_id' => implode(',', $group)]
);
if (is_array($result)) {
$users = array_merge($users, $result);
}
}
}
/* ヘッダーを送出 */
header('Content-Type: application/xhtml+xml; charset=utf-8');
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>本日誕生日を迎えられた人々(かもしれない)</title>
<link rel="stylesheet" type="text/css" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" />
</head>
<body>
<div class="container">
<p class="page-header">
<h1>本日<code><?=date('Y年n月j日')?></code>に誕生日を迎えられた(かもしれない)人々</h1>
</p>
<?php if (!empty($users)): ?>
<p>
<?php foreach ($users as $u): ?>
<?=sprintf(
'<a href="https://twitter.com/%1$s" title="%1$s"><img src="%2$s" alt="%1$s" /></a>' . "\n",
$u->screen_name,
$u->profile_image_url
)?>
<?php endforeach; ?>
</p>
<?php endif; ?>
</div>
</body>
</html>
実行結果
みもりん と誕生日同じだったのを今になって知る
(2014月になってるのは最初typoしてたからなので気にしないで)