Как пропустить известные записи при синхронизации с Google Reader?
Для записи автономного клиента в службу Google Reader я хотел бы знать, как лучше всего синхронизировать его со службой.
Похоже, официальной документации пока нет, и лучший источник, который я нашел, это: http://code.google.com/p/pyrfeed/wiki/GoogleReaderAPI
Теперь рассмотрим это: с помощью информации, приведенной выше, я могу загрузить все непрочитанные элементы, я могу указать, сколько элементов для загрузки, и с помощью атомного идентификатора я могу обнаружить дублирующиеся записи, которые я уже скачал.
Что мне не хватает, так это способ указать, что я просто хочу обновления с момента последней синхронизации. Я могу сказать, дайте мне 10 (параметр n= 10) последних (параметр r= d) записей. Если я укажу параметр r= o (дата по возрастанию), тогда я также могу указать параметр ot= [последний раз синхронизации], но только тогда, и порядок возрастания не имеет никакого смысла, когда я просто хочу прочитать некоторые элементы против всех Предметы.
Любая идея, как решить это, не загружая все элементы снова и просто отклоняя дубликаты? Не очень экономичный способ опроса.
Кто-то предложил мне указать, что я хочу только непрочитанные записи. Но чтобы это решение работало так, чтобы Google Reader больше не предлагал эти записи, мне нужно пометить их как прочитанные. В свою очередь это будет означать, что мне нужно сохранять собственное состояние чтения / непрочитания на клиенте и что записи уже помечаются как прочитанные, когда пользователь входит в онлайн-версию Google Reader. Это не работает для меня.
Ура, Мариано
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.
Один подход к этому будет:
- Обновите статус на Google любых предметов, которые были прочитаны локально.
- Проверьте и сохраните непрочитанное количество для подачи. (Вы хотите сделать это до следующего шага, чтобы гарантировать, что новые элементы не поступили между загрузкой самых новых элементов и временем проверки количества считываний.)
- Загрузите последние предметы.
- Подсчитайте количество прочитанных и сравните их с Google. Если в ленте больше считанных данных, чем вы рассчитывали, вы знаете, что что-то было прочитано в Google.
- Если что-то было прочитано в Google, начните загружать прочитанные элементы и сравнивать их с вашей базой данных непрочитанных элементов. Вы найдете некоторые элементы, которые, по словам Google, прочитаны, поскольку ваши претензии в базе данных непрочитаны; обновить это. Продолжайте делать это до тех пор, пока вы не найдете число этих элементов, равное разнице между вашим счетом чтения и Google, или пока загрузки не станут необоснованными.
- Если вы не нашли все прочитанные материалы, c'est la vie; запишите оставшееся число в виде "непрочитанного непрочитанного" итога, который вам также необходимо включить в следующий расчет локального номера, который вы считаете непрочитанным.
Если пользователь подписывается на множество разных блогов, вероятно, он также широко их помечает, поэтому вы можете делать все это отдельно для каждой метки, а не для всего канала, что должно помочь уменьшить объем данных, поскольку Вам не нужно будет делать какие-либо переводы для ярлыков, где пользователь не прочитал ничего нового в Google Reader.
Вся эта схема может быть применена и к другим статусам, таким как помеченные или не помеченные звездочкой.
Теперь, как вы говорите, это
... означало бы, что мне нужно сохранять собственное состояние чтения / непрочитания на клиенте и что записи уже помечаются как прочитанные, когда пользователь входит в онлайн-версию Google Reader. Это не работает для меня.
Правда достаточно. Ни сохранение локального состояния чтения / непрочитанного (так как вы все равно сохраняете базу данных всех элементов), ни пометка элементов, читаемых в Google (которые поддерживает API), не кажется очень трудным, так почему это не работает для вас?
Однако есть еще одна проблема: пользователь может пометить что-то прочитанное как непрочитанное в Google. Это добавляет немного рывка в систему. Мое предложение, если вы действительно хотите попытаться позаботиться об этом, состоит в том, чтобы предположить, что пользователь в целом будет касаться только самых последних материалов, и загружать последние пару сотен или около того элементов каждый раз, проверяя состояние всех их. (Это не так уж и плохо; загрузка 100 элементов заняла у меня от 0,3 с для 300 КБ до 2,5 с для 2,5 МБ, хотя и при очень быстром широкополосном соединении.)
Опять же, если у пользователя большое количество подписок, у него, вероятно, также достаточно большое количество меток, поэтому выполнение этого для каждой метки ускорит процесс. На самом деле, я бы посоветовал вам не только проверять на основе каждого ярлыка, но также распределять чеки, проверяя один ярлык каждую минуту, а не все раз в двадцать минут. Вы также можете выполнять эту "большую проверку" для изменений состояния старых элементов менее часто, чем проверку "новой вещи", возможно, раз в несколько часов, если вы хотите уменьшить пропускную способность.
Это немного снижает пропускную способность, в основном потому, что вам нужно скачать полную статью из Google, просто чтобы проверить статус. К сожалению, я не вижу никакого способа обойти это в документах API, которые у нас есть. Мой единственный реальный совет - минимизировать проверку статуса на не новинках.
API Google еще не был выпущен, и в этот момент этот ответ может измениться.
В настоящее время вам придется вызывать API и игнорировать уже загруженные элементы, что, как вы сказали, не очень эффективно, поскольку вы будете повторно загружать элементы каждый раз, даже если они у вас уже есть.