export google reader shared posts

благодаря open google reader интерфейс google reader для меня не изменился, и возможность рекомендовать записи у меня тоже осталась. Однако комментариев в ридере скоро не станет совсем, даже приходящих из базза, поэтому хочется на всякий случай забрать из него всё своё. К счастью гугл старается быть хорошим и даёт возможность экспорта данных (Настройки → Импорт/экспорт). К несчастью, у активных пользователей вроде меня нередко скачиваются только данные за короткий период.

к счастью, гугл давно старается быть хорошим, поэтому он дал нам многостраничный atom feed. Вот страничка с моими рекомендациями и бесконечной промоткой назад при помощи параметра ?c= в адресе, а вот поток моих рекомендаций, в котором нет прямой ссылки на «предыдущую страницу», зато есть тег gr:continuation. Если его содержимое подставить в адрес потока как параметр ?c=, то результатом будут предыдущие 20 рекомендаций.

а вот простой скрипт на питоне, в который достаточно подставить id из адреса своего потока рекомендаций, и он скачает всю историю этого потока, что я с радостью и сделал для себя:

id = '10202714043885511706'

import os, urllib, xml.dom.minidom as dom

def get(continuation):
    url2 = url + continuation
    print url2
    text = ''.join(urllib.urlopen(url2))

    atom = dom.parseString(text)
    continuation = atom.getElementsByTagName('gr:continuation')
    continuation = continuation[0].firstChild.nodeValue
    date = atom.getElementsByTagName('updated')
    date = date[0].firstChild.nodeValue

    folder = date[:7]
    if not os.path.exists(folder): os.mkdir(folder)

    f = open(os.path.join(folder, date), 'w')
    f.write(text)
    f.close()

    return continuation


url = ('http://www.google.com/reader/public/atom/user%%2F' +\
    '%s%%2Fstate%%2Fcom.google%%2Fbroadcast?c=') % id
continuation = ''

while True: continuation = get(continuation)

в качестве дополнительного бонуса у меня теперь заработает нормальный поиск по своим же рекомендациям : )

Артемий Трегубенко,
, ,

comments powered by Disqus