21
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-06-27

今日自分が誕生日なので何となくやりたくなった、ただそれだけの理由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してたからなので気にしないで)

21
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?