今日が誕生日かもしれない人々を検索する

今日自分が誕生日なので何となくやりたくなった、ただそれだけの理由ｗ

# **ソースコード**

**[「ライブラリに頼らないTwitterAPI入門」](http://qiita.com/mpyw/items/b59d3ce03f08be126000)** からいくらか引用しています。

```php
<?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>
```

# **実行結果**

**[みもりん](http://mimorin.com/)** と誕生日同じだったのを今になって知る

![誕生日](https://qiita-image-store.s3.amazonaws.com/0/25060/cd9e7df9-b993-8394-1885-aeb2eaf9b35d.png)

（2014月になってるのは最初typoしてたからなので気にしないで）