ラベル Twitter の投稿を表示しています。 すべての投稿を表示
ラベル Twitter の投稿を表示しています。 すべての投稿を表示

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を使う準備

2012/01/21

【Twitter】TwitterのAPIを使う準備

ということでTwitterAPIを使う準備をしました。

まず、こちらへアクセスすると下記の画面へ遷移します。
赤い四角で囲まれている 「Create an app」 を押下します。

すると下記画面が表示されログイン要求をされますので、いつものログインIDとPWを入力し ログインします。
ログイン後に下記の画面が表示されますので、そこに必要な項目を入力します。 下記が入力項目とその画面になります。 ・Name アプリケーション名 ・Description アプリケーションの説明文 ・WebSite アプリケーションのTOP ・Callback URL 認証時のコールバック用URL 入力が完了したら一番下の 「Create your Twitter application」 を押下します。
するとこちらの画面に遷移しますので、 Consumer key Consumer secret をアプリケーションで使用しますので保存します。 以上でTwitterAPIを使ったアプリケーションの作成準備は完了です。 次はつぶやきの投稿サンプルを作成したいと思います。 終わり 【追記】 Twitter APIでつぶやきを投稿する際は書き込み権限が必要になりますので下記の画面にて 「Read & Write」にチェックを入れる必要があります。
関連記事: 【PHP】Twitter APIを使ってつぶやきを投稿するサンプル【Twitter】