Twitter APIでツイートする方法〜request_token編〜【PHPとcURLで実装】

2019年11月26日プログラムPHP,Twitter API,プログラムサンプル

Twitter APIでツイートする方法〜request_token編〜【PHPとcURLで実装】
Twitter APIでツイートする方法〜request_token編〜【PHPとcURLで実装】

PHPでcURLを使ってTwitter APIを利用してツイートするサンプルプログラムを紹介します。

ユート

今回は全3回の第1回で request_token を取得するサンプルプログラムの解説です。

Twitter APIをPHPで利用する際に abraham/twitteroauth を利用する例が多いです。今回は PHPでcURLを使ったサンプルコード の解説です。

参考サイト
・Twitter APIをcURLで実装するサンプルコードを解説しています。
 Twitter REST APIの使い方
・サンプルコードを書く際に、参考にしました。
 OAuthをPHPでイチから書いてみた(その1)

Twitter APIで request_token を要求するサンプルコード

PHPでcURLを使ってTwitter APIで access_token を要求するサンプルコードを紹介します。

ユート

Twitter APIを利用するには、Twitterの開発者(Developer)登録とApp登録を行う必要があります。まだ準備できていない人は こちらの記事 を先に読んでください。

<?php
	/**
	 * request_token
	 */
	$consumer_key     = ''; // Twitter Developer登録でアプリ登録した時の値
	$consumer_secret  = '';	// Twitter Developer登録でアプリ登録した時の値
	$token            = ''; // Twitter Developer登録でアプリ登録した時の値
	$secret           = ''; // Twitter Developer登録でアプリ登録した時の値

	$request_method = 'POST';
	$request_url    = 'https://api.twitter.com/oauth/request_token';

	$authorizations = [
		'oauth_nonce'            => md5(uniqid(rand(), true)),
		'oauth_signature_method' => 'HMAC-SHA1',
		'oauth_timestamp'        => time(),
		'oauth_consumer_key'     => $consumer_key,
		'oauth_version'          => '1.0',
//		'oauth_callback'         => '',
		'oauth_callback'         => 'oob',
	];

	// 署名(signature)作成では、アルファベット順にソートする決まり
	ksort($authorizations);

	/*
	 * Signature_base_stringを作成
	 * ・oauth_signatureを作る時のメッセージ部分
	 */
	$signature_base_string = http_build_query($authorizations, '', '&');
	// HTTPメソッドとリクエストトークンURLをURLエンコードして&で繋ぐ
	$signature_base_string = _rawurlencode($request_method)
								. '&'
								. _rawurlencode($request_url)
								. '&'
								. _rawurlencode($signature_base_string);

	/*
	 * Signature_keyの作成
	 * oauth_signatureを作る時のキー部分
	 * oauth_access_secretがあれば"&"の後ろにつける
	 */
	$signing_key = _rawurlencode($consumer_secret) . '&';
//	if ($oauth_access_secret) {
//		$signing_key .= _rawurlencode($oauth_access_secret);
//	}

	/*
	 * oauth_signatureの作成
	 */
	$oauth_signature = base64_encode(
		hash_hmac('sha1', $signature_base_string, $signing_key, true)
	);
	$authorizations['oauth_signature'] = $oauth_signature;

	/*
	 * リクエスト準備
	 */
	// リクエスト用コンテキスト作成
	$request_context = [
		'http' => [
			'method' => $request_method,
			'header' => [
				'Authorization: OAuth ' . http_build_query($authorizations, '', ',')
			]
		]
	];

	/*
	 * cURL設定
	 */
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_URL, $request_url);
	curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request_context['http']['method']);
	curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
	curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
	curl_setopt($curl, CURLOPT_TIMEOUT, 30);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	// SSL
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
	// レスポンスヘッダの出力
	curl_setopt($curl, CURLOPT_HEADER, false);
	curl_setopt($curl, CURLINFO_HEADER_OUT, true);
	// Locationヘッダを追跡
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
	// HTTPヘッダ
	curl_setopt($curl, CURLOPT_HTTPHEADER , $request_context['http']['header']);
	if (isset($request_context['http']['content']) && $request_context['http']['content']) {
		curl_setopt($curl, CURLOPT_POSTFIELDS , $request_context['http']['content']);
	}

	// 結果達
	$response = curl_exec($curl);
	$code     = curl_getinfo($curl, CURLINFO_HTTP_CODE);
	$info     = curl_getinfo($curl);
	$error    = curl_error($curl);
	$errno    = curl_errno($curl);

	// 終了
	curl_close($curl);

	/*
	 * cURLの結果
	 */
	$result = [
		'response' => $response,
		// cURLでリクエストした結果達
		'code'     => $code,
		'info'     => $info,
		'error'    => $error,
		'errno'    => $errno,
	];

	echo "<pre>";
	print_r($result['response']);
// cURLリクエストで失敗した時とかは、$resultをprint_rすると原因が分かるかも....
//	print_r($result);
	echo "</pre>";

	if (!$response || $error || $errno || $code != 200) {
		echo "<span>";
		echo 'Twitter APIのリクエストに失敗';
		echo "</span>";
	}

	echo "<br>";
	echo "以下へoauth_tokenを付与してアクセス<br>";
	echo "https://api.twitter.com/oauth/authorize?oauth_token=";

	exit;
	/**
	 * URLエンコード RFC2986版
	 */
	function _rawurlencode($str='') {
		if (!$str) {
			return $str;
		}
		$result = str_replace(['+', '%7E'], ['%20', '"'], $str);
		$result = rawurlencode($result);
		return $result;
	}

サンプルコードのレスポンス値

サンプルコードを実行すると以下のようにJSON形式のレスポンスで request_token がTwitter APIから返ってきます。

oauth_token=*******************&oauth_token_secret=******&oauth_callback_confirmed=true

request_tokenリクエストからPINコード取得までの流れ

このレスポンスの"oauth_token=*****"をコピーします。そしてTwitter APIのAuthorize URL「https://api.twitter.com/oauth/authorize?oauth_token=*****」をブラウザでアクセスします。

すると「***にアカウントへのアクセスを許可しますか?」と聞かれます。なので 連携アプリを認証ボタン をクリックします。

そして表示される以下の PINコード を使って、つぎのTwitter APIの access_token のリクエストにある oauth__verifier へセットします。
関連記事:Twitter APIの access_token をリクエストするサンプルコード

通常は連携アプリを承認ボタンを押した後は oauth_callback で指定したURLへ戻ってくるフローとなります。今回は oauth_callback に oob をセットしたフローになります。

サンプルコードの解説

PHPでcURLを使ってTwitter APIで request_token を要求するサンプルコードの解説をします。

$consumer_key     = '';
$consumer_secret  = '';
$token            = '';
$secret           = '';

この部分は、TwitterでDeveloper登録を行った時に発行されるアプリの情報をセットします。
関連記事:Twitter APIを利用する為にDeveloper登録する方法

$authorizations = [
'oauth_nonce'            => md5(uniqid(rand(), true)),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_timestamp'        => time(),
'oauth_consumer_key'     => $consumer_key,
	'oauth_version'          => '1.0',
//	'oauth_callback'         => '',
	'oauth_callback'         => 'oob',
];

// 署名(signature)作成では、アルファベット順にソートする決まり
ksort($authorizations);

/*
	* Signature_base_stringを作成
	* ・oauth_signatureを作る時のメッセージ部分
	*/
$signature_base_string = http_build_query($authorizations, '', '&');
// HTTPメソッドとリクエストトークンURLをURLエンコードして&で繋ぐ
$signature_base_string = _rawurlencode($request_method)
							. '&'
							. _rawurlencode($request_url)
							. '&'
							. _rawurlencode($signature_base_string);

/*
 * Signature_keyの作成
 * oauth_signatureを作る時のキー部分
 * oauth_access_secretがあれば"&"の後ろにつける
 */
$signing_key = _rawurlencode($consumer_secret) . '&';
// if ($oauth_access_secret) {
//	$signing_key .= _rawurlencode($oauth_access_secret);
// }

この配列情報は、署名を作成するための情報になります。

/*
	* oauth_signatureの作成
	*/
$oauth_signature = base64_encode(
	hash_hmac('sha1', $signature_base_string, $signing_key, true)
);
$authorizations['oauth_signature'] = $oauth_signature;

そして上記のように署名を作成します。

/*
 * リクエスト準備
 */
// リクエスト用コンテキスト作成
$request_context = [
	'http' => [
		'method' => $request_method,
		'header' => [
			'Authorization: OAuth ' . http_build_query($authorizations, '', ',')
		]
	]
];

署名が作成できたので、次にTwitter APIへcURLでリクエストする準備を行います。HTTPリクエストのヘッダを以下のようにカスタマイズします。
HTTPリクエストヘッダの例:Authorization: OAuth パラメータ名=値,パラメータ名=値,パラメータ名=値,…」

/*
 * cURL設定
 */
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $request_url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request_context['http']['method']);
curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
// SSL
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
// レスポンスヘッダの出力
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLINFO_HEADER_OUT, true);
// Locationヘッダを追跡
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
// HTTPヘッダ
curl_setopt($curl, CURLOPT_HTTPHEADER , $request_context['http']['header']);
if (isset($request_context['http']['content']) && $request_context['http']['content']) {
	curl_setopt($curl, CURLOPT_POSTFIELDS , $request_context['http']['content']);
}

// 結果達
$response = curl_exec($curl);
$code     = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$info     = curl_getinfo($curl);
$error    = curl_error($curl);
$errno    = curl_errno($curl);

// 終了
curl_close($curl);

そしてcURLで実行を行います。

以上がTwitter APIで request_token を取得するサンプルコードの紹介です。つぎが最後の Twitter APIの access_token でツイートするサンプルプログラム の解説です。

Twitter APIについて

Twitter APIでは、Twitter上のデータを取得したりツイートしたりすることができるTwitter公式のAPIです。

TwitterのAPIについて

ウェブやモバイル端末からTwitterにアクセスできます。Twitterにある情報をできるだけ広く共有するために、API (アプリケーション・プログラミング・インタフェイス)を通してTwitterデータにプログラムレベルでアクセスし、企業、開発者、利用者に提供します。

https://help.twitter.com/ja/rules-and-policies/twitter-api

abraham/twitteroauthとは

Twitter APIをPHPで使う時によく使われているライブラリです。サンプルコードの情報も豊富なので、簡単に利用することも出来るライブラリです。

TwitterOAuth
The most popular PHP library for use with the Twitter OAuth REST API.

https://twitteroauth.com/

が、今回のサンプルコードでは abraham/twitteroauth のライブラリは使いません。

OAuth認証とは

OAuthとは、自分のサイトがTwitterなどの他サービスから情報を利用する許可を得る為の仕組み。といった感じです。

OAuthは、流れがちょっと複雑になっています。図でわかりやすく説明してくれているサイトがあったので紹介しておきます。
多分わかりやすいOAuth

プログラミングスクール受講メリット

・メンターにすぐ聞けるので分からないところでつまづかない
・受講生同士で学び合いモチベーション維持しやすい
・就学後に就職支援や進路サポートを受けることが出来る

ユート
ユート

1985年生まれ1児の父親です。Web系エンジニアを10年以上しています。
プロフィール
Amazon欲しいものリスト

2019年11月26日プログラムPHP,Twitter API,プログラムサンプル

Posted by ユート