国会会議録検索システム 検索APIをRubyで使う

国会の会議の議事録を検索するAPIがある。昔は使い勝手が悪かったようだが、今アクセスしてみたところ、以前指摘を受けていた点は修正されていて、使いやすくなっている。

## 会議単位簡易出力の例

会議の一覧が返ってくる。

```
require 'open-uri'
require 'json'

def to_query(hash)
  hash.map { |k, v| "#{k}=#{v}" }.join('&')
end

params = {
    from: '2020-01-20',
    until: '2020-01-20',
    maximumRecords: 5,
    startRecord: 1,
    recordPacking: 'json'
}

endpoint = 'https://kokkai.ndl.go.jp/api/meeting_list?'
meetings = []
start = 1

10.times do |loop|
  params['startRecord'] = start
  url = endpoint + to_query(params)
  puts "Fetch #{url}"
  res = JSON.parse(URI.open(url).read)

  if res['meetingRecord'].is_a?(Array)
    meetings.concat(res['meetingRecord'])
  end

  if meetings.size >= res['numberOfRecords']
    break
  end

  start += 5
end

meetings.each do |meeting|
  puts "第#{meeting['session']}回国会 #{meeting['nameOfHouse']} #{meeting['nameOfMeeting']} #{meeting['issue']} #{meeting['date']}"
end
```

```
第201回国会 衆議院 消費者問題に関する特別委員会 第1号 2020-01-20
第201回国会 衆議院 政治倫理の確立及び公職選挙法改正に関する特別委員会 第1号 2020-01-20
第201回国会 衆議院 地方創生に関する特別委員会 第1号 2020-01-20
第201回国会 衆議院 東日本大震災復興特別委員会 第1号 2020-01-20
第201回国会 衆議院 北朝鮮による拉致問題等に関する特別委員会 第1号 2020-01-20
第201回国会 衆議院 災害対策特別委員会 第1号 2020-01-20
第201回国会 衆議院 沖縄及び北方問題に関する特別委員会 第1号 2020-01-20
第201回国会 衆議院 科学技術・イノベーション推進特別委員会 第1号 2020-01-20
第201回国会 衆議院 議院運営委員会 第1号 2020-01-20
第201回国会 衆議院 原子力問題調査特別委員会 第1号 2020-01-20
第201回国会 参議院 沖縄及び北方問題に関する特別委員会 第1号 2020-01-20
第201回国会 参議院 議院運営委員会 第1号 2020-01-20
第201回国会 参議院 災害対策特別委員会 第1号 2020-01-20
第201回国会 参議院 政治倫理の確立及び選挙制度に関する特別委員会 第1号 2020-01-20
第201回国会 参議院 政府開発援助等に関する特別委員会 第1号 2020-01-20
第201回国会 参議院 政府開発援助等に関する特別委員会 第1号 2020-01-20
第201回国会 参議院 東日本大震災復興特別委員会 第1号 2020-01-20
第201回国会 参議院 北朝鮮による拉致問題等に関する特別委員会 第1号 2020-01-20
第201回国会 衆議院 本会議 第1号 2020-01-20
第201回国会 参議院 本会議 第1号 2020-01-20
```

JSONのレスポンスは下記のようになる。

```
[{
  "issueID": "120104536X00120200120",
  "imageKind": "会議録",
  "searchObject": 0,
  "session": 201,
  "nameOfHouse": "衆議院",
  "nameOfMeeting": "消費者問題に関する特別委員会",
  "issue": "第1号",
  "date": "2020-01-20",
  "closing": null,
  "speechRecord": [
    {
      "speechID": "120104536X00120200120_000",
      "speechOrder": 0,
      "speaker": "会議録情報",
      "speechURL": "https://kokkai.ndl.go.jp/#/detail?minId=120104536X00120200120&spkNum=0&single"
    }
  ],
  "meetingURL": "https://kokkai.ndl.go.jp/#/detail?minId=120104536X00120200120",
  "pdfURL": "https://kokkai.ndl.go.jp/#/detailPDF?minId=120104536X00120200120"
}]
```

## 会議単位出力の例

会議単位簡易出力のレスポンスを利用することで、各会議の詳細を取得することができる。

```
meetings.each do |meeting|
  params = {
      sessionFrom: meeting['session'],
      nameOfHouse: CGI.escape(meeting['nameOfHouse']),
      nameOfMeeting: CGI.escape(meeting['nameOfMeeting']),
      issueFrom: meeting['issue'].match(/(\d+)/)[1],
      maximumRecords: 5,
      startRecord: 1,
      recordPacking: 'json'
  }

  url = 'https://kokkai.ndl.go.jp/api/meeting?' + to_query(params)
  puts "Fetch #{url}"
  res = JSON.parse(URI.open(url).read)

  res['meetingRecord'].each do |meeting_detail|
    puts "第#{meeting['session']}回国会 #{meeting['nameOfHouse']} #{meeting['nameOfMeeting']} #{meeting['issue']} #{meeting['date']}"
    meeting_detail['speechRecord'].each do |speech|
      text = speech['speech'].slice(0, 100).gsub(/[\s　]+/, ' ')
      puts "    #{speech['speechOrder']} #{speech['speaker']} group=#{speech['speakerGroup']} position=#{speech['speakerPosition']} role=#{speech['speakerRole']} text=#{text} #{speech['speechURL']}"
    end
  end

  sleep 5
end
```

```
第201回国会 衆議院 消費者問題に関する特別委員会 第1号 2020-01-20
    0 会議録情報   本特別委員会は令和二年一月二十日（月曜日）議院において、消費者の利益の擁護及び増進等に関する総合的な対策を樹立するため設置することに決した。 一月二十日 本特別委員は議長の指名で、次のとおり選任 https://kokkai.ndl.go.jp/#/detail?minId=120104536X00120200120&spkNum=0&single
    1 冨岡勉   ○冨岡委員 これより会議を開きます。 衆議院規則第百一条第四項の規定によりまして、委員長が選任されるまで、私が委員長の職務を行います。 これより委員長の互選を行います。 https://kokkai.ndl.go.jp/#/detail?minId=120104536X00120200120&spkNum=1&single
    2 青山大人   ○青山（大）委員 動議を提出します。 委員長の互選は、投票によらないで、土屋品子君を委員長に推薦いたします。 https://kokkai.ndl.go.jp/#/detail?minId=120104536X00120200120&spkNum=2&single
    3 冨岡勉   ○冨岡委員 ただいまの青山大人君の動議に御異議ありませんか。 〔「異議なし」と呼ぶ者あり〕 https://kokkai.ndl.go.jp/#/detail?minId=120104536X00120200120&spkNum=3&single
    4 冨岡勉   ○冨岡委員 御異議なしと認めます。よって、土屋品子君が委員長に御当選になりました。 土屋品子君に本席を譲ります。 〔土屋委員長、委員長席に着く〕 https://kokkai.ndl.go.jp/#/detail?minId=120104536X00120200120&spkNum=4&single
    5 土屋品子   ○土屋委員長 この際、一言御挨拶申し上げます。 ただいま委員各位の御推挙によりまして、今国会も本特別委員会の委員長の重責を担うこととなりました。 委員各位の御指導と御協力を賜りまして、引き続き https://kokkai.ndl.go.jp/#/detail?minId=120104536X00120200120&spkNum=5&single
    6 土屋品子   ○土屋委員長 これより理事の互選を行います。 https://kokkai.ndl.go.jp/#/detail?minId=120104536X00120200120&spkNum=6&single
    7 青山大人   ○青山（大）委員 動議を提出します。 理事は、その数を八名とし、委員長において指名されることを望みます。 https://kokkai.ndl.go.jp/#/detail?minId=120104536X00120200120&spkNum=7&single
    8 土屋品子   ○土屋委員長 ただいまの青山大人君の動議に御異議ありませんか。 〔「異議なし」と呼ぶ者あり〕 https://kokkai.ndl.go.jp/#/detail?minId=120104536X00120200120&spkNum=8&single
    9 土屋品子   ○土屋委員長 御異議なしと認めます。よって、委員長は、理事に 穴見 陽一君 勝俣 孝明君 武村 展英君 冨岡 勉君 永岡 桂子君 青山 大 https://kokkai.ndl.go.jp/#/detail?minId=120104536X00120200120&spkNum=9&single
```

## 参考リンク

- [国会会議録検索システム 検索API](https://kokkai.ndl.go.jp/api.html)