完全無料で今のあなたにオススメの旅行先を教えるLineBotを作りました。

#はじめに（キッカケ）
私は海外旅行が数少ない趣味の一つなのですが、年々興味のあるところが変わってきたり減ってきたりしていて「次はどこへ行こう・・・」と悩むことがありました。（じゃあ、行かなきゃいいじゃん）

そこで勉強も兼ねて、顔写真から読み取った感情分析によってオススメの旅行先を決めてもらおうと思ってこのbotを作りました。

#構成図
システムの構成図としてはこのようになっています。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303354/aa0b3ee1-da16-2ea6-de6c-81451ee08642.png)
※LINE＠というよりはチャンネルかもしれません。

#各選定理由
お試しということもあり、とにかくお金と開発に時間を掛けないことをモットーに選定しました。

###LINE
スマホを持っていればみんな入れているだろうなあという安易な考えと、<b>これを使って合コンでLINEの交換のキッカケに使えないか</b>ということを考えた末、LINEを選びました。
そして何よりUI部分についてはあまり考える時間を割きたくなかったのでLINEの優秀なデザイナーさんが作った
アップデートされ続けているものを利用させてもらいました。

###Face++
<a href="https://www.faceplusplus.com/">Face++</a>は中国公安も使用している画像認証～解析まで行えるAPIです。

<b>中国公安公認</b>というワードに一抹の不安を覚えながらもAzureのFaceAPIやAWSのAmazon Rekognitionと違い、リクエスト数による課金とならないという部分に魅力を感じてこれを選びました。
※安さには理由がある。。。のかもしれません

###heroku
デプロイ環境にはherokuを採用しました。使ったことがあったこととgithub連携ができるのでデプロイが楽だったからです。

###SpringBoot
業務で使うことが決まっていたので勉強がてら使うことにしました。
RESTAPIを楽々に作ることができていい感じでした。

##各種登録と設定

###Face++
http://famirror.hateblo.jp/entry/2015/12/14/180000
こちらを参考にさせていただきました。
###LineBot作成
https://qiita.com/fkooo/items/d07a7b717e120e661093
LineBotの作成とheroku連携はこちらを参考にさせていただきました。
###heroku
https://qiita.com/sho7650/items/ebd87c5dc2c4c7abb8f0
こちらを参考にさせていただきました。

##実際の画面

##画像を複数送ってみました
![Screenshot_20200116_132325.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303354/0208e94f-bd82-ed7e-71de-2484cd5b7c66.jpeg)
こんな感じで写真の顔を基にあなたへのオススメの旅行先トップ5をオススメして返してくれます。
一位にはトリップアドバイザーのその旅行先のリンクを付けて返しています。
複数送っても複数分返してくれます。
※ただし、herokuの無料枠とFace++の特性上ややレスポンス速度には難があります。特にしばらく起動していない時は10秒ほどかかってしまうことも・・・

##申し訳程度に画像以外を送った場合の処理も
![Screenshot_20200116_132508.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303354/736a5c9f-058b-8ec8-fe80-4a1d14e54a05.jpeg)


##オススメの旅行先を返信するロジックについて
上記の構成図の画像が大体のロジックですがオススメの旅行先を返信するロジックについては下記のようになっています。
①旅行先の分類としてこんな感じで分類しています。

```
public final static String[] NATURE = {AUCKLAND,CAIRNS,YELLOWKNIFE,WHITEHORSE,URANBARTOR,NAIROBI,MARAKESH,PAMUKKALE,KEIRIN};
public final static String[] HISTORICAL = {TALYN,ST_PETERBURG,MOSCOW,BARCERONA,HABANA,LONDON,PARIS,PRAGUE,VIENNA,VRADIVOSTOK};
public final static String[] RESORT = {HAWAII,PHUKET,GUAAM,KANKUN,MAIAMI,MORUDIB,DANAN,RANKAUI,ST_RINO,GOLDCOAST,CEBU,BARI};
public final static String[] CITY = {BANGKOK,KUALALUMPUR,LA,NY,VANCOUVER,HONGKONG,DUBAI,KOSHU,SINGAPORE};
	
```
②Face++から送信した画像データを基に性別、年齢、笑顔、感情を数値で返してもらうとざっくりこんな感じで返ってきます

```
"gender":{"value": "Male"},
"age":{"value": 47},
"smile":{"value": 0.516, "threshold": 50},
"headpose":{"pitch_angle": 9.200011, "roll_angle": 0.19580199, "yaw_angle": -0.9760451},
"blur":{"blurness":{"value": 1.045, "threshold": 50 }, "motionblur":{"value": 1.045,…},
"eyestatus":{"left_eye_status":{"no_glass_eye_open": 96.265, "no_glass_eye_close": 0.124, "normal_glass_eye_open": 0.99, "normal_glass_eye_close": 0.001,…},
"emotion":{"anger": 0.967, "disgust": 0.736, "fear": 0.033, "happiness": 0.092, "neutral": 98.146,…},
```
③数値を受け取り各要素を基に係数で得点を決め得点が多い分類を確定します
※例えば女性だったらショッピング向きのシティーの得点が高くなりやすかったり、悲しみの感情の得点が高かったらリゾートでゆっくりしてもらうためにリゾートの得点を高くしたり等々、独断と偏見でその点数をつけています。
④最も得点が高い分類の中からランダムで5件の候補地を返却メッセージとして返しています。

##苦労したところ
こういうSDKや外部のAPIを使うのが正直初めてだったこと。
APIが受け付ける正しいBASE64の形式が分からず手探りだったこと。
レスポンスデータのJSONのパースがどういう形式が正しいのかわからないままやっていたこと。
※需要があれば詳細を記事にしていこうと思います。

##最後に

同じ候補地が出てしまうなどなどまだまだ問題はありますが、もし良かったら下にQRコード載せておきますので追加してお楽しみツールとして試してみてください。
![gtc4772j.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303354/0ec47b6f-6ba7-3696-54f1-d39595475db6.png)

※送信された情報を特に私の方で収集したり何かに使ったりする事はしませんが、LineのサーバーやFace++に送信されている事が気になる方はお控え頂いた方がいいかと思います。その事、ご了承の上で楽しんでください。