gpt4 book ai didi

ruby-on-rails - 使用 FeedJira 创建 RSS 聚合器/阅读器

转载 作者:行者123 更新时间:2023-12-04 03:54:34 25 4
gpt4 key购买 nike

我正在尝试使用 ruby​​ on rails 创建我自己的 rss 阅读器应用程序。我希望能够在我的数据库中存储各种新闻故事,以后我可以从中提取这些新闻故事,以便以漂亮的布局显示每个故事及其标题、图像、摘要等。我正在使用 feedjira 库,对 RoR 也很陌生。我知道 rails 控制台中的这两个命令获取 rss 提要并以某种方式解析它们:

urls = %w[http://feedjira.com/blog/feed.xml https://github.com/feedjira/feedjira/feed.xml]
feeds = Feedjira::Feed.fetch_and_parse urls

虽然这两个命令适用于 rss 提要,但我想知道如何配置我的数据库/模型,然后将我从 Feedjira 获得的新闻条目保存到数据库中。我试着观看关于这个问题的 railscast,但它似乎有点过时了。对此问题的任何帮助将不胜感激!提前致谢!

最佳答案

这是一种方法:

创建这样的模型:

class Entry < ActiveRecord::Base

attr_accessible :guid, :source_site_id, :url, :title, :summary, :description, :published_at

def self.update_from_feed(feed_name)
feed = Feed.find_by_name(feed_name)
feed_data = Feedjira::Feed.fetch_and_parse(feed.feed_url)
add_entries(feed_data.entries, feed)
end

private
def self.add_entries(entries, feed)
entries.each do |entry|
break if exists? :entry_id => entry.id

create!(
:entry_id => entry.id,
:feed_id => feed.id,
:url => entry.url,
:title => entry.title.sanitize,
:summary => entry.summary.sanitize,
:description => entry.content.sanitize,
:published_at => entry.published
)

end
end
end
end

然后您可以从 cli/cron 或其他任何地方调用它,例如:

rails runner -e development 'Entry.update_from_feed("feedname")'

这会使用单独的 Rails 实例(有点像 rails console)在 Rails 应用程序的上下文中运行 update_from_feed 方法,但不会影响正在运行的 Rails 实例。

在这个例子中,有一个单独的模型,它有名称和 feed_urls,所以会根据提供的名称查找 url。

此代码不使用 Feedjira 的功能来检查更新,因此内置了欺骗检查。(This guthub issue 说要避免使用#update 方法。

请注意,break 的使用假定新条目始终添加到提要的顶部。如果您不信任提要,请将 break if 替换为 unless。该 url 可用作替代唯一 ID。

编辑:

这是 update_from_feed 方法的一个版本,它利用了 Feedjira 处理多个提要的能力:

def self.update_all
feed_urls = Feed.pluck :feed_url
feeds = Feedjira::Feed.fetch_and_parse(feed_urls)

feed_urls.each do |feed_url|
feed = Feed.find_by_feed_url(feed_url)
add_entries(feeds[feed_url].entries, feed)
end
end

pluck 返回数组中指定列(在本例中为:feed_url)的所有行。同样,您可以将其更改为接受一组名称,它会从中查找一组 URL 以传递给 feedjira。

最后,如果你想要一个自循环方法,你可以包括:

def self.update_all_periodically(frequency = 15.minutes)
loop do
update_all_from_feed
sleep frequency.to_i
end
end

然后这个:

rails runner -e development 'Feed.update_all_periodically'

在您中断进程之前不会返回,并将以默认频率或指定为可选参数的频率更新所有提要。

如果您想在主 Rails 进程中异步运行更新,那么 Sidekiq、Resque 或 DelayedJob 等后台工作程序将完成……工作。 :)

关于ruby-on-rails - 使用 FeedJira 创建 RSS 聚合器/阅读器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25235067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com