e-Gov API に対応した gem 「kiji」を公開しました

公開しました！

![logo_kiji.png](https://qiita-image-store.s3.amazonaws.com/0/7823/54672d92-f7b8-9d9a-6db8-a4d2c5631611.png)

- [e-Gov API に対応した gem「kiji」を公開しました | 株式会社KUFU](http://kufuinc.com/?p=496)
- [kufu/kiji](https://github.com/kufu/kiji)

# なにそれ

[e-Gov](http://www.e-gov.go.jp/shinsei/index.html) という総務省の運営する電子申請の窓口がある。
社会保険や労働保険関連の手続きを Web 上から簡単に行うための窓口だ。
これまでは役所に行って、用紙を貰って、書いて、印鑑押して、また役所に持ってく、というアナログかつ面倒だった手続きを Web 上から行うことができる。

一見便利そうなのだけれども、Windows + IE のみ対応だったり、Java プラグインのインストールが必要だったりで、結局あまり使われていなかったりする。

そこで昨年、e-Gov は API 仕様を公開し、ソフトウェアベンダ各社のクライアントから直接この手続を行えるようにした。実運用はまさにこれから。

[外部連携API仕様公開（ソフトウェア開発事業者の方へ）｜電子政府の総合窓口e-Gov イーガブ](http://www.e-gov.go.jp/shinsei/interface_api/index.html)




# kiji 公開の意図と経緯

e-Gov 外部連携 API の仕様自体は去年秋ごろに公開されていたのだけれども、

- API の存在自体があまり知られていない
- 個人でこの API 使う開発者は（たぶん）いない
- 企業の開発者は情報出しにくい
- そもそもこの API 使う企業が少ない

という状況で、開発者発信の情報が見つからず、なんとかしたかった。

API 仕様が公開されたことは素晴らしい。けれども中身は大量の PDF と Excel だ。
リクエストには署名付き XML が利用される。レスポンスも JSON ではなく XML だ。

**こんなのや**
![SS 2015-05-11 11.02.05.png](https://qiita-image-store.s3.amazonaws.com/0/7823/8812b74e-0536-10ce-94af-c59f60176f60.png)

**こんなの**
![SS 2015-05-11 11.02.33.png](https://qiita-image-store.s3.amazonaws.com/0/7823/3e0799c9-b5c0-227a-def2-874fd760906a.png)

よく訓練された元 SIer（私だ）は既視感とともに軽いノスタルジーを覚えた。


**経緯**

**e-Gov API を知る**

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">e-Gov API 使って社会保険・労働保険の電子申請を楽チンにするぞ - <a href="http://t.co/NByjsC5JEv">http://t.co/NByjsC5JEv</a></p>&mdash; K (@kakipo) <a href="https://twitter.com/kakipo/status/567928480660213761">2015, 2月 18</a></blockquote>


**疎通できた**

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">やったー。e-Gov API 疎通確認できたよー(^o^)</p>&mdash; K (@kakipo) <a href="https://twitter.com/kakipo/status/583504024248299520">2015, 4月 2</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

**愚痴る**

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">斬新な API だ... せめて /access/apply/{SendNumber} と /access/apply?date_from={SendDateFrom}&amp;date_to={SendDateTo} では... <a href="http://t.co/IvNlPHxE7G">pic.twitter.com/IvNlPHxE7G</a></p>&mdash; K (@kakipo) <a href="https://twitter.com/kakipo/status/585000372139241472">2015, 4月 6</a></blockquote>

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">&quot;apply&quot; も気に食わない...</p>&mdash; K (@kakipo) <a href="https://twitter.com/kakipo/status/585000727002484738">2015, 4月 6</a></blockquote>


<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">ぶつぶつ</p>&mdash; K (@kakipo) <a href="https://twitter.com/kakipo/status/585000812515995648">2015, 4月 6</a></blockquote>


<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">e-Gov API、仕様書の不具合で絶対に最終試験パスできない状態だった。辛い。</p>&mdash; K (@kakipo) <a href="https://twitter.com/kakipo/status/585782906674487296">2015, 4月 8</a></blockquote>



**開き直る**

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">e-Gov API デバッガーになってる。。。</p>&mdash; K (@kakipo) <a href="https://twitter.com/kakipo/status/592616363300036608">2015, 4月 27</a></blockquote>

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">e-Gov API の地雷はオレが踏みしめておくぜ</p>&mdash; K (@kakipo) <a href="https://twitter.com/kakipo/status/592616644863602689">2015, 4月 27</a></blockquote>


日本のどこかにいる同じような境遇のエンジニアと知見の共有ができると嬉しい。 

# kiji の使い方

### 利用者 ID 登録

```ruby
p12 = OpenSSL::PKCS12.new(p12_file, P12_PIN)

client = Kiji::Client.new do |c|
  c.software_id   = ENV['EGOV_SOFTWARE_ID']
  c.api_end_point = ENV['EGOV_API_END_POINT']

  # 証明書 & 秘密鍵の attach
  c.cert = p12.certificate
  c.private_key = p12.key
end

response = client.register("NEW_USER_ID") # => Faraday::Response
xml = Nokogiri::XML(response.body) # => Nokogiri::XML::Document
xml.at_xpath('//Code').text # => 0（正常終了）
```

### 利用者認証

```ruby
p12 = OpenSSL::PKCS12.new(p12_file, P12_PIN)

client = Kiji::Client.new do |c|
  c.software_id   = ENV['EGOV_SOFTWARE_ID']
  c.api_end_point = ENV['EGOV_API_END_POINT']

  # 証明書 & 秘密鍵の attach
  c.cert = p12.certificate
  c.private_key = p12.key
end

# 利用者認証（Access Key の取得 & 設定）
response = client.login("REGISTERED_USER_ID")
xml = Nokogiri::XML(response.body)
client.access_key = xml.at_xpath('//AccessKey').text
```

### 一括申請

```ruby
p12 = OpenSSL::PKCS12.new(p12_file, P12_PIN)

client = Kiji::Client.new do |c|
  c.software_id   = ENV['EGOV_SOFTWARE_ID']
  c.api_end_point = ENV['EGOV_API_END_POINT']

  # 証明書 & 秘密鍵の attach
  c.cert = p12.certificate
  c.private_key = p12.key
end

# 利用者認証（Access Key の取得 & 設定）
response = client.login("REGISTERED_USER_ID")
xml = Nokogiri::XML(response.body)
client.access_key = xml.at_xpath('//AccessKey').text

# 一括申請
file_name = 'apply.zip'
encoded_data = Base64.encode64(File.new("data/#{file_name}").read)
client.apply(file_name, encoded_data)
```