Tinder自動化のスゝメ〜Pythonで右スワイプを自動化してみよう　その1〜

# Tinderとは
初めまして．突然ですが，[Tinder](https://tinder.com/?lang=ja
)というアプリをご存知でしょうか．簡単に言うとスマホを右左にスワイプしてる内に異性とマッチしてメッセージ送って会う，所謂マッチングアプリです．~~暇な○子○生さんが優勝していたアレです．~~

Tinderでは，

- 表示された異性のプロフィール（写真，名前，年齢，学歴，職業，自己紹介文）を見る
- 気に入ったら右にスワイプ
- 気に入らなかったら左スワイプ
- めちゃくちゃ気に入ったら下にスワイプ（今回はこの辺は余り扱いません）

のプロセスを男女が繰り返し，お互いを右スワイプしたペアがマッチし，メッセージのやり取りが可能になります．右スワイプ出来る回数には無料会員の場合連続で100回の制限があり，一度100回の右スワイプを使い切って12時間経つと上限100で回数がチャージされます．

やってみると分かるのですがこのスワイピング，非常にめんどくさいのです．連続で100回もプロフィールをチェックしてスワイプするとなると結構時間がかかりますし，手も疲れてきます．実際私も始めて数週間でしんどくなってきました．

# pynderとは

そこで，何とかこのスワイピングをラクに出来ないものかと色々ググっていたところ，Tinder APIを使うことが出来そうだ，という事が分かってきました．Tinderは公式にはAPIが公開されていませんが，[有志の手によりAPIが解析](https://gist.github.com/rtt/10403467)されています．

また，このAPIをPythonから弄れるパッケージとして[pynder](https://github.com/charliewolf/pynder)があります．Pythonはまぁまぁ使った事がある（むしろPythonしか出来ない）ので，早速pynderで自動右スワイプに取り組むことにしました．

# 環境構築
本ドキュメントでは特に追記がない場合，以下の環境で作業をするものとし，Facebookアカウントを使ってTinderアカウントを作成済みとします．

- OS:OS X High Sierra 10.13.5
- Python: Python3.6.5

まずはpynderをインストールしましょう．pipでインストールすると実行時エラーを吐く場合が多いので，以下の様なsetup.pyを使ったインストールを推奨します．

```shell
$ git clone https://github.com/charliewolf/pynder
$ cd pynder
$ python setup.py install
```

次に，Tinderアカウントを作る際に用いたFacebookアカウントのIDを[findmyfbid.com](https://findmyfbid.com/)を用いて取得します．

最後に，Rubyのtinder_auth_fetcherを用いてトークンを取得します．トークンの取得のため，以下のコマンドを実行します．

```sh
$ sudo gem install tinder_auth_fetcher
$ irb
$ require "tinder_auth_fetcher"
$ token = TinderAuthFetcher.fetch_token("email@address", "your password") # Facebookのログインに使っているアドレスとログインパスワードを入力
```

# pynderを用いたスワイプ自動化
さて，準備も出来たのでスワイピングを自動化していくことにしましょう．今回は以下の2手法について簡単に紹介します．
## 脳死右スワイプ
Tinderやるのがめんどくさくなった人が真っ先に取るであろう方法が脳死右スワイプと呼ぶことにします．プロフィールを一切見ず出てくるユーザを全て右スワイプしていきます．

```python:all_swipe_right.py
# -*- coding: utf-8 -*-
import pynder

usr = "your user id" # findmyfbidで取得したFacebook ID
token = "your fb token" # tinder_auth_fetcherで取得したTinder Token

def swipe():
    session = pynder.Session(facebook_id = usrid, facebook_token = token) # Tinderアカウントへのログイン
    users = session.nearby_users() # 近くに居るユーザの情報を取得

    for usr in users:
        # likeできなくなるまでlikeする
        if session.likes_remaining == 0:
            print("右スワイプ終わり！")
            break
        usr.like() # 右スワイプ

def main():
    swipe()

if __name__ == "__main__":
    main()
```

この方法はシンプルですが，自分の嗜好と全く合わないユーザとマッチしてしまうリスクがあります．私も最初はこの方法を採っていましたが，~~ア○○ェイやってる女性とマッチしまくったのもあり~~やめました．

## ルールベース
嗜好に対してある明確な基準がある場合，これに基づき機械的にスワイプする方法をルールベースと呼ぶことにします．この方法は例えば，ネットワークビジネスに興味がない，自分の好みでない体型の方とはマッチしたくない，知人の知人とはマッチしたくない等，ある程度具体的な基準がある場合に有効でしょう．

Tinderの場合，こうした情報は自己紹介文から判断する他ありません．今回は自己紹介を[JUMAN++](http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN++)で形態素解析し，該当の単語が出てきた場合に左スワイプする処理を行うことにします．JUMAN++を用いた理由としては，MeCab等よりも律速ではあるものの性能は良く，俗語にもある程度対応しているだろう，と判断したことが挙げられます．

JUMAN++やPythonラッパーのpyknpのインストールに関しては[公式ドキュメント](http://lotus.kuee.kyoto-u.ac.jp/nl-resource/jumanpp/jumanpp-manual-1.01.pdf)を参照して下さい．

形態素解析に際しては，絵文字を除去するため[emoji-python](https://github.com/najeira/emoji-python)を以下のコマンドでインストールして使いました．

```sh
$ git clone https://github.com/najeira/emoji-python
$ cd emoji-python
$ python setup.py install
```
ルールベースのソースコードは以下の通りです．~~ちなみにこのコード書いてる時は修論とか書いてました…~~

```python:rule_base.py
# -*- coding: utf-8 -*-
import pynder
from pyknp import Jumanpp

usrid = "your user id" # findmyfbidで取得したFacebook ID
token = "your fb token" # tinder_auth_fetcherで取得したTinder Token

# プロフィール中の絵文字を除去
def rm_emoji(strings):
    output = "".join([str(s) for s in strings if s not in emoji.UNICODE_EMOJI])
    output.replace("\n",".").replace("\r",".")
    return output

# JUMAN++による形態素解析
def juman_morph(strings):
    jum = Jumanpp()
    result = jum.analysis(strings)
    return [r.midasi for r in result]

def swipe():
    session = pynder.Session(facebook_id = usrid, facebook_token = token) # Tinderアカウントへのログイン
    users = session.nearby_users() # 近くに居るユーザの情報を取得

    for usr in users:
        # likeできなくなるまでlikeする
        if session.likes_remaining == 0:
            print("右スワイプ終わり！")
            break
        bio = (usr.bio).replace("\n",".").replace(" ","　").replace(":","").replace("：","").replace("/","　").replace("#","　") # 自己紹介の中の半角スペースを全角に直したり，余計な記号を取り除いておきます
        bio = rm_emoji(origin_bio)
        if bio != "":
            bio = [str(d) for d in juman_morph(bio) if d not in emoji.UNICODE_EMOJI]
            bio = list(np.unique(bio))

        # 単語によるフィルタリング（ここでは体型，知人の知人でフィルタリング）
        if len(bio) > 0 and (("デブ" in bio) or ("でぶ" in bio) or ("ぽっちゃり" in bio) or ("ポッチャリ" in bio) or (("マシュマロ" in bio) and ("女子" in bio)) or ("chubby" in bio) or ("Chubby" in bio) or ("CHUBBY" in bio)):
            print("太めの方はちょっと…")
            usr.dislike()
        if len(usr.common_connections)>0:
            print("知人の知人の方はちょっと…")
            usr.dislike()
        usr.like() # 右スワイプ

def main():
    swipe()

if __name__ == "__main__":
    main()
```

# まとめ
今回，ある程度お手軽にTinderで脳死右スワイプ，ルールベースによる自動スワイピングが実装出来ることが分かったかと思います．次回，機械学習を組み込んだ自動右スワイプについても紹介していきたいと思います．~~初投稿がこんなネタ記事ですみません~~