Как пропустить известные записи при синхронизации с Google Reader?

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

Официальной документации пока нет, и лучший источник, который я нашел до сих пор, это: http://code.google.com/p/pyrfeed/wiki/GoogleReaderAPI

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

Что мне не хватает, так это способа указать, что мне нужны только обновления с момента моей последней синхронизации. Я могу сказать, дайте мне 10 (параметр n = 10) последних (параметр r = d) записей. Если я укажу параметр r = o (по возрастанию даты), тогда я также могу указать параметр ot = [последний раз синхронизации], но только тогда, и порядок возрастания не изменится. Это не имеет никакого смысла, когда я просто хочу прочитать некоторые статьи, а не все.

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

Кто-то предложил мне указать, что мне нужны только непрочитанные записи. Но чтобы это решение работало так, чтобы Google Reader больше не предлагал эти записи, мне нужно было бы отметить их как прочитанные. В свою очередь, это означало бы, что мне нужно сохранить свое собственное состояние чтения / непрочитания на клиенте и, что записи уже помечаются как прочитанные, когда пользователь входит в онлайн-версию Google Reader. У меня это не работает.

Привет, Мариано


person Mariano Kamp    schedule 21.12.2008    source источник
comment
Я не уверен, что вижу проблему с использованием режима r=o (возрастание даты). Если он дает вам все, что вам нужно, почему это так важно, что они отсортированы?   -  person Noldorin    schedule 19.06.2009
comment
Там поток обычного пользователя содержит более 10.000 записей и по всем практическим вопросам является бессрочным. Так что я не могу прочитать все 10.000 (или что-то еще), чтобы добраться до последних 50, актуальных для меня ... и для каждой синхронизации, всего, скажем, 20 минут.   -  person Mariano Kamp    schedule 19.06.2009
comment
Кроме того, кажется, что OT не принимает во внимание измененный статус, например переход от непрочитанного - ›прочитанного, не помеченного -› помеченного и т. Д. Но все равно спасибо за проявленный интерес.   -  person Mariano Kamp    schedule 19.06.2009


Ответы (2)


Чтобы получить самые свежие записи, используйте стандартную загрузку по убыванию от новейшей даты, которая будет начинаться с самых последних записей. В результате XML вы получите токен «продолжения», который выглядит примерно так:

<gr:continuation>CArhxxjRmNsC</gr:continuation>`

Просматривайте результаты, вытаскивая что-нибудь новое для вас. Вы должны обнаружить, что либо все результаты новые, либо все до определенного момента новое, а все последующее вам уже известно.

В последнем случае все готово, но в первом вам нужно найти новый материал старше того, что вы уже получили. Сделайте это, используя продолжение, чтобы получить результаты сразу после последнего результата в только что полученном наборе, передав его в запросе GET в качестве параметра c, например:

http://www.google.com/reader/atom/user/-/state/com.google/reading-list?c=CArhxxjRmNsC

Продолжайте так, пока не получите все.

Параметр n, который является подсчетом количества элементов для извлечения, хорошо работает с этим, и вы можете изменять его по мере необходимости. Если частота проверки устанавливается пользователем и, следовательно, может быть очень частой или очень редкой, вы можете использовать адаптивный алгоритм, чтобы уменьшить сетевой трафик и нагрузку на обработку. Сначала запросите небольшое количество последних записей, скажем, пять (добавьте n=5 к URL-адресу вашего GET-запроса). Если все они новые, в следующем запросе, в котором вы используете продолжение, попросите большее число, скажем, 20. Если они все еще новые, либо в ленте много обновлений, либо это было давно, поэтому продолжайте в группах по 100 человек или что-то еще.


Однако и поправьте меня, если я ошибаюсь, вы также хотите знать, после того, как вы загрузили элемент, изменилось ли его состояние с «непрочитанного» на «прочитанное» из-за того, что человек читает его с помощью интерфейса Google Reader.

Один из подходов к этому:

  1. Обновите статус в Google для всех элементов, которые были прочитаны локально.
  2. Проверьте и сохраните количество непрочитанных каналов. (Вы хотите сделать это до следующего шага, чтобы гарантировать, что новые элементы не поступят в период между загрузкой новейших элементов и временем, когда вы проверяете счетчик чтения.)
  3. Загрузите самые свежие товары.
  4. Подсчитайте свое количество прочитанных и сравните его с показателем Google. Если у фида больше чтения, чем вы рассчитали, вы знаете, что что-то было прочитано в Google.
  5. Если что-то было прочитано в Google, начните загружать прочитанные элементы и сравнивать их с вашей базой данных непрочитанных элементов. Вы найдете некоторые элементы, которые, по утверждениям Google, прочитаны, что ваши требования к базе данных не прочитаны; обновите их. Продолжайте делать это, пока не найдете количество этих элементов, равное разнице между вашим счетчиком чтения и счетчиком Google, или пока количество загрузок не станет необоснованным.
  6. Если вы не нашли все прочитанные элементы, c'est la vie; запишите оставшееся число как «ненайденное непрочитанное» общее количество, которое вам также необходимо включить в следующий расчет местного номера, который вы считаете непрочитанным.

Если пользователь подписывается на множество разных блогов, вероятно, он сильно помечает их, поэтому вы можете делать все это для каждой метки, а не для всего канала, что должно помочь снизить объем данных, поскольку Вам не нужно будет делать какие-либо переводы для ярлыков, на которых пользователь не читал ничего нового в Google Reader.

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

Теперь, как вы говорите, это

... означало бы, что мне нужно сохранить мое собственное состояние чтения / непрочитанности на клиенте и что записи уже отмечены как прочитанные, когда пользователь входит в онлайн-версию Google Reader. У меня это не работает.

Достаточно верно. Ни сохранение локального состояния чтения / непрочитанности (поскольку вы все равно храните базу данных со всеми элементами), ни маркировка элементов, прочитанных в Google (что поддерживает API), не кажутся очень сложными, так почему это не работает для вас?


Однако есть еще одна загвоздка: пользователь может пометить что-то прочитанное в Google как непрочитанное. Это немного затрудняет работу системы. Мое предложение, если вы действительно хотите попытаться позаботиться об этом, состоит в том, чтобы предположить, что пользователь в целом будет касаться только более свежих материалов, и загружать последние пару сотен или около того элементов каждый раз, проверяя статус всех их. (Это не все это плохо; загрузка 100 элементов заняла у меня от 0,3 с для 300 КБ до 2,5 с для 2,5 МБ, хотя и при очень быстром широкополосном соединении.)

Опять же, если у пользователя большое количество подписок, у него также, вероятно, есть достаточно большое количество ярлыков, поэтому выполнение этого для каждого ярлыка ускорит процесс. На самом деле я бы посоветовал вам не только проверять на основе каждой метки, но также распределять проверки, проверяя одну метку каждую минуту, а не все каждые двадцать минут. Вы также можете выполнять эту «большую проверку» на предмет изменений статуса старых элементов реже, чем проверку «новых вещей», возможно, раз в несколько часов, если вы хотите снизить пропускную способность.

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

person cjs    schedule 21.06.2009
comment
Проблема не в том, что я не могу указать большее n. Я уже использую продолжения, но весь процесс загрузки всех статей, чтобы найти несколько измененных на стороне клиента, очень неэффективен. Пожалуйста, не думайте об этом как о разовом, думайте об этом каждые 20 минут. - person Mariano Kamp; 21.06.2009
comment
Чтобы избавиться от этой неэффективности, я в первую очередь задал этот вопрос. Поскольку этот подход просто не масштабируется, мне пришлось искусственно ограничить NewsRob до 500 статей. И мне бы очень хотелось снять это ограничение, но это означало бы знание этого неофициального API и поиск способа, позволяющего выполнять фильтрацию на стороне сервера. Здесь я объяснил это более подробно: groups.google.com/group/newsrob/ browse_thread / thread / - person Mariano Kamp; 21.06.2009
comment
Я совершенно точно думаю об этом каждые двадцать минут. Насколько я понимаю, вы сначала загружаете все (или многие) элементы, а после этого вам нужны новые, которые появились с тех пор. Так и будет, так как новые всегда будут первыми, и вы просто продолжаете, пока не попадете в ту, которую видели. Если я ответил не на тот вопрос, возможно, вы сможете уточнить свой? Не стесняйтесь писать мне по электронной почте, если вы не хотите ввязываться в большую дискуссию здесь. - person cjs; 21.06.2009
comment
А, проблема в следующем: элемент, который вы помечаете как прочитанный в веб-интерфейсе Google Reader, даже после синхронизации останется непрочитанным в NewsRob. - person cjs; 21.06.2009
comment
Фух! Хорошо, возможно, я нашел способ помочь вам здесь, если теперь понимаю вашу настоящую проблему. Это не идеально, но должно быть намного эффективнее, чем просто скачивание всего. Дайте мне знать, если это то, что вы ищете. - person cjs; 21.06.2009

Google API еще не выпущен, после чего этот ответ может измениться.

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

person Fenton    schedule 15.06.2009
comment
Да, это неэффективно, и эта неэффективность усугубляется с увеличением количества статей, на которые вы устанавливаете емкость клиента, что довольно быстро достигает реального барьера. В NewsRob я ограничиваю объем до 500 статей. Чтобы избавиться от этого ограничения, я задал этот вопрос. Время идет, и я сомневаюсь, что когда-нибудь будет официальный релиз. - person Mariano Kamp; 18.06.2009