kokkaiapi

package module
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 17, 2024 License: Apache-2.0 Imports: 9 Imported by: 0

README

kokkai-api

国会議事録検索用APIのGo言語ラッパー

https://kokkai.ndl.go.jp/api.html

Supports

  • 会議単位簡易出力, 会議単位出力, 発言単位出力 に対応しています。
  • 任意検索条件の再帰的全件取得に対応しています。
    • iterパッケージを利用しています。
  • APIコールの時間間隔の調整が可能です。
  • すべての検索用パラメータに対応しています。(2024/04/25時点)

Install

go get "github.com/yyyoichi/kokkai-api"

Example

import (
    "fmt"
    "log"

    kokkaiapi "github.com/yyyoichi/kokkai-api"
)

func main() {
    // 国会回次209の科学技術に関する議事録を「会議単位簡易出力」で最大3件ずつ、再帰的に取得する。
    p := kokkaiapi.NewParam()
    p.Any("科学技術")
    p.RecordPacking("json")
    p.SessionFrom(209)
    p.SessionTo(209)
    p.MaximumRecords(3)
    // exp return 7 records
    for result, err := range kokkaiapi.IterKaniResult(p) {
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println("numberOfReturn", result.NumberOfReturn)
    }

    // Output:
    // numberOfReturn 3
    // numberOfReturn 3
    // numberOfReturn 1
}

Documentation

Overview

Example
package main

import (
	"fmt"
	"log"

	kokkaiapi "github.com/yyyoichi/kokkai-api"
)

func main() {
	// 国会回次209の科学技術に関する議事録を「会議単位簡易出力」で最大3件ずつ、再帰的に取得する。
	p := kokkaiapi.NewParam()
	p.Any("科学技術")
	p.RecordPacking("json")
	p.SessionFrom(209)
	p.SessionTo(209)
	p.MaximumRecords(3)
	// exp return 7 records
	for result, err := range kokkaiapi.IterKaniResult(p) {
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println("numberOfReturn", result.NumberOfReturn)
	}

}
Output:

numberOfReturn 3
numberOfReturn 3
numberOfReturn 1

Index

Examples

Constants

View Source
const (
	KaniURI     = "https://kokkai.ndl.go.jp/api/meeting_list"
	KaigiURI    = "https://kokkai.ndl.go.jp/api/meeting"
	HatsugenURI = "https://kokkai.ndl.go.jp/api/speech"
)

Variables

View Source
var (

	// 「会議単位簡易出力」を取得するクライアント
	KaniClient = Client[*KaniResult]{
		HttpClient:    http.DefaultClient,
		Interval:      defaultInterval,
		NewResultFunc: func() *KaniResult { return new(KaniResult) },
	}
	// 「会議単位出力」を取得するクライアント
	KaigiClient = Client[*KaigiResult]{
		HttpClient:    http.DefaultClient,
		Interval:      defaultInterval,
		NewResultFunc: func() *KaigiResult { return new(KaigiResult) },
	}
	// 「発言単位出力」を取得するクライアント
	HatsugenClient = Client[*HatsugenResult]{
		HttpClient:    http.DefaultClient,
		Interval:      defaultInterval,
		NewResultFunc: func() *HatsugenResult { return new(HatsugenResult) },
	}
)
View Source
var (
	ErrRequestFailed   = errors.New("http request failed")
	ErrNonOKResponse   = errors.New("non-OK HTTP status")
	ErrParsingResponse = errors.New("failed to parse response")
)
View Source
var (
	//「会議単位簡易出力」を取得するリクエスト構造体
	DefaultKaniRequest = Request[*KaniResult]{
		Client:    KaniClient,
		Generator: KaniURI,
	}
	//「会議単位出力」を取得するリクエスト構造体
	DefaultKaigiRequest = Request[*KaigiResult]{
		Client:    KaigiClient,
		Generator: KaigiURI,
	}
	//「発言単位出力」を取得するリクエスト構造体
	DefaultHatsugenRequest = Request[*HatsugenResult]{
		Client:    HatsugenClient,
		Generator: HatsugenURI,
	}
)

Functions

func ConstructURI

func ConstructURI(baseURI string, p Param) string

func GetResult

func GetResult[T result](p Param, r Request[T]) (T, error)

任意のリクエスト構造体から議事録を取得する。

Example
package main

import (
	"fmt"
	"log"

	kokkaiapi "github.com/yyyoichi/kokkai-api"
)

func main() {
	// 国会回次209の科学技術に関する議事録を「会議単位簡易出力」で一度だけ取得する。
	p := kokkaiapi.NewParam()
	p.Any("科学技術")
	p.RecordPacking("json")
	p.SessionFrom(209)
	p.SessionTo(209)
	p.MaximumRecords(10)
	// exp return 7 records
	for result, err := range kokkaiapi.IterKaniResult(p) {
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println("numberOfReturn", result.NumberOfReturn)
	}

}
Output:

numberOfReturn 7

func IterHatsugenResult

func IterHatsugenResult(p Param) iter.Seq2[*HatsugenResult, error]

「発言単位出力」で議事録を再帰的に取得します。

引数に最初の検索条件を指定します。

func IterKaigiResult

func IterKaigiResult(p Param) iter.Seq2[*KaigiResult, error]

「会議単位出力」で議事録を再帰的に取得します。

引数に最初の検索条件を指定します。

func IterKaniResult

func IterKaniResult(p Param) iter.Seq2[*KaniResult, error]

「会議単位簡易出力」で議事録を再帰的に取得します。

引数に最初の検索条件を指定します。

func IterResult

func IterResult[T result](p Param, r Request[T]) iter.Seq2[T, error]

任意のリクエスト構造体から再帰的に議事録を取得します。

Example
package main

import (
	"fmt"
	"log"
	"net/http"
	"time"

	kokkaiapi "github.com/yyyoichi/kokkai-api"
)

func main() {
	// httpクライアントに任意の構造体を利用して、議事録を取得する。

	request := kokkaiapi.DefaultHatsugenRequest
	// `Get(uri string) (*http.Response, error)` メソッドを持つ構造体が必要。
	request.Client.HttpClient = &http.Client{
		// custom http client
		Timeout: time.Duration(1 * time.Second),
	}
	p := kokkaiapi.NewParam()
	p.Any("鬼滅の刃")
	p.RecordPacking("json")
	p.SessionFrom(209) // 議事録は存在しない。
	p.SessionTo(209)   // 210には議事録があったりする。
	p.MaximumRecords(3)

	// return no record
	for result, err := range kokkaiapi.IterResult(p, request) {
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println("numberOfReturn", result.NumberOfReturn)
	}
}
Output:

numberOfReturn 0

Types

type Client

type Client[T result] struct {
	// httpリクエストを実行する構造体。
	//
	// 下記の、`httpClient`を満たす構造体が必要。
	//
	// type httpClient interface {
	// 	Get(string) (*http.Response, error)
	// }
	//
	HttpClient httpClient
	// APIにアクセスするインターバル。
	//
	// [国会会議録検索システム 検索用APIの仕様](https://kokkai.ndl.go.jp/api.html)では、アクセスの間隔に数秒間を置くことが推奨されている。
	//
	// デフォルトで1秒間としている。
	Interval time.Duration
	// レスポンス構造体を初期化する関数。
	NewResultFunc func() T
}

国会議事録APIにリクエストを行う構造体。

func (*Client[T]) DoRequest

func (c *Client[T]) DoRequest(ctx context.Context, uri string) (T, error)

一度だけリクエストを実行する。

func (*Client[T]) IterRequest

func (c *Client[T]) IterRequest(ctx context.Context, uriIter iter.Seq[string]) iter.Seq2[T, error]

uriを受け取るだけ再帰的にリクエストを実行する。

type Generator

type Generator string

func (*Generator) Generate

func (g *Generator) Generate(ctx context.Context, p Param, nextPosCh <-chan int) iter.Seq[string]

type HatsugenResult

type HatsugenResult struct {
	Message            string   `json:"message"`            // エラーメッセージ
	Details            []string `json:"details"`            // エラーメッセージの詳細(※検索条件の入力誤りの場合のみ、※検索条件の入力誤りが複数ある場合のみ)
	NumberOfRecords    int      `json:"numberOfRecords"`    // 総結果件数
	NumberOfReturn     int      `json:"numberOfReturn"`     // 返戻件数
	StartRecord        int      `json:"startRecord"`        // 開始位置
	NextRecordPosition int      `json:"nextRecordPosition"` // 次開始位置
	SpeechRecord       []struct {
		SpeechID        string `json:"speechID"`        // 発言ID
		IssueID         string `json:"issueID"`         // 会議録ID
		ImageKind       string `json:"imageKind"`       // イメージ種別(会議録・目次・索引・附録・追録)
		SearchObject    int    `json:"searchObject"`    // 検索対象箇所(議事冒頭・本文)
		Session         int    `json:"session"`         // 国会回次
		NameOfHouse     string `json:"nameOfHouse"`     // 院名
		NameOfMeeting   string `json:"nameOfMeeting"`   // 会議名
		Issue           string `json:"issue"`           // 号数
		Date            string `json:"date"`            // 開催日付
		Closing         string `json:"closing"`         // 閉会中フラグ
		SpeechOrder     int    `json:"speechOrder"`     // 発言番号
		Speaker         string `json:"speaker"`         // 発言者名
		SpeakerYomi     string `json:"speakerYomi"`     // 発言者よみ
		SpeakerGroup    string `json:"speakerGroup"`    // 発言者所属会派
		SpeakerPosition string `json:"speakerPosition"` // 発言者肩書き
		SpeakerRole     string `json:"speakerRole"`     // 発言者役割
		Speech          string `json:"speech"`          // 発言
		StartPage       int    `json:"startPage"`       // 発言が掲載されている開始ページ
		SpeechURL       string `json:"speechURL"`       // 発言URL
		SeetingURL      string `json:"meetingURL"`      // 会議録テキスト表示画面のURL
		PdfURL          string `json:"pdfURL"`          // 会議録PDF表示画面のURL(※存在する場合のみ)
	} `json:"speechRecord"` // 発言情報
}

発言単位出力

type KaigiResult

type KaigiResult struct {
	Message            string   `json:"message"`            // エラーメッセージ
	Details            []string `json:"details"`            // エラーメッセージの詳細(※検索条件の入力誤りの場合のみ、※検索条件の入力誤りが複数ある場合のみ)
	NumberOfRecords    int      `json:"numberOfRecords"`    // 総結果件数
	NumberOfReturn     int      `json:"numberOfReturn"`     // 返戻件数
	StartRecord        int      `json:"startRecord"`        // 開始位置
	NextRecordPosition int      `json:"nextRecordPosition"` // 次開始位置
	MeetingRecord      []struct {
		IssueID       string `json:"issueID"`       // 会議録ID
		ImageKind     string `json:"imageKind"`     // イメージ種別(会議録・目次・索引・附録・追録)
		SearchObject  int    `json:"searchObject"`  // 検索対象箇所(議事冒頭・本文)
		Session       int    `json:"session"`       // 国会回次
		NameOfHouse   string `json:"nameOfHouse"`   // 院名
		NameOfMeeting string `json:"nameOfMeeting"` // 会議名
		Issue         string `json:"issue"`         // 号数
		Date          string `json:"date"`          // 開催日付
		Closing       string `json:"closing"`       // 閉会中フラグ
		SpeechRecord  []struct {
			SpeechID        string `json:"speechID"`        // 発言ID
			SpeechOrder     int    `json:"speechOrder"`     // 発言番号
			Speaker         string `json:"speaker"`         // 発言者名
			SpeakerYomi     string `json:"speakerYomi"`     // 発言者よみ
			SpeakerGroup    string `json:"speakerGroup"`    // 発言者所属会派
			SpeakerPosition string `json:"speakerPosition"` // 発言者肩書き
			SpeakerRole     string `json:"speakerRole"`     // 発言者役割
			Speech          string `json:"speech"`          // 発言
			StartPage       int    `json:"startPage"`       // 発言が掲載されている開始ページ
			CreateTime      string `json:"createTime"`      // レコード登録日時
			UpdateTime      string `json:"updateTime"`      // レコード更新日時
			SpeechURL       string `json:"speechURL"`       // 発言URL
		} `json:"speechRecord"` // 発言情報
		MeetingURL string `json:"meetingURL"` // 会議録テキスト表示画面のURL ,
		PdfURL     string `json:"pdfURL"`     // 会議録PDF表示画面のURL(※存在する場合のみ) ,
	} `json:"meetingRecord"` // 会議録情報
}

会議単位出力

type KaniResult

type KaniResult struct {
	Message            string   `json:"message"`            // エラーメッセージ
	Details            []string `json:"details"`            // エラーメッセージの詳細(※検索条件の入力誤りの場合のみ、※検索条件の入力誤りが複数ある場合のみ)
	NumberOfRecords    int      `json:"numberOfRecords"`    // 総結果件数
	NumberOfReturn     int      `json:"numberOfReturn"`     // 返戻件数
	StartRecord        int      `json:"startRecord"`        // 開始位置
	NextRecordPosition int      `json:"nextRecordPosition"` // 次開始位置
	MeetingRecord      []struct {
		IssueID       string `json:"issueID"`       // 会議録ID
		ImageKind     string `json:"imageKind"`     // イメージ種別(会議録・目次・索引・附録・追録)
		SearchObject  int    `json:"searchObject"`  // 検索対象箇所(議事冒頭・本文)
		Session       int    `json:"session"`       // 国会回次
		NameOfHouse   string `json:"nameOfHouse"`   // 院名
		NameOfMeeting string `json:"nameOfMeeting"` // 会議名
		Issue         string `json:"issue"`         // 号数
		Date          string `json:"date"`          // 開催日付
		Closing       string `json:"closing"`       // 閉会中フラグ
		SpeechRecord  []struct {
			SpeechOrder int    `json:"speechOrder"` // 発言番号
			Speaker     string `json:"speaker"`     // 発言者名
			SpeechURL   string `json:"speechURL"`   // 発言URL
		} `json:"speechRecord"`
		MeetingURL string `json:"meetingURL"` // 会議録テキスト表示画面のURL ,
		PdfURL     string `json:"pdfURL"`     // 会議録PDF表示画面のURL(※存在する場合のみ) ,
	} `json:"meetingRecord"`
}

会議単位簡易出力

type Param

type Param struct {
	// contains filtered or unexported fields
}

検索条件

- {検索条件}は「パラメータ名=値」の形式で指定し、UTF-8でURLエンコードしてください。

- 複数のパラメータで検索する場合には、半角の&(U+0026)で接続してください。

- 検索条件部分は全体で2000バイトが上限です。

- 院名、会議名、検索語、発言者名、開会日付/始点、開会日付/終点、発言番号、発言者肩書き、発言者所属会派、発言者役割、発言ID、冊子ID、国会回次From、国会回次To、号数From、号数Toのいずれも指定がなかった場合には、エラーになります。

func NewParam

func NewParam() Param

func (*Param) Any

func (p *Param) Any(val string)

検索語 発言内容等に含まれる言葉を指定可能。部分一致検索。半角スペース(U+0020)を区切り文字として複数指定した場合は、指定した語のAND検索となる。 省略可(省略時は検索条件に含めない)。

func (*Param) Closing

func (p *Param) Closing(val bool)

閉会中指定 検索対象を閉会中の会議録に限定するか否かを「true」「false」で指定可能。 省略可(省略時は「false」(限定しない)が指定されたものとして検索する)。

func (*Param) ContentsAndIndex

func (p *Param) ContentsAndIndex(val bool)

目次・索引指定 検索対象を目次・索引に限定するか否かを「true」「false」で指定可能。 省略可(省略時は「false」(限定しない)が指定されたものとして検索する)。

func (*Param) From

func (p *Param) From(val string)

開会日付/始点 検索対象とする会議の開催日の始点を「YYYY-MM-DD」の形式で指定可能。 省略可(省略時は「0000-01-01」が指定されたものとして検索する)。

func (*Param) IssueFrom

func (p *Param) IssueFrom(val int)

号数From 検索対象とする号数の始まり(開始号)を3桁までの整数で指定可能(目次・索引・附録・追録は0号扱い)。号数Toと組み合わせて指定した場合には範囲指定検索、号数From単独で指定した場合は当該の回次のみを完全一致検索。 省略可(省略時は検索条件に含めない)。

func (*Param) IssueID

func (p *Param) IssueID(val string)

会議録ID 会議録(冊子)を一意に識別するIDとして、会議録テキスト表示画面の「会議録テキストURLを表示」リンクで表示される21桁の英数字で指定可能(例:「100105254X00119470520」)。完全一致検索。 省略可(省略時は検索条件に含めない)。書式が適切でない場合にはエラーになる。

func (*Param) IssueTo

func (p *Param) IssueTo(val int)

号数To 検索対象とする号数の終わり(終了号)を3桁までの整数で指定可能(目次・索引・附録・追録は0号扱い)。号数Fromと組み合わせて指定した場合には範囲指定検索、号数To単独で指定した場合は当該の回次のみを完全一致検索。 省略可(省略時は検索条件に含めない)。

func (*Param) MaximumRecords

func (p *Param) MaximumRecords(val int)

一回の最大取得件数 一回のリクエストで取得できるレコード数を、会議単位簡易出力、発言単位出力の場合は「1~100」、会議単位出力の場合は「1~10」の範囲で指定可能。 省略時のデフォルト値は、会議単位簡易出力、発言単位出力の場合は「30」、会議単位出力の場合は「3」

func (*Param) NameOfHouse

func (p *Param) NameOfHouse(val string)

院名 院名として「衆議院」「参議院」「両院」「両院協議会」のいずれかを指定可能。「両院」と「両院協議会」の結果は同じ。 省略可(省略時は検索条件に含めない)。また、指定可能な値以外を指定した場合も、検索条件に含めない。

func (*Param) NameOfMeeting

func (p *Param) NameOfMeeting(val string)

会議名 本会議、委員会等の会議名(ひらがな可)を指定可能。部分一致検索。半角スペース(U+0020)を区切り文字として複数指定した場合は、指定した語のOR検索となる。 省略可(省略時は検索条件に含めない)。

func (*Param) RecordPacking

func (p *Param) RecordPacking(val string)

応答形式 検索リクエストに対する応答ファイルの形式として、「xml」「json」のいずれかを指定可能。 省略可(省略時は「xml」が指定されたものとして検索する)。

func (*Param) ResetStartRecord

func (p *Param) ResetStartRecord(val int)

開始位置 の再設定。

func (*Param) SearchRange

func (p *Param) SearchRange(val string)

議事冒頭・本文指定 検索語(パラメータ名:any)を指定して検索する際の検索対象箇所を「冒頭」「本文」「冒頭・本文」のいずれかで指定可能。 省略可(省略時は「冒頭・本文」が指定されたものとして検索する)。検索語を指定しなかった時は検索条件には含めない。

func (*Param) SessionFrom

func (p *Param) SessionFrom(val int)

国会回次From 検索対象とする国会回次の始まり(開始回)を3桁までの自然数で指定可能。国会回次Toと組み合わせて指定した場合には範囲指定検索、国会回次From単独で指定した場合は当該の回次のみを完全一致検索。 省略可(省略時は検索条件に含めない)。

func (*Param) SessionTo

func (p *Param) SessionTo(val int)

国会回次To 検索対象とする国会回次の終わり(終了回)を3桁までの自然数で指定可能。国会回次Fromと組み合わせて指定した場合には範囲指定検索、国会回次To単独で指定した場合は当該の回次のみを完全一致検索。 省略可(省略時は検索条件に含めない)。

func (*Param) Speaker

func (p *Param) Speaker(val string)

発言者名 発言者名(議員名はひらがな可)を指定可能。部分一致検索。半角スペース(U+0020)を区切り文字として複数指定した場合は、指定した語のOR検索となる。 省略可(省略時は検索条件に含めない)。

func (*Param) SpeakerGroup

func (p *Param) SpeakerGroup(val string)

発言者所属会派 発言者の所属会派を指定可能。部分一致検索(なお、登録されているデータは正式名称のみ)。 省略可(省略時は検索条件に含めない)。

func (*Param) SpeakerPosition

func (p *Param) SpeakerPosition(val string)

発言者肩書き 発言者の肩書きを指定可能。部分一致検索。 省略可(省略時は検索条件に含めない)。

func (*Param) SpeakerRole

func (p *Param) SpeakerRole(val string)

発言者役割 発言者の役割として「証人」「参考人」「公述人」のいずれかを指定可能。 省略可(省略時は検索条件に含めない)。指定可能な値以外を指定した場合はエラーになる。

func (*Param) SpeechID

func (p *Param) SpeechID(val string)

発言ID 発言を一意に識別するIDとして、「会議録ID(パラメータ名:issueID。21桁の英数字)_発言番号(会議録テキスト表示画面で表示されている各発言に付されている、先頭に0を埋めて3桁にした数字。4桁の場合は4桁の数字)」の書式で指定可能(例:「100105254X00119470520_000」)。完全一致検索。 省略可(省略時は検索条件に含めない)。書式が適切でない場合にはエラーになる。

func (*Param) SpeechNumber

func (p *Param) SpeechNumber(val int)

発言番号 発言番号を0以上の整数(例:発言番号10の場合は「speechNumber=10」)で指定可能。完全一致検索。 省略可(省略時は検索条件に含めない)。

func (*Param) StartRecord

func (p *Param) StartRecord(val int)

開始位置 検索結果の取得開始位置を「1~検索件数」の範囲で指定可能。 省略時のデフォルト値は「1」

func (*Param) SupplementAndAppendix

func (p *Param) SupplementAndAppendix(val bool)

追録・附録指定 検索対象を追録・附録に限定するか否かを「true」「false」で指定可能。 省略可(省略時は「false」(限定しない)が指定されたものとして検索する)。

func (*Param) Until

func (p *Param) Until(val string)

開会日付/終点 検索対象とする会議の開催日の終点を「YYYY-MM-DD」の形式で指定可能。 省略可(省略時は「9999-12-31」が指定されたものとして検索する)。

type Request

type Request[T result] struct {
	Client    Client[T]
	Generator Generator
}

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL