turbofilm-community-api

if you are not have account on russian web-site turbofilm.tv, this package won't help you anything. please do not install it

if you are not have account on russian web-site turbofilm.tv, this package won't help you anything. please do not install it

turbofilm-community-api

каркас для парсеров сайта turbofilm.tv

предназначен только для внутреннего использования продвинутыми пользователями сайта turbofilm.tv

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

архитектуру модуля можно описать двумя словами: connect наоборот — вы пишите middleware, и делаете исходящий запрос, а middleware делает всю остальную работу

вам потребуется node.js и npm

в консоли:

$npm install turbofilm-community-api

в текстовом редакторе:

var turbofilm = require ('turbofilm-community-api');

для начала, вам нужно узнать у своего браузера значение куки под именем IAS_ID, без него ничего работать не будет

передать IAS_ID внутрь скрипта можно целыми двумя способами: напрямую, как в примере ниже, и через переменную окружения TF_IAS_ID (это может понадобиться для запуска в облаке)

turbofilm.config.ias_id = "<ваш IAS_ID>"
turbofilm ('/', function (err, data) {
    console.log (data.url) // -> "/"
    console.log (data.response) // -> http.ClientResponse
    console.log (data.body) // -> String – текст страницы
    console.log (data.config) // -> Object – настройки модуля
    console.log (data.match) // -> String.match () – далее
});

во фрагменте выше объект data – это то, чем оперируют middleware. на данный момент не один middleware не был подключен, давайте сделаем это

turbofilm.use (".*", turbofilm.middleware.$);

сразу же видно две особенности:

  1. в одноименном свойстве находятся несколько встроенных middleware (ниже)
  2. в отличии от connect-а, пути пишутся обычными регекспами (именно для этого нужно data.match), что больше похоже на роутер django

теперь, стало доступно свойство data.$

turbofilm ("/", function (err, data) {
    console.log (data.$); // -> cheerio.load (data.body)
});

все middleware выполняются последовательно в порядке вызова .use

###$### экспортирует в data.$ cheerio-дерево документа

###links#### экспортирует в data.links массив $(a[href]), требует, чтобы $ было включено раньше

###parseBlog### экспортирует в data.posts массив постов со страницы (о парсерах ниже), требует $

###parsePost#### экспортирует в data.post пост со страницы (без комментариев!), требует $

###parseComments#### экспортирует в data.comments массив комментариев со страницы, требует $

###parseOnpageSeries### на каждой странице вверху есть список сериалов, этот парсер парсит именно их экспортирует в data.series массив сериалов со страницы, требует $

###экспериментальные### нужны для работы с базой данных redis

для того, чтобы включить экспериментальные middleware нужно в middleware.js в самом верху заменить строчку:

var ENABLE_REDIS = true;

сразу же потребуется установить пакеты для работы с редисом

$npm install hiredis redis

как несложно догадаться, parseX middleware – это некие парсеры, которые выдирают из cheerio-дерева некие данные. Ниже описаны форматы данных, экспортируемые встроенными парсерами, на некотором json-like псевдокоде

###parseBlog### data.posts = [ { // то же самое, что и parseComments, плюс: offset: Number // номер поста в блоге } ... ]

###parsePost#### data.post = { id: String, // идентификатор поста blogName: String, // название блога, в котором опубликован пост blogUrl: String, // url блога, в котором опубликован пост title: String, // название поста url: String, // url самого поста author: String, // url на страницу профиля автора username: String, // отображаемое имя автора pubdate: String, // дата публикации поста. Строка, как на турбофильме votes: Number, // рейтинг поста text: String, comments: Array // то же самое, что и parseComments }

###parseComments#### data.comments = [ { level: Number, // уровень вложенности в треде (от 0 до 7) id: String, // идентификатор комментария в формате /comm\d+/ author: String, // url на страницу профиля автора username: String, // отображаемое имя автора pubdate: String, // дата публикации комментария. Строка, как на турбофильме votes: Number, // рейтинг комментария text: String }, ... ]

###parseOnpageSeries### data.series = [ { img: String, // url на превью сериала, как на сайте alt: String, // alt-аттрибут картинки, соответствует канонiчному названию сериала на сайте ru: String, // название сериала на русском языке en: String, // название сериала на английском языке url: String // url на страницу сериала }, ... ]

###parseCommentDate### data.comments = [ { pubdate: Date // Парсит дату публикации в объект Data } ]

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

turbofilm.use (".*", function (data, callback) {
    // некий код
    callback ();
});

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

можно передавать несколько обработчиков

turbofilm.use (".*", turbofilm.middleware.$, turbofilm.parseOnPageSeries);

кроме того, вместо регекспа можно передавать строку-идентификатор:

turbofilm.use ('post', ...);

внимательный читатель наверняка уже догадался, что в него просто передается результат вычисления url.match (regexp), больше тут добавить нечего

  1. на данный момент, нет повторной авторизации при ошибках авторизации, и, соответственно не работает .auth-метод
  2. также, нет возможности оставлять посты и комментарии с помощью .create.(post|comment|reply)
  3. нет никакой поддержки скачивания сериалов
var turbofilm = require ('turbofilm-community-api');
turbofilm.config.ias_id = '0h2048hg08hg8h294gh92h4g8';
turbofilm.use ('.*', turbofilm.middleware.$);
turbofilm.use ('.*', turbofilm.middleware.links);
turbofilm.use ('[BT]log(?!=\/Posts\/)', turbofilm.middleware.parseBlog);
turbofilm.use ('[BT]log(?=\/Posts\/)', turbofilm.middleware.parsePost);

turbofilm.use ('.*', function (data, callback) {
    callback ();
});

turbofilm ('/Tlog');

turbofilm ('/Tlog/Posts/31537');