10

Open Graph APIRestFB クライアントを使用してFacebook のユーザーのニュース フィードをクエリするときに、パラメータを 4 つの異なる値 (10、100、1000、10000)でテストするlimitJava で小さなスクリプトを作成しました。ご覧のとおり、奇妙な動作をしています...

シナリオ:

public static void main(String[] args) {

    // vars
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    FacebookClient client = new DefaultFacebookClient(accessToken);
    Connection<Post> home;
    List<Post> postList;
    Map<String, Post> postMap;
    int i;

    // limits to test
    String[] limits = {"10", "100", "1000", "10000"};
    for (String limit : limits) {

        // init list and map (looking for duplicate posts)
        postList = new LinkedList<Post>();
        postMap = new LinkedHashMap<String, Post>();
        // get news feed
        home = client.fetchConnection(id + "/home", Post.class, Parameter.with("limit", limit));

        // going through pages
        i = 1;
        for (List<Post> page : home) {
            for (Post post : page) {
                // store into list
                postList.add(post);
                // store into map (unique post id)
                postMap.put(post.getId(), post);
            }
            i++;
        }

        // sort posts by created time
        Collections.sort(postList, new Comparator<Post>() {
            @Override
            public int compare(Post post1, Post post2) {
                return post1.getCreatedTime().compareTo(post2.getCreatedTime());
            }
        });

        // log
        try {
            FileWriter out = new FileWriter("log/output.txt", true);
            out.write("LIMIT: " + limit + "\n");
            out.write("\tPAGES: " + (i - 1) + "\n");
            out.write("\tLIST SIZE: " + postList.size() + "\n");
            out.write("\tMAP SIZE: " + postMap.size() + "\n");
            out.write("\tOLDER POST: " + dateFormat.format(postList.get(0).getCreatedTime()) + "\n");
            out.write("\tYOUGNER POST: " + dateFormat.format(postList.get(postList.size() - 1).getCreatedTime()) + "\n");
            out.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

}

出力:

LIMIT: 10
    PAGES: 7
    LIST SIZE: 56
    MAP SIZE: 56
    OLDER POST: 2009-03-22 14:58:03
    YOUGNER POST: 2012-05-11 15:48:49
LIMIT: 100
    PAGES: 3
    LIST SIZE: 174
    MAP SIZE: 172
    OLDER POST: 2012-01-12 23:01:34
    YOUGNER POST: 2012-05-11 15:48:49
LIMIT: 1000
    PAGES: 2
    LIST SIZE: 294
    MAP SIZE: 292
    OLDER POST: 2009-03-22 14:58:03
    YOUGNER POST: 2012-05-11 15:48:49
LIMIT: 10000
    PAGES: 2
    LIST SIZE: 294
    MAP SIZE: 292
    OLDER POST: 2009-03-22 14:58:03
    YOUGNER POST: 2012-05-11 15:48:49

解釈と質問:

  1. 明らかに、ユーザーがアカウントを作成してからニュース フィードに投稿したすべての投稿を取得することはできません。リミットは有限ですか?

  2. 100、1000、および 10000 の場合、返されたニュース フィード全体でlimit毎回2 つの重複した投稿があったに違いありません (174 - 172 = 194 - 192)。なんで?個人のニュース フィードで同じ投稿を 2 回見たことはありません...

  3. a が 100 の場合 (およびその場合のみ)、limit取得する古い投稿は 2012 年に作成されたものであり、一方、limitmake の他の値は、2009 年に作成された投稿を取得するクエリを作成します。上限limit(1000または 10000)、クエリは古い投稿を取得します。しかし、なぜa limitof 10 を使用すると、クエリが 100 で制限されたクエリよりも古い投稿を取得するようになるのでしょうか?

  4. 最後になりましたが、同じ数の投稿が得られません。明らかに、limitが高いほど、検索された投稿の数が多くなります。私が最初に考えたのは、小さいページの唯一の結果はlimitページ数の増加であり (実際にはそうです)、取得された投稿の数は変わらないということです。しかし、そうです。なんで?とはいえ、投稿数は1000のaと10000のlimitaと同じなので、投稿数は100と1000の間で収束しているようです。limitlimit

PS:sinceおよび/またはuntilパラメータをクエリに指定しても、何も変わりません。

回答/コメントは大歓迎です:)

乾杯。

編集:

これは私の最高の思い出です:

LIMIT: 200
    PAGES: 3
    LIST SIZE: 391
    MAP SIZE: 389
    OLDER POST: 2012-01-27 14:17:16
    YOUGNER POST: 2012-05-11 16:52:38

なんで200?ドキュメントのどこかに指定されていますか?

4

3 に答える 3

18

ドキュメントにはありませんが、個人的にはプロジェクトのために以下をテストしました。

Facebooklimitは 500 件の投稿に制限されています。上限を 500 より大きくしても、最大 500 件の結果しか取得できません。500 (またはそれ以上) で試してみると、最大の投稿が得られます。

毎回 500 件の投稿が得られるわけではありませんが、通常は 490 件を超える投稿が得られます。一部の投稿は、さまざまな理由 (プライバシー、ブロックされたユーザー、特定の地域に適していないなど) によってフィルターされます。

これで、1 番目と 4 番目の質問に答えます。

質問No. 2、私はJavaで働いていないので、コード/ロジックに問題があるかどうか、またはコードが何をしているのかはわかりません。

質問No. 3、神はfacebookを助けます!

編集

4 番目の問題については、グラフ API のクエリ/時間制限に達している可能性があります (Facebook はこれを使用してスパムを防止しています。API を頻繁に連続してクエリすることはできません)。

また、

Facebook フィルター

これが、facebook から返されたすべての結果を取得できない理由です。

(「5」の制限を指定したが、返された 5 つの投稿が閲覧者に表示されない場合、空の結果セットが返されます。)

上記の各テーブルと接続のドキュメントに記載されている制限に加えて、可視性チェックを実行する前にフェッチする結果の最大数が 5,000 であることを知っておくと役立ちます。

参考:グラフAPIとfqlによるページング

また、特定のテーブルの結果数には制限があります。それぞれの fql テーブルでそれらの詳細を取得できます。

ストリーム テーブル (投稿/フィード用) の場合、

ストリーム テーブルの各クエリは、過去 30 日間または 50 投稿のいずれか大きい方に制限されますが、created_time などの時間固有のフィールドを FQL 演算子 (< または > など) と共に使用して、はるかに広い範囲の投稿を取得できます。投稿。

参考:Fqlストリームテーブル

こちらもご覧ください: Facebook FQL ストリーム制限?

于 2012-05-13T20:36:46.720 に答える
3

Facebook オープン グラフ API のページングで、limit パラメーターに関連するバグが進行中です。制限が高いほど、投稿のページ数が多くなります --- あたかも制限が低いと投稿のサンプリングも選別されるかのように。この問題は、投稿検索機能が 9 月に 1 か月間ダウンして以来、表面化しては後退しています。

新しいバグが表面化しました: 現在、access_token と小さな制限 (12 など) を使用しない投稿検索では、少数のまばらに入力された結果ページが返されます。API ドキュメントの例で指定された access_token を使用して同じ検索を行うと、12 の結果の全ページが +/- スキップなしで返されます。彼らがどの種類の access_token を使用しているかはわかりませんが、私の試みでは結果が重複していません。アクセス トークンなしのポスト検索は多かれ少なかれ機能しません (再び)!

于 2012-12-09T16:43:56.153 に答える
0

Facebook側には、データマイニングを防ぐためのロジックがいくつかある可能性があります。ページを移動する際に遅延を追加してみて、改善されるかどうかを確認してください。

于 2012-05-19T03:30:56.633 に答える