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

0
Posted at

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

Twitter APIでツイートするサンプルコード

PHPでcURLを使ってTwitter APIでツイートするサンプルコードを紹介します。

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

	$request_method = 'POST';
	$request_url    = 'https://api.twitter.com/1.1/statuses/update.json';
	$boundary       = 's-a-m-p-l-e-------------' . md5(uniqid(rand(), true));

	// Twitter APIのaccess_tokenのレスポンス値
	$oauth_access_secret = '';

	// リクエストパラメータ配列
	$request_params = [
		'status'    => 'ハロー', // 内容
// 画像付き投稿する場合
//		'media_ids' => '', // メディアID(複数の場合はカンマ(,)区切りで指定)
	];

	$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のaccess_tokenのレスポンス値
		'oauth_token'            => '',
		'status'                 => $request_params['status'],
// 画像付き投稿する場合
//		'media_ids'              => $request_params['media_ids'],
	];

	// 署名(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 (isset($oauth_access_secret) && $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, '', ',')
			]
		]
	];

	// リクエストクエリー
	if (isset($request_params) && $request_params && count($request_params) > 0) {
		$request_params = http_build_query($request_params, '', '&');
		if ($request_method == 'GET') {
			$request_url .= '?' . $request_params;
		}
		else {
			$request_context['http']['content'] = $request_params;
		}
	}
	elseif (isset($request_body) && $request_body) {
		// 画像リクエストの時
		$request_context['http']['header'][] = 'Content-Type: multipart/form-data; boundary= ' . $boundary;
		$request_context['http']['content'] = $request_body;
	}

	/*
	 * 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;
	}

サンプルコードの解説

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

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

boundary

	$request_method = 'POST';
	$request_url    = 'https://api.twitter.com/1.1/statuses/update.json';
	$boundary       = 's-a-m-p-l-e-------------' . md5(uniqid(rand(), true));

oauth_access_secret

	// Twitter APIのaccess_tokenのレスポンス値
	$oauth_access_secret = '';

statusとmedia_ids

	// リクエストパラメータ配列
	$request_params = [
		'status'    => 'ハロー', // 内容
// 画像付き投稿する場合
//		'media_ids' => '', // メディアID(複数の場合はカンマ(,)区切りで指定)
	];
	$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のaccess_tokenのレスポンス値
		'oauth_token'            => '',
		'status'                 => $request_params['status'],
// 画像付き投稿する場合
//		'media_ids'              => $request_params['media_ids'],
	];

oauth_token

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

署名を作成

	// 署名(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 (isset($oauth_access_secret) && $oauth_access_secret) {
		$signing_key .= _rawurlencode($oauth_access_secret);
	}

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

	$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 パラメータ名=値,パラメータ名=値,パラメータ名=値,…

	// リクエストクエリー
	if (isset($request_params) && $request_params && count($request_params) > 0) {
		$request_params = http_build_query($request_params, '', '&');
		if ($request_method == 'GET') {
			$request_url .= '?' . $request_params;
		}
		else {
			$request_context['http']['content'] = $request_params;
		}
	}
	elseif (isset($request_body) && $request_body) {
		// 画像リクエストの時
		$request_context['http']['header'][] = 'Content-Type: multipart/form-data; boundary= ' . $boundary;
		$request_context['http']['content'] = $request_body;
	}

リクエストクエリを作成します。

	$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でTwitterへツイートするサンプルコードになります。

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?