0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

0
Posted at

2023年2月9日をもって Twitter API の無料提供が終了すると発表がありました。
あと個々の内容は個人用の備忘録な要素が多いです

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

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

<?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=*****」をブラウザでアクセスします。

image.png

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

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

通常は連携アプリを承認ボタンを押した後は 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について

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

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?