2013-12-15 12 views
7

Potrzebuję zbudować aplikację, która będzie miała trzy pola wejściowe dla trzech adresów URL. Następnie aplikacja musi przeszukać wszystkie publiczne posty na Facebooku i znaleźć użytkowników, którzy opublikowali te konkretne adresy URL. Używam tego kodu:Zapytanie o wszystkie publiczne posty na Facebooku

$q = "http://www.someurl.com"; 
$search = $facebook->api('/search?q=' . $q .'&type=post&limit=200'); 
foreach ($value as $fkey=>$fvalue) { 
    if(isset($fvalue['from']['name'])) 
    { 
     echo $fvalue['from']['name']."<br />"; 
    } 
    }} 

Spowoduje to wydrukowanie 200 nazwisk użytkowników Facebooka, którzy zamieścili jeden konkretny link. Ale, jak wspomniałem powyżej, muszę wyszukać wiele dopasowań adresów URL. Korzystając z tego podejścia, musiałbym wykonać trzy zapytania, a następnie porównać wyniki i uzyskać użytkowników, którzy pojawią się na wszystkich trzech listach wyników. Czy istnieje sposób na utworzenie zapytania, które zwróci potrzebne wyniki w jednym wywołaniu? Teraz, gdy FQL jest potężnym narzędziem, ale myślę, że nie można go używać do tego rodzaju publicznych pytań. Czy naprawdę ograniczam się tylko do publicznego interfejsu graficznego? A jeśli tak, czy możliwe jest tworzenie złożonych zapytań przy użyciu tylko api grafów?

EDIT # 1: Próbowałem za pomocą następujących FQL:

SELECT source_id FROM stream WHERE 
CONTAINS('http://www.incgamers.com/2013/12/doom-20th-anniversary-today-true-classic') 
AND CONTAINS('http://kotaku.com/5917693/ten-years-of-civ-ii-lock-the-world-in-perpetual-war') 
AND CONTAINS('http://www.youtube.com/watch?v=1TBxdXm3DP0') limit 200 

Jak rozumiem, to powinien wrócić do użytkowników, którzy mają te trzy linki w swoim strumieniu FB. Tak jednak nie jest. Czy to wszystko źle?

Odpowiedz

2

Prostszym rozwiązaniem będzie po prostu sprawdzenie obecności adresu URL w części wiadomości w poście. Ten FQL powinno działać:

SELECT message FROM stream WHERE CONTAINS("http://www.incgamers.com/2013/12/doom-20th-anniversary-today-true-classic") 
AND strpos(message,'http://www.incgamers.com/2013/12/doom-20th-anniversary-today-true-classic') >=0 

Podobnie, aby wyszukać postu zawierającej wszystkie trzy linki można dodatkowo rozszerzają FQL.

SELECT message FROM stream WHERE CONTAINS("http://www.incgamers.com/2013/12/doom-20th-anniversary-today-true-classic") 
AND strpos(message,'http://www.incgamers.com/2013/12/doom-20th-anniversary-today-true-classic') >=0 
AND CONTAINS("http://kotaku.com/5917693/ten-years-of-civ-ii-lock-the-world-in-perpetual-war") 
AND strpos(message,'http://kotaku.com/5917693/ten-years-of-civ-ii-lock-the-world-in-perpetual-war') >=0 
AND CONTAINS("http://www.youtube.com/watch?v=1TBxdXm3DP0") 
AND strpos(message,'http://www.youtube.com/watch?v=1TBxdXm3DP0') >=0 
+0

Dzięki za odpowiedzi. Czy przetestowałeś to zapytanie za pomocą narzędzia Graph API Explorer? Powinien działać z postami z mojej własnej ściany, ustawiłem ich prywatność na publiczną. Nie mogę uzyskać żadnych wyników bez względu na to, jaką kombinację linków wchodzę. Myślę, że czegoś brakuje ... – Xardas

+0

Masz rację. Zachowanie jest dziwne! Przetestowałem pierwsze zapytanie za pomocą eksploratora wykresów i działa ono poprawnie. Jednak nie wyświetla żadnych wyników dla wielu adresów URL. –

+0

Próbowałem nawet napisać wiadomość SELECT ze strumienia WHERE CONTAINS ("http://vimeo.com") AND strpos (wiadomość, "http: //vimeo.com")> = 0 I ZAWIERA ("http: // www .youtube.com ") AND strpos (wiadomość," http: //www.youtube.com ")> = 0" i zwróciło kilka wyników. –

1

nie jest już możliwe, ponieważ facebook niepełnosprawnych poszukiwań publicznej postu w połowie grudnia 2013 r

+0

Jak mówi Wikipedia, wymagane jest cytowanie. Link do postu na oficjalnej dokumentacji Facebooka naprawdę pomógłby "sprzedać twój punkt" :) – javatarz