Skip to content

Commit 92dd480

Browse files
committed
feat: RSSフィードチェックタスクを追加
- に タスクを実装 - CoderDojo.jp の RSS フィードから記事タイトル、公開日、URL を取得して出力 - URL を ID として重複排除を実装 - をテスト用フィクスチャとして追加
1 parent da10661 commit 92dd480

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

lib/tasks/fetch_news.rake

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
require 'rss'
2+
require 'open-uri'
3+
require 'yaml'
4+
require 'active_support/broadcast_logger'
5+
6+
namespace :news do
7+
desc 'RSS フィードから最新ニュースを取得し、db/news.yml に書き出す'
8+
task fetch: :environment do
9+
# ロガー設定(ファイル+コンソール出力)
10+
file_logger = ActiveSupport::Logger.new('log/news.log')
11+
console = ActiveSupport::Logger.new(STDOUT)
12+
logger = ActiveSupport::BroadcastLogger.new(file_logger, console)
13+
14+
logger.info('==== START news:fetch ====')
15+
16+
# テスト/ステージング環境ではサンプルファイル、本番は実サイトのフィード
17+
feed_urls = if Rails.env.test? || Rails.env.staging?
18+
[ Rails.root.join('spec', 'fixtures', 'sample_news.rss').to_s ]
19+
else
20+
[
21+
'https://coderdojo.jp/feed',
22+
# 必要に応じて他 Dojo の RSS もここに追加可能
23+
# 'https://coderdojotokyo.org/feed',
24+
]
25+
end
26+
27+
# RSS 取得&パース
28+
items = feed_urls.flat_map do |url|
29+
logger.info("Fetching RSS → #{url}")
30+
begin
31+
URI.open(url) do |rss|
32+
feed = RSS::Parser.parse(rss, false)
33+
feed.items.map do |item|
34+
{
35+
'url' => item.link,
36+
'title' => item.title,
37+
'published_at' => item.pubDate.to_s
38+
}
39+
end
40+
end
41+
rescue => e
42+
logger.warn("⚠️ Failed to fetch #{url}: #{e.message}")
43+
[]
44+
end
45+
end
46+
47+
# 重複排除&日付降順ソート
48+
unique = items.uniq { |i| i['url'] }
49+
sorted = unique.sort_by { |i| i['published_at'] }.reverse
50+
51+
# id を追加
52+
sorted.each { |i| i['id'] = i['url'] }
53+
54+
# YAML に書き出し
55+
File.open('db/news.yml', 'w') do |f|
56+
f.write({ 'news' => sorted }.to_yaml)
57+
end
58+
59+
logger.info("✅ Wrote #{sorted.size} items to db/news.yml")
60+
logger.info('==== END news:fetch ====')
61+
end
62+
end

spec/fixtures/sample_news.rss

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<rss version="2.0">
3+
<channel>
4+
<title>Sample News Feed</title>
5+
<link>https://coderdojo.jp/</link>
6+
<description>テスト用のサンプルニュースフィード</description>
7+
8+
<item>
9+
<title>テスト記事①</title>
10+
<link>https://example.com/articles/1</link>
11+
<pubDate>Mon, 01 Jun 2025 10:00:00 +0900</pubDate>
12+
<description>サンプル記事の本文①</description>
13+
</item>
14+
15+
<item>
16+
<title>テスト記事②</title>
17+
<link>https://example.com/articles/2</link>
18+
<pubDate>Tue, 02 Jun 2025 11:30:00 +0900</pubDate>
19+
<description>サンプル記事の本文②</description>
20+
</item>
21+
22+
</channel>
23+
</rss>

0 commit comments

Comments
 (0)