2012/01/22

【PHP】Twitter APIを使ってつぶやきを投稿するサンプル【Twitter】

ということでPHPでTwitterAPIをつかってつぶやきを投稿するサンプルを作りました。

※Twitter APIを使うにはOAuth認証を使いますのでこちらより必要なモノを取得してください。

必要なもの
・Consumer key ・Consumer secret 前回の記事を参考にしてください。 今回はサイトURLを   http://example.com/index.php コールバックURLを   http://example.com/callback.php という感じに設定しました。 通常コールバックURLにてアクセストークンの保存処理などを行うのですが、今回は サンプルということでそのままつぶやきを投稿しています。 下記ソースです。 index.php
<?php
session_start();
require_once 'common.php';

$consumer_key    = '取得したコンシューマキー';
$consumer_secret = '取得したコンシューマシークレット';
$request_url     = 'https://api.twitter.com/oauth/request_token';
$auth_url        = 'https://api.twitter.com/oauth/authorize';

// シグネチャ作成用パラメータ
$signature_params = array(
    'oauth_consumer_key'     => $consumer_key,
    'oauth_nonce'            => md5(microtime() . mt_rand()),
    'oauth_signature_method' => 'HMAC-SHA1',
    'oauth_timestamp'        => time(),
    'oauth_version'          => '1.0',
);
// シグネチャの作成
$signature = getOAuthSignature($request_url, $signature_params, $consumer_secret);
$signature_params['oauth_signature'] = $signature;

// トークン取得用リクエスト文字列作成
$query = getRequestQuery($signature_params);

// リクエストトークン取得
$request_token = getRequestToken($request_url, $query);

// Twitterのアプリケーション認証画面へリダイレクト
header('Location: ' . $auth_url . '?oauth_token=' . $request_token);
exit;

/**
 * リクエストトークンの取得
 * @param  string $request_url   リクエストURL
 * @param  string $query         リクエストパラメータのクエリストリング
 * @return string $request_token リクエストトークン
 */
function getRequestToken($request_url, $query)
{
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL, $request_url . '?' . $query);

    $res = curl_exec($ch);
    curl_close($ch);

    parse_str($res, $result);
    $request_token = $result['oauth_token'];

    return $request_token;
}
callback.php
<?php
session_start();
require_once 'common.php';

$consumer_key    = '取得したコンシューマキー';
$consumer_secret = '取得したコンシューマシークレット';
$access_url      = 'https://api.twitter.com/oauth/access_token';
$update_api      = 'https://api.twitter.com/1/statuses/update.json';

// アクセストークン取得用パラメータ
$params = array(
    'oauth_consumer_key'     => $consumer_key,
    'oauth_nonce'            => md5(microtime() . mt_rand()),
    'oauth_signature_method' => 'HMAC-SHA1',
    'oauth_timestamp'        => time(),
    'oauth_token'            => $_GET['oauth_token'],
    'oauth_verifier'         => $_GET['oauth_verifier'],
    'oauth_version'          => '1.0',
);

$signature = getOAuthSignature($access_url, $params, $consumer_secret, 'POST', $_GET['oauth_token_secret']);
$params['oauth_signature'] = $signature;

// トークン取得用リクエスト文字列作成
$query = getRequestQuery($params);

// アクセストークンとシークレットの取得
$access_token = getAccessToken($access_url, $query);

// ツイート投稿パラメータ
unset($params['oauth_signature'], $params['oauth_verifier']);
$params['status'] = 'test投稿';
$params['oauth_token'] = $access_token['oauth_token'];

uksort($params, 'strnatcmp');
$signature = getOAuthSignature($update_api, $params, $consumer_secret, 'POST', $access_token['oauth_token_secret']);
$params['oauth_signature'] = $signature;

// パラメータ名でソート
uksort($params, 'strnatcmp');
$request_param = getRequestQuery($params);

echo '<pre>';
print_r(update($update_api, $request_param));
echo '</pre>';

/**
 * つぶやきの投稿
 * @param  string $update_api    update apiのURL
 * @param  string $request_param リクエストパラメータ
 * @return string $res           TwitterAPIよりのレスポンス
 */
function update($update_api, $request_param)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $update_api);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request_param);
    curl_setopt($ch, CURLOPT_HEADER, false);

    $res = curl_exec($ch);
    curl_exec($ch);

    return $res;
}

/**
 * アクセストークンの取得
 * @param  string      $access_url アクセストークン取得用URL
 * @param  assoc_array $query      アクセストークン取得用クエリ
 * @return assoc_array $result     アクセストークン と アクセストークンシークレット
 */
function getAccessToken($access_url, $query)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $access_url . '?' . $query);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $res = curl_exec($ch);
    parse_str($res, $result);
    $access_token = $result['oauth_token'];

    return $result;
}
common.php
<?php
/**
 * シグネチャ文字列の作成
 * @param  string      $request_url     リクエストURL
 * @param  assoc_array $params          シグネチャ作成用パラメータ
 * @param  string      $consumer_secret コンシューマシークレット
 * @param  string      $method          リクエストメソッド
 * @param  string      $oauth_token     OAuth token
 * @return string      $signature       シグネチャ
 */
function getOAuthSignature($request_url, $params, $consumer_secret, $method = 'GET', $oauth_token_secret = '')
{
    $signature = '';

    $params = array_map('urlEncodeRfc', $params);
    uksort($params, 'strnatcmp');

    $param = array();
    foreach ($params as $key => $val)
    {
        $param[] = $key . '=' . $val;
    }
    $query = implode('&', $param);

    $base_array = array(
        $method,
        $request_url,
        $query,
    );
    $base_array = array_map('urlEncodeRfc', $base_array);
    $base_string = implode('&', $base_array);

    $key = array(
        $consumer_secret,
        $oauth_token_secret,
    );
    $key = array_map('urlEncodeRfc', $key);
    $key = implode('&', $key);

    // ベース文字列をシグネチャに
    $signature = base64_encode(hash_hmac('sha1', $base_string, $key, true));

    return $signature;
}

/**
 * URLエンコードをしたリクエスト用クエリストリングを作成
 * @param  assoc_array $params 作成する連想配列
 * @return string      $query  クエリストリング
 */
function getRequestQuery($params)
{
    $params = array_map('urlEncodeRfc', $params);
    $query_param = array();
    foreach ($params as $key => $val)
    {
        $query_param[] = $key . '=' . $val;
    }
    $query = implode('&', $query_param);

    return $query;
}

/**
 * URLエンコード
 * @param  string $str     エンコードする文字列
 * @return string $enc_str エンコード済み文字列
 */
function urlEncodeRfc($str)
{
    $enc_str = str_replace('%7E', '~', rawurlencode($str));

    return $enc_str;
}
流れは、index.phpでまず、リクエストトークンを取得します。 その後リクエストトークンをクエリパラメータとしてTwitterの アプリケーション認証画面にリダイレクトします。 ユーザが認証を押下した場合 コールバックURL「callback.php」 に リダイレクトされます。 リダイレクトされてきた際にGETパラメータにて 「oauth_token」 「oauth_token_secret」 の値が付加されていますので、その値を使いアクセストークンを取得します。 つぶやきを投稿する際はつぶやき投稿用パラメータを含めたシグネチャを作成し、 取得したアクセストークンを使ってリクエストを送信します。 おおまかな流れは以上になります。 終わり 関連記事: 【Twitter】TwitterのAPIを使う準備

0 件のコメント:

コメントを投稿