22

Агрегатор контента своими руками. Попытка №2.

Агрегатор контента своими руками. Попытка №2.

Привет моим верным подписчикам и лиге вэб разработчиков! В данном посте я поведаю о:

- паре забавных случаев, возникших при разработке новой версии моего агрегатора котиков и мемасиков (а так же новостей, видео, пабликов, групп, RSS и Telegram каналов );

- текущем состоянии дел и планах развития.


Около 800 дней назад я опубликовал первую версию агрегатора контента и сделал пост на пикабу. Сервис получился неплохим и мои цели удовлетворял. Я пользовался им каждый день, для просотра мемасиков и котеек. Но, к сожалению, большого интереса у пользователей не вызывал. А в комментариях знающие люди советовали весь функционал перенести на сервер, что бы на клиентских устройствах все работало максимально быстро.


Так как по своей натуре я перфекционист, то идея сделать все "красиво" не давала мне покоя и в 2017 году я наконец сдался и решился переписать все с 0, нанять хорошего дизайнера и выкатить ресурс который заткнет за пояс конкурентов :) Получилось ли у меня или это очередное фиаско, я надеюсь узнать сегодня, в комментариях к этому посту :)


Итак, начнем с пары интересных задач, которые пришлось решить при разработке.


1. Как я добавлял вывод телеграмм каналов.


В последний год появляется все больше популярных телеграм-каналов. Но лично мне не удобно читать их в приложении, хотя я не пробовал :). Я сразу запланировал, что в новой версии агрегатора обязательно должна быть возможность вывести в свою ленту посты из любых публичных телеграм-каналов вместе со всеми другими источниками.


Обилие инструкций по работе с телеграм-ботами воодушевляло и я рассчитывал, что задача не займет много времени. И еще я не понимал, почему никто не сделал аналогичного сервиса :)


Как это всегда бывает в разработке, препятствия возникли на ровном месте: оказалось, что для того, что бы бот мог читать какой-то канал, бота надо туда добавить. Поэтому вариант сразу отпал. И я перешел к чтению мануалов на основной API телеграма.


Через 30 минут изучения документации я был в отчаянии.



Все данные у телеграма шифруются, что бы получить что то от их серверов нужно обладать степенью магистра по криптографии... И, конечно, обычные http запросы - это не для них, только низкоуровневые socket, отдающие чистые байты, только хардкор. Вообщем без сторонней помощи задача была нерешаемая.


Несколько дней поиска привели меня к решению: использовать на сервере opensource php телеграм клиент. Дада! Можно использовать телеграм под php, и там даже есть поддержка звонков! Это чудо называется madelineProto и исходники доступны на гитхабе.


В итоге, через 3 дня настройки и две блокировки моего аккаунта из-за чрезмерного количества попыток авторизации я настроил клиент и решил задачу. Теперь у меня есть свой шлюз из telegram в web! А пользователи могут читать любые публичные телеграмм каналы у меня на сайте без регистрации и смс.


2. Парсинг youtube каналов.


С API youtube'a вообще вышло забавно. Их справка предлагает использовать php плагин от гугла для доступа к API.  От их API мне нужно было не много: список видео на канале с метаданными, название канала и его логотип. У vk или fb такой запрос создается парой строчек кода и разобраться можно за пол часа.


Но у гугла свой путь разработки :)

Я смирился с тем, что плагин для доступа к API весит более 30 мегабайт. Но я еще и не смог настроить его за 3 часа!

В итоге, кликая на все подряд в справке гугла, оказалось, что плагин можно вообще не использовать, а для получения всей информации - воспользоваться стандартным get запросом, как везде. На формирование запроса мне понадобилось ровно 10 строк кода и 15 минут, вместо 30 мегабайтного плагина.

А потом люди удивляются: "а почему андройд притормаживает на 8-миядерных процессорах и требует 4 гигабайта оперативы?" ;)


3. Что сейчас с агрегатором?


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


4. Планы


- Добавить прямые ссылки на отдельные источники

- Расширять список источников: imgur, rutube, reddit, новостные сайты.

- Привлечь ядро активных пользователей, что бы были данные для формирования ленты популярных постов;

- Добавить в ленту вывод видео и гифок, что бы сократить число внешних переходов;

- Е-маил рассылки с лучшими постами за день/неделю (естественно при желании пользователя);

- Сотрудничество с создателями контента для совместного продвижения.



5. Техническая часть.


Для тех кому интересно то под капотом следующий стек технологий:


Backend: самописный, доставшийся мне в наследство на одном из проектов и переписаный мной под свои нужды. Используется шаблонизатор smarty.

БД: Mysql

Fron-end: HTML + Angular JS 1, так же используется Jquery 2 (в 3-й версии scroll события в firefox не работают периодически) для анимаций.


Парсинг осуществляю с помощью библиотеки php-query или через API раз в 5 минут по CRON'у в порядке живой очереди с приоритетом на публичные источники. Т.е. если за 4 минуты сайт не успел пройтись по всем источникам, то скрипт останавливается. А в следующий раз в начале очереди находятся те источники, которые дольше всего не обновлялись. Очереди для публичных и персональных источников разные - по 2 минуты и на те и на другие.


Если вас заинтересовал проект, то буду очень признателен за любые отзывы и комментарии. Ссылка (на пикабу, вроде, разрешено в конце поста давать ссылку): https://i-c-a.su/

Правила сообщества

- запрещено добавлять посты отличной от мира программирования тематики (так как пикабу - это в первую очередь развлекательный ресурс, то посты с юмором, историями, изображениями и всем, что связано с php - разрешены);

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

- запрещено добавлять посты провакационной тематики, нацеленные на бессмысленные споры и оскарбления;

- в копипастах и переводах указывайте источники;

3
Автор поста оценил этот комментарий

Если у коллег-разработчиков есть вопросы по коду/технологиям, то с удовольствием отвечу.  


А если пост соберет много плюсов, то выложу в открытый доступ исходники первой версии агрегатора - она не требует базы данных, можно запускать на локальной машине, лишь бы php был.

показать ответы
1
Автор поста оценил этот комментарий

Есть пара вопросов:

Все посты храните у себя в БД? Если да, то какую БД используете?

Сколько набирается записей за сутки?

Если пользователь не авторизирован, то как храните включенные источники (которые он выбрал для чтения)?


Сразу спасибо за ответы)

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Привет!


В бд храню все посты. Но сокращаю до 700 символов текст поста, удаляю из него все кроме текста. Так же храню название поста и ссылку на картинку, количество просмотров, лайков и дату добавления в базу данных.


В сутки набегает от 1500 до 3000 постов, но пока у меня не очень много источников (112).


Когда пользователь неавторизован, то все храню в localstorage браузера. Посты загружаются ajax запросом, в котором предаются id выбранных источников. Можно хранить и в cookies, но там ограничение в 4кб и эти данные будут передаваться при любом запросе, так что в будущем это может начать мешать. При регистрации в форме есть скритое поле, куда записываются выбранные источники, что бы записать их в базу для нового пользователя. Т.е. после регистрации выбор источников сохранятеся но переносится на сервер. Из localstorage я эти данные удаляю потом.

3
Автор поста оценил этот комментарий
Мне нравится)
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Спасибо! Пользуйтесь, ставьте лайки, добавляйте интересные источники или пишите мне, что бы я добавил.


Насчет рекламы и всякой непотребщины типа "кккккак поднять бабла" - гарантирую, что в ближайшие годы ее не будет, так как в первую очередь для себя делаю ресурс и родителям настроил аккаунты :)

Иллюстрация к комментарию
показать ответы
0
Автор поста оценил этот комментарий

То есть у тебя есть отдельная таблица со всеми источниками и временем последнего парсинга этого источника, и скрипт работает в соответствии с данными из этой таблицы. Я правильно понял?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ага, рядом с другими данными по источникам.

показать ответы
0
Автор поста оценил этот комментарий
Если вы всё ещё занимаетесь проектом/помните как он устроен, хотелось бы поподробнее узнать, как с точки зрения кода устроена остановка скрипта и "порядок живой очереди".
Понимю, что вероятность получения ответа мала, но всё же :)
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Привет. Занимаюсь. Переписываю говнокод на ларавель и вью что бы в opensource выложить :)


Живая очередь из базы формируется: источники сортируются по дате последнего парсинга. А скрипт запускается по крону.


В laravel есть нормальные очереди, в будущем буду их использовать.

показать ответы
1
Автор поста оценил этот комментарий

Ещё интересный вопрос, как будете в будущем бороться с ограничением ВК в 10000 запросов в сутки на получение постов из групп?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Пообщался тут с агентами техподдержки. Лимиты у них увеличить нельзя, даже за деньги.

Но я зарегестрировал еще одно приложение, даже ссылку указал на сайт такую же как в первом приложении. Добавилось без проблем. В ближайшие недели попробую использовать два сервисных ключа, в запросах к апи. Тоесть рандомно буду выбирать ключ из своего списка и использовать. Тем самым лимит будет n*10000, где n -  количество ключей...


Но не знаю есть ли запрет на такие действия...

показать ответы
0
Автор поста оценил этот комментарий

уважаемый автор, есть пару задачек, хотел бы проконсультироваться, пусть даже платно, как это возможно сделать?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Мой ник в телеграме xtrime, пишите с удовольствием подскажу, что знаю :)  

1
Автор поста оценил этот комментарий

Ещё интересный вопрос, как будете в будущем бороться с ограничением ВК в 10000 запросов в сутки на получение постов из групп?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Пока у меня 32 источника из ВК, они обновляются раз в 5 минут, следовательно в сутки набегает 9000 запросов. Когда начнутся проблемы, буду увеличивать интервал обновления. раз в 10 минут поставлю, например.


Так же у меня сделано разделение: публичные и личные источники обновляются независимо, так что в будущем когда личных источников станет много,  они будут обновляться с меньшей частотой, например раз в час. Ну так же можно перейти на какие нибудь платные подписки...  

1
Автор поста оценил этот комментарий

Проблема в том, пользовательский ключ доступа получается через ваш браузер путём oAuth2 авторизации, и если вы попробуете сделать запрос с другого ip (не с того, с которого авторизовались), то ВК вам отдаст 403 ошибку и удалит ключ.


Запросы с сервера ВК тоже отклоняет. Я как-то пробовал сделать так: ставил прокси на сервер и авторизовывался через ip сервера,  а потом с нег же отправлял запросы. Но ВК всё равно понимал, что запросы идут не из браузера и блокировал их.


Если вы хотите получать видео и фото вам необходимо будет заставлять пользователя авторизоваться, так как запросы нужно будет отправлять с его ip и ВК требует чтобы все запросы с ключом пользователя были отправлены именно из браузера, серверные запросы блокируются.


Если вы знаете как побороть эту проблему, буду очень рад узнать. У меня к сожалению так и не вышло это сделать.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Интересно! Тянет на целый пост :)


В ближайшее время не планировал обновлений, но через пару месяцев попробую.


UPDATE:

У вк есть 2 способа использования ключа: для фронта через js, и там есть привязка к ip и для бэкэнда через php, например, и там привязки нет, но есть какие то ограничения: https://vk.com/dev/authcode_flow_user


Я начну со второго способа...

показать ответы
1
Автор поста оценил этот комментарий

Есть пара вопросов:

Все посты храните у себя в БД? Если да, то какую БД используете?

Сколько набирается записей за сутки?

Если пользователь не авторизирован, то как храните включенные источники (которые он выбрал для чтения)?


Сразу спасибо за ответы)

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Оу, забыл ответить про тип базы. Конфгурация базы стандартая: mysql с innodb. Все крутится на хостинге за 150 руб в месяц. Нагрузка при этом менее 10%.

0
Автор поста оценил этот комментарий

Как вы хотите подтягивать проигрывание gif и видео из ВК для не авторизированных пользователей? VK требует ключ пользователя для этих целей (доки: https://vk.com/dev/docs.get).


Была схожая задача, тех поддержка ВК сказала что сделать без авторизации пользователя это невозможно.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Да, вы правы, для получения ссылки на видео или плеер требуется ключ доступа пользователя https://vk.com/dev/video.get . Ссылка на gif отдается вроде бы в рамках wall.get, но это особой роли не играет.


Тех поддержка права, пользователя надо авторизовать, но нигде же не сказано что это должны быть разные пользователи :) У меня же в бэкэнде зашиты мои сервисные ключ доступа к различным API, не сложно добавить и личный для доступа к видео. Т.е. ссылки на видео будут запрашиваться от моего имени и сохраняться в базу, а потом - выводиться внутри поста в виде iframe с плеером vk.


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


Существенных рисков с точки зрения безопасности так же нет, так как запросы к vk API отправляются по расписанию и только backend формирует запросы к vk API для получения фиксированного набора данных. Т.е. пользователи не могут отправлять запросы к vk api через мой backend.

показать ответы
0
Автор поста оценил этот комментарий

Отличный сайт, хотелось бы видеть сообщество “Новости Apple” vk.com/novosti.apple на ваше усмотрение конечно же

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Добавил ваш паблик в публичные источники. Маленьким проектам надо помогать друг другу :)

0
Автор поста оценил этот комментарий

Отличный сайт, хотелось бы видеть сообщество “Новости Apple” vk.com/novosti.apple на ваше усмотрение конечно же

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Спасибо за отзыв!


Что то не очень популярный паблик, хотя и материалы вроде неплохие. Вы можете добавить его в собственные источники (доступно после регистрации) и он будет в вашей ленте.


Если это ваш паблик, то можем, что нибудь придумать :)

1
Автор поста оценил этот комментарий

Превью-изображения к гифкам не подтягивается.

Сейчас проверил, не подтягиваются в Firefox. В хроме всё в порядке. Возможно, только у меня. Желательны более тщательные тесты)

Update: Проверил через мобильный Firefox, подтягиваются. Скорее всего, ложная тревога. Гифки должны проигрываться, или только переход к источнику?

Иллюстрация к комментарию
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Пока писал сообщение появился UPDATE :)

Вероятно vk лаганул.

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


Но пока основная цель - это привлечение пользователей. Если ядро постоянных пользователей наберется, то тогда и мотивация будет развивать ресурс активнее :) Делитесь ссылкой с родственниками и друзьями ;)

показать ответы
1
Автор поста оценил этот комментарий

Превью-изображения к гифкам не подтягивается.

Сейчас проверил, не подтягиваются в Firefox. В хроме всё в порядке. Возможно, только у меня. Желательны более тщательные тесты)

Update: Проверил через мобильный Firefox, подтягиваются. Скорее всего, ложная тревога. Гифки должны проигрываться, или только переход к источнику?

Иллюстрация к комментарию
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Спасибо за скриншот! Но это какой то полтергейст :) Проверил в FF 58 на маке конкретно эта картинка загрузилась.

Иллюстрация к комментарию
1
Автор поста оценил этот комментарий

Вроде неплохой сервис. Из пожеланий-советов: превью изображения к гифкам не подтягиваются. Удобен был бы переключатель для выбора всех источников из категории (или вообще всех источников). Можно добавить hover-эффект для кнопок (вроде входа, регистрации).

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Сейчас перечитал ваш комент, и возник вопрос: к гифкам не подтягивается вообще ничего, или просто статичная картинка? Если вообще ничего, то это скорее всего баг и тогда мне хотелось бы узнать, что за источник.

показать ответы
1
Автор поста оценил этот комментарий

Вроде неплохой сервис. Из пожеланий-советов: превью изображения к гифкам не подтягиваются. Удобен был бы переключатель для выбора всех источников из категории (или вообще всех источников). Можно добавить hover-эффект для кнопок (вроде входа, регистрации).

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Спасибо за замечания, со всеми пунктами согласен!