@@ -2,9 +2,10 @@ require 'rss'
22require 'net/http'
33require '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
75TEST_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
910NEWS_YAML_PATH = 'db/news.yml' . freeze
1011NEWS_LOGS_PATH = 'log/news.log' . freeze
@@ -16,31 +17,49 @@ TASK_LOGGER = ActiveSupport::BroadcastLogger.new(
1617# DojoNews (WordPress) REST APIから全投稿を取得するメソッド
1718def 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
4243end
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+
4463namespace :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