Facebook API: Получить поклонников/людей, которым нравится страница

Я хотел бы получить список пользователей, которым нравится определенная страница или поклонник этого.

В документации FB API указано, что вы можете получить только количество поклонников определенной страницы, используя социальный график, но не список фанатов.

Обсуждение здесь Извлечение имен поклонников Facebook предполагает, что можно использовать запрос FQL, например SELECT user_id FROM like WHERE object_id="YOUR PAGE ID", чтобы получить число людей, которым понравилась эта страница, но для на той же странице он дает пустой ответ "{}".

Поэтому мне было интересно, есть ли у кого-нибудь идея, можно ли это сделать.

Ответ 1

Существует "способ" получить часть списка поклонников с их идентификаторами профиля на какой-либо странице без токена.

  • Получить идентификатор фан-страницы с общедоступными данными графа: http://graph.facebook.com/cocacola - Coca-Cola имеет 40796308305. UPDATE 2016.04.30: Facebook теперь требует токена доступа, чтобы получить page_id через график, чтобы вы могли анализировать синтаксис HTML-страницы fanpage, чтобы получить этот идентификатор без какой-либо авторизации от https://www.facebook.com/{PAGENAME}, как в примере ниже, на основе тэгов og, присутствующих на Fanpage.
  • Получить Coca-Cola "как плагин" iframe непосредственно с некоторыми измененными параметрами: http://www.facebook.com/plugins/fan.php?connections=100&id=40796308305
  • Теперь проверьте источники страниц, есть много поклонников со ссылками на их профили, где вы можете найти их идентификаторы или псевдонимы своего профиля: http://www.facebook.com/michal.semeniuk.
  • Если вам интересны только идентификаторы профиля, используйте график api снова - он даст вам профиль id напрямую: http://graph.facebook.com/michal.semeniuk ОБНОВЛЕНИЕ 2016.04.30: Facebook теперь требует токена доступа, чтобы получить такую ​​информацию. Вы можете анализировать синтаксис HTML-профиля, так же как в метаданных первого шага ваш лучший друг: <meta property="al:android:url" content="fb://profile/{PROFILE_ID}" />

И теперь лучшая часть: попробуйте обновить (F5) ссылку в пункте 2. Появится новый полный набор других поклонников Coca-Cola. Возьмите только uniques, и вы сможете получить хороший, почти полный список поклонников.

- ОБНОВЛЕНИЕ 2013.08.06 -

Почему бы вам не использовать мой готовый PHP script для извлечения некоторых поклонников?:)

UPDATE 2016.04.30: обновленный пример script для использования новых методов после того, как Facebook начал требовать токен доступа, чтобы получить общедоступные данные из графика api.

function fetch_fb_fans($fanpage_name, $no_of_retries = 10, $pause = 500000 /* 500ms */){
    $ret = array();
    // prepare real like user agent and accept headers
    $context = stream_context_create(array('http' => array('header' => 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/49.0.2623.108 Chrome/49.0.2623.108 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-encoding: gzip, deflate, sdch\r\nAccept-language: en-US,en;q=0.8,pl;q=0.6\r\n')));
    // get page id from facebook html og tags for mobile apps
    $fanpage_html = file_get_contents('https://www.facebook.com/' . $fanpage_name, false, $context);
    if(!preg_match('{fb://page/(\d+)}', $fanpage_html, $id_matches)){
        // invalid fanpage name
        return $ret;
    }
    $url = 'http://www.facebook.com/plugins/fan.php?connections=100&id=' . $id_matches[1];
    for($a = 0; $a < $no_of_retries; $a++){
        $like_html = file_get_contents($url, false, $context);
        preg_match_all('{href="https?://www\.facebook\.com/([a-zA-Z0-9\._-]+)" data-jsid="anchor" target="_blank"}', $like_html, $matches);
        if(empty($matches[1])){
            // failed to fetch any fans - convert returning array, cause it might be not empty
            return array_keys($ret);
        }else{
            // merge profiles as array keys so they will stay unique
            $ret = array_merge($ret, array_flip($matches[1]));
        }
        // don't get banned as flooder
        usleep($pause);
    }
    return array_keys($ret);
}

print_r(fetch_fb_fans('TigerPolska', 2, 400000));

Ответ 3

Используйте это.

https://www.facebook.com/browse/?type=page_fans&page_id=<your page id>

Он вернет до 500 самых последних.

http://www.facebook.com/browse/?type=page_fans&page_id=<your page id>&start=400

Каждая страница даст вам 100 фанатов. Измените начальное значение на (0, 100, 200, 300, 400), чтобы получить первый 500. Если start > 401, страница будет пустой: (

Ответ 4

В соответствии с документацией на Facebook невозможно получить всех поклонников страницы:

Хотя вы не можете получить список всех поклонников Facebook-страницы, вы может узнать, понравился ли конкретный человек странице.

Ответ 5

Для ответа s3m3n плагин для фанатов Facebook (например, LAMODA) имеет ограничение теперь, вы получаете все меньше и меньше новых поклонников от непрерывных запросов. Вы можете попробовать модифицированный PHP script для визуализации результатов: https://gist.github.com/liruqi/7f425bd570fa8a7c73be#file-facebook_fans_by_plugin-php

Другой подход - поиск по графику в Facebook. На странице результатов поиска: Люди, которым нравятся страницы с именем "Lamoda" , откройте консоль Chrome и запустите JavaScript:

var run = 0;
var mails = {}
total = 3000; //滚动次数,可以自己根据情况定义

function getEmails (cont) {
    var friendbutton=cont.getElementsByClassName("_ohe");
    for(var i=0; i<friendbutton.length; i++) {
        var link = friendbutton[i].getAttribute("href");

        if(link && link.substr(0,25)=="https://www.facebook.com/") {
            var parser = document.createElement('a');
            parser.href = link;
            if (parser.pathname) {
                path = parser.pathname.substr(1);
                if (path == "profile.php") {
                    search = parser.search.substr(1);
                    var args = search.split('&');
                    email = args[0].split('=')[1] + "@facebook.com\n";
                } else {
                    email = parser.pathname.substr(1) + "@facebook.com\n";
                }
                if (mails[email] > 0) {
                    continue;
                }
                mails[email] = 1;
                console.log(email);
            }
        }
    }
}

function moreScroll() {
    var text="";
    containerID = "BrowseResultsContainer"
    if (run > 0) {
        containerID = "fbBrowseScrollingPagerContainer" + (run-1);
    }
    var cont = document.getElementById(containerID);
    if (cont) {
        run++;
        var id = run - 2;
        if (id >= 0) {
            setTimeout(function() {
                containerID = "fbBrowseScrollingPagerContainer" + (id);
                var delcont = document.getElementById(containerID);
                if (delcont) {
                getEmails(delcont);
                delcont.parentNode.removeChild(delcont);
                }
                window.scrollTo(0, document.body.scrollHeight - 10);
            }, 1000);
        }
    } else {
        console.log("# " + containerID);
    }
    if (run < total) {
        window.scrollTo(0, document.body.scrollHeight + 10);
    }
    setTimeout(moreScroll, 2000);
}//1000为间隔时间,也可以根据情况定义

moreScroll();

Он загрузит новых поклонников и распечатает идентификатор пользователя/адрес электронной почты, удалит старые узлы DOM, чтобы избежать сбоя страницы. Вы можете найти здесь script здесь

Ответ 6

Эта страница https://developers.facebook.com/docs/reference/fql/like/ написала, вы не можете получить список поклонников.

"Объекты Post, Video, Note, Link, Photo и Album Graph API содержат эквивалентное соединение, называемое симпатичным."

ПРИМЕЧАНИЕ: fql как запрос устарел

Ответ 7

Технически этот запрос FQL должен работать, но по какой-то причине Facebook запрещает его из-за отсутствующего индекса. Не уверен, что это из-за политики или они просто забыли.

SELECT uid FROM page_fans WHERE page_id="YOUR_PAGE_ID"

Ответ 8

Документация FQL для Facebook здесь рассказывает вам, как это сделать. Запустите пример SELECT name, fan_count FROM page WHERE page_id = 19292868552 и замените номер page_id номером идентификатора страницы, и он вернет имя страницы и количество вентиляторов.