はじめに
趣味で作っているWebアプリケーションでニュースAPIを叩きたくて調べてみました。
日本語のニュースを取得できるAPIは、newsAPI(日本語版)などがありますが、取得方法everything
に対応しておらず、top-headlines
だと20件のみしかとってきてくれないようです。
取得方法everything
はエラーになります。
$ curl 'https://newsapi.org/v2/everything?country=jp&apiKey={YOUR_API_KEY}'
{"status":"error","code":"parameterInvalid","message":"The country param is not currently supported on the /everything endpoint."}
一方、top-headlines
は取れますが、20件までしか取得できないです。
$ curl 'https://newsapi.org/v2/top-headlines?country=jp&apiKey={YOUR_API_KEY}'
{"status":"ok","totalResults":30,"articles":[{"source":{"id":"engadget","name":"Engadget"},"author":"Ittousai","title":"速報:マイクラアースは10月配信開始、アーリーアクセスの事前登録を受付 #MinecraftEarth - Engadget 日本版","description":"マイクロソフトが基本無料のスマホAR版マインクラフト Minecraft Earthの...(略)
なので、category指定とかもできますが、どのカテゴリも2, 3件しかない状態なので、使いづらいなと思っていました。
大量のニュースを取得できて、かつカテゴリ指定や検索ができるAPIがないかなと思っていたのですが、なさそうなので、タイトルの通りGoogle News RSSからとってきてJSONで返すAPIを自作すればいいのかなと思いました。
コード
試しで書いてみたら取得することができました。
クエリストリングでカテゴリや検索ワードを指定できるみたいです。
ここでは一旦カテゴリだけ指定してみます。
# frozen_string_literal: true
require 'rss'
require 'active_support'
require 'active_support/core_ext'
category = ARGV[0]
base_url = 'https://news.google.com/rss/search'
query_string = "?hl=ja&q=#{category}&hl=ja&gl=JP&ceid=JP:ja"
rss = RSS::Parser.parse(base_url + query_string)
news_hash = Hash.from_xml(rss.to_xml)
news_json = news_hash.to_json
puts news_json
$ ruby news_to_json.rb health
{"rss":{"version":"2.0","xmlns:content":"http://purl.org/rss/1.0/modules/content/","xmlns:dc":"http://purl.org/dc/elements/1.1/","xmlns:itunes":"http://www.itunes.com/dtds/podcast-1.0.dtd","xmlns:trackback":"http://madskills.com/public/xml/rss/mod...(略)
おわりに
こんな感じのAPI自作して、フロントエンドで呼び出せばWebで便利に使えるのかなと思いました。
ただ、Google News RSSはニュースの画像を返してくれないので、画像が欲しい場合はスクレイピングして、OGP画像のリンクを取得する。OGPがなければフロントエンドでデフォルトの画像を表示する、といった実装が必要そうです。
スクレイピングは、【rails】urlからサイトの情報を引き出す。【スクレイピング】を参考に、<meta property="og:image">
をとってくればできそうです。