ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
事前知識: SDK の現状(2026)
重要な経緯: Facebook (Meta) は 2010 年代に PHP SDK を公式提供していましたが、2020 年以降は更新が止まり、Composer の facebook/graph-sdk も廃止されました。現在の選択肢は:
| 選択肢 | 状態 | 推奨度 |
|---|---|---|
facebook/graph-sdk | 2018 で停止、廃止 | × |
facebook/php-graph-sdk | 5.x で停止、廃止予告 | × |
| JustCoded / sammyjankis フォーク | 非公式継続 | △ 動くが自己責任 |
| Guzzle で REST 直叩き | 常に動く | ◎ 最推奨 |
| Laravel Socialite | OAuth ログインのみ | ○ ログインなら |
Meta for Developers の準備
- developers.facebook.com でアプリ作成
- 「Facebook ログイン」プロダクト追加
- App ID / App Secret をメモ
- 投稿先 Facebook ページの管理者権限を確認
- Graph API Explorer で長期 Page Access Tokenを生成
- 必要な権限:
pages_manage_posts/pages_read_engagement/pages_show_list - 「アプリレビュー」を申請(本番公開時)
方式 A: Guzzle 直叩き(推奨)
composer require guzzlehttp/guzzle
テキスト投稿
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$pageId = 'YOUR_PAGE_ID';
$pageAccessToken = 'EAAB...long-lived-token';
$client = new Client([
'base_uri' => 'https://graph.facebook.com/v19.0/',
'timeout' => 30,
]);
try {
$response = $client->post("{$pageId}/feed", [
'form_params' => [
'message' => 'PHP からの投稿テスト',
'access_token' => $pageAccessToken,
],
]);
$body = json_decode((string) $response->getBody(), true);
echo "投稿成功: post_id = " . $body['id'] . "\n";
} catch (\GuzzleHttp\Exception\ClientException $e) {
$err = json_decode((string) $e->getResponse()->getBody(), true);
echo "エラー: " . ($err['error']['message'] ?? '不明') . "\n";
}
画像投稿
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client(['base_uri' => 'https://graph.facebook.com/v19.0/']);
$response = $client->post("{$pageId}/photos", [
'multipart' => [
['name' => 'access_token', 'contents' => $pageAccessToken],
['name' => 'caption', 'contents' => '今日のランチ'],
['name' => 'source', 'contents' => fopen('/path/to/image.jpg', 'r')],
],
]);
$body = json_decode((string) $response->getBody(), true);
echo "photo_id = " . $body['id'] . "\n";
// URL 指定での画像投稿(自前で download する代わりに Meta に取りに来てもらう)
$response = $client->post("{$pageId}/photos", [
'form_params' => [
'url' => 'https://example.com/image.jpg',
'caption' => 'URL 指定投稿',
'access_token' => $pageAccessToken,
],
]);
動画投稿
$response = $client->post("{$pageId}/videos", [
'multipart' => [
['name' => 'access_token', 'contents' => $pageAccessToken],
['name' => 'description', 'contents' => 'プロモ動画'],
['name' => 'source', 'contents' => fopen('/path/promo.mp4', 'r')],
],
]);
予約投稿
$response = $client->post("{$pageId}/feed", [
'form_params' => [
'message' => '明日の朝に投稿',
'published' => 'false', // 即時公開しない
'scheduled_publish_time' => time() + 86400, // UNIX 時刻
'access_token' => $pageAccessToken,
],
]);
方式 B: 非公式フォーク SDK
# 非公式フォーク (例)
composer require espresso-dev/facebook-graph
# または
composer require justcoded/facebook-php-sdk<?php
require 'vendor/autoload.php';
use Facebook\Facebook; // フォークが提供する場合のみ
$fb = new Facebook([
'app_id' => 'YOUR_APP_ID',
'app_secret' => 'YOUR_APP_SECRET',
'default_graph_version' => 'v19.0',
]);
try {
$response = $fb->post("/{$pageId}/feed", [
'message' => 'SDK 経由の投稿',
], $pageAccessToken);
$node = $response->getGraphNode();
echo $node['id'];
} catch (\Facebook\Exception\ResponseException $e) {
echo $e->getMessage();
}
新規開発では非推奨。レガシ保守でのみ使用。
Page Access Token の発行
- Graph API Explorer を開く
- 右上のアプリを選択
- User Access Token 取得 → 権限
pages_manage_posts等を選択 - 「Get Token」 → ユーザートークン発行
GET /me/accountsでページごとの Page Access Token を取得- Access Token Debugger で長期化(60 日)に変換
- Page Access Token は Page を管理する限り無期限(仕様変更注意)
エラーハンドリング
| code | 意味 | 対処 |
|---|---|---|
| 190 | Access Token 失効 | 再発行 |
| 200 | 権限不足 | 追加権限申請 |
| 368 | スパム判定 | 投稿頻度を下げる |
| 1487 | 画像 URL 不正 | HTTPS / 公開 URL に |
| 100 | パラメータ不正 | API リファレンス確認 |
Webhook 連携
投稿に対するいいね・コメントをリアルタイム受信:
// webhook.php
$secret = 'YOUR_APP_SECRET';
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_HUB_SIGNATURE_256'] ?? '';
$expected = 'sha256=' . hash_hmac('sha256', $payload, $secret);
if (!hash_equals($expected, $signature)) {
http_response_code(403); exit;
}
$event = json_decode($payload, true);
foreach ($event['entry'] as $entry) {
foreach ($entry['changes'] as $change) {
// feed / comments / reactions のイベント
error_log(json_encode($change));
}
}
http_response_code(200);
Instagram Graph API への展開
Facebook ページに接続された Instagram Business アカウントは、同じ Graph API で操作可能:
// 1. メディアコンテナ作成
$container = $client->post("{$igUserId}/media", [
'form_params' => [
'image_url' => 'https://example.com/photo.jpg',
'caption' => '#sunset',
'access_token' => $pageAccessToken,
],
])->getBody();
$containerId = json_decode($container, true)['id'];
// 2. 公開
$client->post("{$igUserId}/media_publish", [
'form_params' => [
'creation_id' => $containerId,
'access_token' => $pageAccessToken,
],
]);
FAQ
Q: 個人プロフィールに投稿したい
A: 不可。Meta は 2018 年以降、個人アカウントへの API 投稿を全面禁止。Page か Instagram のみ。
Q: 公式 SDK が廃止されたが Facebook が SDK で書かれた例を載せている
A: 古いドキュメント。Meta 自身も「Graph API は HTTPS の REST なので任意の言語で直接呼べる」と推奨しています。
Q: トークンが頻繁に失効する
A: ユーザートークンを Page Access Token に変換せず使っている可能性。Page トークンは長期です。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- アプリケーションの登録のトークンの取得
- SDKの導入と投稿の実装(PHP)
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?