2012-05-11 20 views
10

Tôi đã viết một đoạn mã nhỏ trong JAVA, rằng kiểm tra tham số limit với bốn giá trị khác nhau (10, 100, 1000 và 10000) khi truy vấn nguồn cấp dữ liệu tin tức của người dùng của Facebook bằng cách sử dụng API biểu đồ mởRestFB client. Như bạn sẽ thấy, nó có một hành vi kỳ lạ ...API đồ thị mở Facebook: hành vi kỳ lạ của giới hạn thông số khi nhận được nguồn cấp dữ liệu tin tức của người dùng được phân trang

Kịch bản:

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); 
     } 

    } 

} 

Output:

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 

Giải thích và câu hỏi:

  1. Rõ ràng, bạn không thể nhận được tất cả các bài viết người dùng đã có trên nguồn cấp dữ liệu tin tức của anh ấy kể từ khi tài khoản của anh ấy được tạo. Giới hạn?

  2. Với limit trong số 100, 1000 và 10000, tôi phải có mỗi lần hai bài đăng trùng lặp trong toàn bộ nguồn cấp tin được trả lại (174 - 172 = 194 - 192). Tại sao? Tôi không bao giờ thấy cùng một bài đăng hai lần trên nguồn cấp tin tức cá nhân của tôi ...

  3. Với (và chỉ với) số limit của 100, bài đăng cũ hơn tôi nhận được tạo trong năm 2012, trong khi các giá trị khác của limit làm truy vấn truy xuất một bài đăng đã được tạo trong năm 2009. Tôi có thể hiểu rằng với một số trên limit (1000 hoặc 10000), truy vấn sẽ truy xuất các bài đăng cũ hơn. Nhưng tại sao a limit trong số 10 yêu cầu truy vấn bài đăng cũ hơn truy vấn bị giới hạn bởi 100?

  4. Điểm cuối cùng nhưng không kém phần quan trọng: Tôi không nhận được cùng số lượng bài đăng. Rõ ràng, số lượng limit cao hơn, số lượng bài đăng được truy xuất càng cao. Những gì tôi nghĩ đầu tiên, đó là hậu quả duy nhất của một số nhỏ hơn là limit là số trang cao hơn (trường hợp đó), nhưng số lượng bài viết đã truy xuất sẽ không thay đổi. Nhưng nó có. Tại sao? Điều đó nói rằng, số lượng bài viết dường như hội tụ giữa một limit 100 và 1000, vì số lượng bài viết giống hệt với một limit 1000 và một limit của 10000.

PS: chỉ định một since và/hoặc tham số until cho truy vấn không thay đổi bất cứ điều gì.

Bất kỳ câu trả lời/nhận xét nào đều được chào đón :)

Chúc mừng.

Edit:

Đây là của tôi tốt nhất recall:

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 

Tại sao 200? Nó có được chỉ định ở bất kỳ đâu trong số documentation không?

Trả lời

18

Tài liệu không có trong tài liệu nhưng cá nhân tôi đã thử nghiệm sau cho dự án của tôi.

Facebook limit được giới hạn trong 500 bài đăng. Cho dù bạn đặt giới hạn cao hơn 500, nó sẽ chỉ lấy được tối đa 500 kết quả. Hãy thử với 500 (hoặc nhiều hơn), bạn sẽ nhận được bài viết tối đa.

Bạn sẽ không nhận được 500 bài đăng mỗi lần nhưng sẽ nhận được trên 490 bài đăng nói chung. Một số bài đăng được lọc theo nhiều lý do khác nhau (như quyền riêng tư, người dùng bị chặn, không phù hợp với khu vực cụ thể và những thứ khác)

Câu trả lời cho câu hỏi thứ nhất và thứ tư của bạn.

Đối với câu hỏi số. 2, tôi không làm việc trong java, vì vậy tôi không thể nói nếu có một prob trong mã của bạn/logic hoặc những gì mã của bạn đang làm.

Đối với câu hỏi số. 3, Thiên Chúa giúp facebook!

Sửa

Đối với vấn đề thứ 4, bạn có thể đánh giới hạn truy vấn/giờ graph api (facebook sử dụng nó để ngăn chặn gửi thư rác, bạn truy vấn không thể Apis thường xuyên liên tiếp nhanh)

Ngoài ra,

Facebook filter

đây là lý do tại sao, bạn không nhận được tất cả các kết quả trả về bởi facebook.

(nếu bạn chỉ định một giới hạn của “5”, nhưng năm bài trả lại không phải có thể nhìn thấy người xem, bạn sẽ nhận được một tập kết quả có sản phẩm nào.)

Ngoài các giới hạn được đề cập trong tài liệu cho từng bảng các bảng và kết nối được liệt kê ở trên, sẽ hữu ích khi biết rằng số lượng kết quả tối đa chúng tôi sẽ tìm nạp trước khi chạy kiểm tra mức hiển thị là 5.000.

tham khảo: Paging with graph api and fql

Ngoài ra, có một giới hạn về không kết quả cho một bảng cụ thể. Bạn có thể nhận được một chi tiết về chúng trên các bảng fql tương ứng.

Đối với bảng dòng (một trong những bài/thức ăn),

Mỗi truy vấn của bảng dòng được giới hạn trong vòng 30 ngày trước hoặc 50 bài viết, giá trị lớn hơn, tuy nhiên bạn có thể sử dụng tốn nhiều thời gian cụ thể các trường như created_time cùng với các toán tử FQL (chẳng hạn như < hoặc>) để truy xuất phạm vi bài đăng lớn hơn nhiều.

tham khảo: Fql stream table

Look đây quá: Facebook FQL stream limit?

+0

Cảm ơn câu trả lời của bạn. Tôi đã thấy [câu hỏi mà bạn đã yêu cầu] (http://goo.gl/P9kpP). Rõ ràng, giới hạn là hạn chế, nhưng đó là lạ, chúng tôi không thể tìm thấy bất kỳ chi tiết trong [doc] (http://bit.ly/f5O0Oz). Cá nhân tôi không thể nhận được hơn 389 bài đăng và với số lượng giới hạn là 200 (xem phần chỉnh sửa). Vì vậy, tôi có thể nói rằng bạn không thể nhận được hơn 400 bài đăng, chứ không phải 500. Số 4 là nhiều hơn về số trang: tại sao giới hạn 10 làm cho truy vấn truy xuất ít bài đăng hơn giới hạn 100? Điều đó chỉ nên tác động đến số lượng trang của số trang, không phải số lượng bài đăng. – sp00m

+0

Tôi đã cập nhật mã, tôi hy vọng nó sẽ giúp bạn :) – Jashwant

+0

Cảm ơn. Bạn xứng đáng với nó :) – sp00m

0

Có thể có một số logic bên facebook để ngăn chặn khai thác dữ liệu. Hãy thử thêm một số độ trễ trong khi xem qua các trang và xem có tốt hơn không.

3

Đã xảy ra lỗi trong phân trang API biểu đồ mở của Facebook phải thực hiện với thông số giới hạn. Giới hạn càng cao, càng nhiều trang của bài đăng --- như thể giới hạn dưới cũng sẽ chọn một mẫu bài đăng. Vấn đề đã nổi lên và rút lui kể từ khi chức năng tìm kiếm bài đăng đã giảm trong một tháng vào tháng Chín.

Một lỗi mới đã xuất hiện: hiện tại tìm kiếm bài đăng không có access_token và giới hạn nhỏ (như 12) sẽ trả về các trang kết quả ít và có mật độ dân cư thưa thớt. Tìm kiếm tương tự được thực hiện với access_token được đưa ra trong ví dụ về tài liệu API sẽ cung cấp toàn bộ trang gồm 12 kết quả +/- và không bỏ qua. Tôi không biết họ sử dụng loại access_token nào, nhưng không có nỗ lực nào về phía tôi đã sao chép kết quả của họ. Tìm kiếm bài đăng không có mã thông báo truy cập ít nhiều chức năng (lại)!