Как пропустить известные записи при синхронизации с Google Reader? - PullRequest
7 голосов
/ 21 декабря 2008

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

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

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

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

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

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

Cheers, Мариано

Ответы [ 2 ]

6 голосов
/ 21 июня 2009

Чтобы получить последние записи, используйте стандартную загрузку от самой новой даты по убыванию, которая начнется с самых последних записей. В результате 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 Интерфейс считывателя.

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

  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, которые у нас есть. Единственный мой реальный совет - минимизировать проверку статуса на не новинках.

1 голос
/ 15 июня 2009

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

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

...