【PHP】Twitter, Facebookページ, Instagram自動投稿（OAuth認証）

Twitter、Facebookページ、Instagramビジネスアカウントへの自動投稿について、簡単なサンプルコードを作成しました。
※Facebookはページ（個人アカウントではない）、InstagramはそのFacebookページに紐づけられたビジネスアカウントである必要があります。

※2018年8月に、Facebookタイムライン（個人アカウント）へ自動投稿できる機能は廃止されています。

## Twitter
### 準備
各詳細手順はこの記事では省きます。

- Twitterアカウントの作成
- [Twitter developerサイト](https://developer.twitter.com/en)にて、developer登録、アプリケーションの作成、設定
- Consumer Key(API key), Consumer Secret(API secret)の取得
- TwitterOAuthのインストール：GitHub([https://github.com/abraham/twitteroauth](https://github.com/abraham/twitteroauth))

### サンプルプログラム
Twitterログインを行う⇒成功すると、自動で該当Twitterアカウントに投稿される

```php: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>';
?>
```

```php: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登録](https://developers.facebook.com/apps)　
- アプリケーションの作成、設定   
　※プロダクトに、「Facebookログイン」「InstagramグラフAPI」を追加
- App ID, App secretの取得
- Facebook SDKのインストール：GitHub([https://github.com/facebookarchive/php-graph-sdk](https://github.com/facebookarchive/php-graph-sdk))


実際にコードを書く前に、以下のツールで確認することができます。
[グラフAPIエクスプローラ](https://developers.facebook.com/tools/explorer)

### サンプルプログラム
Facebookログインを行う⇒成功すると、自動で該当Facebookページ、Instagramアカウントに投稿される

```php: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>';
?>
```



```php: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');
?>
```



```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();
?>
```



あくまで超簡易的なコードになりますが、ご参考になれば幸いです。