メール一通でアプリケーションの作成からデータ登録、共有まで行う

kintoneはそれ単体でも便利なサービスですが、APIを利用することでより活用の幅が広がります。特に、アプリケーションの作成や変更を行うAPIまで公開しているのはなかなかないのではないでしょうか。

[kintone API](https://cybozudev.zendesk.com/hc/ja/categories/200147600-kintone-API)

というわけで、今回は誰でも手軽に送れるメールという連絡手段と、kintoneを連携させ、アプリケーションの作成からデータの登録、はてはその共有までを行った例をご紹介します。

本件については、[kintone devCamp 2015](http://www.kintonedevcamp.com/)での発表を行っています。興味がある方は発表資料も見ていただければと思います。

[kintone devCamp 2015 ultra fast improvement](http://www.slideshare.net/takahirokubo7792/kintone-devcamp-2015-ultra-fast-improvement)

## 動機

業務を改善していくに当たっては、気づきの共有が欠かせません。良く知られているのは、ヒヤリハットなどです。
ただ、こうした気づきは揮発的なものですし、それを共有するために「業務システムを開いて~」とか「システム管理者に連絡して~」となってしまうと、面倒になって共有する気がなくなってしまいます。

そこで、気づいた瞬間に共有できるプラットフォームを構築しよう、というのが動機になります。具体的には、簡単な連絡ツールで共有のプラットフォーム(=アプリ)の作成から、そこへのデータ登録、メンバへの共有まで済ませてしまおうということです。

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/3949deb0-e843-9296-3a8a-96e9663761ab.png)

## 構成

「簡易な連絡ツール」としては、本当はLINEなどのチャットツールが良かったのですが、APIを使うにはお金をちょとアレしないといけない感じだったので、今回はメールにします。

全体の構成は、以下のような感じになっています。

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/efa3837a-ebee-0fc8-6077-63d4acdb0dd8.png)

### SendGrid

メールの送信、受信検知などがAPI経由で実行できるプラットフォームです。以下のブログに使い方がとてもよくまとまっているので、ご参考ください。

[【MA:Techblog／SendGrid】Webの世界と親和性の高いメールAPI](http://mashupaward.jp/2015/10/sendgrid/)

SendGridは公式のPython SDKがあるので、今回はこちらを利用しました。

[sendgrid/sendgrid-python](https://github.com/sendgrid/sendgrid-python)

### Microsoft Project Oxford

Microsoftの研究機関で、画像解析や自然言語処理といったAPIを公開しています。

[Microsoft Project Oxford](https://www.projectoxford.ai/)

デモが豊富なので、いろいろ試してみるのも面白いと思います。Pythonから簡単に使うためのライブラリを公開しているのでよろしければ使ってみてください。今回はMicrosoft Translator APIも利用しているのですが、そちらの方にもついでに対応しているので、テキストを翻訳してから音声合成するという風にも使えます。

[icoxfog417/pyoxford](https://github.com/icoxfog417/pyoxford)

### Watson

IBM Bluemix上で使える、自然言語処理系のAPI群の総称になっています。今回は、自然言語の分類を行えるNLCを利用しました。

[Natural Language Classifier](https://console.eu-gb.bluemix.net/catalog/services/natural-language-classifier/)

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/3281b51e-06a5-917c-6571-6834d3a54663.png)

Watsonは、公式でPython SDKを公開しているので、こちらを利用すると簡単にアプリケーションに組み込むことができます。

[watson-developer-cloud/python-sdk](https://github.com/watson-developer-cloud/python-sdk)

### kintone

そしてわれらがkintoneです。Python SDKを公開しているので、今回はこちらを利用します。

[icoxfog417/pykintone](https://github.com/icoxfog417/pykintone)

アプリケーションの作成・変更を行う、今回肝ともなっているデプロイAPIにも対応済みです。

### Other Python Libraries

その他、利用したライブラリやツールをまとめておきます。

* Falcon  
PythonのWeb API専用アプリケーションフレームワークです。今回は画面がいらないので、API特化して高速に動作するFalconを利用しました。詳細は[こちら](http://qiita.com/icoxfog417/items/913bb815d8d419148c33)。
* janome  
Pure Pythonの形態素解析ライブラリです。MeCabが有名ですがセットアップが結構まごつくので、こちらの方が手軽で便利です。今回は最終的にはHeroku Buttonで使えるようにしようと思っているので、ポータビリティを重視しjanomeにしました。

あと、SendGridとの連携テストに[ngrok](https://ngrok.com/)というツールを利用しました。これはローカルサーバーにグローバルIPを割り当てることのできるツールで、WebHook系のサービスと連携するアプリケーションのテストに重宝します。便利すぎて言葉にならないくらいなので、みんな使って幸せになるといいと思います(使い方については[こちら](https://sendgrid.kke.co.jp/blog/?p=3085)が詳しいです)。

## 実装

実際に構築したものがこちらになります(執筆時点(12/4)では間に合ってないですが、Heroku Buttonを付けようと思ってます)。

[icoxfog417/kanaria](https://github.com/icoxfog417/kanaria)

実際難しかったのは、以下点です。

* メールの文面をkintoneアプリのフィールドに「いい感じ」に割り当てる  
書いてある順番や日付/メールアドレスといった特徴的なテキストなどを手掛かりにして割り当てています。ちょっと困ったのが、kintoneの[フィールド情報取得API](https://cybozudev.zendesk.com/hc/ja/articles/204783170-%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%AE%E5%8F%96%E5%BE%97#anchor_getform_fields)ではフォームの並び順が不規則?に返されるので、[レイアウトの方](https://cybozudev.zendesk.com/hc/ja/articles/204783170-%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%AE%E5%8F%96%E5%BE%97#anchor_getform_layout)を利用しアプリ上で並んでいる順番を考慮しています。
* フィールドの追加・削除  
操作自体はAPIをたたけば済むので難しくないのですが、文面から「なにを」「どうしようとしているのか」を判断するのが結構難しかったです(単純にキーワードで処理すると、「削除フラグを削除したい」とかに無力なので、ちゃんとやる必要がある)。助詞の形態などを手掛かりにしているのですが、これは「形態素」解析をしたかいがある実装になりました(janome様様)。
* 添付ファイル対応  
業務の上での障害の報告などは写真を付けたいケースが多いはずなので、ここは対応を頑張りました。これに伴い、pykintoneに添付ファイルを扱えるフィールドを追加しました。

登録しないといけないAPIが多いので動かすのは大変かもしれませんが、興味のある方はGitHubのソースを動かしてみてください(※早いとこドキュメントは書いときます)。


このように、アプリケーションを自動に作ったり項目を追加・削除できるのはkintoneの柔軟性のなせる業だと思います。ぜひこの柔軟なプラットフォームを利用して、いろいろなサービスに活用していただけたら幸いです。