Skip to content

Commit 0962f2b

Browse files
committed
feat: PR TIMESのRSSパース処理を汎用メソッド化
- fetch_prtimes_posts メソッドを新規追加 - RSS::Parser を使用してPR TIMESフィードを解析 - dc:date フィールドからのJST変換を統一 - fetch:reset タスクでインライン実装(15行)を1行に簡素化 - DRY原則に従いコードの重複を排除
1 parent fe7b52e commit 0962f2b

File tree

1 file changed

+29
-24
lines changed

1 file changed

+29
-24
lines changed

lib/tasks/news.rake

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ require 'rss'
22
require 'net/http'
33
require 'json'
44

5-
PR_TIMES_FEED = 'https://prtimes.jp/companyrdf.php?company_id=38935'.freeze
6-
DOJO_NEWS_FEED = 'https://news.coderdojo.jp/feed/'.freeze
75
TEST_NEWS_FEED = Rails.root.join('spec', 'fixtures', 'sample_news.rss').freeze
6+
DOJO_NEWS_FEED = 'https://news.coderdojo.jp/feed/'.freeze
7+
DOJO_NEWS_JSON = 'https://news.coderdojo.jp/wp-json/wp/v2/posts'.freeze
8+
PR_TIMES_FEED = 'https://prtimes.jp/companyrdf.php?company_id=38935'.freeze
89

910
NEWS_YAML_PATH = 'db/news.yml'.freeze
1011
NEWS_LOGS_PATH = 'log/news.log'.freeze
@@ -16,31 +17,49 @@ TASK_LOGGER = ActiveSupport::BroadcastLogger.new(
1617
# DojoNews (WordPress) REST APIから全投稿を取得するメソッド
1718
def fetch_dojo_news_posts(api_endpoint)
1819
items = []
19-
20+
2021
loop.with_index(1) do |_, page|
2122
uri = URI(api_endpoint)
2223
uri.query = URI.encode_www_form(page: page, per_page: 100, status: 'publish')
23-
24+
2425
response = Net::HTTP.get_response(uri)
2526
break unless response.is_a?(Net::HTTPSuccess)
26-
27+
2728
posts = JSON.parse(response.body)
2829
break if posts.empty?
29-
30+
3031
posts.each do |post|
3132
items << {
3233
'url' => post['link'],
3334
'title' => post['title']['rendered'],
3435
'published_at' => Time.parse(post['date_gmt'] + ' UTC').in_time_zone('Asia/Tokyo').iso8601
3536
}
3637
end
37-
38+
3839
TASK_LOGGER.info("📄 WordPress API: ページ #{page} から #{posts.size} 件取得")
3940
end
40-
41+
4142
items
4243
end
4344

45+
# PR TIMES RSS フィードからすべてのプレスリリースを取得するメソッド
46+
def fetch_prtimes_posts(rss_feed_url)
47+
feed = RSS::Parser.parse(rss_feed_url, false)
48+
feed.items.map do |item|
49+
published_at = if item.respond_to?(:dc_date) && item.dc_date
50+
item.dc_date.in_time_zone('Asia/Tokyo').iso8601
51+
else
52+
raise "PR TIMES feed: dc:date not found for item: #{item.link}"
53+
end
54+
55+
{
56+
'url' => item.link,
57+
'title' => item.title,
58+
'published_at' => published_at
59+
}
60+
end
61+
end
62+
4463
namespace :news do
4564
desc "RSS フィードを取得し、#{NEWS_YAML_PATH} に保存"
4665
task fetch: :environment do
@@ -140,25 +159,11 @@ namespace :news do
140159
TASK_LOGGER.info("📄 news.yml をリセットしました")
141160

142161
# 2. WordPress REST API からすべての投稿を取得
143-
dojo_news_items = fetch_dojo_news_posts("https://news.coderdojo.jp/wp-json/wp/v2/posts")
162+
dojo_news_items = fetch_dojo_news_posts(DOJO_NEWS_JSON)
144163
TASK_LOGGER.info("📰 news.coderdojo.jp から #{dojo_news_items.size} 件を取得")
145164

146165
# 3. PR TIMES RSS フィードからすべてのプレスリリースを取得
147-
prtimes_items = []
148-
feed = RSS::Parser.parse(PR_TIMES_FEED, false)
149-
feed.items.each do |item|
150-
published_at = if item.respond_to?(:dc_date) && item.dc_date
151-
item.dc_date.iso8601
152-
else
153-
raise "PR TIMES feed: dc:date not found for item: #{item.link}"
154-
end
155-
156-
prtimes_items << {
157-
'url' => item.link,
158-
'title' => item.title,
159-
'published_at' => published_at
160-
}
161-
end
166+
prtimes_items = fetch_prtimes_posts(PR_TIMES_FEED)
162167
TASK_LOGGER.info("📢 PR TIMES から #{prtimes_items.size} 件を取得")
163168

164169
# 4. すべてのアイテムをマージし、ID を付与

0 commit comments

Comments
 (0)