Twitter、Facebookページ、Instagramビジネスアカウントへの自動投稿について、簡単なサンプルコードを作成しました。
※Facebookはページ(個人アカウントではない)、InstagramはそのFacebookページに紐づけられたビジネスアカウントである必要があります。
※2018年8月に、Facebookタイムライン(個人アカウント)へ自動投稿できる機能は廃止されています。
準備
各詳細手順はこの記事では省きます。
- Twitterアカウントの作成
- Twitter developerサイトにて、developer登録、アプリケーションの作成、設定
- Consumer Key(API key), Consumer Secret(API secret)の取得
- TwitterOAuthのインストール:GitHub(https://github.com/abraham/twitteroauth)
サンプルプログラム
Twitterログインを行う⇒成功すると、自動で該当Twitterアカウントに投稿される
login.php
<?php
// twitteroauth の読み込み
require "vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
//Twitterのコンシュマーキー(APIキー)等読み込み
define('TWITTER_API_KEY', '取得したconsumer key'); //Consumer Key (API Key)
define('TWITTER_API_SECRET', '取得したconsumer secret');//Consumer Secret (API Secret)
//コールバックページのURL
define('CALLBACK_URL', 'https://*********/callback.php');
//Twitterからリクエストトークンを取得する
$connection = new TwitterOAuth(TWITTER_API_KEY, TWITTER_API_SECRET);
$request_token = $connection->oauth('oauth/request_token', array('oauth_callback' => CALLBACK_URL));
//リクエストトークンはコールバックページでも利用するためセッションに格納しておく
$_SESSION['oauth_token'] = $request_token['oauth_token'];
$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];
//Twitterの認証画面のURL
$oauthUrl = $connection->url('oauth/authorize', array('oauth_token' => $request_token['oauth_token']));
echo '<a href="' . $oauthUrl . '">Log in with Twitter!</a>';
?>
callback.php
<?php
// twitteroauth の読み込み
require "vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;
//Twitterのコンシュマーキー(APIキー)等読み込み
define('TWITTER_API_KEY', '取得したconsumer key'); //Consumer Key (API Key)
define('TWITTER_API_SECRET', '取得したconsumer secret');//Consumer Secret (API Secret)
session_start();
//リクエストトークンを使い、アクセストークンを取得する
$twitter_connect = new TwitterOAuth(TWITTER_API_KEY, TWITTER_API_SECRET, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
$access_token = $twitter_connect->oauth('oauth/access_token', array('oauth_verifier' => $_GET['oauth_verifier'], 'oauth_token'=> $_GET['oauth_token']));
//アクセストークンからユーザの情報を取得する
$user_connect = new TwitterOAuth(TWITTER_API_KEY, TWITTER_API_SECRET, $access_token['oauth_token'], $access_token['oauth_token_secret']);
$user_info = $user_connect->get('account/verify_credentials');//アカウントの有効性を確認するためのエンドポイント
if(isset($user_info->id_str)){
//画像をアップロードし、画像のIDを取得
$imageId = $user_connect->upload('media/upload', ['media' => 'test.png']);
$tweet = [
'status' =>
'💡ログインに成功しました❗❗' . PHP_EOL .
'' . PHP_EOL .
'✋✨' . PHP_EOL .
'' . PHP_EOL .
'💻https://example.com' . PHP_EOL .
'' . PHP_EOL .
'#test #開発 #プログラミング',
'media_ids' => implode(',', [
$imageId->media_id_string
])
];
$user_connect->post('statuses/update', $tweet);
echo $user_info->name.'さん、ログインに成功しました!';
}else{
echo 'ログイン失敗に失敗しました';
}
?>
Facebook, Instagram
準備
各詳細手順はこの記事では省きます。
- Facebookページ、Instagramアカウントの作成
※Instagramは作成後、設定画面から「プロアカウント」に切り替え必要、FacebookページとInstagramアカウントを紐づける必要あり - Facebook for Developers登録
- アプリケーションの作成、設定
※プロダクトに、「Facebookログイン」「InstagramグラフAPI」を追加 - App ID, App secretの取得
- Facebook SDKのインストール:GitHub(https://github.com/facebookarchive/php-graph-sdk)
実際にコードを書く前に、以下のツールで確認することができます。
グラフAPIエクスプローラ
サンプルプログラム
Facebookログインを行う⇒成功すると、自動で該当Facebookページ、Instagramアカウントに投稿される
login.php
<?php
require_once __DIR__ . "/vendor/autoload.php";
session_start();
$fb = new Facebook\Facebook([
'app_id' => '取得したapp id',
'app_secret' => '取得したapp secret',
'default_graph_version' => 'v2.10',
]);
$helper = $fb->getRedirectLoginHelper();
$permissions = ['email']; // Optional permissions
$loginUrl = $helper->getLoginUrl('https://*******/callback.php', $permissions);
echo '<a href="' . $loginUrl . '">Log in with Facebook!</a>';
?>
callback.php
<?php
require_once __DIR__ . "/vendor/autoload.php";
session_start();
$fb = new Facebook\Facebook([
'app_id' => '取得したapp id',
'app_secret' => '取得したapp secret',
'default_graph_version' => 'v2.10',
]);
$helper = $fb->getRedirectLoginHelper();
try {
$accessToken = $helper->getAccessToken();
} catch(Facebook\Exceptions\FacebookResponseException $e) {
// When Graph returns an error
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
// When validation fails or other local issues
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
if (! isset($accessToken)) {
if ($helper->getError()) {
header('HTTP/1.0 401 Unauthorized');
echo "Error: " . $helper->getError() . "\n";
echo "Error Code: " . $helper->getErrorCode() . "\n";
echo "Error Reason: " . $helper->getErrorReason() . "\n";
echo "Error Description: " . $helper->getErrorDescription() . "\n";
} else {
header('HTTP/1.0 400 Bad Request');
echo 'Bad request';
}
exit;
}
//長期トークンへの変換処理は省略
$_SESSION['fb_access_token'] = (string) $accessToken;
header('Location: index.php');
?>
index.php
<?php
require_once __DIR__ . "/vendor/autoload.php";
session_start();
$fb = new Facebook\Facebook([
'app_id' => '取得したapp id',
'app_secret' => '取得したapp secret',
'default_graph_version' => 'v2.10',
]);
try {
// Returns a `Facebook\FacebookResponse` object
$response = $fb->get('/me?fields=id,name', $_SESSION['fb_access_token']);
} catch(Facebook\Exceptions\FacebookResponseException $e) {
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(Facebook\Exceptions\FacebookSDKException $e) {
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
$user = $response->getGraphUser();
//FBページアクセストークンを取得する
$response = $fb->get('/'.$user['id'].'/accounts', $_SESSION['fb_access_token']);
$result = $response ->getDecodedBody();
$page_id = $result['data'][0]['id'];
$page_access_token = $result['data'][0]['access_token'];
$page_name = $result['data'][0]['name'];
try {
// Returns a `FacebookFacebookResponse` object
$response = $fb->post(
'/'.$page_id.'/feed',
array (
'message' => 'Facebook PHP-sdkのテストです。',
'link' => 'https://developers.facebook.com/docs/'
),
$page_access_token
);
} catch(FacebookExceptionsFacebookResponseException $e) {
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
echo $page_name.'への投稿が完了しました!'. PHP_EOL;
//Instagramプロアカウントを取得する
try {
$response = $fb->get('/'.$page_id.'?fields=instagram_business_account', $_SESSION['fb_access_token']);
$result = $response ->getDecodedBody();
$insta_id = $result['instagram_business_account']['id'];
} catch(FacebookExceptionsFacebookResponseException $e) {
echo 'Graph returned an error: ' . $e->getMessage();
exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
//media create
try {
$response = $fb->post(
'/'.$insta_id.'/media',
array (
'image_url' => 'https://*****/*****.jpg',
'caption' =>
'💡お知らせが更新されました❗❗' . PHP_EOL .
'✋✨' . PHP_EOL .
'' . PHP_EOL .
'#test #開発 #プログラミング'
),
$_SESSION['fb_access_token']
);
$result = $response ->getDecodedBody();
$media_id = $result['id'];
} catch(FacebookExceptionsFacebookSDKException $e) {
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
//media publish
try {
$response = $fb->post(
'/'.$insta_id.'/media_publish',
array (
'creation_id' => $media_id
),
$_SESSION['fb_access_token']
);
} catch(FacebookExceptionsFacebookSDKException $e) {
echo 'Facebook SDK returned an error: ' . $e->getMessage();
exit;
}
echo 'instagramへの投稿が完了しました!';
$graphNode = $response->getGraphNode();
?>
あくまで超簡易的なコードになりますが、ご参考になれば幸いです。