Buffer APIの使い方まとめ (サンプルコード付き)

Buffer APIの使い方まとめ (サンプルコード付き)

TwitterやFacebook、Google+にスケジュール投稿したり、クリック率を分析できるウェブサービス、「Buffer」。今回はBufferのAPIを使って、スケジュールを設定したり、投稿したりする方法を説明します。このAPIの魅力をズバリ言うと、このAPIの仕様1つ覚えるだけで、Twitter、Facebook、Google+に投稿できることです。

アプリケーションの登録

BufferのAPIを利用するために、まずはアプリケーションを作成しましょう。この章では、アプリケーションを作成する方法を説明します。

ユーザーアカウントの取得

Bufferでアプリケーションを作成してAPIを利用するためには、ユーザーアカウントを所有している必要があります。まだ取得していない人は、登録作業を行なって下さい。なお、アカウント登録後は、メールアドレスを登録しておくことを忘れないようにして下さい。アプリケーションキーの一部をメールで受け取ることになります。

アプリケーションの作成

「Create An App」をクリックする
「Create An App」をクリックする

BufferのDevelopersページにアクセスしたら、上部にある「Create An App」のボタンをクリックして下さい。

アプリケーションの情報を入力する
アプリケーションの情報を入力する

アプリケーションの登録フォームが出てきます。図を参考に、アプリケーションの情報を入力して下さい。「Callback URL」は入力必須です。これは、ユーザーのアクセストークンを取得する際の、認証画面からの戻り先となるURLアドレスです。Bufferの場合、開発者のアクセストークンは最初から認証作業なしに調べることができるため、多くの人はこの「Callback URL」を利用することがないかもしれません。それでも、何らかのURLを入力しておきましょう。最後に「Create Application」をクリックして下さい。

キーを確認する
キーを確認する

入力内容に問題がなければ、アプリケーションが作成され、アプリケーションの一覧画面に移動します。ここで、アプリケーションキー(Client ID)とシークレット(Client Secret)、アクセストークン(Access Token)を確認することができます。シークレットは、Bufferに登録しているメールアドレス宛てに届いているので、そちらを確認して下さい。これらは他人には知られないように、ご注意下さい。

アプリケーションの管理

「Registed Apps」をクリックする
「Registed Apps」をクリックする

アプリケーションの登録情報を編集するには、Buffer Developersのページにアクセスし、左メニューにある「Registed Apps」という項目をクリックして下さい。作成してあるアプリケーションの一覧が表示され、名前の右側にある「Edit App」のボタンから、編集することができます。ただし、アプリケーションを削除する項目が見当たりませんでした。これに関しては、メールなどでBufferの運営に依頼する必要がありそうです。

アクセストークンの取得

さて、開発者自身のアクセストークンは、アプリケーションの情報を参照することで、簡単に知ることができました。しかし、ウェブサービスを運営する上で、他ユーザーのアクセストークンが必要になってくる場面があるかもしれません。この章では、Buffer APIでアクセストークンを取得する方法を説明します。

アクセストークンを取得するには?

アクセストークンを取得するには、ユーザーによる認証作業が必要です。Twitterなどで占いアプリとかを利用する際に訪れる認証画面を想像して下さい。ユーザーが、その認証画面で、あなたのアプリケーションが自分のプライベートなデータにアクセスしたり、自分のユーザーデータを変更したりするのを、許可することで、初めてアクセストークンが発行されます。この章で作成する認証用プログラムは、これら一連のユーザーの行動を補助する形の内容となります。

アクセストークン発行の流れ

Bufferは、OAuth2.0という認証形式を採用しています。この技術的な仕様は、文章を読むよりも、プログラムを書いて、自分で体験してみることの方が、理解を助けるはずです。主な流れは次の通りとなります。

  1. ユーザーを、Bufferのサーバー上にある認証画面に移動させる。
  2. ユーザーが認証画面で、あなたのアプリケーションを承認する。
  3. 戻ってきたユーザーからコードを受け取り、そのコードを元に、Bufferにリクエストを送り、アクセストークンを取得する。

プログラミング

Callback URIの設定

アプリケーション情報の「Callback URL」の欄には、この章で作成するプログラムの設置先となるURLアドレスを設定して下さい。認証画面で作業を終えたユーザーが、このプログラムにリダイレクトで戻って来ることになります。

ユーザーを認証画面に移動させる

それでは、プログラムを作成しましょう。まずは、ユーザーを、Bufferが指定したパラメータを付けた上で、認証画面となるURLアドレスに移動させます。

https://bufferapp.com/oauth2/authorize?client_id={アプリケーションキー}&response_type=code&redirect_uri={リダイレクトURI}

PHPでは、次のようになります。

PHP

<?php

	// 設定
	$client_id = '' ;			// クライアントID (Client ID)
	$client_secret = '' ;			// クライアントシークレット (Client Secret)
	$callback_uri = '' ;		// コールバックURL (Callback URI)

	// ユーザーを認証画面に移動させる
	header( 'Location: https://bufferapp.com/oauth2/authorize?client_id=' . $client_id . '&response_type=code&redirect_uri=' . rawurlencode( $callback_uri ) ) ;

このコードの動作を確認する

ユーザーが認証作業を行なう

Bufferの認証画面
Bufferの認証画面

ユーザーは、リダイレクトされて、図のような、Bufferのサーバー上にある認証画面に移動します。ここで、あなたのアプリケーションと自分のユーザーアカウントを連携することを許可するか、拒否するかを選択することになります。

認証を終えたユーザーが戻ってくる

認証作業を終えたユーザーが、アプリケーション連携を許可した場合と、拒否した場合とで、違ったパラメータを付けて戻ってきます。戻り先は、アプリケーション情報で「Callback URL」に指定したURLアドレスです。下記は「拒否」の場合です。errorというパラメータを持っています。

GET https://example.com/myscript.php?state=&error=access_denied

下記は「許可」の場合です。codeというパラメータを持っていますね。このコードの値は、この後、Bufferにアクセストークンの発行をリクエストする処理において必要です。

GET https://example.com/myscript.php?state=&code=1%2Fdc0c46d5c1d2d858f5ed6a9defcd79eb

errorcodeに注目することで、単純に、ユーザーが「許可」をしたのか、「拒否」をしたのかを判別することができますね。

PHP

<?php

	// 「許可」の場合
	if( isset( $_GET['code'] ) && !empty( $_GET['code'] ) && is_string( $_GET['code'] ) )
	{
		// アクセストークンの取得に利用するコード
		$code = $_GET['code'] ;
	}

	// 「拒否」の場合
	elseif( isset( $_GET['error'] ) )
	{
		// 「許可」してくれなかったことに文句を言う
		echo 'なんで「許可」してくれなかったんですか!?' ;
	}

アクセストークンを取得する

アプリケーション連携を許可したユーザーから受け取ったcodeの値を使って、Bufferにアクセストークンの発行をリクエストします。下記URLに、POSTメソッドでリクエストを送ります。

POST https://api.bufferapp.com/1/oauth2/token.json

下記パラメータを、リクエストボディに指定します。

client_id
クライアントキー。
client_secret
クライアントシークレット。
redirect_uri
コールバックURL。
code
受け取ったコード。
grant_type
必ず、authorization_codeを指定する。

リクエストが成功すると、アクセストークンが発行され、下記の返り値(JSON)を受け取ります。access_tokenの中身が、この章の目的としているアクセストークンです。

JSON

{"access_token": "1/a22abff3fb1541ac7f826d8ae2ffa32eb","scope": null}

PHPでアクセストークンを受け取る方法は、下記の通りです。ここではブラウザに出力していますが、通常はデータベースに保存したり、そのまま次の処理へ進んだりという流れになると思います。

PHP

	// リクエストボディ
	$params = array(
		'client_id' => '' ,		// クライアントID
		'client_secret' => '' ,		// クライアントシークレット
		'redirect_uri' => '' ,		// コールバックURI
		'code' => $_GET['code'] ,		// 受け取ったコード
		'grant_type' => 'authorization_code' ,
	) ;

	// リクエスト用のコンテキスト
	$context = array(
		'http' => array(
			'method' => 'POST' ,
			'content' => http_build_query( $params ) ,
		)
	) ;

	// cURLでリクエスト
	$curl = curl_init() ;
	curl_setopt( $curl , CURLOPT_URL , 'https://api.bufferapp.com/1/oauth2/token.json' ) ;
	curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; 
	curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $context['http']['method'] ) ;			// メソッド
	curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ;								// 証明書の検証を行わない
	curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ;								// curl_execの結果を文字列で返す
	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 ) ;

	// 取得したデータ
	$json = substr( $res1, $res2['header_size'] ) ;										// 取得したデータ(JSONなど)
	$header = substr( $res1, 0, $res2['header_size'] ) ;								// レスポンスヘッダー (検証に利用したい場合にどうぞ)

	// JSONをオブジェクト型に変換する
	$obj = json_decode( $json ) ;

	// アクセストークンを[$access_token]に代入する
	$access_token = $obj->access_token ;

	// アクセストークンをブラウザに出力する
	echo $access_token ;

サンプルプログラム

Buffer APIを使ってアクセストークンを取得するためのサンプルプログラムです。エラー処理など、最低限のことしかしていないため、「とりあえず動作確認をしたい」「流れを知りたい」という用途でお使い下さいね。

PHP

<?php

	// 設定
	$client_id = '' ;			// クライアントID (Client ID)
	$client_secret = '' ;			// クライアントシークレット (Client Secret)
	$callback_uri = '' ;		// コールバックURL (Callback URI)

	// HTML用
	$html = '' ;

	// 実行結果
	$html .= '<h2>実行結果</h2>' ;

	// 「許可」の場合
	if( isset( $_GET['code'] ) && !empty( $_GET['code'] ) && is_string( $_GET['code'] ) )
	{
		// リクエストボディ
		$params = array(
			'client_id' => $client_id ,
			'client_secret' => $client_secret ,
			'redirect_uri' => $callback_uri ,
			'code' => $_GET['code'] ,
			'grant_type' => 'authorization_code' ,
		) ;

		// リクエスト用のコンテキスト
		$context = array(
			'http' => array(
				'method' => 'POST' ,
				'content' => http_build_query( $params ) ,
			)
		) ;

		// cURLでリクエスト
		$curl = curl_init() ;
		curl_setopt( $curl , CURLOPT_URL , 'https://api.bufferapp.com/1/oauth2/token.json' ) ;
		curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; 
		curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , $context['http']['method'] ) ;			// メソッド
		curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ;								// 証明書の検証を行わない
		curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ;								// curl_execの結果を文字列で返す
		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 ) ;

		// 取得したデータ
		$json = substr( $res1, $res2['header_size'] ) ;										// 取得したデータ(JSONなど)
		$header = substr( $res1, 0, $res2['header_size'] ) ;								// レスポンスヘッダー (検証に利用したい場合にどうぞ)

		// JSONをオブジェクト型に変換する
		$obj = json_decode( $json ) ;

		// エラー判定
		if( !isset( $obj->access_token ) )
		{
			// アクセストークンが取得できなかった
			$error = 'アクセストークンを上手く取得できませんでした…' ;
		}
		else
		{
			// アクセストークンを[$access_token]に代入する
			$access_token = $obj->access_token ;

			// HTMLで出力する
			$html .= '<dl>' ;
			$html .= 	'<dt>アクセストークン</dt>' ;
			$html .= 		'<dd>' . $access_token . '</dd>' ;
			$html .= '</dl>' ;
		}
	}

	// 「拒否」の場合
	elseif( isset( $_GET['error'] ) )
	{
		// 「許可」してくれなかったことに文句を言う
		$error = 'なんで「許可」してくれなかったんですか!?' ;
	}

	// 初回アクセスの場合
	else
	{
		// ユーザーを認証画面に移動させる
		header( 'Location: https://bufferapp.com/oauth2/authorize?client_id=' . $client_id . '&response_type=code&redirect_uri=' . rawurlencode( $callback_uri ) ) ;
	}

	// エラーの場合
	if( isset( $error ) && !empty( $error ) )
	{
		$html = '<p><mark>' . $html . '</mark>もう一度、認証をするには、<a href="' . explode( '?' , $_SERVER['REQUEST_URI'] )[0] . '">こちら</a>をクリックして下さい。</p>' ;
	}

	// 取得したデータ
	$html .= '<h2>取得したデータ</h2>' ;
	$html .= '<p>下記のデータを取得できました。</p>' ;
	$html .= 	'<h3>JSON</h3>' ;
	$html .= 	'<p><textarea rows="8">' . $json . '</textarea></p>' ;
	$html .= 	'<h3>レスポンスヘッダー</h3>' ;
	$html .= 	'<p><textarea rows="8">' . $header . '</textarea></p>' ;

?>

<?php
	// ブラウザに[$html]を出力 (HTMLのヘッダーとフッターを付けましょう)
	echo $html ;
?>

このコードの動作を確認する

SNSアカウント情報の取得

アプリケーションの作成、アクセストークンの取得ができたら、APIの各エンドポイントにリクエストを送り、色々とデータを取得してみましょう。まずは、Bufferで連携している、各SNSアカウントの情報を取得してみます。

リクエスト方法

下記URLにGETメソッドでリクエストを送って下さい。基本的に全てのSNSアカウントの情報を取得できますが、URLに、SNSアカウント用のIDを含めることで、そのアカウントの情報のみを取得することができます。さらに、/schedulesを付けることで、投稿スケジュールのデータを示すschedulesプロパティに絞って取得することもできます。

全アカウントの情報を取得

GET https://api.bufferapp.com/1/profiles.json

特定のアカウントの情報を取得

GET https://api.bufferapp.com/1/profiles/{SNSのID}.json

特定のアカウントのスケジュール情報だけを取得

GET https://api.bufferapp.com/1/profiles/{SNSのID}/schedules.json

パラメータ

オプションパラメータはありません。アクセストークンのみを指定して下さい。

access_token
アクセストークン。

取得できるJSON

リクエストに成功すると、下記構造のJSONを取得することができます。「Twitter」「Facebook」「Google+」「App.net」と連携している場合です。SNSアカウントを指定して、1つだけ取得した場合は、配列ではない点にご注意下さい。

JSON

[{"_id":"5471d00fca241c9558f81993","avatar":"https:\/\/lh4.googleusercontent.com\/-E1HV1Swm-7Q\/AAAAAAAAAAI\/AAAAAAAAAAw\/SQuMHLKf-V4\/photo.jpg?sz=50","avatar_https":"https:\/\/lh4.googleusercontent.com\/-E1HV1Swm-7Q\/AAAAAAAAAAI\/AAAAAAAAAAw\/SQuMHLKf-V4\/photo.jpg?sz=50","counts":{"daily_suggestions":25,"drafts":0,"pending":0,"sent":71},"cover_photo":"https:\/\/d3ijcis4e2ziok.cloudfront.net\/default-cover-photos\/blurry-blue-background-iii_facebook_timeline_cover.jpg","default":true,"disabled_features":[],"disconnected":null,"formatted_service":"Google+ Page","formatted_username":"SyncerJP","has_used_suggestions":false,"id":"5471d00fca241c9558f81993","schedules":[{"days":["sun","mon","tue","wed","thu","fri","sat"],"times":["00:00","00:15","00:30","00:45","01:00","01:15","01:30","01:45","02:00","02:15","02:30","02:45","03:00","03:15","03:30","03:45","04:00","04:15","04:30","04:45","05:00","05:15","05:30","05:45","06:00","06:15","06:30","06:45","07:00","07:15","07:30","07:45","08:00","08:15","08:30","08:45","09:00","09:15","09:30","09:45","10:00","10:15","10:30","10:45","11:00","11:15","11:30","11:45","12:00","12:15","12:30","12:45","13:00","13:15","13:30","13:45","14:00","14:15","14:30","14:45","15:00","15:15","15:30","16:00","16:15","16:30","16:45","17:00","17:15","17:30","17:45","18:00","18:15","18:30","18:45","19:00","19:15","19:30","19:45","20:00","20:15","20:30","20:45","21:00","21:15","21:30","21:45","22:00","22:15","22:30","22:45","23:00","23:15","23:30","23:45","45:45"]}],"service":"google","service_id":"103134813331235422103","service_type":"page","service_username":"SyncerJP","shortener":{"domain":"buff.ly"},"statistics":{"plusOnes":0},"timezone":"Asia\/Tokyo","timezone_city":"Tokyo - Japan","user_id":"54721387f5ff80f86cb5c4ea","utm_tracking":"enabled","verb":"post"},{"_id":"54721388f5ff80f86cb5c4ed","avatar":"http:\/\/pbs.twimg.com\/profile_images\/510438057967767552\/qao7U2US_normal.png","avatar_https":"https:\/\/pbs.twimg.com\/profile_images\/510438057967767552\/qao7U2US_normal.png","counts":{"daily_suggestions":25,"pending":0,"sent":0},"cover_photo":"https:\/\/d3ijcis4e2ziok.cloudfront.net\/default-cover-photos\/blurry-blue-background-iii_facebook_timeline_cover.jpg","default":true,"disabled_features":[],"disconnected":null,"formatted_service":"Twitter","formatted_username":"@arayutw","has_used_suggestions":false,"id":"54721388f5ff80f86cb5c4ed","schedules":[{"days":["mon","tue","wed","thu","fri","sat","sun"],"times":["09:26","13:17","18:30","19:42"]}],"service":"twitter","service_id":"1528352858","service_type":"profile","service_username":"arayutw","shortener":{"domain":"buff.ly"},"statistics":{"followers":577},"timezone":"Asia\/Tokyo","user_id":"54721387f5ff80f86cb5c4ea","utm_tracking":"enabled","verb":"tweet"},{"_id":"547213dcf5ff80b170b5c4d1","avatar":"https:\/\/fbcdn-profile-a.akamaihd.net\/hprofile-ak-xpa1\/v\/t1.0-1\/p50x50\/1743487_760216590706648_5486468803111783909_n.png?oh=ad9901eefc737b158379f99d332a757c&oe=5531505B&__gda__=1429132168_20a655384c851b38b1d7244b09302b9c","avatar_https":"https:\/\/fbcdn-profile-a.akamaihd.net\/hprofile-ak-xpa1\/v\/t1.0-1\/p50x50\/1743487_760216590706648_5486468803111783909_n.png?oh=ad9901eefc737b158379f99d332a757c&oe=5531505B&__gda__=1429132168_20a655384c851b38b1d7244b09302b9c","counts":{"daily_suggestions":25,"drafts":0,"pending":1,"sent":70},"cover_photo":"https:\/\/d3ijcis4e2ziok.cloudfront.net\/default-cover-photos\/blurry-blue-background-iii_facebook_timeline_cover.jpg","default":true,"disabled_features":[],"disconnected":null,"formatted_service":"Facebook Page","formatted_username":"Syncer - \u30b7\u30f3\u30ab\u30fc","has_used_suggestions":false,"id":"547213dcf5ff80b170b5c4d1","schedules":[{"days":["sun","mon","tue","wed","thu","fri","sat"],"times":["00:00","00:15","00:30","00:45","01:00","01:15","01:30","01:45","02:00","02:15","02:30","02:45","03:00","03:15","03:30","03:45","04:00","04:15","04:30","04:45","05:00","05:15","05:30","05:45","06:00","06:15","06:30","06:45","07:00","07:15","07:30","07:45","08:00","08:15","08:30","08:45","09:00","09:15","09:30","09:45","10:00","10:15","10:30","10:45","11:00","11:15","11:30","11:45","12:00","12:15","12:30","12:45","13:00","13:15","13:30","13:45","14:00","14:15","14:30","14:45","15:00","15:15","15:30","16:00","16:15","16:30","16:45","17:00","17:15","17:30","17:45","18:00","18:15","18:30","18:45","19:00","19:15","19:30","19:45","20:00","20:15","20:30","20:45","21:00","21:15","21:30","21:45","22:00","22:15","22:30","22:45","23:00","23:15","23:30","23:45","45:45"]}],"service":"facebook","service_id":"607698112625164","service_type":"page","service_username":"Syncer - \u30b7\u30f3\u30ab\u30fc","shortener":{"domain":"buff.ly"},"statistics":{"impressions_28":12,"likes":97,"negative_feedback_28":0,"negative_feedback_per_impression_28":0},"timezone":"Asia\/Tokyo","timezone_city":"Tokyo - Japan","user_id":"54721387f5ff80f86cb5c4ea","utm_tracking":"enabled","verb":"post"},{"_id":"5475aaf05c8b2d44220f0a94","avatar":"https:\/\/d2rfichhc2fb9n.cloudfront.net\/image\/5\/ZfPcwXpWBRA1DzluRUOKelvW6Kt7InMiOiJzMyIsImIiOiJhZG4tdXNlci1hc3NldHMiLCJrIjoiYXNzZXRzL3VzZXIvZjAvNTMvYTAvZjA1M2EwMDAwMDAwMDAwMC5wbmciLCJvIjoiIn0","avatar_https":"https:\/\/d2rfichhc2fb9n.cloudfront.net\/image\/5\/ZfPcwXpWBRA1DzluRUOKelvW6Kt7InMiOiJzMyIsImIiOiJhZG4tdXNlci1hc3NldHMiLCJrIjoiYXNzZXRzL3VzZXIvZjAvNTMvYTAvZjA1M2EwMDAwMDAwMDAwMC5wbmciLCJvIjoiIn0","counts":{"daily_suggestions":25,"pending":0,"sent":62,"drafts":0},"cover_photo":"https:\/\/d3ijcis4e2ziok.cloudfront.net\/default-cover-photos\/blurry-blue-background-iii_facebook_timeline_cover.jpg","default":true,"disabled_features":[],"disconnected":null,"formatted_service":"App.net","formatted_username":"syncerjp","has_used_suggestions":false,"id":"5475aaf05c8b2d44220f0a94","schedules":[{"days":["sun","mon","tue","wed","thu","fri","sat"],"times":["00:00","00:15","00:30","00:45","01:00","01:15","01:30","01:45","02:00","02:15","02:30","02:45","03:00","03:15","03:30","03:45","04:00","04:15","04:30","04:45","05:00","05:15","05:30","05:45","06:00","06:15","06:30","06:45","07:00","07:15","07:30","07:45","08:00","08:15","08:30","08:45","09:00","09:15","09:30","09:45","10:00","10:15","10:30","10:45","11:00","11:15","11:30","11:45","12:00","12:15","12:30","12:45","13:00","13:15","13:30","13:45","14:00","14:15","14:30","14:45","15:00","15:15","15:30","16:00","16:15","16:30","16:45","17:00","17:15","17:30","17:45","18:00","18:15","18:30","18:45","19:00","19:15","19:30","19:45","20:00","20:15","20:30","20:45","21:00","21:15","21:30","21:45","22:00","22:15","22:30","22:45","23:00","23:15","23:30","23:45","45:45"]}],"service":"appdotnet","service_id":"309374","service_type":"profile","service_username":"syncerjp","shortener":{"domain":"buff.ly"},"statistics":{"followers":0},"timezone":"Asia\/Tokyo","user_id":"54721387f5ff80f86cb5c4ea","utm_tracking":"enabled","verb":"post"}]

各プロパティの説明

JSONの主な項目の説明は下記の通りです。

id
Buffer内で管理している、SNSアカウント用のID。他のエンドポイントで利用することになる。
service_id
そのSNSの、アカウントID。
user_id
Bufferの、ユーザーID。
avatar
アバター画像のURL。
counts
投稿待ちなどの、数の情報。
service
SNSの名前(コード)。
formatted_service
SNSの名称(表示用)。
formatted_username
SNSで利用されているユーザー名。
service_username
SNSで利用されているユーザー名(スクリーンネームなど)。
service_type
コンテンツの種類。例えば、Facebookだったら、ユーザーなのか、ページなのか。
shortener
短縮URLのドメイン。
statistics
統計情報。
timezone
タイムゾーンの情報

サンプルプログラム

Buffer APIを利用して、各SNSのアカウント情報を取得するサンプルプログラムです。デモは、あなたのBufferアカウントの情報を取得するため、アプリケーションの連携を許可する必要があります。ご利用後は、連携を解除するのを忘れないで下さいねっ。

PHP

<?php

	// アクセストークン
	$access_token = '' ;

	// 設定項目
	$params = array(
		'access_token' => $access_token ,	// アクセストークン
	) ;

	// リクエストURL
	$request_url = 'https://api.bufferapp.com/1/profiles.json' . '?' . http_build_query( $params ) ;

	// cURLでリクエスト
	$curl = curl_init() ;
	curl_setopt( $curl , CURLOPT_URL , $request_url ) ;
	curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; 
	curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ;
	curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ;
	curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ;
	$res1 = curl_exec( $curl ) ;
	$res2 = curl_getinfo( $curl ) ;
	curl_close( $curl ) ;

	// 取得したデータ
	$json = substr( $res1, $res2['header_size'] ) ;			// 取得したデータ(JSONなど)
	$header = substr( $res1, 0, $res2['header_size'] ) ;		// レスポンスヘッダー (検証に利用したい場合にどうぞ)

	// HTML用
	$html = '' ;

	// JSONデータをオブジェクト形式に変換する
	$obj = json_decode( $json ) ;

	// 実行結果の出力
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj )
	{
		$html .= '<p>データを取得できませんでした…。設定を再確認して下さい。</p>' ;
	}
	else
	{
		// インフォメーション
		$html .= '<p>下記のSNSアカウントの情報を取得いたしました。</p>' ;

		// 解析
		foreach( $obj as $item )
		{
			// 各データの整理
			$id = $item->id ;		// SNSのID
			$avatar_https = $item->avatar_https ;		// アバター画像のURL
			$formatted_service = $item->formatted_service ;		// サービス名称
			$service_username = $item->service_username ;		// SNSで使ってるユーザー名

			// ブラウザに出力
			$html .= '<dl>' ;
			$html .= 	'<dt>SNSのID</dt>' ;
			$html .= 		'<dd>' . $id . '</dd>' ;
			$html .= 	'<dt>SNSのサービス名</dt>' ;
			$html .= 		'<dd>' . $formatted_service . '</dd>' ;
			$html .= 	'<dt>SNSのユーザー名</dt>' ;
			$html .= 		'<dd>' . $service_username . '</dd>' ;
			$html .= 	'<dt>アバター画像</dt>' ;
			$html .= 		'<dd><img class="_img" src="' . $avatar_https . '" width="auto" height="50"></dd>' ;

			// スケジュール
			if( isset( $item->schedules ) && !empty( $item->schedules ) )
			{
				// HTML出力
				$html .= 	'<dt>スケジュール</dt>' ;
				$html .= 		'<dd>' ;
				$html .= 			'<dl>' ;

				// 解析
				for( $i=0,$l=count($item->schedules) ; $l>$i ; $i++ )
				{
					// 曜日
					if( isset( $item->schedules[$i]->days ) )
					{
						$html .= '<dt>曜日(' . ( $i + 1 ) . ')</dt>' ;
						$html .= '<dd>' . implode( ',' , $item->schedules[$i]->days ) . '</dd>' ;
					}

					// 時間
					if( isset( $item->schedules[$i]->times ) )
					{
						$html .= '<dt>投稿時間(' . ( $i + 1 ) . ')</dt>' ;
						$html .= '<dd>' . implode( ',' , $item->schedules[$i]->times ) . '</dd>' ;
					}
				}

				$html .= 			'</dl>' ;
				$html .= 		'</dd>' ;
			}

			$html .= '</dl>' ;
		}
	}

	// 取得したデータ
	$html .= '<h2>取得したデータ</h2>' ;
	$html .= '<p>下記のデータを取得できました。</p>' ;
	$html .= 	'<h3>JSON</h3>' ;
	$html .= 	'<p><textarea rows="8">' . $json . '</textarea></p>' ;
	$html .= 	'<h3>レスポンスヘッダー</h3>' ;
	$html .= 	'<p><textarea rows="8">' . $header . '</textarea></p>' ;

	// アプリケーション連携の解除
	$html .= '<h2>アプリケーション連携の解除</h2>' ;
	$html .= '<p>このアプリケーションとの連携は、下記設定ページで解除することができます。</p>' ;
	$html .= '<p><a href="https://buffer.com/app/account/apps" target="_blank">https://buffer.com/app/account/apps</a></p>' ;

?>

<?php
	// ブラウザに[$html]を出力 (HTMLのヘッダーとフッターを付けましょう)
	echo $html ;
?>

このコードの動作を確認する

スケジュールを登録する

Buffer APIを利用して、各SNSアカウントの投稿スケジュールを登録(更新)することができます。この章では、その説明をしていきます。

リクエスト方法

下記URLにPOSTメソッドでリクエストを送ります。Bufferで管理しているSNSのIDの指定が必要です。

POST https://api.bufferapp.com/1/profiles/{対象SNSのID}/schedules/update.json

SNSのIDですが、基本的にはAPIを利用して取得するのですが、Bufferのウェブサイトの、各SNSの投稿画面のURLアドレスから調べることもできます。手っ取り早くIDを調べたい場合はこちらからどうぞ。下記のURLの場合、このSNSのIDは54721388f5ff80f86cb5c4edということになります。

https://bufferapp.com/app/profile/54721388f5ff80f86cb5c4ed/buffer/queue

パラメータ

なかなか慣れない人もいるかもしれませんが、パラメータは配列で送信します。といっても、パラメータ名を配列にすればいいだけです。Bufferの場合、プレミアムアカウントだと、複数パターンのスケジューリングができます。その場合は、schedules[0]schedules[1]というように分けます。1つのスケジュールの中で、例えば複数の曜日を指定するには、schedules[0][days][0]schedules[0][days][1]というように指定していきます。

schedules[n][days][n]
投稿する曜日。
sun … 日曜日。
mon … 月曜日。
tue … 火曜日。
wed … 水曜日。
thu … 木曜日。
fri … 金曜日。
sat … 土曜日。
schedules[n][times][n]
投稿する時間。HH:MMの文字列で指定する。

例えば、月曜、火曜の、12:00、13:00、14:00というスケジュールを投稿したい場合のパラメータは次の通りになります。

schedules[0][days][0]=mon&schedules[0][days][1]=tue&schedules[0][times][0]=12:00&schedules[0][times][1]=13:00&schedules[0][times][2]=14:00

取得できるJSON

リクエスト成功時に取得できるのは、下記のように結果のみのJSONです。なので、内容を確認するには、リクエスト後に管理画面を確認するか、または別途、SNSのアカウント情報を取得する必要があります。

JSON

{"success": true,"message": "Schedule saved successfully"}

サンプルプログラム

この章の内容を踏まえた、Buffer APIを通じてスケジュールを更新するサンプルプログラムです。複数種類のスケジュール更新には対応していないので、プレミアムアカウントの人は、カスタマイズしてご利用下さい。デモでは実際に、あなたのBufferアカウントの、Twitterのスケジュールを、「毎日」「30分ごとに48回」という内容に変更します。BufferをTwitterアカウントと連携していない人はご利用いただけません。ご利用後は、連携を解除して下さい。

PHP

<?php

	// アクセストークン
	$access_token = '' ;

	// SNSのID
	$sns_id = '' ;

	// 登録する曜日
	$days = array( 'sun' , 'mon' , 'tue' , 'wed' , 'thu' , 'fri' , 'sat' , ) ;

	// 登録する時間
	$times = array( '00:00' , '00:30' , '01:00' , '01:30' , '02:00' , '02:30' , '03:00' , '03:30' , '04:00' , '04:30' , '05:00' , '05:30' , '06:00' , '06:30' , '07:00' , '07:30' , '08:00' , '08:30' , '09:00' , '09:30' , '10:00' , '10:30' , '11:00' , '11:30' , '12:00' , '12:30' , '13:00' , '13:30' , '14:00' , '14:30' , '15:00' , '15:30' , '16:00' , '16:30' , '17:00' , '17:30' , '18:00' , '18:30' , '19:00' , '19:30' , '20:00' , '20:30' , '21:00' , '21:30' , '22:00' , '22:30' , '23:00' , '23:30' ) ;

	// 設定項目
	$params = array(
		'access_token' => $access_token ,	// アクセストークン
	) ;

	// 曜日と時間をまとめてパラメータに追加する
	foreach( array( 'days' , 'times' ) as $val )
	{
		if( isset( ${ $val } ) && !empty( ${ $val } ) )
		{
			for( $i=0,$l=count( ${ $val } ) ; $l > $i ; $i++ )
			{
				$params[ 'schedules[0][' . $val . '][' . $i . ']' ] = ${ $val }[ $i ] ;
			}
		}
	}

	// リクエストURL
	$request_url = 'https://api.bufferapp.com/1/profiles/' . $sns_id . '/schedules/update.json' ;

	// cURLでリクエスト
	$curl = curl_init() ;
	curl_setopt( $curl , CURLOPT_URL , $request_url ) ;
	curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , 'POST' ) ;
	curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; 
	curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ;
	curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ;
	curl_setopt( $curl , CURLOPT_POSTFIELDS , http_build_query( $params ) ) ;
	curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ;
	$res1 = curl_exec( $curl ) ;
	$res2 = curl_getinfo( $curl ) ;
	curl_close( $curl ) ;

	// 取得したデータ
	$json = substr( $res1, $res2['header_size'] ) ;			// 取得したデータ(JSONなど)
	$header = substr( $res1, 0, $res2['header_size'] ) ;		// レスポンスヘッダー (検証に利用したい場合にどうぞ)

	// HTML用
	$html = '' ;

	// JSONデータをオブジェクト形式に変換する
	$obj = json_decode( $json ) ;

	// 実行結果の出力
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj )
	{
		$html .= '<p>リクエストに失敗してしまいました…。設定をご確認下さい。</p>' ;
	}
	else
	{
		// インフォメーション
		$html .= '<p>リクエストの結果は次の通りです。</p>' ;

		// 各データの整理
		$success = $obj->success ;		// 成功判定
		$message = $obj->message ;		// メッセージ

		// ブラウザに出力
		$html .= '<dl>' ;
		$html .= 	'<dt>成功判定</dt>' ;
		$html .= 		'<dd>' . ( ( $success ) ? 'true' : 'false' ) . '</dd>' ;
		$html .= 	'<dt>メッセージ</dt>' ;
		$html .= 		'<dd><mark>' . $message . '</mark></dd>' ;
		$html .= '</dl>' ;
	}

	// 取得したデータ
	$html .= '<h2>取得したデータ</h2>' ;
	$html .= '<p>下記のデータを取得できました。</p>' ;
	$html .= 	'<h3>JSON</h3>' ;
	$html .= 	'<p><textarea rows="8">' . $json . '</textarea></p>' ;
	$html .= 	'<h3>レスポンスヘッダー</h3>' ;
	$html .= 	'<p><textarea rows="8">' . $header . '</textarea></p>' ;

	// アプリケーション連携の解除
	$html .= '<h2>アプリケーション連携の解除</h2>' ;
	$html .= '<p>このアプリケーションとの連携は、下記設定ページで解除することができます。</p>' ;
	$html .= '<p><a href="https://buffer.com/app/account/apps" target="_blank">https://buffer.com/app/account/apps</a></p>' ;

?>

<?php
	// ブラウザに[$html]を出力 (HTMLのヘッダーとフッターを付けましょう)
	echo $html ;
?>

このコードの動作を確認する

エントリーを新規登録する

今度は、Buffer APIを利用して、新しくエントリー(投稿)を登録してみましょう。スケジュールに従って投稿されるエントリー一覧に追加するか、または、リクエストしたと同時に投稿をすることが可能です。

リクエスト方法

下記URLにPOSTメソッドでリクエストを送ります。

POST https://api.bufferapp.com/1/updates/create.json

パラメータ

text
投稿内容のテキスト。
profile_ids[n]
投稿対象となる各SNSのIDを指定する。1つだけ指定するにはprofile_ids[0]で、2つ目以降は、別途profile_ids[1]というパラメータで指定する。
shorten
falseを指定すると、テキスト内のURLに自動でリンクが貼られることがありません。
now
trueを指定すると、リクエストと同時に、投稿が実行されます。
top
trueを指定すると、スケジュールの一番目(次に投稿される)にセットされます。
media
画像のURLを指定すると、その画像が投稿に添付されます。attachmentとセットで指定する必要があります。
attachment
画像のサムネイルのURLを指定します。mediaと同じ内容でもかまいません。mediaとセットで指定する必要があります。
scheduled_at
UNIX TIMESTAMPで日時を指定すると、その日時に直接、投稿予約することができます。スケジュールリストに影響はありません。

取得できるJSON

リクエストが成功した時に取得できるJSONの内容です。updatesには、各SNSに登録されたエントリーの内容が配列形式で含まれます。また、シンプルにリクエストが成功したか否かを判定するにはsuccessを参照すれば大丈夫です。

JSON

{"updates":[{"_id":"54fd14d878207f57668e93d0","clicks_caveat":false,"client_id":"54fc3648b014ef4e7ed9411e","created_at":1425872088,"day":"Today","due_at":1425873048,"due_time":"12:50","id":"54fd14d878207f57668e93d0","media":"http:\/\/syncer.jp\/static\/images\/eyecatch\/post\/buffer-api-matome_product.png","perm_approvable":false,"perm_editable":true,"processing_analytics":false,"profile_id":"54721388f5ff80f86cb5c4ed","profile_service":"twitter","shared_now":"1","status":"buffer","text":"Buffer API\u30d7\u30ed\u30b0\u30e9\u30e0\u306b\u3088\u308b\u6295\u7a3f\u3067\u3059\u3002 \u6295\u7a3f\u5143: http:\/\/buff.ly\/1x7Xh60 \u6295\u7a3f\u6642\u9593: 03\/09 12:34","text_formatted":"Buffer API\u30d7\u30ed\u30b0\u30e9\u30e0\u306b\u3088\u308b\u6295\u7a3f\u3067\u3059\u3002 \u6295\u7a3f\u5143: http:\/\/buff.ly\/1x7Xh60<\/a> \u6295\u7a3f\u6642\u9593: 03\/09 12:34","text_md5":"d28add1bffd2d3c33b67e227f3f46881","type":"link","updated_at":1425872088,"user_id":"54721387f5ff80f86cb5c4ea","via":"api"}],"buffer_percentage":10,"buffer_count":1,"success":true,"message":"Your tweet has been sent!"}

各プロパティの説明

JSONの主な項目の説明は下記の通りです。

updates
登録されたエントリーの内容。
due_at
投稿予定日時のUNIX TIMESTAMP。
shared_now
即時投稿されたか?
text_md5
投稿内容をMD5のハッシュ値に変換したもの。

サンプルプログラム

この章の内容を踏まえて作成した、Buffer APIを使って、新しく投稿をエントリーするサンプルプログラムです。かなり継ぎ接ぎ観がありますが、カスタマイズの下地やパーツとして利用していただけたら、嬉しく思います。デモでは、あなたのBufferアカウントに連携しているTwitterに、実際に即時反映(投稿)されるエントリーを新規登録します。ご利用後にTwitterのタイムラインを確認してみて下さいね。また、アプリケーション連携を解除するのを忘れないようにご注意下さい。

PHP

<?php

	// アクセストークン
	$access_token = '' ;

	// SNSのID
	$sns_id = '' ;

	// 設定項目
	$params = array(
		'access_token' => $access_token ,	// アクセストークン
		'profile_ids[0]' => $sns_id ,		// 投稿するSNS(1つ目)
		'now' => true ,		// 即時投稿するか?
		'shorten' => true ,		// 自動リンクを有効にするか?
		'text' => 'Buffer APIのデモとして投稿いたしました。(' . date( 'm/d H:i' ) . ') 投稿元:https://syncer.jp/buffer-api-matome' ,		// テキスト内容
	) ;

	// リクエストURL
	$request_url = 'https://api.bufferapp.com/1/updates/create.json' ;

	// cURLでリクエスト
	$curl = curl_init() ;
	curl_setopt( $curl , CURLOPT_URL , $request_url ) ;
	curl_setopt( $curl , CURLOPT_CUSTOMREQUEST , 'POST' ) ;
	curl_setopt( $curl , CURLOPT_HEADER, 1 ) ; 
	curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER , false ) ;
	curl_setopt( $curl , CURLOPT_RETURNTRANSFER , true ) ;
	curl_setopt( $curl , CURLOPT_POSTFIELDS , http_build_query( $params ) ) ;
	curl_setopt( $curl , CURLOPT_TIMEOUT , 5 ) ;
	$res1 = curl_exec( $curl ) ;
	$res2 = curl_getinfo( $curl ) ;
	curl_close( $curl ) ;

	// 取得したデータ
	$json = substr( $res1, $res2['header_size'] ) ;			// 取得したデータ(JSONなど)
	$header = substr( $res1, 0, $res2['header_size'] ) ;		// レスポンスヘッダー (検証に利用したい場合にどうぞ)

	// HTML用
	$html = '' ;

	// JSONデータをオブジェクト形式に変換する
	$obj = json_decode( $json ) ;

	// 実行結果の出力
	$html .= '<h2>実行結果</h2>' ;

	// エラー判定
	if( !$obj )
	{
		$html .= '<p>リクエストに失敗してしまいました…。設定をご確認下さい。</p>' ;
	}
	else
	{
		// インフォメーション
		$html .= '<p>リクエストの結果は次の通りです。SNSに投稿されているか、確認してみて下さい。</p>' ;

		// 各データの整理
		$success = $obj->success ;		// 成功判定
		$message = $obj->message ;		// メッセージ

		// ブラウザに出力
		$html .= '<dl>' ;
		$html .= 	'<dt>成功判定</dt>' ;
		$html .= 		'<dd>' . ( ( $success ) ? 'true' : 'false' ) . '</dd>' ;
		$html .= 	'<dt>メッセージ</dt>' ;
		$html .= 		'<dd><mark>' . $message . '</mark></dd>' ;
		$html .= '</dl>' ;
	}

	// 取得したデータ
	$html .= '<h2>取得したデータ</h2>' ;
	$html .= '<p>下記のデータを取得できました。</p>' ;
	$html .= 	'<h3>JSON</h3>' ;
	$html .= 	'<p><textarea rows="8">' . $json . '</textarea></p>' ;
	$html .= 	'<h3>レスポンスヘッダー</h3>' ;
	$html .= 	'<p><textarea rows="8">' . $header . '</textarea></p>' ;

	// アプリケーション連携の解除
	$html .= '<h2>アプリケーション連携の解除</h2>' ;
	$html .= '<p>このアプリケーションとの連携は、下記設定ページで解除することができます。</p>' ;
	$html .= '<p><a href="https://buffer.com/app/account/apps" target="_blank">https://buffer.com/app/account/apps</a></p>' ;

?>

<?php
	// ブラウザに[$html]を出力 (HTMLのヘッダーとフッターを付けましょう)
	echo $html ;
?>

このコードの動作を確認する

ダウンロード

Buffer APIの各エンドポイントにリクエストをするための、各種サンプルプログラムを配布しています。コードや動作の確認などにご利用下さい。

ファイル一覧

SYNCER00324
redirect.php Download
buffer-get-access-token.php Download
get-profiles.php Download
post-schedules.php Download
post-entry.php Download

ファイル名をクリックすると内容を確認できます。「Download Zip」をクリックするとファイル一式をダウンロードできます。

Download Zip