Help us understand the problem. What is going on with this article?

Pythonで学ぶ効率的な彼女の作り方

概要

彼女は欲しいけど時間がないという人のために無料で気軽に使えるマッチングアプリtinderを自動化+アルファしたいと思います。

用意

・facebookアカウント
・tinderアカウント
tinderの登録は自動化のためにfacebookを用いてください。
やましいことがある人は身バレ防止のために新規アカウントを作ることをお勧めします(笑)。

アクセストークンの入手

tinderにapiを使ってログインするためにはアクセストークンを入手しなければいけません。アクセストークンの入手法はサイトの仕様変更などによってすぐ変わってしまうので今できる方法ができなくなってしまう可能性があることにご注意ください。ここでかなり詰まりました。
まず、tinder-tokenを入手するライブラリを入れます。(参考:https://pypi.org/project/tinder-token/)

pip install tinder-token

入ったら次のプログラムを作成し実行してみてください。
必要なライブラリが入ってなかったら適宜入れてください。

get_token.py
from tinder_token.facebook import TinderTokenFacebookV2
mail = "facebookログインのためのメールアドレス"
password = "facebookのパスワード"
facebook = TinderTokenFacebookV2()
def sample_email_password(email: str, password: str) -> (str, str):
    return facebook.get_tinder_token(fb_email=email, fb_password=password)

api_token = sample_email_password(mail,password)[0]
print(api_token)

これを実行して長い文字列が表示されていれば取得成功しています。

tinderにログイン

先ほどのコードでapiコードが取得できたのでいよいよログインします。

import requests
s = requests.Session()

# Tinderにログイン
headers = {"X-Auth-Token": api_token, "Content-type": "application/json",
           "User-agent": "Tinder/10.1.0 (iPhone; iOS 12.1; Scale/2.00)"}
s.headers.update(headers)
meta = s.get("https://api.gotinder.com/meta")
print(meta.text)

変数api_tokenに先ほど取得したapiトークンを入れてください。
コードを連結するほうが楽なので連結をお勧めします。
自分の情報がずらっと出てきたらオッケー。

ユーザーを取得

緯度経度情報をpostで渡すことで好きな地点の近くのユーザー情報を集めることができます。
user変数の中にそのユーザーの名前やID写真など様々な情報が格納されています。
このプログラムでは名前を取得しているので名前がつらつらと出力されているはずです。

url = "https://api.gotinder.com/" + endpoint
latitude = "緯度"
longitude = "経度"
params = {"lat": latitude, "lon": longitude}
response = s.post(url, data=json.dumps(params))
limit = 10
params = {"limit": limit}
for i in range(3):
    users = s.post("https://api.gotinder.com/user/recs", data=json.dumps(params))
    content = users.content
    if len(content) > 0:
        content = content.decode("utf-8")
        content = json.loads(content)
    else:
        break
        #print(content)

    for user in content["results"]:
        #print(user)
        print(user["name"])

全自動ライク

/like/{id}をgetで叩くことで任意のidをライクすることが可能です。

url = "https://api.gotinder.com/" + endpoint
latitude = "緯度"
longitude = "経度"
params = {"lat": latitude, "lon": longitude}
response = s.post(url, data=json.dumps(params))
limit = 10
params = {"limit": limit}
for i in range(3):
    users = s.post("https://api.gotinder.com/user/recs", data=json.dumps(params))
    content = users.content
    if len(content) > 0:
        content = content.decode("utf-8")
        content = json.loads(content)
    else:
        break
        #print(content)

    for user in content["results"]:
        #print(user)
        print(user["name"])

        id = user["_id"]
        # 右スワイプ
        s.get("https://api.gotinder.com/like/{}".format(id))

全員ライクしてるだけの力技で面白くないという人へ

確かに出会いは数が重要だというけれどやっぱり質も求めたいという人のためにオプションを考えました。
Face++APIというものをご存じでしょうか?
FaceAPIは中国の会社の開発したもので顔の美しさいわゆる顔面偏差値を点数化してくれるという恐ろしいAPIです。無料で使える範囲が大きいというのもこのAPIの良きところです。

face++の登録

次のURLから登録します。https://console.faceplusplus.com/register
ログインしたらAPIKeyのページを見てAPI KeyとAPI secretをメモします。
image.png

face++で顔の採点をする

tinderと連携することも考えクラス化しています。
判定したい写真をプログラムと同じディレクトリに置き、test.jpegを判定したい画像のファイル名にすれば点数が出力されます。
ちなみに新〇〇衣さんは88.74点でした。さすがの高スコアですね。
自分で何人か試して相場観を見るとよいと思います。

faceplus```
import requests
import base64

class FacePlus:
    def __init__(self,key,secret):
        self.key = key
        self.secret = secret
        self.endpoint = 'https://api-us.faceplusplus.com'

    def judge_face(self,path):
        img_file = base64.encodestring(open(path, 'rb').read())
        response = requests.post(
            self.endpoint + '/facepp/v3/detect',
            {
        'Content-Type': 'multipart/form-data',
        'api_key': self.key,
        'api_secret': self.secret,
        'image_base64': img_file,
        'return_attributes': 'gender,age,headpose,facequality,eyestatus,emotion,ethnicity,beauty,mouthstatus'
        }
        )
        result = response.json()
        return result["faces"][0]["attributes"]["beauty"]["female_score"]
if __name__ == '__main__':
    key = "API token"
    secret = "API secret"

    fp = FacePlus(key, secret)  
    print(fp.judge_face("test.jpeg")) 

tinderの自動ライクと連携

注意事項
・複数写真を載せている人は一つ目を参照する
・tmpフォルダを作成しておく必要があり、tmpフォルダに写真データが保存されます。
・scoreのif文の点数を変えることでlikeする閾値を調整します。
・try,except文を用いて顔写真が写っていない写真などははじきます。

import requests
import json
import os
from tinder_token.facebook import TinderTokenFacebookV2
import urllib.error
import urllib.request
import faceplus
facebook = TinderTokenFacebookV2()
key = "face++_api"
secret = "face++_api_secret"

mail = "facebook_mail"
password = "facebook_password"

border = 75
fp = faceplus.FacePlus(key,secret)

def sample_email_password(email: str, password: str) -> (str, str):
    return facebook.get_tinder_token(fb_email=email, fb_password=password)



def download_file(url, dst_path):
    try:
        with urllib.request.urlopen(url) as web_file:
            data = web_file.read()
            with open(dst_path, mode='wb') as local_file:
                local_file.write(data)
    except urllib.error.URLError as e:
        print(e)
def download_file_to_dir(url, dst_dir):
    download_file(url, os.path.join(dst_dir, os.path.basename(url)))


# Tinderのトークンの取得

api_token = sample_email_password(mail,password)[0]


s = requests.Session()
# Tinderにログイン
headers = {"X-Auth-Token": api_token, "Content-type": "application/json",
           "User-agent": "Tinder/10.1.0 (iPhone; iOS 12.1; Scale/2.00)"}
s.headers.update(headers)
meta = s.get("https://api.gotinder.com/meta")
print(meta.text)

endpoint = "v2/meta"
#渋谷の緯度経度
latitude = 35.658034
longitude = 139.701636
params = {"lat": latitude, "lon": longitude}
url = "https://api.gotinder.com/" + endpoint
response = s.post(url, data=json.dumps(params))


limit = 10
params = {"limit": limit}
name_list = []

for i in range(3):
    users=s.post("https://api.gotinder.com/user/recs", data=json.dumps(params))
    content = users.content
    if len(content) > 0:
        content = content.decode("utf-8")
        content = json.loads(content)
    else:
        break
    #print(content)

    for user in content["results"]:
        #print(user)
        print(user["name"])
        id = user["_id"]

        name_list.append(user["name"])

        photo = user['photos'][0]

        #tmpファイルを作成してください
        dst_dir = 'tmp/'
        print(photo['url'])
        #ファイルを保存
        download_file_to_dir(photo['url'], dst_dir)

        f_name = photo['url'].split('/')[-1]
        print(f_name)
        try:
            score = fp.judge_face("./tmp/"+f_name)
            print(score)
            if(score >= border):
                # 右スワイプ
                s.get("https://api.gotinder.com/like/{}".format(id))
        except:
            print("error")

まとめ

作ったは良いものの完成したら満足してしまって結局実証実験できていません。途中で目的が変わってしまうエンジニアの悪いところですね(笑)。

ルールを守って楽しいtinderライフを!

参考文献

[1]https://qiita.com/Fulltea/items/fe4d4214552476c28e88
[2]https://note.com/ryohei55/n/n72084219f751

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした