見出し画像

Tinderで美男・美女がいるのは?? PythonでTinderいじって、各地の女の子のデータベースをつくったら?

TinderがpythonベースのAPI, pynderでいじれる!!

ここ数年マッチングアプリってメジャーな存在になってきましたが、中でも

Tinder

は最大手!

近くにいる恋人候補の写真がアプリに表示され、好きか嫌いかセレクト(スワイプ)していくうちに相思相愛の人にあたるとメッセージが交換できるという、ちょっと偶然の要素と自分の主観が混ざり合わさったよくできたアプリです。

個人認証としてfacebookもしくは携帯電話の番号を要求されるのも業者をできる限り排除していて、安心なところ。

実はこのTinderのシステムを解析して、pythonで動く API(Application Programming Interface)であるpynderを作った人がいて、pythonでいろいろいじれるんです!

pynderを使ってpythonをいじろう!

まずはTinderのアカウントをfacebookアカウントをつかってつくっておいてください!

次に環境構築です!なお自分はwindowsマシンをつかっていますが、Macの場合もググると同様にできると思います!

Anaconda上でpythonをいじるのが割と便利なので、anacondaとpythonをインストール

次にpynderをいれるためgitのインストール

ここまでできたら、anacondaを立ち上げjypyter notebookを立ち上げ環境構築です。

必要な環境は大体以下の通り(https://blog.aidemy.net/entry/2018/07/05/172157より)

0.環境

・Python 3.6.4    プログラミング言語

・Anaconda 1.6.9    プログラミングする環境を管理する

・Jupyter 4.4.0      ノートにそのまま書くみたいにプログラミングができる

・numpy 1.14.0       数学でやった行列みたいなのを上手に扱える

・matplotlib 2.1.2   グラフを描いたりしてくれる

・OpenCV 3.4.1.15    写真を上手に扱える

・Pynder 0.0.13    TinderPythonで動かすためのAPIhttplib2 0.11.3  ホームページから情報をとってくる

・pandas 0.24.4      データフレーム行列みたいなのをいじる

このうちだいたいはjupyter notebook上で

!pip install numpy
!pip install matplotlib
!pip install pandas
!pip install opencv-python
!pip install opencv-python

などとやるだけでインストールできるのですが、pynderだけはそれをやると、実際に動かす際にバグがでます。

そこでオリジナルのサイト(github)の情報を使ってインストールするのが重要!そのためにgitを利用して、

!pip install git+https://github.com/charliewolf/pynder.git

としてみてください!

ここまでできたら、次はpythonをいじる番です。pythonを使ってtinderをいじるにはtinderに許可してもらうための二つの情報

Facebook ID

Facebook tinder token

が必要になります。

Facebook IDは以下のサイトで

Facebook tokenは以下をクリックすると、

facebookのログイン画面が出ます。そこでfacebookにログインすると、tinderの認証を求められ、画面が変わります。そこのURLウィンドウにでてくる次のような情報の中のXXXXXXXXXX部分がtokenになります(実際はすごく長いです)。

fbconnect://success/#access_token=XXXXXXXXXX&expires_in=5022&reauthorize_required_in=7775999

上のURLは長いので、以下のサイトに張り付けると作業しやすいです。

以上で、必要な情報はそろいましたので次は実装です。

Pynderを使って各地の女の子のデータベースを作ってみよう

実装についてはまずは次の記事を参考にしました。

まずライブラリのインポート部分

import os
import re
import random
import matplotlib.pyplot as plt
import cv2
import numpy as np
import urllib.request
from urllib.parse import quote
import httplib2
import pynder
import pandas as pd

次にディスクトップに移動します(USERNAMEは個々人のものをいれてください)。

os.chdir("C:/Users/USERNAME/Desktop")

関数は上のAidemyさんのブログのものを使いましょう。

def get_image(img_url): # ウェブ上の画像をダウンロードする
    opener = urllib.request.build_opener()
    http = httplib2.Http(".cache")
    response, content = http.request(img_url)            
    return content

def aidemy_imshow(name, img): # Jupyter notebook上で画像を表示
    b,g,r = cv2.split(img)
    img = cv2.merge([r,g,b])
    plt.imshow(img)
    plt.show()
cv2.imshow = aidemy_imshow

def jpg_count(folder_name): # ディレクトリ内のjpgファイルを数える
    files = os.listdir("./"+folder_name)
    jpgcount = 0
    for file in files:
        index = re.search(".jpg", file)
        if index:
            jpgcount += 1
    return jpgcount

def image_save(img,folder_name): # 画像を保存する
    # ディレクトリがなければ作る
    if not os.path.exists(folder_name):
        os.mkdir(folder_name)
    jpgcount = jpg_count(folder_name)
    # カウント数+1でファイル名をつけて保存
    w_pass = "./{}/{}.jpg".format(folder_name,jpgcount)
    cv2.imwrite(w_pass,img)

次にいよいよtinderとつなぐ作業

usrid = "YYYYYYYYYYYYY" # findmyfbidで取得したFacebook ID
token = "XXXXXXXXXX" # Facebook Tinder Token

session = pynder.Session(facebook_id = usrid, facebook_token = token)

これでtinderからいろいろ情報を取ってこれるようになったはずです!

では最後実際のコード部分。ここでは日本全国各地を訪れて近くにいる女の子30人(tinder側の設定を前もって変ておけば男女もしくは男性の情報を集められます。また近くの距離の設定も前もってtinder側で競ってしておいてください)の情報を習得し、

名前、年齢、写真のURL、インスタグラムID、距離、仕事、学校

の情報の入ったスプレッドシートをimages_fというフォルダに出力することとと、メイン写真を各都市ごとのサブフォルダに保存することです。


# coding: UTF-8

# 写真を保存するディレクトリを作成する
if not os.path.exists("images_f"):
        os.mkdir("images_f")

session = pynder.Session(token)
#friends = session.get_fb_friends()

# 探索する都市の緯度と経度を指定

Locations = [["Sapporo", 43.055248, 141.345505],
             ["Akita", 40.824589, 140.755203],
             ["Utunomiya", 36.554241, 139.897705],
             ["Tokyo", 35.680909, 139.767372],
             ["Yokohama", 35.465786, 139.622313],
             ["Niigata", 37.917793, 139.06105],
             ["Nagoya", 35.154919, 136.920593],
             ["Kyoto", 35.009129, 135.754807],
             ["Osaka", 34.702509, 135.496505],
             ["Hukuoka", 33.579788, 130.402405],
             ["Okinawa", 26.204830, 127.692398]
            ]

# 各都市で取得する人数の上限
Limit = 30

cols = ["location","data_id","name","age", "photoURL", "photoURL2", "instagramID","distance", "school","job"]
df = pd.DataFrame(index=[], columns=cols)

for location in Locations:
    print(location[0],location[1],location[2])
    session.update_location(location[1], location[2])
    users = session.nearby_users()
    df2 = pd.DataFrame(index=[], columns=cols)    
    count = 0
    for user in users:
        count += 1
        if count > Limit :
            break
        photo_urls = user.get_photos(width="640")
        username = user.name 
        userage = user.age
        #userbd = user.birth_date
        #userthumbnail = user.thumbnail[0]
        userphoto = list(user.photos)[0]
        userphoto2 = list(user.get_photos(width="640"))[0]
        userinstagram = user.instagram_username
        userdistance = user.distance_km # distane from you
        userschool = user.schools
        userjob = user.jobs
        #userinstaphoto = [user.instagram_photos][0]
        print(username, userage, userdistance, userphoto)
        se = pd.Series([location[0],count-1, username, userage,userphoto, userphoto2,userinstagram, userdistance, userschool, userjob],index=df.columns)    
        df = df.append(se, ignore_index=True)
        df2 = df.append(se, ignore_index=True)
        img_buf = np.fromstring(get_image(userphoto2), dtype='uint8')
        img = cv2.imdecode(img_buf, 1)
        image_save(img,"./images_f/{}".format(location[0]))
    print(location[0] + " is done")

    print("Finished Scraping. Writing CSV.......")
    df2.to_csv("./images_f/{}".format(location[0])+"_output.csv")

print("Finished Scraping. Writing CSV.......")
df.to_csv("./images_f/totaloutput.csv")    
print("DONE")

主要都市をあげていますが、その他の場所を見たい場合は、以下で探してみてください。

またLimitの数を変更すると、もっと多くの人の情報が得られると思います!(このプログラムではスワイプしていないので、何人まででも可能です)

実際に動かしてみてうまくいくと、

経過が出力され

のような女の子の写真とその他の情報の入ったスプレッドシートが保存されているはずです。

ちなみに今回調べた11都市で、男女両方調べてみたんですが。。

個人的には

札幌と横浜

におしゃれな子が多く、美男美女が多い気がしました!!

もし試された皆さんがいらっしゃれば、どうでしたでしょうか?

あと旅行の前に、現地の女の子調査なんて楽しいかもしれませんね笑。

※なおあんまりこのAPI使いすぎると、たまにセッションが開けなくなったり、場所が選べなくなったりするようです(時間がたてば戻ります)。

またこの記事を書くために参考にしたサイトは上のAidemyさんのブログの他

を参考にしました。

この記事が気に入ったらサポートをしてみませんか?