2017-01-01 9 views
4

SO. У меня возникла проблема, и поиск времени в Интернете через Интернет не помог многим, подумал, что это хороший вариант. У меня есть фейсбук GraphAPI звонить, чтобы получить пользователь Facebook кормить как здесь ниже:Как работает facebook graph api pagination и как итерации пользователя facebook с ним?

dynamic myFeed = await fb.GetTaskAsync(
        ("me/feed?fields=id,from {{id, name, picture{{url}} }},story,picture,link,name,description," + 
        "message,type,created_time,likes,comments") 
        .GraphAPICall(appsecret_proof)); 

Выше помочь мне вернуть ряд последнего сообщения о том, что пользователь отправил в некоторое время говорит 21 или, может быть, 22 сообщение, но не полный список сообщений пользователя. Я искал способ итерации через фид пользователей с помощью facebook pagination. Я нашел это решение, которое работает с facebook Offset pagination.

dynamic myFeed = await fb.GetTaskAsync(
        ("me/feed?fields=id,from {{id, name, picture{{url}} }},story,picture,link,name,description," + 
        "message,type,created_time,likes,comments") 
        .GraphAPICall(appsecret_proof), new {limit = "1000", offset = "21" }); 

Это взял меня шаг рядом с тем, что я хочу достичь, но я думаю, что это не идеальный способ сделать это, а также он не возвращает все сообщения пользователей. Есть ли обходной путь? Пожалуйста помоги.

P.S: Я пользуюсь Facebook C# SDK.

UPDATE1: Как ответ Джереми. Кажется, что разбиение на страницы facebook является единственным подходящим вариантом для моих требований. Я хотел бы знать, если C# facebook sdk предоставляет любую функцию для итерации по Next Edges, поэтому я могу получить все сообщения фида в одном вызове, есть ли возможное решение для этого? PS: Я много раз просматривал документы API facebook, и я знаю, что именно являются узлами, краями и полями, единственное, к сожалению, - это то, что facebook пока не поддерживает SDK SDK, и мне не удалось найти правильную документацию по Facebook C# SDK тоже.

+0

Если в последних версиях API Graph не изменилось, на самом деле это не так. Сообщения Facebook на краях, если вы хотите получить все сообщения от пользователя, вам нужно продолжать поиск по краям (обновлять новые элементы). То, что вы нашли с * Offset *, является самым близким. Вы можете прочитать это в документах FB API. –

ответ

1

Наконец после того, как делают некоторые исследования и читать некоторые блог, я обнаружил, что нет прямого API CAlls от Facebook, чтобы получать все сообщения фидерных пользователя в один раз. Для достижения этой функциональности нужно либо бесконечно прокручивать, как предложил Джереми Томсон, либо перебирать разные страницы данных facebook, независимо от того, какой тип facebook pagination поддерживается edge. Насколько мне нужен процесс без вмешательства пользователя/действий, я бы выбрал второй вариант, который выполняет итерацию через страницы данных facebook с помощью цикла while. Для этого нам сначала нужно два наших самых важных параметров (facebook access_token + (facebook appsecret_proof), как описано ниже:

var appsecret_proof = access_token.GenerateAppSecretProof(); 
var fb = new FacebookClient(access_token); 

Поинт помнить: facebook access_token порождается HttpContext класса.

facebook API вызова получат пользователь первый 25 фидера пост, как показано ниже:

dynamic myFeed = await fb.GetTaskAsync(
        ("me/feed?fields=id,from {{id, name, picture{{url}} }},story,picture,link,name,description," + 
        "message,type,created_time,likes,comments") 
        .GraphAPICall(appsecret_proof)); 

API Вызова выше результатов возвращения в Json массиве и что должно быть увлажненным через Model View свойства, как показано здесь :

var postList = new List<FacebookPostViewModel>(); 
    foreach (dynamic post in myFeed.data) 
     { 
     postList.Add(DynamicExtension.ToStatic<FacebookPostViewModel>(post)); 
     } 

До сих пор все было ясно прежде, самая важная часть, которая, несомненно, Сообщение пользователя acebook теперь находится в действии. Для этого нужно установить string опустошить, как здесь:

string NextPageURI = string.Empty; 

Заключительная часть все, чтобы проверить, есть еще одна страница для данных, если да, то должны перебирать и добавить данные в View Model до нет лифта страницы, как показано здесь:

while (myFeed.paging != null && myFeed.paging.next != null) 
       { 
        NextPageURI = myFeed.paging.next; 
        var nextURL = GetNextPageQuery(NextPageURI, access_token); 
        dynamic nextPagedResult = await fb.GetTaskAsync(nextURL.GraphAPICall(appsecret_proof)); 
        foreach (dynamic post in nextPagedResult.data) 
        { 
         postList.Add(DynamicExtension.ToStatic<FacebookPostViewModel>(post)); 
        } 
       } 

Это помогло мне избавиться от проблемы. Но все же у меня есть еще одна задача для работы. Это скорость получения сообщений, если в сообщениях более 30 тыс. Занимает 10 минут, что не идеально для меня.

+0

Что такое 'GetNextPageQuery'? –

+0

Похоже, вы используете для меня другой API :) –

5

Сначала немного терминологии:

узлы - в основном «вещи», такие как пользователь, фотография, страница, комментарий
края - соединения между «вещами», например а фотки страницы или фото в Комментарии
поля - информация о тех «вещах», таких как день рождения человека, или имя страницы

Когда вы делаете запрос API к узлу или ребру, Вы обычно не получают все результаты этого запроса в одном ответе. Это связано с тем, что некоторые ответы могут содержать тысячи объектов, поэтому большинство ответов по умолчанию делятся на страницы.

Чтобы получить все сообщения от пользователя у вас есть 3 варианта:


курсора на основе PAGINATION

курсора на основе нумерацией страниц является наиболее эффективным методом пейджинга и всегда должны быть использованы, где возможное. Курсор относится к случайной строке символов, которая помещает определенный элемент в список данных. Если этот элемент не будет удален, курсор всегда будет указывать на одну и ту же часть списка, но будет недействительным, если элемент будет удален. Поэтому ваше приложение не должно хранить старые курсоры или предположить, что они все равно будут действительны.

При чтении края, который поддерживает курсор пагинацию, вы увидите следующий JSON ответ:

{ 
    "data": [ 
    ... Endpoint data is here 
    ], 
    "paging": { 
    "cursors": { 
     "after": "MTAxNTExOTQ1MjAwNzI5NDE=", 
     "before": "NDMyNzQyODI3OTQw" 
    }, 
    "previous": "https://graph.facebook.com/me/albums?limit=25&before=NDMyNzQyODI3OTQw" 
    "next": "https://graph.facebook.com/me/albums?limit=25&after=MTAxNTExOTQ1MjAwNzI5NDE=" 
    } 
} 

Чтобы получить все сообщения от пользователя вы продолжаете серфинг «следующие» края (upserting новых пунктов) , Именно так я это делаю, когда я отбрасываю целые группы в РСУБД для статистического анализа. Часто вы увидите ребра с узлами, с которыми вы уже столкнулись, поэтому я упоминаю UPSERT (обновление, если оно существует в противном случае).

основы времени разбиения на страницах

Время нумерация страниц используются для навигации по данным результатов с использованием Unix временных меток, указывающий на конкретные периоды времени в списке данных.

При использовании конечной точки, которая использует повременную пагинацию, вы увидите следующий ответ JSON:

{ 
    "data": [ 
    ... Endpoint data is here 
    ], 
    "paging": { 
    "previous": "https://graph.facebook.com/me/feed?limit=25&since=1364849754", 
    "next": "https://graph.facebook.com/me/feed?limit=25&until=1364587774" 
    } 
} 

Чтобы получить все пользователь сообщение вы держать итерацию назад во время. Этот метод даст вам сообщения в порядке, хотя может потребовать их возврата в порядке с помощью алгоритма FaceBooks edge.

Offset на основе разбиения на страницах

Смещения нумерации страниц можно использовать, когда вы не заботитесь о хронологии и просто хотите определенное количество объектов, возвращаемым. Это следует использовать, только если край не поддерживает курсор или временную разбивку на страницы.

Знаете ли вы, что вы нашли с Офсет самый близкий, который вам понравится. Однако:

Нанесение ссылок на основе смещения не поддерживается для всех вызовов API. Чтобы получить согласованные результаты, мы рекомендуем вам разбиваться на страницы, используя предыдущие/следующие ссылки, которые мы возвращаем в ответ.

Вы можете прочитать все это в документах FB API.

https://developers.facebook.com/docs/graph-api/overview/
https://developers.facebook.com/docs/graph-api/using-graph-api/

+0

Я обновил вопрос, пожалуйста, взгляните на него, и я был бы очень признателен, если бы получил ответ на этот вопрос. –

+0

Основополагающий API-интерфейс Facebook не поддерживает получение всех сообщений пользователя в одном вызове, поэтому C# SDK не может обеспечить эту функциональность. Единственное, что я могу придумать, это использовать пакет WebClient &/или HTML Agility и прокручивать нижнюю часть страницы пользователя и выгружать всю страницу. Не идеально. –

+0

Я посмотрел на свой ответ ниже –

 Смежные вопросы

  • Нет связанных вопросов^_^