SYNCER

SYNCER

Twitter Rest APIでアイコン画像をサイズ別に取得する方法

9件

公開日:

Twitter Rest APIで、ユーザーのアイコン画像をサイズ別に取得する方法を説明します。

Profile Images and Banners
Profile Images and Banners
Twitter Developersのウェブサイト(英語)。アイコン画像やヘッダー画像の、サイズ別のURLの説明があります。

準備

目的を達成するには、下記の情報が必要です。

アプリケーション
書込権限(Read and Write)を持つアプリケーションの、APIキー(API Key)とAPIシークレット(API Secret)。
アクセストークン
アプリケーションで認証した、ユーザーのアクセストークン(Access Token)とアクセストークンシークレット(Access Token Secret)。

説明

画像ファイルのURL

ユーザーのアイコン画像は、GET users/showなどで取得したユーザーオブジェクトに含まれています。profile_image_url_httpsの値が画像ファイルのURLです。

JSON

{"id":2905085521,"id_str":"2905085521","name":"SYNCER","screen_name":"SyncerJP","location":"Tokyo","profile_location":null,"description":"\u30d6\u30ed\u30b0\u300cSYNCER\u300d\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u3059\u3002\u8a18\u4e8b\u306b\u8a00\u53ca\u3057\u3066\u304f\u308c\u305f\u30c4\u30a4\u30fc\u30c8\u3092\u304a\u6c17\u306b\u5165\u308a\u767b\u9332\u3057\u305f\u308a\u3057\u307e\u3059\u3002 \u6700\u7d42\u66f4\u65b0\u65e5:2015\/05\/22","url":"https:\/\/t.co\/J5bOOK7ugS","entities":{"url":{"urls":[{"url":"https:\/\/t.co\/J5bOOK7ugS","expanded_url":"https:\/\/syncer.jp","display_url":"syncer.jp","indices":[0,23]}]},"description":{"urls":[]}},"protected":false,"followers_count":270,"friends_count":2,"listed_count":10,"created_at":"Thu Nov 20 11:17:51 +0000 2014","favourites_count":1613,"utc_offset":32400,"time_zone":"Tokyo","geo_enabled":true,"verified":false,"statuses_count":661,"lang":"ja","status":{"created_at":"Sun Jan 29 12:11:34 +0000 2017","id":825677764250398721,"id_str":"825677764250398721","text":"\u3053\u3061\u3089\u304c\u30c4\u30a4\u30fc\u30c8\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u8aac\u660e\u3067\u3059\u3002\n\nTweet Object\nhttps:\/\/t.co\/MqqZFJOlaL","truncated":false,"source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","in_reply_to_status_id":825677426449453057,"in_reply_to_status_id_str":"825677426449453057","in_reply_to_user_id":2905085521,"in_reply_to_user_id_str":"2905085521","in_reply_to_screen_name":"SyncerJP","geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":1,"favorite_count":0,"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"ja"},"contributors_enabled":false,"is_translator":false,"is_translation_enabled":false,"profile_background_color":"000000","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/600501255656448000\/1qe0CVbE.png","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/600501255656448000\/1qe0CVbE.png","profile_background_tile":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/604130129762074624\/5c0Rku36_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/604130129762074624\/5c0Rku36_normal.jpg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/2905085521\/1432005636","profile_link_color":"D36015","profile_sidebar_border_color":"C6E2EE","profile_sidebar_fill_color":"DAECF4","profile_text_color":"663B12","profile_use_background_image":true,"has_extended_profile":false,"default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null,"translator_type":"regular"}

サイズ別のURLの法則

profile_image_url_httpsの値は、横幅、高さ、ともに48pxという小さなサイズです。これよりも大きなサイズを取得したい場合は、ファイル名のsuffixにあたるキーワードの部分を、置換処理などで調整する必要があります。

https://pbs.twimg.com/profile_images/604130129762074624/5c0Rku36_normal.jpg[LINK]
48x48
_normalを付ける。
: https://pbs.twimg.com/profile_images/604130129762074624/5c0Rku36_normal.jpg
73x73
_biggerを付ける。
: https://pbs.twimg.com/profile_images/604130129762074624/5c0Rku36_bigger.jpg
24x24
_miniを付ける。
: https://pbs.twimg.com/profile_images/604130129762074624/5c0Rku36_mini.jpg
Original
何も付けない。
: https://pbs.twimg.com/profile_images/604130129762074624/5c0Rku36.jpg

置換処理の例

置換処理をするには、_normal.の部分を対象にするといいでしょう。

PHP (index.php)

<?php
// ノーマルサイズ (48x48)
$normal_url = "https://pbs.twimg.com/profile_images/604130129762074624/5c0Rku36_normal.jpg" ;	// 取得したURLアドレス
echo '<p>' . $normal_url . '</p>' ;
echo '<p><img src="' . $normal_url . '"></p>' ;

// ミニサイズ (24x24)
$mini_url = str_replace( "_normal.", "_mini.", $normal_url ) ;
echo '<p>' . $mini_url . '</p>' ;
echo '<p><img src="' . $mini_url . '"></p>' ;

// ビッグサイズ (73x73)
$bigger_url = str_replace( "_normal.", "_bigger.", $normal_url ) ;
echo '<p>' . $bigger_url . '</p>' ;
echo '<p><img src="' . $bigger_url . '"></p>' ;

// オリジナルサイズ
$original_url = str_replace( "_normal.", ".", $normal_url ) ;
echo '<p>' . $original_url . '</p>' ;
echo '<p><img src="' . $original_url . '"></p>' ;

デモを開く

サンプルコード

サンプルコードです。デモは、あなたのアカウントのユーザーアイコンを取得してサイズ別に表示します。利用する場合は、当サイトのアプリケーションを認証する必要があります。ご利用後は、お手数ですが連携を解除して下さい。連携を解除しなかったとしてもアプリケーションがユーザーデータにアクセスすることはありません。

PHP

<?php
/*****

	アイコン画像をサイズ別に取得する方法

	使い方:
		[設定項目]に必要な情報を指定して実行して下さい。

	解説:
		SYNCER
		https://syncer.jp/Web/API/Twitter/Snippet/4/

	質問掲示板:
		SYNCER FORUM
		https://forum.syncer.jp/t/twitter-rest-api/58

*****/


/***** 設定項目 *****/
$api_key = "" ;	// APIキー
$api_secret = "" ;	// APIシークレット
$access_token = "" ;	// アクセストークン
$access_token_secret = "" ;	// アクセストークンシークレット

$screen_name = "syncerjp" ;	// 取得対象のユーザーのスクリーンネーム


/***** プログラムの実行 *****/
// ユーザータイムラインを取得する
list( $response_body, $response_header ) = syncer_twitter_rest_api_request ( $api_key, $api_secret, $access_token, $access_token_secret, "https://api.twitter.com/1.1/users/show.json", "GET", [
	"screen_name" => $screen_name ,
] ) ;

// 取得したプロフィール画像をサイズ別に表示
$user_object = json_decode( $response_body, true ) ;

if ( $user_object ) {
	// ノーマルサイズ (48x48)
	$normal_url = $user_object["profile_image_url_https"] ;	// 取得したURLアドレス
	echo '<p>' . $normal_url . '</p>' ;
	echo '<p><img src="' . $normal_url . '"></p>' ;

	// ミニサイズ (24x24)
	$mini_url = str_replace( "_normal.", "_mini.", $normal_url ) ;
	echo '<p>' . $mini_url . '</p>' ;
	echo '<p><img src="' . $mini_url . '"></p>' ;

	// ビッグサイズ (73x73)
	$bigger_url = str_replace( "_normal.", "_bigger.", $normal_url ) ;
	echo '<p>' . $bigger_url . '</p>' ;
	echo '<p><img src="' . $bigger_url . '"></p>' ;

	// オリジナルサイズ
	$original_url = str_replace( "_normal.", ".", $normal_url ) ;
	echo '<p>' . $original_url . '</p>' ;
	echo '<p><img src="' . $original_url . '"></p>' ;
}


/*** Twitter Rest APIの汎用関数 ***/
// 作成者: SYNCER
// 作成日時: 2017-01-29
// 更新情報:
// 	2017-01-29: 作成しました。
// 使用条件:
// 	・再配布禁止
// 	・転載禁止
// お問い合わせ: https://twitter.com/arayutw
/*** ***/
function syncer_twitter_rest_api_request ( $api_key="", $api_secret="", $access_token="", $access_token_secret="", $request_url="", $request_method="", $params_a=[] ) {
	$request_headers = [] ;
	$request_body = "" ;

	$params_b = array(
		'oauth_token' => $access_token ,
		'oauth_consumer_key' => $api_key ,
		'oauth_signature_method' => 'HMAC-SHA1' ,
		'oauth_timestamp' => time() ,
		'oauth_nonce' => microtime() ,
		'oauth_version' => '1.0' ,
	) ;

	switch ( $request_method ) {
		case "POST" :
			switch( $request_url ) {
				case( 'https://api.twitter.com/1.1/account/update_profile_background_image.json' ) :
				case( 'https://api.twitter.com/1.1/account/update_profile_image.json' ) :
					$media_param = 'image' ;
				break ;

				case( 'https://api.twitter.com/1.1/account/update_profile_banner.json' ) :
					$media_param = 'banner' ;
				break ;

				case( 'https://upload.twitter.com/1.1/media/upload.json' ) :
					$media_param = ( isset($params_a['media']) && !empty($params_a['media']) ) ? 'media' : 'media_data' ;
				break ;
			}

			// multipart POST
			if ( isset($media_param) && isset($params_a[ $media_param ]) ) {
				$media_data = ( $params_a[ $media_param ] ) ? $params_a[ $media_param ] : "" ;

				if( isset( $params_a[ $media_param ] ) ) unset( $params_a[ $media_param ] ) ;

				$boundary = 's-y-n-c-e-r---------------' . md5( mt_rand() ) ;

				$request_body .= '--' . $boundary . "\r\n" ;
				$request_body .= 'Content-Disposition: form-data; name="' . $media_param . '"; ' ;
				$request_body .= "\r\n" ;
				$request_body .= "\r\n" . $media_data . "\r\n" ;

				foreach( $params_a as $key => $value ) {
					$request_body .= '--' . $boundary . "\r\n" ;
					$request_body .= 'Content-Disposition: form-data; name="' . $key . '"' . "\r\n\r\n" ;
					$request_body .= $value . "\r\n" ;
				}

				$request_body .= '--' . $boundary . '--' . "\r\n\r\n" ;

				$request_headers[] = "Content-Type: multipart/form-data; boundary=" . $boundary ;

				$params_c = $params_b ;

			// POST
			} else {
				switch ( $request_url ) {
					case "https://api.twitter.com/1.1/collections/entries/curate.json" :
						$params_c = $params_b ;
						$request_body = $params_a ;
					break ;

					default :
						$params_c = array_merge( $params_a , $params_b ) ;

						if ( $params_a ) {
							$request_body = http_build_query( $params_a ) ;
						}
					break ;
				}
			}
		break ;

		// GET
		case "GET" :
			$params_c = array_merge( $params_a , $params_b ) ;
		break ;
	}

	ksort( $params_c ) ;

	$signature_key = rawurlencode( $api_secret ) . '&' . rawurlencode( $access_token_secret ) ;

	$request_params = http_build_query( $params_c, '', '&' ) ;
	$request_params = str_replace( array( '+', '%7E' ) , array( '%20', '~' ) , $request_params ) ;
	$request_params = rawurlencode( $request_params ) ;
	$encoded_request_method = rawurlencode( $request_method ) ;
	$encoded_request_url = rawurlencode( $request_url ) ;
	$signature_data = $encoded_request_method . '&' . $encoded_request_url . '&' . $request_params ;
	$hash = hash_hmac( 'sha1' , $signature_data , $signature_key , TRUE ) ;
	$signature = base64_encode( $hash ) ;
	$params_c['oauth_signature'] = $signature ;
	$header_params = http_build_query( $params_c , '' , ',' ) ;

	$context = array(
		'http' => array(
			'method' => $request_method ,
			'header' => array(
				'Authorization: OAuth ' . $header_params ,
			) ,
			'content' => $request_body ,
		) ,
	) ;

	if ( $request_headers ) {
		$context['http']['header'] = array_merge( $context['http']['header'], $request_headers ) ;
	}

	if( $request_method == "GET" ) {
		$request_url .= '?' . http_build_query( $params_a ) ;
	}

	$curl = curl_init() ;
	curl_setopt( $curl, CURLOPT_URL , $request_url ) ;
	curl_setopt( $curl, CURLOPT_HEADER, true ) ; 
	curl_setopt( $curl, CURLOPT_CUSTOMREQUEST , $context['http']['method'] ) ;
	curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER , false ) ;
	curl_setopt( $curl, CURLOPT_RETURNTRANSFER , true ) ;
	curl_setopt( $curl, CURLOPT_HTTPHEADER , $context['http']['header'] ) ;
	if ( isset($context['http']['content']) ) {
		curl_setopt( $curl, CURLOPT_POSTFIELDS , $context['http']['content'] ) ;
	}
	curl_setopt( $curl, CURLOPT_TIMEOUT, 5 ) ;
	$res1 = curl_exec( $curl ) ;
	$res2 = curl_getinfo( $curl ) ;
	curl_close( $curl ) ;

	$response_body = substr( $res1, $res2['header_size'] ) ;
	$response_header = substr( $res1, 0, $res2['header_size'] ) ;

	return [ $response_body, $response_header ] ;
}

デモを開く