Как стать автором
Обновить

Сохранение данных Google Reader. PHP версия

Время на прочтение5 мин
Количество просмотров8.2K
Анонс: данная заметка не претендует на полноценную статью. Здесь будет очередная «выкачивалка всех данных» из сервиса Google Reader, заметка из разряда «я просто оставлю это здесь».



Вступление


По известному всем поводу закрытия прекрасной RSS читалки уже было написано несколько статей.
На данную небольшую заметку меня «навеяла» вот эта, в которой так же давалось промежуточное решение в виде сохранения своих данных из GReader с помощью «питонового» скрипта.
Собственно суть этой моей заметки только в одном: я писал для себя похожий скрипт на PHP(«питона» не знаю), и думаю, неплохо бы ним поделиться.
С одной стороны, может кому-то еще поможет, а с другой — может кто-то поможет мне, указав на какие-либо ошибки или на то, что я что-то забыл, недоделал или где-то накосячил.

Что это?


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

Где взять?


Сам скрипт можно взять здесь на GitHub (хотя предположительно в июле это все станет уже неактуальным).
Один файл скрипта, и один батник(.bat файл). Скрипт писался под windows, но должен работать везде.
С PHP под Windows есть упрощенный вариант, уже давал его здесь.
Суть — автономный архив с PHP, разворачиваем его в любую папку(не важно в какую, желательно, чтобы путь был покороче и без пробелов), например c:\php, после чего либо прописываем в системную переменную окружения path эту директорию, либо правим первую строчку запускающего скрипт bat-ника, либо если развернули в c:\php, то вообще больше ничего делать не надо(в прилагаемом батнике именно она и прописана). Ну, либо качаем свежую с php.net, либо у многих уже и так все есть.

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

Как это работает?


Теперь описание работы скрипта и что он может.
Для начала наверное следует указать, что использует он из нежестко-прошитых библиотек cURL и функцию json_decode().
cURL, как я предполагаю, у многих включен по-умолчанию, а JSON-функции хоть и появились, начиная с какой-то там пятой версии PHP, но для болеее ранних версий в скрипте работает и включена по-умолчанию замена этой функции на простенькие регулярки. То есть из «обязаловок» остается только cURL.
Так же для очистки совести не лишним наверное будет упомянуть, что код авторизации на сервисе взят из этого маленького класса. Фактически оттуда взяты только пару функций для получения токена, остальное перелопачено и встроено в конец скрипта.

Теперь настройки. Они находятся в начале скрипта и выглядят так:
$GLOBALS['account_user']='googleuser@gmail.com';
$GLOBALS['account_password']='qwerty';

$GLOBALS['is_atom']=true;
$GLOBALS['try_consolidate']=true;
$GLOBALS['fetch_count']=1000;
$GLOBALS['fetch_special_feeds']=true;
$GLOBALS['fetch_regular_feeds']=true;

$GLOBALS['atom_ext']="atom.xml.txt";
$GLOBALS['json_ext']="json.txt";
$GLOBALS['save_dir']="./feeds/";
$GLOBALS['log_file']=$GLOBALS['save_dir']."log.txt";
$GLOBALS['use_json_decode']=false;//function_exists('json_decode');

/* !!!!!!!!!! */
$GLOBALS['need_readinglist']=false;
/* !!!!!!!!!!
 important!
 this will fetch a very full feed list, mixed from all subscribtions and ordered by post date.
 in most cases this data is unusefull and this option will double the script worktime and the hdd space requirement.
 so probably you don't need set this to true.
!!!!!!!!!! */



Куда вводить логин и пароль, думаю понятно )
У меня, при настроенной двухэтапной аутентификации в гугл-аккаунт, в скрипте прекрасно работает «пароль для приложений».

Остальное:
$GLOBALS['is_atom'] — тащить данные в json или xml(atom) формате. при true будет создавать именно xml-версию.

$GLOBALS['try_consolidate'] — если true, пытается каждую подписку писать в один непрерывный файл.
Тут дело в том, что гугль не дает за один запрос вытащить более тысячи записей, поэтому скрипт тащит кусками по $GLOBALS['fetch_count'] записей(1000 — это максимальное валидное значение этого параметра), и может как укладывать каждую такую пачку в пронумерованные файлы-«тысячники», так и пытаться дописывать все время в один и тот же файл, не нарушая его структуры(json и xml). Т.к. фактически парсить входящие данные по ходу работы скрипта накладно, в нем сделан довольно топорный механизм сливания файлов на простеньких регулярках, который тем не менее работает. В общем можете играться с параметрами и смотреть, что получается на выходе.

$GLOBALS['fetch_special_feeds']=true; вытаскивать ли спецфиды, такие как «заметки», «отмеченные записи» и т.п. Может, кому не надо.

$GLOBALS['fetch_regular_feeds']=true; тащить ли основные фиды по списку по отдельности. Можно отрубить, например, если вам зачем-то нужна только основная лента, где все вперемешку(параметр $GLOBALS['need_readinglist']).

$GLOBALS['atom_ext']=«atom.xml.txt»;
$GLOBALS['json_ext']=«json.txt»;
Это настройки расширений файлов, которые скрипт будет присваивать всему, что скачивает, в зависимости от параметра $GLOBALS['is_atom'] будет выбирать либо одно, либо другое.

$GLOBALS['save_dir']="./feeds/"; директория, в которую качать. по-умолчанию он возле себя создаст директорию feeds, как можно догадаться из этого параметра )

$GLOBALS['log_file'] — по-умолчанию в поддиректории feeds будет файл log.txt, в котором будет продублировано все, что скрипт выводит на экран.

$GLOBALS['use_json_decode'] — использовать ли функцию json_decode, или обойтись упрощенной версией. Если сделать так:
$GLOBALS['use_json_decode']=function_exists('json_decode'); то автоматом будет использовать системную функцию, если она поддерживается вашей версией PHP. Теоретически должно работать, а в реале мне пробовать не на чем.

Ну и последнаяя настройка $GLOBALS['need_readinglist']=false;, выделенная кучей восклицательных знаков и комментарием. Тащить ли основную ленту Ридера. Там очень много постов, теоретически это все посты из всех подписок, сваленные в кучу и отсортированные по датам, но на практике у меня например, там чуть больше половины постов из подписок. В любом случае это будет большой файл, будет долго качаться, и непонятно, зачем он нужен. Ну или скажем так: я не знаю, зачем он кому-либо может понадобиться. Если просветите в комментах, заранее спасибо, может и мне появится смысл его выкачать ))

Заключение


Ну вроде и все, удачи всем, надеюсь эта поделка кому-либо поможет. И готовьте место на «винтах» — у меня вытаскивает около гигабайта данных. Например, подписка главной ленты Хабра занимает на данный момент почти 80 тысяч записей, самые старые из которых на самом Хабре уже недоступны.

P.S. Я не могу ответить на вопрос, как потом эти сохраненные данные импортировать в какую-либо RSS-читалку. Думаю, далеко не все читалки будут в принципе поддерживать импорт контента подписок из внешних источников. Для себя я этот вопрос не задаю — ибо пишу сам себе читалку под OS X. Не знаю, буду ли делать и вылизывать ее для всех или оставлю только себе. Но думаю, что т.к. здесь, на Хабре, присутствуют авторы некоторых онлайн-читалок, они вполне могут позже реализовать у своих сервисов поддержку импорта этих данных. А может подсмотрят, как вытащить всю историю и таки реализуют это у себя — не просто же так пользователи практически повсеместно жалуются, что читалка если и поддерживает импорт с GReader, то почему-то по каждой подписке вытаскивает только 500-1000 последних записей и все.
Теги:
Хабы:
-1
Комментарии9

Публикации

Истории

Работа

PHP программист
159 вакансий

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн