2012-12-19 37 views
13

Tôi đang trong quá trình tổng hợp một ứng dụng tab Facebook cho một khách hàng tìm nạp và hiển thị các bài đăng từ một trang Facebook. Ứng dụng này cũng cung cấp khả năng thêm bài đăng mới vào trang và nhận xét về bài đăng hiện có. Điều này đạt được bằng cách sử dụng Facebook Graph API (thông qua PHP SDK).Tìm nạp các bài đăng của bên thứ ba từ Facebook Graph API

Tôi có mọi thứ hoạt động nhưng đã gặp sự cố liên quan đến việc đăng bài từ ứng dụng của tôi. Khi người dùng gửi một bài đăng, nó được gửi đến Graph API thông qua yêu cầu sau.

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

Yêu cầu này là thành công và bài xuất hiện trên trang Facebook có liên quan với "Via tên ứng dụng của tôi" bên dưới nó.

Khi tôi sau đó yêu cầu danh sách bài đăng trên Trang qua API (yêu cầu bên dưới), bài đăng nói trên không xuất hiện.

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

Tôi có cảm giác mạnh mẽ là do bài đăng từ ứng dụng của bên thứ ba. Tôi đã nghe nói rằng Facebook "hạ cấp" bài viết của bên thứ ba để khuyến khích việc sử dụng nền tảng riêng của mình. Tất cả các bài đăng được đăng trực tiếp qua Facebook đều xuất hiện.

Tuy nhiên, phải có cách để truy xuất các loại bài đăng này.

Cập nhật cho Fisch dưới

Khi tôi làm cho đường bưu điện đến API, sau ID bài được trả về:

112706495458566_468411663221379 

Tuy nhiên, khi tôi thực hiện một yêu cầu API cho nó:

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

Tôi nhận được phản hồi sau:

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

Tuy nhiên, khi tôi thực hiện cùng một yêu cầu nhưng với ID của bài đăng đã được đưa vào yêu cầu/nguồn cấp dữ liệu.

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

Tôi nhận được phản hồi sau.

{ 
    "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 
    } 
} 

Vì vậy, vì lý do nào đó, Facebook thậm chí không cho phép tôi tra cứu bài đăng bằng ID của nó.

Update # 2

Trong tìm kiếm của tôi cho một câu trả lời cho điều này, tôi đã đi qua một nghiên cứu trong đó tăng cường sự nghi ngờ trước đây của tôi về "cân" được gán cho bài viết ứng dụng của bên thứ ba.

Từ báo cáo Trình kiểm tra EdgeRank: "Khi một đối tượng được tạo trong Facebook, nó được gán một trọng số. Chúng tôi tin rằng Facebook giảm chiến lược trọng lượng của các đối tượng được tạo thông qua API. Lý do đằng sau chiến lược này là khuyến khích tạo nhiều nội dung hơn trong Nền tảng Facebook. Điều này cuối cùng làm tăng giá trị của nền tảng của họ trong khi tăng số lần hiển thị quảng cáo."

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

Điều này có thể giải thích tại sao các bài đăng không đi qua trong thư mục/feed hoặc phản ứng API/bài.

Tuy nhiên, điều này không giải thích tại sao các API thậm chí sẽ không trả lại bài bởi ID của nó (xem cập nhật ở trên)

Tất cả những gì tôi có thể nghĩ là Facebook không xếp hạng ứng dụng của bên thứ ba là "Bài đăng" thực và do đó không đẩy chúng qua phản hồi API thích hợp. không thể tìm thấy bằng chứng về điều này trong tài liệu Facebook.

Update # 3

Dựa trên các ý kiến ​​dưới đây, bây giờ tôi cố gắng làm điều tương tự nhưng sử dụng một tài khoản Facebook mà không phải là chủ sở hữu của ứng dụng hoặc trong thực tế có bất kỳ mối quan hệ admin để bất kỳ trang nào trên Facebook (tài khoản Facebook cá nhân của riêng tôi).

tôi đã cho phép ứng dụng sử dụng hộp thoại OAuth và đã chấp nhận permisions sau:

  • email
  • user_birthday
  • publish_stream

Với bóng thẻ truy cập mới của tôi, tôi làm yêu cầu API sau:

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

Để mà tôi nhận được phản hồi như sau:

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

sau đó tôi kiểm tra trang Facebook thực tế, các bài mà tôi vừa gửi đã xuất hiện từ tài khoản người dùng Facebook của tôi như mong đợi.

sau đó tôi thực hiện yêu cầu sau đây để lấy tất cả các bài viết trên trang:

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

Để mà tôi nhận được một mảng dài của tất cả các bài viết trên trang (mà tôi wont gửi ở đây). Tuy nhiên, bài đăng mà tôi vừa gửi (và nhận lại một ID) không xuất hiện.

Sau đó tôi thực hiện yêu cầu trực tiếp cho bài đăng đó bằng ID được trả về bởi yêu cầu POST.

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

Điều này ném ngoại lệ sau (theo lần thử trước).

GraphMethodException: Unsupported get request. 

Để nhắc lại, nỗ lực này đã sử dụng tài khoản hoàn toàn không liên quan đến ứng dụng hoặc bất kỳ trang nào mà chúng tôi đang cố tìm nạp dữ liệu. Tài khoản cũng chưa bao giờ có bất kỳ liên hệ nào với ứng dụng (nghĩa là đây là lần đầu tiên các quyền đã được chấp nhận và khóa oAuth được tạo).

+0

Bạn đã thử chạy ứng dụng của mình với tư cách là người dùng không phải quản trị viên hay bạn chỉ thử nghiệm ứng dụng với tư cách quản trị viên ứng dụng? Nếu sau này, hãy thử chạy với tư cách người dùng không phải quản trị viên. – Puzbie

+0

Chắc chắn, tôi đã cố gắng sao chép vấn đề của bạn bằng cách sử dụng cả một ứng dụng tab và một trang web riêng biệt, nhưng đã không thể làm như vậy. Bạn có thể cho tôi biết, khách hàng của bạn là chủ sở hữu của trang facebook, cũng như ứng dụng được tab? Tôi đã nghĩ họ phải nhưng không muốn thừa nhận bất cứ điều gì. – Puzbie

+0

Bạn có chắc chắn điều này không phải do lỗi này không? – Igy

Trả lời

2

Sử dụng một sự kết hợp của Yahoo Query Language.ajax() số liệu cạo Facebook Thức ăn Kênh.

Lợi ích về xóa dữ liệu Trang web thành viên Facebook LIVEbạn không cần mã thông báo để nhận nguồn cấp dữ liệu thời gian thực mới nhất!

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

DEMO: Lấy cảm hứng từ online tutorial này.

jsFiddle Facebook Feeds


EDIT: Click image cho sửa đổi jsFiddle với Style


EXTRA:

012.351.

Để bổ sung cho câu trả lời của tôi ở trên, đây là gần như liên quan đến jsFiddle với tựa đề:

jsFiddle Tutorial: Creating Dynamic Div's (Now Improved!)

Hướng dẫn này cho thấy làm thế nào để chuyển đổi mã HTML của bạn để nó trở thành một "mẫu" có nghĩa là sẵn sàng để sử dụng với jQuery như một đối tượng, sau đó có thể được nối vào trang web một cách chính xác.

+1

Cảm ơn câu trả lời của bạn. Đây là một cách thú vị để giải quyết vấn đề. Tôi sẽ xem xét điều này càng sớm càng tốt! –

+0

Chỉ cần thêm: ** EXTRA ** phần trong câu trả lời ở trên. Chúc mừng! – arttronics

1

Khi bạn tạo một bài đăng qua API, Facebook sẽ trả lại cho bạn ID của bài đăng đó.Bạn có thể lưu các ID này và sau đó truy vấn cho chúng sau này với các API đồ thị hoặc FQL

+0

Fisch, cảm ơn trả lời của bạn. Tôi đã cập nhật bài đăng của mình ở trên để phản hồi. Thật không may, Facebook không cho phép tôi xem bài đăng lên bằng ID của nó. Hầu như không tồn tại trong API. –

9

Dan, tôi đã cố gắng this-

  1. POST một thức ăn từ một APP đến một trang

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

    Kết quả: Đăng thành công

  2. Yêu cầu danh sách bài đăng trên trang e

    GET: "PAGE_ID/feed" 
    

    quả: Tất cả các bài đăng trên các trang bao gồm bài viết nói trên.


Tại sao nó làm việc?

Do yêu cầu GET được thực hiện bằng mã thông báo truy cập của người dùng là quản trị viên của ứng dụng mà thông điệp đã được đăng.

Kết luận

Tôi đã thử tất cả các trường hợp và kết luận cuối cùng là, để lấy thức ăn của một trang bao gồm được đăng bởi một số APP, bạn phải sử dụng các thẻ truy cập của quản trị của ứng dụng đó (không phải là vấn đề lớn); else bạn sẽ chỉ nhận được phần còn lại của nguồn cấp dữ liệu.

Các vấn đề liên quan