「CROSS ME使ったら相手に退会された話」からIoTでCROSS MEする仕組みを考えた #iotlt


こんにちは、カノジョできないエンジニアの@n0bisukeです。

正直[カノジョできないエンジニア Advent Calendar 2016](http://qiita.com/advent-calendar/2016/no-girlfriend)の期待値が高すぎてどうしようかとけっこう直前まで悩んでましたが、[先ほどの#IoTLT](https://iotlt.connpass.com/event/45272/)で発表してきました。[ツイートまとめ](http://togetter.com/li/1057158)もあります。

> [「CROSS ME使ったら相手に退会された話」からIoTでCROSS MEする仕組みを考えた #iotlt](https://speakerdeck.com/n0bisuke/cross-meshi-tutaraxiang-shou-nitui-hui-saretahua-karaiotdecross-mesurushi-zu-miwokao-eta-number-iotlt)

> ![](https://i.gyazo.com/eae5bfa7cf6a1d84f98866d01ce2d969.png)

この記事の終着点はいかにって感じですが、進めます。

## まず、期待値が高い気がしていて日和る

さっそく本題からそれるんですけど、僕がこの記事を書くにあたりこんな感じのプレッシャーを感じていることを共有します。

### その１。はてぶが大盛況

![](https://i.gyazo.com/798c28384929b42b1784b47668495c77.png)

大盛況だから乗っかったってのもあります笑

### その2。タイトルを勢いでいれてしまった

「cross me使ったら相手に退会された話」

![](https://i.gyazo.com/b04fdaf8ef0a2987541a444f6f0a7a0e.png)

あとから気づいたけどハック要素を入れるのが難しい...

### その3。知り合いからメッセージが来る

↑の結果、久しく連絡取ってなかった知人から急にメッセージがきました。

![](https://i.gyazo.com/a798b7a71c8889046629016282fdd859.png)

このタイトルで期待してる人がいた。後戻りしにくい

### その4。知り合いにFacebookでタグ付けされる

これも久しく連絡取ってなかった知人です。

![](https://i.gyazo.com/d0aee4d0f3d609e3674984d7c7e90210.png)

しれっと別のネタを題材に記事を書こうかと思ってもいたけど、FBでタグ付けされたらもう後戻りできない。

ということでこのネタで進んでいきます。

## CROSS ME(クロスミー)とは

https://crossme.jp/

位置情報を使ったいわゆる出会い系アプリです。

![](https://i.gyazo.com/7f3d7cdbd94d795a039d12e5e4d2cd83.png)

Facebookの友達は表示されないですが、友達の友達は表示されるようです。

![](https://i.gyazo.com/f5d537d6508b05dee541b1f39b3c4332.png)
こんな感じで同じタイミングで近くにいた異性が表示されます。(画像では写真は伏せてます)
異性のプロフィールに"いいね"をつけることができますが、これをお互いにするとマッチングとなってメッセージやり取りができます。

出会い系だとお互いのことが最初分からないので同じ場所にいたっていうカジュアルな共通点があることで話しやすさを演出している気がします。

## CROSS ME(クロスミー)を使ったら相手に退会された話

本題といえば本題なのですが、そのままです笑。

まず、僕のCROSS ME歴についてですが、[こちら](https://www.facebook.com/photo.php?fbid=1296121760422822&set=pb.100000750311559.-2207520000.1481093035.&type=3&theater)にもあるように2016年9月23日に開始していました。

![](https://i.gyazo.com/3ab3b11169f3e7c8dc5addfbefc10c97.png)

謎に始めた宣言してますね。

* 一つ目の衝撃的な出来事

![](https://i.gyazo.com/9f4c2d0d1aba6f2ccc356d4d4bd98454.png)

とまぁ、 **Web業界の狭さを感じさせれらました。**
出会い系って隠れてやるものだと思うので、こういう感じで知り合いの知り合いが出て来ると ~~つらい~~こわいです。

* 2段階目の衝撃的な出来事

ここまで読めばなんとなく予想がつく人も多いかと思います。

![](https://i.gyazo.com/b04d90345766111277b547b3f4ed0183.png)

とまぁ、タイトルにある通りですが会社名を言い当てたら次の瞬間にその子は退会してました苦笑

実際の画面はこんな感じです。 退会した人との会話ログは見れないようになってるみたいです。

![](https://i.gyazo.com/94195cca1232f8b5c8c1b065b448c94a.png)

キャプチャの日付を見ると分かりますが、9/23に開始して9/24にこの事件が発生していて、わずか１日でCROSS MEは衝撃を与えてくれました。


・
・
・
・
・
・
・
・

ということでCROSS MEを使ってけど **カノジョできてない**ですorz

## CROSS MEの実装をリバースエンジニアリングして探ってみた(蛇足)

この悔しさを何かハックネタに昇華したいと思いCROSS MEをリバースエンジニアリングしてAPIを探れないか試してみました。

> ちなみにこの項目は完全に蛇足な上にグレーな記載なので関係各所から刺されたらここの項目をまるっと消します。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">出会えなかった怒りからか出会い系アプリをリバースエンジニアリング <a href="https://twitter.com/hashtag/iotlt?src=hash">#iotlt</a> <a href="https://t.co/kZr6NiDQ87">pic.twitter.com/kZr6NiDQ87</a></p>&mdash; shanon (@shanonim) <a href="https://twitter.com/shanonim/status/806467998315737088">2016年12月7日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ちなみに普段アプリなどは触らないでリバースエンジニアリングって違法じゃないの？って思いつつ調べてたらリバースエンジニアリングをすること自体は違法では無いっぽいですね。

> * [［リバースエンジニアリング（Reverse engineering）］](http://www.jpat.net/Y192.htm)
> * [当社のライバル会社が、当社の製品を購入して分解してその仕組みを調べ上げ（リバースエンジニアリング）、同等の性能をもつ製品を開発してしまいました。このようなライバル会社の行為は違法でしょうか。また、秘密保護のための対策はありますか。](https://www.clairlaw.jp/qa/it/information/post-40.html)
> * [リバースエンジニアリング](https://ja.wikipedia.org/wiki/リバースエンジニアリング)

### ということでAndroidアプリのリバースエンジニアリングをやってみた

[Androidリバースエンジニアリング（apkからjavaソースコードとasset取り出し）](http://qiita.com/syotaro/items/1d58b0bdef368b8961c7)この記事を参考に、ソースコードを読めるレベルまで持っていきます。

流れとしては`.apk -> .dex -> .jar -> .class -> .jad`という流れで.jadまで変換させるとソースコードが読めるようになります。

#### 1. `.apk`を抽出

* [apk抽出](https://play.google.com/store/apps/details?id=com.pandaz.apkextraction&hl=ja)
* [Apk Extractor](https://play.google.com/store/apps/details?id=com.ext.ui)

などのツールを使うと`.apkファイル`を抽出することができます。

#### 2. `.apk`から`.dex`を抽出

`.apk`の正体はzipファイルなので`unzipコマンド`で解凍しましょう。

```
$ unzip CROSS\ ME\ すれ違いを恋のきっかけに.apk
```

```
$ ls
AndroidManifest.xml                               classes2.dex
CROSS ME すれ違いを恋のきっかけに.apk             fabric
META-INF                                          jsr305_annotations
assets                                            lib
build-data.properties                             res
classes.dex                                       resources.arsc
```

解凍すると`classes.dex`と`classes2.dex`の`.dexファイル`とその他フォルダやファイルが出て来ました。

#### 3. `.dex`から`.jar`に変換

`dex2jar`というツールを使い`.dex`から`.jar`を復元します。

まずはhomebrewでインストールしましょう。

```
$ brew install dex2jar
```

これで`d2j-dex2jarコマンド`が使えるようになります。

> 参考記事だと`dex2jarコマンド`となってましたが、僕の手元だと`d2j-dex2jarコマンド`でした。

```
$ mkdir jaroutput
$ mv classes.dex jaroutput
$ cd jaroutput
```

としてjaroutputフォルダ内で作業しました。

```
$ d2j-dex2jar classes.dex

dex2jar classes.dex -> ./classes-dex2jar.jar
```

これで`.jar`ファイルまで復元ができました。

#### 4. `.jar`から`.class`を抽出

`.jar`も正体はzipファイルらしいのでunzipで展開します。

```
$ unzip classes-dex2jar.jar
```

```
$ ls
android             classes-dex2jar.jar io                  okhttp3             retrofit
bolts               classes.dex         jp                  okio                retrofit2
butterknife         com                 me                  org
```

こんな感じで展開されました。

各フォルダ内を除くと`.classファイル`が確認できます。

![](https://i.gyazo.com/373ee8fe88d5a567e9a0ac128777a2f7.png)

#### 5. `.class`から`.jad`に変換

最終ステップです。

jadコマンドをインストール

```
$ brew tap homebrew/binary
$ brew install jad
```

jadコマンドで変換をかけていきます。

```
$ jad ./*/*.class
```

途中で出て来る質問は全てyで通ります。

これでついにソースコードを確認できました。

![](https://i.gyazo.com/9fc0fb719e729b99a16d3ee33fc1a0ed.png)

今回初めてやってみたんですけど、アプリのソースコードって難読化しないとマジでやばいですね。
アプリ開発者の皆さんすごいです。

#### 以下、コードのスクショ

完全に出すとアレかと思うので、一部抜粋&トリミングしてます。

* 内部APIっぽい記述発見

![](https://i.gyazo.com/5a02dbc57ee39e20951e8d1a57abb495.png)

* この辺もあやしい

![](https://i.gyazo.com/128aa608fc394d5c0c10616989f8415f.png)

* パッケージ名などは把握できた

![](https://i.gyazo.com/aeebee55f44ff8677da81ec5e6dc1832.png)

* findMatchingPinsメソッドで周辺にいる人とのマッチングをやっている(ような気がする)

![](https://i.gyazo.com/9427fb773155f303dd5e2eb109375851.png)


まぁ結局難読化コードを読めずにここまでです苦笑

### リバースエンジニアリングの結論

何も分からなかった。
難読化されてるコードを解読は体力的にもスキル的にも厳しかったです。

本当は、ポケモンGoハックっぽいことしたかったです笑

> [Pokemon GOで近くにポケモンが出たらPepperが教えてくれる仕組みをNode.jsだけで作る](https://dotstud.io/blog/pepper-pokemon-go-notice/)

## IoTを絡めて自分でCROSS MEっぽいものを作ってみます

さて、リバースエンジニアリングの項目は割となくても問題ないので本題に戻りましょう。

> 正直な話をすると「リバースエンジニアリングしたけどなんも分からんかった」くらいでやめようか悩みましたが何もしてないのは流石にって思った次第です。

……ということで(謎)
**CROSS MEでカノジョはできてないので、IoT絡めて自分でCROSS MEっぽいものを作ってみます。**

### 作るもののイメージ

今回は、近くで(WioNodeで)IoTをやってる人とクロスできる仕組みを考えてみます。

![](https://i.gyazo.com/7092755c0df971272c84d6c91680afb8.png)

![](https://i.gyazo.com/0ff2cdb6d5e9b5990043d7f253fc32f4.png)

分かりますでしょうか。近くでIoTやってる人が多ければ多いほど、LED Barが反応する仕組みです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">近くでIoTやっていました、それは既に関係者ではw <a href="https://twitter.com/hashtag/iotlt?src=hash">#iotlt</a></p>&mdash; furufuru (@furufuruX10) <a href="https://twitter.com/furufuruX10/status/806467712541073408">2016年12月7日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ただ、今回GroveGPSモジュールが用意できなかったのでGPS取得だけスマホ/PCで代替です。

### 実際にうごいてるもの(GIF)と構成

分かりにくいかもしれませんが、こんな感じになります。

![](https://i.gyazo.com/3a4b754ab7c969809fd47bb25d793147.gif)

近くでIoTやってる人がいればいるほどLED Barの光の数があがっていってドキドキする体験(謎)を味わえます。

実際は以下のような構成で、サーバーに設置したNode.js側で

* 二点間距離 : [[JAVASCRIPT] JSで二点間の距離計算をする関数](http://offsidenow.phpapps.jp/archives/496)
* コネクション数(socket.io): [Socket.io (v1.2)の同時アクセス数を取得するミニマム構成とSocketの中身](http://qiita.com/n0bisuke/items/647a244430b46375aba0)

などを計算しています。(↑のソースコードが調べて出て来たのですがどちらも自分の過去記事でびっくりでした。)

![](https://i.gyazo.com/bee34275532bae29af1cb37aa02c8aa3.png)

### WioNodeとNode.js側とつなぐ部分

WioNodeをアプリに連携するだけでWebAPIとしてセンサーたちにアクセスできるようになります。

例えば、以下を叩くとLED Barの光が0になる、みたいなコードが生成されてあとは叩くだけの状態になるのでかなり手頃です。

```bash
$ curl -k -X POST https://us.wio.seeed.io/v1/node/GroveLEDBarUART0/level/0\?access_token\=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

![](https://i.gyazo.com/dbe0581c4fd52793d6291b0ec21edba3.png)

こんな感じでNode.js側から呼び出してあげればすぐに独自のWebシステムと連携できますね。

サクッと試すためにhttpsモジュールではなくexecを使ってます。

```app.js
const exec = require('child_process').exec;

function wionode(count){
  let cmd = `curl -k -X POST https://us.wio.seeed.io/v1/node/GroveLEDBarUART0/level/${count}?access_token=xxxxxxxxxxxxxx`;
  exec(cmd, function (error, stdout, stderr) {
      if(stdout){
          console.log('stdout: ' + stdout);
      }
      if(stderr){
          console.log('stderr: ' + stderr);
      }
      if (error !== null) {
        console.log('Exec error: ' + error);
      }
  });
}
```

このwionode()に同時接続数を渡してあげれば、そのときに近くにいる人の数とLEDが連動してくれます。`wionode(socket.client.conn.server.clientsCount)`などの呼び出し方になります。

## 終わりに

謎ですが、こんな感じでIoTでクロスする仕組みを作ることができました。

ちょっと途中文章がだれてしまってる感がありますがCROSS MEからIoTハックネタに繋げたらこんな感じになりました。

今回アドベントカレンダーの担当日と[IoTLT](https://iotlt.connpass.com/event/45272/)が同じ日になってしまって計画性のなさを感じています苦笑
(そこからくるゴリ押し感もあるかもしれません。)

今回言いたかったことは

* CROSS MEで退会された話はガチ
* CROSS MEっぽい仕組みもWioNodeで作れそう
* (リバースエンジニアリングは悔しかった試行錯誤)
* **WIoNodeのAPIがひたすら楽なのでIoTやるにはオススメ -> [購入ページ](https://dotstud.io/projects/wionode-social-remote-control/)**
* **カノジョできない**

って感じです。

ちなみに **来年１発目のIoTLTは1/25に、なかなか使えないソフトバンク本社で開催です。**

> https://iotlt.connpass.com/event/45884/

こんな感じのゆるい話も多いので来たことがない方がいたら遊びに来てください~