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

npm install turbofilm-community-api
84 downloads in the last month

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

встроенные middleware

$

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

экспортирует в 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

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

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

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

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

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

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

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

data.match

внимательный читатель наверняка уже догадался, что в него просто передается результат вычисления 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');
npm loves you