web-dev-qa-db-ja.com

ユーザーに許可を求めることなく、Graph APIを使用してFacebookの公開ページのフィードを取得できますか?

FacebookのGraph APIまたはOAuthを使用したことはありません。 Graph APIを使用してFacebookの公開ページのフィードを取得しようとしていますが、アクセストークンが必要です。ユーザーを煩わせてログインさせ、トークンを取得するためのアクセスを許可したくありません。 Facebookアプリのアクセストークンを使用して公開フィードを取得することもできますが、これを完全にJavascriptで実行しようとしているため、アプリシークレットを使用してこれを行うことはできません。 Facebookアプリのアクセストークンは、手動でシークレットをリセットしない限り、有効期限が切れたり変更されたりしないことをどこかで読みました。これは本当ですか?アクセストークンにハードコードするだけで安全ですか?そうでない場合、ユーザーを関与させることなくトークンを取得するアプリを認証できる方法はありますか?使用できる汎用アプリトークンの種類はありますか?

35
xtkoeller

あなたが私のようなものであれば、クライアントは標準のFacebook likeboxプラグインを必要としないでしょう。彼らはそれをすべて自分のスタイルに合わせてカスタマイズしたいと思うでしょう。

このような単純なものに当てはまるものがあるかどうか疑問に思って、公式ドキュメントを1日中見回す必要はありません。非常に簡単です。混乱が生じるのは、これらすべてのキーとシークレットIDを使用して、フィードを取得したいFacebookページから許可または認証を取得する必要があると想定しているためです。必要なのは有効なアプリだけで、公開ページのフィードを取得できます。

Facebookでアプリを設定すると、アプリIDとAPIキーが提供されます。必要な公開ページフィードのプロファイルIDを取得します。これで十分です。その後、次のコードを使用して認証トークンを取得し、それを使用してフィードデータをJSONオブジェクトとして返すことができます。

<?php

function fetchUrl($url){

 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_TIMEOUT, 20);
 // You may need to add the line below
 // curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);

 $feedData = curl_exec($ch);
 curl_close($ch); 

 return $feedData;

}

$profile_id = "the_profile_id_of_the_page_you_want";

//App Info, needed for Auth
$app_id = "your_app_id_in_here";
$app_secret = "your_app_secret_in_here";

//Retrieve auth token
$authToken = fetchUrl("https://graph.facebook.com/oauth/access_token?grant_type=client_credentials&client_id={$app_id}&client_secret={$app_secret}");

$json_object = fetchUrl("https://graph.facebook.com/{$profile_id}/feed?{$authToken}");

編集のおかげで、このコードは here (とにかくおなじみのようです:))に由来するものだと私が示唆したので、コメントに役立つ情報がさらにあります。

その後、オブジェクトを解析できます。以下に、このスレッドに基づいてPHP;

PHP JSON Object

$feedarray = json_decode($json_object);

foreach ( $feedarray->data as $feed_data )
{
    echo "<h2>{$feed_data->name}</h2><br />";
    echo "{$feed_data->message}<br /><br />";
}

Jsonオブジェクトで何が利用できるかを調べるには、ブラウザーでURLを出力し、この便利なjson視覚化ツールにコピーして貼り付けます。

http://chris.photobooks.com/json/default.htm

78
McNab

Facebookアプリのアクセストークンは、手動でシークレットをリセットしない限り、有効期限が切れたり変更されたりすることはありません

そのとおりです。

アプリシークレットがリセットされない限り、アプリトークンの有効期限は切れません。アプリアクセストークンは各アプリに固有です。

パブリックフィードは有効なアクセストークンanyを取るため、アプリケーショントークンを使用できます。

https://developers.facebook.com/tools/access_token に移動すると、フローは不要になります。その後、ハードコードするだけで済みます。秘密をリセットした瞬間、このメソッドは無効になります。

$access_token = '1111111111|2Cha_1-n5'
$graph_url = "https://graph.facebook.com/Boo/posts?access_token=" 
    . $access_token;
$page_posts = json_decode(file_get_contents($graph_url), true);

次に、ページを繰り返し処理します

foreach($page_posts['data'] as $post){
    $post_link = $post['actions'][0]['link'];
    $page_id = $post['from']['id'];
    $page_name = $post['from']['name'];
    $message = ($post['message']) ? $post['message'] : " ";
    $name = ($post['name']) ? $post['name'] : " ";
    $story = ($post['story']) ? $post['story'] : " ";
    $post_time = $post['updated_time'];
}

ソース: http://philippeharewood.com/facebook/how-to-get-facebook-access-tokens-in-php-for-public-posts-the-basic-sauce/

6
phwd

受け入れられた回答は、profileId/pageIdを動的に取得する方法を提供するものではなく、取得方法を説明するものでもありません。 answer/question をチェックしてください。私の経験から、受け入れられた答えは、app-idapp-secretを中括弧で囲む必要があるという点でも間違っています。それらを含めるとエラーが発生し、うまく機能しました。

これよりも簡単なことはありません。

1
craned

@Psykedおよび@James_David_Lowのメッセージへの応答では、廃止されているため、FQLの使用は推奨されません。

"... Facebookでもグラフにアクセスするために使用される低レベルのHTTP APIが2つあります。FQLとLegacy REST API。これらのAPIには同様のものが含まれています機能が重複していますが、非推奨です。」

通常、新機能は Graph API でのみ利用可能です。 アプリの将来性を保証するには、可能であればアプリでGraph APIを使用する必要があります。

1
Diego Palomar

これを行うには、単にGraph APIではなくFQLを使用する必要があると思います。これは私がやっていることです(PAGE_IDページのIDを使用して、引用符を付けてください):

SELECT post_id, created_time, type, message, attachment 
FROM stream 
WHERE source_id = 'PAGE_ID' 
AND actor_id = source_id

https://developers.facebook.com/docs/reference/fql/stream/

0
James David Low

他のユーザーに表示するためにアプリでページフィード(独自のページフィードなど)を使用する場合。独自のaccess_tokenを使用して取得してください。
しかし!それは良いプラクティスとはみなされないので、ページまたはアプリケーションでログインし、それらのaccess_tokenを使用することもできます。

詳細については、 認証に関する公式ドキュメント をご覧ください。

0
Henrik Peinar