Написать пост

Xtrime

Свой агрегатор новостей с преферансом и дамами.

Привет, Кадабра!

Оффтоп про то, как я писал кривой код и пилил агрегатор новостей. Если интересно, как это было и что из этого вышло - прошу под кат.

Если материал вообще не годится для кадабры - ногами не пинать, просто проголосуйте в опросе, и я удалю пост.

Ссылка на результат года трудов и кучи бессонных выходных - в конце.


Пару лет назад мне было стало просто лень каждый день заходить на одни и те же 5-10 сайтов перед сном и вспоминать, что я читал утром, а что нет. Кроме того интересные сайты с нерегулярным обновлением моментально забывались. Выхода было 3:
1) RSS. Минусы: не совсем понятно как быть с мобильными устройствами и не все сайты поддерживают RSS, да и технология устаревшая.

2) Ленты соц сетей - неплохое решение, но контент в основном "быстрый", да и популярные паблики однотипны. "Серьезного" контента крайне мало. Кроме того, испытываю некоторое отторжение и не люблю пользоваться соц. сетями.

3) Агрегаторы новостей. Минус - не совсем гибкая настройка. Можно выбрать только тематику, а остальное за тебя решат. [UP: оказывается anews.ru теперь тоже предлагает выбор именно конкретных источников и теперь не требуется регистрация, но просмотр все еще не очень удобен]

В итоге было решено подключить свои школьные навыки программирования на turbo pascal и в свободное время запилить свой ресурс :) Мысль эта отлеживалась, но 12 месяцев назад я собрал сопли в кулак, и, закончив прокрастинировать, приступил.

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

Как это было

1) Выбор дизайна.
В разработку, что бы было веселее, обещаниями миллионной аудитории и золотых гор от рекламы был заманен друг :). Было решено брать готовый велосипед, а не изобретать свой, так как навыки дизайнеров позволяли сделать только что то подобное: .

Из подборки шаблонов ( http://blog.zizaza.com/design-news/369-responsive-psd-web-templates-25-free-templates ) выбрали несколько вариантов, а после остановились на Zeni: http://luiszuno.com/themes/zeni/

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

2) Настройки.

Идея предполагала выбор сайтов для отображения и для этого требовалась панель с настройками. Идею кнопок нагло стырили у яндекс диска: .

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

3) Трудности.

.

Сначала оказалось, что современные браузеры содержат довольно строгие требования к безопасности и нельзя просто так взять и загрузить код другой страницы через javasript.
Решение этой проблемы заняло несколько дней. Результатом стал php-скрипт в который передается url, и который возращает html код страницы.

С некоторыми сайтами были проблемы с кирилицей из-за кодировки. На перевод всего в UTF-8 ушло еще несколько дней.

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

Для того, что бы обработать html код я стал записывать его в iframe'ы, откуда уже брал только материалы по заданным условиям. Кстати условия пришлось делать индивидуальные для каждого сайта, но сам алгоритм получился почти универсальным.

Неразрешимая проблема была только с vk.com - получаемая по php страница содержала очень мало постов, так как их загрузка происходит динамически. С горечью на душе, было решено забить на пацанские паблики.

Пример условий для поиска постов.

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

Примерно через 4-6 месяцев после начала работ на главной странице уже кое как выводились материалы из выбранных источников.

Тут возникла новая проблема: как упорядочить их по дате, если время указывается не всегда, и в разных форматах?

Совершенно случайно, через пару недель, друг натолкнул на гениальную мысль - брать с сервера дату изменения титульной картинки в новости. Способ оказался применим для 80% источников и выдавал унифицированные результаты, с точностью до секунды. Было всего пара недостатков:
- кое где (например, на youtube) картинки генерировались динамически и дата изменения всегда совпадала с текущим временем;
- Загрузка информации о 100 постах (10 сайтов) занимала около 10 секунд. Ждать приходилось при каждой загрузке страницы;
На том этапе было решено не заморачиваться с этим и двигаться дальше, ведь 80% результата достигаются за 20% времени ;)

Оставался последний шаг на пути к работоспособной альфа-версии. Хотелось сделать не просто коллекцию ссылок с картинками, а полноценный ресурс, на котором все материалы будут открываться в всплывающем окне, без перехода на новую вкладку.

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

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

Через 8-10 месяцев первый этап был завершен, но все еще оставалась куча дел: дизайн требовал доработки, были большие проблемы с производительностью и нагрузкой на сервер из-за php-скриптов, работа сайта на мобильных устройствах была просто ужасной.

4) Оптимизация.

Первой проблемой была долгая загрузка агрегатора из-за запросов даты/времени каждого поста с серверов. Решение было простым, как молоток: даты загруженных новостей и их url надо было сохранять в локальное хранилище и при следующей загрузке получать дату/время только для новых материалов. При ежедневных посещениях это в несколько раз сокращает скорость загрузки агрегатора. Кроме того, такая информация позволила отмечать просмотренные материалы и загруженные в первый раз, что увеличило удобство.

Второй проблемой была производительность. На десктопе все работало более-менее сносно, но вот время загрузки на, все еще актуальном, Ipad 2 составляло от 30 до 60 секунд! В какой то момент, когда я уже свыкся с мыслью о переходе на Air 2, случайно натолкнулся в сети на эксперементальную фишку под названием DOMParser() https://developer.mozilla.org/en-US/Add-ons/Code_snippets/HTML_to_DOM . Она позволяет обработать голый html код и выбрать из него нужные обьекты без использования iframe'ов, прямо на лету. Ее применение сократило время загрузки страницы на ipad 2 c 45 секунд, до 15. В 3 раза! Это был epic win!

Но все еще ставались проблемы с вылетами на моб. устройствах из-за нехватки оперативной памяти. Обнуление переменных после выполнения каждой итерации цикла, там где это было возможным, помогло и дополнительно сократило время загрузки на 20-30%. Видимо, встроенный сборщик мусора в js, который должен освобождать память от ненужных данных, работает так себе.

В итоге после всех оптимизаций работать на ipad 2 сайт стал очень прилично.

5) Вконтакте.

Все первостепенные задачи, кроме одной, были решены. Не получалось получить данные с vk. Поиски привели к vk api и методу wall.get http://vk.com/dev/wall.get . Результатом выполнения запроса была xml строка, которую удалось преобразовать в обьект и выбрать из нее нужные элементы, включая ссылки на картинки. Кроме того в обьекте содержалась дата/время в удобном формате, а скорость загрузки и обработки xml была просто моментальной.

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

Выбирал из топовых групп, на основе данных с http://borgi.ru/stat/ . Спустя 9 лет с момента запуска, я, наконец, открыл для себя дно интернета :) И оказалось, что контент там бывает очень даже неплохим.

Вот до чего доводит неправильное хобби

После успеха с вк, я перевел часть сайтов на загрузку данных по RSS (там не требовалась получение даты) и за один вечер прикрутил facebook. Facebook, кстати, имеет очень простую front-end архитектуру - чувствуется, что он писался гораздо раньше vk.

Что в итоге

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

За время разработки очень сильно втянулся в написание кода. Это шикарная разминка для ума, которая неплохо доставляет при нахождении элегантного решения проблемы или достижении поставленных целей.

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

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

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

А вот и он: http://i-c-a.su
Удалить пост?
Удаляй! кг/ам и оффтоп! Это не для уютненькой.
3
14.3%
Бывало и хуже, можно оставить.
18
85.7%
проголосовал 21 пользователь
45 комментариев 4нравится 1избранное
proff
lolwut
Katrine
OlegTar
  • drifter
    16 июл 2015 в 08:44
    А как прочесть новость не открывая ее? Ну то есть просто пометить как прочитанную.
    • Xtrime
      16 июл 2015 в 09:57
      Такой фичи не предусмотрел. Могу добавить кнопку "удалить", что бы вообще скрывать. Приходила такая мысль, но как то за пару месяцев пользования не показалось, что это первостепенная фича ;) Буду рад предложениям в каком виде это сделать)
    • Xtrime
      18 июл 2015 в 18:16
      Добавил кнопку скрывающую материал, и делающую его прочитанным. Надо кликнуть по круглому логотипу источника.



      При повторной загрузке появится, но будет прочитанным. Что бы пропал при повторной загрузке совсем сделал опцию "Скрывать просмотренные".
  • yar-neon
    16 июл 2015 в 09:01
    в новости бы добавить медузу
    а в авто - жж сообщество ручп
    • Xtrime
      16 июл 2015 в 10:35
      Добавил соответсвующие группы из ВК (контент соответсвует оригиналам) и еще в новости - СЛОН.

      Заметил, что в РУ_ЧП не отображаются посты, где видео из ютуба встроенное, а не прикреплено к посту. Хорошо что таких постов мало ;) В течении дня попробую поправить ;)
      • Xtrime
        16 июл 2015 в 13:00
        Поправил одну настройку, теперь первый пост в РУ_ЧП тоже отображается
  • dro-salevan
    16 июл 2015 в 09:03
    раскрытие путей

    Warning: file_get_contents(http://https:) [function.file-get-contents]: failed to open stream: php_network_getaddresses: getaddrinfo failed: Name or service not known in /home/x/xtrime/i-c-a.su/public_html/shit_coding/loader.php on line 36
    • Xtrime
      16 июл 2015 в 13:01
      Нашел, где была ошибка, теперь ссылки у логотипов источников в "настройках" верные.
  • Guitariz
    2 16 июл 2015 в 09:12
    1) шрифт в заголовках порталов вырвиглазный.
    2) за 3 столбика я бы на костре сжигал
    3) остальное вроде не сильно бросается в глаза
    • Xtrime
      16 июл 2015 в 10:55
      1) Со шрифтами и дизайном я не особо дружу ) Заголовки и текст статей - helvetica, а заголовки блоков (настройки, новое и тд...) - Century Gothic. Помимо выбора самого шрифта приходилось учитывать то, что в разных ОС они выглядят по-разному:

      MAC OS:


      WIN 7:


      В винде, действительно, как то не очень, попробую поправить. Особо не обращал внимание, так как сижу на маке )
    • Xtrime
      16 июл 2015 в 11:17
      2) 3 столбика - сжигать не меня, а дизайнера, сделавшего тему ZENI. Можно сделать адаптивный дизайн, с фиксированной шириной колонки, что бы при увеличении размера количество колонок увеличивалось, но помоему больше 3 колонок это уже перебор, так как человеку удобнее воспринимать узкие но высокие элементы. В мобильной версии, кстати, одна колонка, так что если нужна одна - можно просто уменьшить размер браузера))
      • Guitariz
        16 июл 2015 в 15:19
        Зачем вообще колонок больше одной??? удобно всегда было читать одну колонку, потом кто то из десигнеров придумал такой "бохатый" интерфейс, и все понеслись это говно везде пихать.
        • Xtrime
          16 июл 2015 в 19:04
          Ну, видимо, дело вкуса, я люблю когда перед глазами есть общая картина. А если по душе одна лента, то лучше контакта врят ли что то придумают. Хотя можно сделать настройку для отображения одним столбцом.
          • Guitariz
            17 июл 2015 в 08:10
            на самом деле удобство восприятия давно изучено и всеми объяснено, вопрос чисто психологический.
            • Xtrime
              18 июл 2015 в 18:17
              Добавил настройку для вывода материалов в 1 колонку ;)
  • Katrine
    16 июл 2015 в 10:39
    Если нет возможности вводить собственные ресурсы, то какой смысл?
    Из всего, что есть в настройках, иногда просматриваю Фишки и все. Там можно ввести свой собственный ресурс? если нет - смысла не вижу.

    Спасибо за созидание, молодец! :)
    • Katrine
      1 16 июл 2015 в 10:40
      Там нет Кадабры! :)
      • Xtrime
        16 июл 2015 в 11:03
        Вот с кадаброй - засада, для просмотра нужна регистрация (( Не представляю как ее добавить.
        • lolwut
          16 июл 2015 в 11:26
          Страница с клубами доступна и без регистрации http://autokadabra.ru/clubs
          Факт добавления новых постов можно проверять по данным в столбце "обновлен".
          • Xtrime
            16 июл 2015 в 11:38
            Для агрегатора нужны именно страницы со статьями с картинками, можно сделать отдельные кнопки для каких то клубов, но это не есть хорошо.

            Щас пришла одна мысль: можно же сделать сервисный аккаунт для агрегатора, а php вроде как может передавать логин и пароль на сервер: http://www.electrictoolbox.com/php-file-get-contents-sending-username-password/ , если все так просто, как написано по ссылке то уютненькую можно будет добавить без особых проблем в течении пары дней.
            • Xtrime
              17 июл 2015 в 04:12
              Трюк с авторизацией удался, кадабру удалось успешно добавить.
        • Katrine
          16 июл 2015 в 11:55
          Кстати, зачем так сделано, что под гостем кадабру не почитаешь?
    • Xtrime
      16 июл 2015 в 11:02
      Добавлять свои ресурсы - изначально планировал такую фишку, технически - сделать не сложно, но возникли 2 проблемы:

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



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

      Самое простое решение - скинуть сюда список ресурсов, которые интересны именно вам и я их добавлю, обычно на добавление 1 ресурса уходит от 30 секунд до 10 мин.

      PS. На anews тоже нельзя добавить свои ресурсы, но там каталог ресурсов внушительный.
    • Xtrime
      16 июл 2015 в 11:23
      Я вот раньше тоже не читал ни одного паблика, авторесурсов (кроме кадабры) и научных сайтов, так как желание возникает редко, а вспоминать и открывать годные сайты просто лень. Но теперь, когда они под рукой и материалы загружаются сами, то стал просматривать, так как это не требует затрат сил и времен ;)
    • Xtrime
      1 18 июл 2015 в 18:21
      Пришла идея, что можно дать возможность добавлять RSS подписки, группы вконтакте и facebook. Тогда потребуется только ссылка и логотип для RSS. Займусь в ближайшие недели.
  • OlegTar
    3 16 июл 2015 в 10:46
    Красавчик!
    • Xtrime
      16 июл 2015 в 19:00
      Спасибо за конкретику. Со многим согласен, постараюсь учесть в будущем.

      По поводу анимаций - они есть только у загруженных в первый раз материалов, при повторной загрузке анимаций нет.

      Инструкцию справа тоже планирую убирать вообще и, соответственно, настройки растянутся во весь экран.

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

      Загрузка страницы - наверное все же оставлю. Люблю я блур и бегущие символы )

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

      Свой агрегатор делал по 2 причинам: 1) хотелось сделать :) 2) anews не всем устраивает.

    • Xtrime
      16 июл 2015 в 19:32
      По поводу размеров "настроек" и "информации" они же, по сути, нужны всего на 1 раз и при повторной загрузке они сворачиваются (должны по крайней мере).
  • Moor
    19 июл 2015 в 18:53
    В код не лазил, на вид все вполне юзабельно, хотя темные темы не нравятся субъективно.
    Сам для своих целей пользуюсь inoreader, для сайтов без rss/atom использую feed43.
    По сути вопроса: написать публичный проект - это всегда круто.
    • Xtrime
      19 июл 2015 в 23:04
      После того как выложил ссылку на кадабру, начал смотреть что за последние пару лет придумали умные люди. Помимо anews нравился feedly.com, очень много сайтов в базе. Но там регистрация нужна.
  • Vendict
    19 июл 2015 в 23:47
    Вы уж извините горе программиста, но почему file_get_contents а не curl ? Второй имеет больше возможностей и сколько не писал/видел парсеров, везде использовал именно его.
    • Xtrime
      2 20 июл 2015 в 00:01
      У меня и то и то используется. Curl для обычных сайтов, file_get_contents для rss и если curl вернул пустую строку (уже и не помню было ли такое, но раз написал так, значит были причины).
  • andrewcocos
    1 20 июл 2015 в 10:04
    1. RSS живее всех живых и в 100500 раз удобнее.
    2. На сайте в статьях шрифт замылен адово.
    • Xtrime
      22 июл 2015 в 02:09
      Спасибо за отзыв.

      1. Как минимум в группах vk и facebook нет RSS. На пикабу тоже. Если же ограничиваться только новостными сайтами, то, безусловно, RSS удобен. Для сайтов без РСС на выручку может придти feedly, но я о нем недавно узнал, понятия не имею удобно ли им пользоваться. Кстати следующим делом напишу возможность самостоятельно добавлять любые RSS и группы vk и fb, вот тогда можно будет сказать, что ресурс чем то выделяется от остальных агрегатов.
      2. Если я правильно понял, то шрифт мылится вот тут:


      Это происходит из за того, что сайты без адаптивной верстки надо сжимать в размерах, для того что бы они помещались на экране. Можно либо расширить окно, что бы сайты помещались без сжатия, либо выбрать "Не масштабировать статьи", но тогда нужно будет скроллить.
      • Xtrime
        22 июл 2015 в 02:12
        Насчет масштабирования еще подумаю, может, действительно, на ПК его по умолчанию лучше отключить...
  • Xtrime
    06 дек 2015 в 22:57
    Не знаю, прочитает ли кто то этот камент, но вдруг :)

    За последние пол года я продвинулся от версии 1.2.6 до 1.5.0. Кроме того, месяц назад, мой пост про сайт (аналогичный этому посту) вышел в горячее на пикабу, что добавило мотивации.

    Что изменилось:

    1) Долгожданный нормальный одноколоночный вид (лента). Теперь картинки в одноколоночном режиме отображаются в полном размере, а их высота ничем не ограничена. Не сравнить со старым убожеством :) (дизайн предложил один из коментаторов на пикабу, спасибо ему).
    2) Есть возможность добавлять свои группы vk и ленты RSS. Группы fb тоже можно, но c ними появились проблемы. (о них ниже).

    3) Переключение между плиточным видом и лентой теперь - одним нажатием на большую иконку, без перезагрузки.
    4) Так как по умолчанию прочитанные посты скрываются, то сделал быстрый доступ к просмотренным материалам (кнопка рядом с кнопкой переключения вида.)
    5) Ускорение и повышение стабильности загрузки.
    Пояснения для it-шников: Благодаря волшебной функции .detach() при загрузке и просмотре материалов из html кода удаляются все новости, что должно снижать нагрузку на ЦП и оперативу. Как только просмотр новостей/загрузка закончены, материалы возвращаются в код из переменной. Все манипуляции с dom элементами при загрузке теперь так же происходят внутри переменной, а не в html коде. Так же добавлен интервал 50мс между загрузкой источников, благодаря этому источники теперь загружаются стабильнее. Исключение составляют fishki_net и zr_ru - периодически с их загрузкой возникают проблемы (причина на их стороне, возможно со временем проблемы исчезнут)
    6) Оптимизации при просмотре.
    Пояснения для it-шников: Решены проблемы с просмотром материалов на IOS (скакал скролл, моргало и глючило окно с материалом...). На помощь пришла высота iframe в px и другие css ухищрения.

    Известные проблемы:
    1) facebook периодически показывает капчу вместо материалов, для стабильной работы придется регестрироваться в facebook, и использовать api.
    2) Периодически перезагружается на IOS. Вероятно, переполняется оперативная память, жду новых версий IOS.

    К сожалению, у меня нет устройств на android, так что проверить работоспособность в мобильном хроме не могу, если есть проблемы - пишите, поправлю.
    • OlegTar
      07 дек 2015 в 12:54
      красавец
  • Xtrime
    04 мар 2016 в 00:25
    Привет, уютненькая!

    Выпустил версию 1.6.0:
    1) "Яндекс Новости": Добавил раздел со ссылками на 5 свежих новостей и котировками валют и нефти. (На яндекс часто захожу ради этого раздела, так что добавил для удобства);
    2) Дизайн: удалил все тени, сделал дизайн максимально плоским.
    3) Фейсбук: наконец зарегестрировал приложение и получил доступ к api. Теперь никаких капч и других проблем с отображением материалов из групп facebook.
    4) Гифки на 9gag.com: так и не дождался пока рукожопы из 9gag поправят отображение гифок на IOS и поправил сам ;)

    Что впереди:
    В выходные приступаю к раскрутке сайта. Планирую прикупить рекламы на ютубе и в пабликах вк... Если тут есть знающие люди, то буду признателен за советы по раскрутке...

    ну и ссылку оставлю: http://i-c-a.su/
    • andrewcocos
      04 мар 2016 в 13:11
      Открыл статью с Ленты.ру. Внизу ссылки "ДРУГИЕ МАТЕРИАЛЫ РУБРИКИ". Ни одна не открывается.
      • Xtrime
        04 мар 2016 в 23:04
        Спасибо за бетатест! Сейчас открыл первую статью с ленты, проверил ссылки, все работает: можно поподробнее?



        Сегодня и вчера доделывал найденные после обновления недочеты, так что может сейчас проблема пропадет...
        • andrewcocos
          05 мар 2016 в 16:18
          Нужна именно Лента.ру.
          Refused to display 'http://lenta.ru/articles/2016/02/29/olegivanovich/' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.
          • Xtrime
            05 мар 2016 в 17:43
            Не понимаю, как повторить проблему. Если вас не затруднит: какой у вас браузре, какой источник включили, что кликнули и тд...

            Вот как у меня происходит: (гифка 7 мегабайт...):
            • andrewcocos
              05 мар 2016 в 18:10
              Ничего не включал, открыл, прокрутил, выбрал. Опера 35.0.2066.68 Windows 8.1 64-bit.
              • Xtrime
                05 мар 2016 в 19:05
                Даже оперу установил, но в ней ссылки в lenta.ru тоже работают. К сожалению не знаю, что может вызвать такие проблемы. Но в любом случае, спасибо за тестирование.
Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста, или зарегистрируйтесь.