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)でツイートする方法〜access_token編〜【PHPとcURLで実装】

0
Posted at

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

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

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

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

	$request_method = 'POST';
	$request_url    = 'https://api.twitter.com/oauth/access_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',
		// Twitter APIのrequest_tokenのレスポンス値
		'oauth_token'            => '',
		// PINコード
		'oauth_verifier'         => '',
	];

	// 署名(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>";
	}

	exit;

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

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

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

oauth_token=************&oauth_token_secret=************&user_id=************&screen_name=************

また access_token のリクエストが成功すると、Twitterアカウントでアプリの連携を確認することが出来ます。

image.png

サンプルコードの解説

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

	// Twitter Developer登録でアプリ登録した時の値
	$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',
		// Twitter APIのrequest_tokenのレスポンス値
		'oauth_token'            => '',
		// PINコード
		'oauth_verifier'         => '',
	];

oauth_tokenの値

oauth_tokenは、Twitter APIの request_token で取得した以下のようなレスポンス値(oauth_token=****)をセットします。
関連記事:Twitter APIでrequest_tokenを取得するサンプルコードを紹介

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

oauth__verifierの値

oauth__verifierもTwitter APIの request_token を行った後の PINコード をセットします。
関連記事:Twitter APIでrequest_tokenを取得するサンプルコードを紹介

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

request_token へリクエストした後のレスポンスにある Authorize URL「https://api.twitter.com/oauth/authorize?oauth_token=*」にブラウザでアクセスします。

image.png

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

そして表示される以下の PINコード を oauth__verifier にセットします。

image.png

署名を作成

	// 署名(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で access_token を取得するサンプルコードの紹介です。

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?