Как и многих людей, использующих RSS, меня расстраивают каналы, которые не возвращают всю историю, а только ее короткую версию.
В этом случае нет возможности прочитать ленту в автономном режиме.
io не является исключением: текст приходит урезанным, и приходится каждый раз переключаться с читалки на браузер, чтобы прочитать одну новость.
Особенно ужасно это выглядело, когда у Медузы не было нормальной мобильной версии; веб-версия на телефоне работала очень медленно.
Существуют различные сервисы по парсингу html в rss, но когда я наткнулся консольный клиент для Медузы , у меня сразу возник вопрос: какой API там используется и можно ли его использовать для написания собственного приложения?
API
Далеко ходить не пришлось, код консольного приложения опубликовано на github и представляет собой js, который обращается к необходимому API.
Получение списка новостей
https://meduza.io/api/v3/searchЭchrono=news&page=0&per_page=10&locale=ru хроно - принимает значения новости, открытки, статьи, фигуры или многоугольник , в зависимости от категории, которую мы хотим получить; страница - номер страницы; на страницу — количество записей на странице; локаль - локаль RU или ru ;Получайте индивидуальные новости
https://meduza.io/api/v3/shapito/2015/06/02/vyshel-neofitsialnyy-terminalnyy-klient-meduzy Здесь просто подставляется url, полученный из предыдущего пункта.Идея Получите исходный RSS-канал по адресу https://meduza.io/rss/all , но вместо обрезанной новости подставьте текст новости, полученной через API. Пример реализации (прототип) Я взял Ruby и написал код для анализа исходного RSS-канала:
А также код, который анализирует json одной новости:Nokogiri::XML(open(' https://meduza.io/rss/all '))
JSON::parse(open(' https://meduza.io/api/v3/ ' + post_url).
read)['root']['content']['body']
Подставляем одно в другое и получаем примерно следующее:
require 'open-uri'
require 'json'
require 'nokogiri'
$meduza = ' https://meduza.io '
$meduza_rss = $meduza + '/rss/%s'
$meduza_api = $meduza + '/api/v3/%s'
class Meduza
def Meduza.generate(feed = 'all')
doc = Nokogiri::XML(open($meduza_rss % feed))
doc.xpath('/rss/channel/item').
each do |item|
post_id = item.xpath('link').
inner_text.gsub(/^#{$meduza}\//, '')
json = JSON::parse(open($meduza_api % post_id).
read)
item.search('description').
each do |description|
description.content = json['root']['content']['body'].
gsub('src="/image/', 'src="http:// meduza.io/image/ ')
end
end
doc.to_xml
end
end
puts Meduza.generate
При этом меняем относительные URL-адреса изображений на абсолютные с помощью метода gsub .
Применение Минималистичное приложение было написано на Синатра , который можно развернуть, например, на хостинге геройку и пользуйтесь им на здоровье (и к тому же совершенно бесплатно).
Подобный сервис поможет избавиться от засыпания приложений на Heroku этот .
Исходный код приложения опубликовано на github , Спасибо за внимание! P.S. Ссылка на рабочее приложение meduza.herokuapp.com/rss (пока бесплатная учетная запись Heroku может справиться с нагрузкой).
Теги: #медуза #rss #api #ruby #heroku #Sinatra #JavaScript #никто не читает теги #api
-
«Умные» Рекламные Щиты
19 Oct, 24 -
Репликация Dfs И «Временные» Файлы
19 Oct, 24 -
Минусы Дурова
19 Oct, 24 -
Re: Земля Под Информационной Блокадой?
19 Oct, 24 -
Рекомендации По Продвижению Проекта В Сша
19 Oct, 24 -
Прибыль Microsoft Упала На 11%
19 Oct, 24 -
Я Хочу Переголосовать!
19 Oct, 24