13

私は、Facebook ページから投稿を取得して表示するクライアント用の Facebook タブ アプリケーションをまとめているところです。このアプリケーションは、ページに新しい投稿を追加したり、既存の投稿にコメントしたりする機能も提供します。これは、Facebook Graph API を使用して (PHP SDK を介して) 実現されます。

すべてが機能していますが、アプリからの投稿に関する問題が発生しました。ユーザーが投稿を送信すると、次のリクエストを介して Graph API に送信されます。

$facebook->api([PAGE_ID]/feed', 'POST', array(
    'message' => [MESSAGE]
));

このリクエストは成功し、関連する Facebook ページに投稿が表示され、その下に「Via my app name」が表示されます。

次に、API を介してページ上の投稿のリストを要求すると (以下の要求)、前述の投稿が表示されません。

$posts = $facebook->api([PAGE_ID].'/feed');

これはサードパーティのアプリからの投稿が原因であると強く感じています。Facebook がサード パーティの投稿を「ダウングレード」して、独自のプラットフォームの使用を奨励していると聞きました。Facebook から直接投稿されたすべての投稿が表示されます。

ただし、これらの種類の投稿を取得する方法が必要です。

以下のフィッシュの更新

API に投稿すると、次の投稿 ID が返されます。

112706495458566_468411663221379

ただし、API リクエストを行うと、次のようになります。

$facebook->api('112706495458566_468411663221379');

次の応答が返されます。

{
    "error": {
        "message": "Unsupported get request.",
        "type": "GraphMethodException",
        "code": 100
    }
}

ただし、同じリクエストを行ったが、投稿の ID が既に /feed リクエストに含まれている場合。

$facebook->api('112706495458566_457890310940181');

次の応答が得られます。

{
    "id": "112706495458566_457890310940181",
    "from": {
        "category": "Local business",
        "name": "Genting Casino Southport",
        "id": "112706495458566"
    },
    "story": "\"Very well done to ste,...\" on their own status.",
    "privacy": {
        "value": ""
    },
    "type": "status",
    "application": {
        "name": "Mobile",
        "id": "2915120374"
    },
    "created_time": "2012-11-25T22:12:21+0000",
    "updated_time": "2012-11-25T22:12:21+0000",
    "comments": {
        "count": 0
    }
}

そのため、何らかの理由で、Facebook は ID で投稿を検索することさえ許可していません。

アップデート #2

これに対する答えを探しているうちに、サードパーティのアプリの投稿に割り当てられた「重み」についての以前の疑惑を強化する調査に出くわしました.

EdgeRank Checker レポートから: 「Facebook でオブジェクトが作成されると、重みが割り当てられます。Facebook は、API を介して作成されたオブジェクトの重みを戦略的に減らしたと考えています。この戦略の背後にある理由は、 Facebook プラットフォームです。これにより、最終的にプラットフォームの価値が高まり、広告のインプレッションが増加します。」

http://adage.com/article/digitalnext/posting-facebook-truth-party-applications/229694

これは、/feed または /posts API 応答で投稿が渡されない理由を説明している可能性があります。

ただし、API が投稿を ID で返さない理由については説明しません (上記の更新を参照)。

私が考えることができるのは、Facebook がサードパーティのアプリの投稿を実際の「投稿」として分類していないため、適切な API 応答でそれらをプッシュしていないということだけです。ただし、Facebook のドキュメントでは、これに関する証拠を見つけることができません。

アップデート #3

以下のコメントに基づいて、私は今同じことをしようとしていますが、アプリの所有者ではない、または実際には Facebook のどのページとも管理関係にある Facebook アカウント (私自身の個人的な Facebook アカウント) を使用しています。

oAuth ダイアログを使用してアプリを承認し、次の権限を受け入れました。

  • Eメール
  • ユーザー_誕生日
  • パブリッシュ_ストリーム

光沢のある新しいアクセス トークンを使用して、次の API 要求を行います。

$post = $facebook->api('112706495458566/feed', 'POST', array(
    'message' => 'this is a test'
));

次の応答を受け取ります。

array(1) {
    ["id"] => string(31) "112706495458566_470663409662871"
}

次に、実際の Facebook ページを確認すると、送信したばかりの投稿が、期待どおりに Facebook ユーザー アカウントから表示されました。

次に、ページ上のすべての投稿を取得するために次のリクエストを行います。

$posts = $facebook->api('112706495458566/feed');

ページ上のすべての投稿の長い配列を受け取ります (ここには投稿しません)。しかし、送信したばかりの (そして ID を受け取った) 投稿が表示されません。

次に、POST リクエストによって返された ID を使用して、その投稿を直接リクエストします。

$post = $facebook->api('112706495458566_470663409662871');

これにより、次の例外がスローされます (前の試行に従って)。

GraphMethodException: Unsupported get request.

繰り返しますが、この試みは、アプリやデータを取得しようとしているページとはまったく関係のないアカウントを使用していました。アカウントは、アプリとの接触もありません (つまり、権限が受け入れられ、oAuth キーが生成されたのはこれが初めてでした)。

4

3 に答える 3

9

ダン、私はこれを試しました-

  1. アプリからページにフィードを投稿する

    POST: "PAGE_ID/feed"
    message: "hi"
    

    結果: 投稿成功

  2. ページ上の投稿のリストをリクエストする

    GET: "PAGE_ID/feed"
    

    結果: 前述の投稿を含む、ページ上のすべての投稿


なぜそれが機能したのですか?

メッセージが投稿されたアプリの管理者であるユーザーのアクセス トークンを使用して GET 要求が行われたためです。

結論

私はすべてのケースを試しましたが、最終的な結論は、一部のAPPによって投稿されたページを含むフィードを取得するには、そのアプリの管理者のアクセス トークンを使用する必要があるということです (大きな問題ではありません)。それ以外の場合は、残りのフィードを取得するだけです。

于 2012-12-25T10:29:17.353 に答える
2

Yahoo Query Languageとの組み合わせを使用して、 Facebook フィード チャネル.ajax()をデータ スクレイピングします。

ライブ Facebook メンバー Web ページのデータ スクレイピングの利点は、最新のリアルタイム フィードを取得するためにトークン キーが必要ないことです。

HTML:

<div id="results"></div>

jQuery:

$.ajax({
    url: "http://query.yahooapis.com/v1/public/yql",
    dataType: "jsonp",
    success: function(data) {
        console.log(data.query.results.json);
        $.each(data.query.results.json.entries, function(i, v) {
            $('#results').append(data.query.results.json.entries[i].content + '<br /><br />');
        });
    },
    data: {
        q: 'select * from json where url="https://www.facebook.com/feeds/page.php?id=112706495458566&format=json"',
        format: "json"
    }
});

デモ:このオンライン チュートリアル に触発されました。

jsFiddle Facebook フィード


編集:スタイル付きの改訂されたjsFiddleの画像をクリックしてください


追加:

上記の私の回答を補完するために、準関連の jsFiddle というタイトルを以下に示します。

jsFiddle チュートリアル: 動的 Div の作成 (改善されました! )

このチュートリアルでは、HTML マークアップを変換して、jQuery でオブジェクトとしてすぐに使用できる「テンプレート」にし、Web ページに正しく追加できるようにする方法を示します。

于 2012-12-25T13:15:17.563 に答える
1

API を介して投稿すると、Facebook はその投稿の ID を返します。これらの ID を保存して、後でグラフ API または FQL を使用してクエリを実行できます。

于 2012-12-19T10:53:39.617 に答える