見出し画像

【全行解説付き】現役ソフトエンジニアが作るTinderスワイプ自動化スクリプト

本記事では私が作成したTinderのスワイプを自動化するPythonのスクリプトを紹介します。
(完成したスクリプトは本記事の最下部に記載しておきます)

この記事の対象者

- Pythonの基本的な文法(変数、関数、if文、繰り返し処理 ... )がある程度理解できる
(ただし本記事からコピペで自動化自体は可能ですので、ご自身でカスタマイズ等をしない場合はpythonの知識は不要です)

- WindowsのPCを使っている
(Macでも同内容のスクリプトが書けると思いますが、本スクリプトはWindowsのPCにて作成しました)

- FacebookアカウントでTinderにログインできる
(他のログイン方法でも可能だと思いますが試していません)

* * *

仕様

【出来ること】
- 自動でスワイプ
- コマンドプロンプトで操作
- いつでも中断可能
- BOT対策に引っかからない

TinderにはBOT対策として「短時間に同じ操作を行うユーザーはマッチさせない」という機能が実装されているという噂があります。ですのでこの対策を回避するような処理を実装します。

【操作イメージ】
- コマンドライン立ち上げ
- .pyファイルを実行
- ブラウザ立ち上げ
- ログイン(facebookアカウント)
- スワイプ
- コマンドラインで終了

【環境】
- windows
- python 3.x
- selenium

* * *

準備

まずはスクリプトを作成する準備です。

今回紹介するコードに必要なものはSeleniumというパッケージになります。

詳しくは下の参考リンクを見て頂きたいのですが、seleniumをpipでインストールしましょう。次にブラウザを操作するためのソフトウェア「chromedriver」をダウンロードします。これで準備は完了です!

(参考)seleniumインストール -------------------------------------------------

chromedriverのダウンロード

-------------------------------------------------------------------------------------

* * *

実装

いよいよ実装していきます。まず処理の大まかな流れから説明します。

1. chromedriverを使ってブラウザを立ち上げる
2. https://tinder.com/ へアクセスする
3. ログインする(Facebook経由)
4. ポップアップが現れるので消す
6. スワイプをする
7. スワイプを何回か行っているとポップアップが出るので消す
8. BOT対策を実装する
9. 終了する

以降では上から順にコード+説明を書いていきます。
ファイル名は何でもいいですが、ここではauto_like.pyとしておきましょう。拡張子を必ず.pyにして下さい。

まずは必要なパッケージをimportするコードを書きます。

from selenium import webdriver
import time
import random

ブラウザを操作する為seleniumからwebdriverというクラスをimportします。
また処理を一時停止させるためにtime、BOT対策のために乱数を発生させるのでrandomをimportします。必要なパッケージは以上です。


1. chromedriverを使ってブラウザを立ち上げる

まずchromedriverでブラウザを立ち上げる処理を書きます。以下の通り書けばseleniumで操作可能なブラウザが立ち上がります。

driver = webdriver.Chrome(r"<chromedriver.exeのパス>")

chromedriverをダウンロードしたらchromedriver.exeという実行ファイルがご使用のPC内のどこかのフォルダに置かれたかと思います。そのパスをChromeメソッドに渡してあげてください。
因みにダブルクオーテーションの前にrを書いているのはraw文字列と言いまして、エスケープ文字(¥)をそのまま文字列として表すための記法です。これを使うことでパスをコピーしてそのまま張り付ければOKになります。

(参考)raw文字列 --------------------------------------------------------------

-------------------------------------------------------------------------------------


2. https://tinder.com/ へアクセスする

開いたブラウザでtinderにアクセスします。

driver.get("https://tinder.com/")

getメソッドにURLを渡すことでサイトを開くことが出来ます。
余談ですがgetとはHTTPプロトコルのメソッドの一つで、最も使用されるメソッドでもあります。chromedriverでもHTTPを踏まえたメソッド名になっています。

(参考)getメソッド ------------------------------------------------------------

-------------------------------------------------------------------------------------

またここで私は画面を最大化しています。これは好みですが画面サイズを固定したほうがこの後HTMLの要素を読み取る時に安定するかなと思ったからです。
最近のWEBサイトやアプリは基本的にレスポンシブ対応しているので、この記事をお読みの皆さんも最大化しておくことをお勧めします。最大化は以下の様に記述できます。

driver.maximize_window()

すると以下のような状態になるかと思います。

無題のプレゼンテーション

そしてここでWEBサイトが開かれるまで一時的に処理を停止させておきたいので以下の処理を加えます。

time.sleep(5)

これで5秒間プログラムが一時停止します。こういった処理はこの後も頻繁に出てきます。

(参考)明示的な待機処理 ------------------------------------------------------
この様な待機処理にはいろいろな方法があります。seleniumには特定の条件が満たされるまで待機するという処理も実装されているので、興味のある方はチャレンジしてみるといいかもしれません。

-------------------------------------------------------------------------------------


3. ログインする(Facebook経由)

さてTinderのTOPページが開かれたと思うので次にログイン処理を書いていきます(ここは結構重いパートです!笑)。
ログイン処理に進むには右上の「ログイン」ボタンをクリックする必要があります。

無題のプレゼンテーション (1)

webdriverはブラウザで行う操作の全てが可能です。なのでクリックももちろん可能です。しかしクリックをするにはまずクリックをする対象を決定する必要があります。対象を決定する処理は以下の様に記述します。

login_button = driver.find_element_by_xpath(r"/html/body/div[1]/div/div[1]/div/main/div[1]/div/div/header/div[1]/div[2]/div/button")

上記の処理でログインボタンのxpathをfind_element_by_xpathメソッドに渡すことでボタンをオブジェクトとして取得できます。

(参考)xpathの取得方法、xpathとは、find_element_by_xpath() ----------

-------------------------------------------------------------------------------------

因みにxpathを取得する際のコツですが、buttonタブのxpathを取得するといいです。buttonタブに囲われているspanタグのxpathを取得したりすると上手くいかないことが結構ありました。

クリックする対象が取得できたので、次はクリックをします。

login_button.click()

clickメソッドを使うことでクリック出来ます。メソッド名が動作そのままなので分かりやすいですね。この様にwebdriverを用いてクリック処理を行うときには

1. クリック対象を取得
2. クリック処理

という流れで記述するのが基本的な流れになります。またクリックしたらここで一時停止処理を入れておきます。

time.sleep(5)

次にログインボタンをクリックするとすると以下のような画面になるかと思います。

無題のプレゼンテーション (2)

ここでログイン方法を選びます。今回はFacebookアカウントにてログインしたいと思います。その場合は真ん中の「FACEBOOKでログイン」というボタンをクリックします。

無題のプレゼンテーション (3)

クリックする時の流れは覚えているでしょうか?はい、対象を取得してクリックするのでしたね。ではその処理を記載していきます。

login_button_facebook = driver.find_element_by_xpath(r"/html/body/div[2]/div/div/div[1]/div/div[3]/span/div[2]/button")
   
login_button_facebook.click()

time.sleep(5)

上記で「FACEBOOKでログイン」がクリック出来ます。すると今度は以下のような別ウィンドウが出てくると思います。

無題のプレゼンテーション (4)

このフォームにメールアドレスとパスワードを入力し「ログイン」ボタンをクリックすることでログインが可能になります。

さて、別ウィンドウにて操作を行い処理を進めたいのですが問題が一つあります。それは現在捜査対象になっているウィンドウは新たに出現したウィンドウではなく、最初のウィンドウであるという事です。

無題のプレゼンテーション (5)

なのでウィンドウを切り替えるという処理が必要になります。
ここでseleniumの重要な仕様を紹介します。それは各ウィンドウには固有のウィンドウhandleというIDが割り当てられています。このIDを指定することで任意のウィンドウを操作できるようになります。

(参考)ウィンドウhandleの取得方法 ------------------------------------------

-------------------------------------------------------------------------------------

ではウィンドウhandleの取得方法、切り替え方を紹介します。
ウィンドウhandleはdriver.window_handlesというリストに格納されています。そして新しいウィンドウが開かれた場合はdriver.window_handlesにpushされます。

無題のプレゼンテーション (6)

なのでdriver.window_handlesを取得してindexが1の値が後に出現したウィンドウhandleになります。

handle_array = driver.window_handles 

次にウィンドウを切り替えます。切り替えるには以下の様にコードを書けばOKです。

driver.switch_to.window(handle_array[1])

handle_array[1]がポップアップのIDなのでこの値をswitch_to.windowメソッドに渡すことでウィンドウを切り替えられます!

画面上はあまり変化がないかもしれませんが、操作ウィンドウが切り替わりました。次はフォームにメールアドレスとパスワードを入力していきます。
大丈夫、慣れれば結構簡単です。やっていきましょう!

基本はクリックと変わりません。まず操作する対象を取得し、対象に対して処理を行います。ここでの対象はフォーム。ですのでまずはフォームのxpathを指定してオブジェクトとして取得しましょう

mail_form = driver.find_element_by_xpath(r"/html/body/div/div[2]/div[1]/form/div/div[1]/div/input")

これでフォームのオブジェクトが取得できました。次にフォームに文字列を入力します。入力にはsend_keysメソッドを使用します。

入力は以下の様に行います。

mail_form.send_keys(<facebookに登録しているメールアドレス>)

<facebookに登録しているメールアドレス>にご自身のメールアドレスを文字列で入力してください。また同様にパスワードフォームにも入力をします。
フォームをオブジェクトとして取得し値をsend_keysで入力します。

pass_form = driver.find_element_by_xpath(r"/html/body/div/div[2]/div[1]/form/div/div[2]/div/input")

pass_form.send_keys(<facebookのパスワード>)

これで入力は完了です!最後にログインボタンを押しましょう。

login_button = driver.find_element_by_xpath(r"/html/body/div/div[2]/div[1]/form/div/div[3]/label[2]/input")
   
login_button.click()

するとポップアップ画面が消えるはずです。このままですと操作対象のウィンドウが消えてしまったポップアップになったままですので、ウィンドウhandleを指定して操作対象ウィンドウを元のウィンドウに切り替えましょう。

handle_array = driver.window_handles

driver.switch_to.window(handle_array[0])

time.sleep(5)

お疲れ様です。これでログイン処理が自動化できました!


4. ポップアップが現れるので消す

ログインが完了すると画像のようなポップアップが出ています。

無題のプレゼンテーション (7)


これが出ている間はスワイプをすることが出来ないので、ポップアップを消すためにボタンをクリックします。
ポップアップもクリックはこれまでと同じやり方でOKです!ですのでコードは以下の様になります。

popup_button = driver.find_element_by_xpath(r'/html/body/div[2]/div/div/div/div/div[3]/button[1]')

popup_button.click()

するともう一つポップアップが出現するので、数秒待機処理を挟んで同様の処理を行います。

無題のプレゼンテーション (8)

time.sleep(2)

popup_button = driver.find_element_by_xpath(r'/html/body/div[2]/div/div/div/div/div[3]/button[1]')

popup_button.click()

これでポップアップが消せました!


6. スワイプをする

ではいよいよスワイプ自動化を実装します。まずは説明のためにポップアップを消したら一度右スワイプする処理を書きます。
右スワイプをするには画像のボタンをクリックすればいいので、これまでと同様にクリックする処理を書きましょう。

無題のプレゼンテーション (9)

like_button = driver.find_element_by_xpath(r"/html/body/div[1]/div/div[1]/div/main/div[1]/div/div/div[1]/div/div[2]/div[4]/button")

like_button.click()

これで右スワイプが出来ました。ではこの処理を繰り返す処理を続けて実装します。

本プログラムを終了させるにはコマンドラインから操作をする予定なので、今回は無限ループさせます。

while True:
       like_button = driver.find_element_by_xpath(r"/html/body/div[1]/div/div[1]/div/main/div[1]/div/div/div[1]/div/div[2]/div[4]/button")
           
       like_button.click()

これでプログラムを起動するとスワイプを継続する状態になりました。


7. スワイプを何回か行っているとポップアップが出るので消す

但しこれでOK!というわけではありません。なんと数回スワイプをするとまたポップアップが出現するのです...。

無題のプレゼンテーション (10)

このポップアップは何回スワイプを行うと出現するのか分かりません(大体5回くらい?)。ですのでここで例外処理を実装します。

例外処理というのは、特定の操作を実行してエラーが発生した場合は別の処理を行う、というものです。

(参考)例外処理 ----------------------------------------------------------------

-------------------------------------------------------------------------------------

今回発生するエラーとは「ポップアップが出現している状態でスワイプをしようとすると、存在しないxpathを参照してしまっている」というものです。
ですのでこのエラーが発生した場合はポップアップを消すために「興味なし」をクリックしてポップアップを消す処理を実装します。

「興味なし」ボタンをクリックするには以下の様にします。

not_intersted_button = driver.find_element_by_xpath(r'//*[@id="modal-manager"]/div/div/div[2]/button[2]')

not_intersted_button.click()

これを先程の無限ループに組み込むと以下の様になります。

while True:

   try:

       like_button = driver.find_element_by_xpath(r"/html/body/div[1]/div/div[1]/div/main/div[1]/div/div/div[1]/div/div[2]/div[4]/button")
       like_button.click()

   except:
       not_intersted_button = driver.find_element_by_xpath(
           r'//*[@id="modal-manager"]/div/div/div[2]/button[2]')
       not_intersted_button.click()

これでポップアップが出た時に「興味なし」をクリック出来るようになりました。


8. BOT対策を実装する

これでも恐らく問題ないのですが、冒頭でも書いた通りBOT対策も実装していきます!
今回実装するBOT対策は「乱数を発生させて一定値以上の場合は左スワイプする」という処理です。

乱数の発生にはrandomパッケージを使用します。以下の様に記述することで0以上1未満の実数を生成できます。

random_num = random.random()

これを使ってBOT対策を実装しましょう。
好みですが今回は0.85より大きい値が出た場合左スワイプ、0.85以下の場合は右スワイプをします。適宜待機処理を加えて、実装は以下の様になります。

while True:
   # 0-1の乱数を生成
   random_num = random.random()
   
   try:
       if (random_num <= 0.85):
           like_button = driver.find_element_by_xpath(
               r"/html/body/div[1]/div/div[1]/div/main/div[1]/div/div/div[1]/div/div[2]/div[4]/button")
           like_button.click()
           
       else:
           dislike_button = driver.find_element_by_xpath(
               r'/html/body/div[1]/div/div[1]/div/main/div[1]/div/div/div[1]/div/div[2]/div[2]/button')
           dislike_button.click()
           
   except:
       not_intersted_button = driver.find_element_by_xpath(
           r'/html/body/div[2]/div/div/div[2]/button[2]')
       not_intersted_button.click()
       
   time.sleep(random_num*2)

これですべての実装が完了しました!完成したコードは以下の様になります。

from selenium import webdriver
import time
import random

driver = webdriver.Chrome(r"<chromedriver.exeのパス>")
driver.get("https://tinder.com/")
driver.maximize_window()
time.sleep(5)

login_button = driver.find_element_by_xpath(
   r"/html/body/div[1]/div/div[1]/div/main/div[1]/div/div/header/div[1]/div[2]/div/button")
login_button.click()
time.sleep(5)

login_button_facebook = driver.find_element_by_xpath(r"/html/body/div[2]/div/div/div[1]/div/div[3]/span/div[2]/button")
login_button_facebook.click()
time.sleep(5)

# windowを切り替える
handle_array = driver.window_handles
driver.switch_to.window(handle_array[1])
time.sleep(3)

# アドレス入力フォームのxpath取得
mail_form = driver.find_element_by_xpath(r"/html/body/div/div[2]/div[1]/form/div/div[1]/div/input")

# 入力
mail_form.send_keys(<facebookに登録しているメールアドレス>)

# パスワード入力フォームのxpath取得
pass_form = driver.find_element_by_xpath(r"/html/body/div/div[2]/div[1]/form/div/div[2]/div/input")

# 入力
pass_form.send_keys(<facebookのパスワード>)

# # ログインボタンのxpath取得
login_button = driver.find_element_by_xpath(r"/html/body/div/div[2]/div[1]/form/div/div[3]/label[2]/input")

# ログインボタンクリック
login_button.click()

# windowの切り替え
handle_array = driver.window_handles
print(handle_array)
driver.switch_to.window(handle_array[0])
time.sleep(5)

popup_button = driver.find_element_by_xpath(r'/html/body/div[2]/div/div/div/div/div[3]/button[1]')
popup_button.click()
time.sleep(2)

popup_button = driver.find_element_by_xpath(r'/html/body/div[2]/div/div/div/div/div[3]/button[1]')
popup_button.click()
time.sleep(5)

while True:
   # 0-1の乱数を生成
   random_num = random.random()
   try:
       if (random_num <= 0.85):
           like_button = driver.find_element_by_xpath(
               r"/html/body/div[1]/div/div[1]/div/main/div[1]/div/div/div[1]/div/div[2]/div[4]/button")
           like_button.click()
       else:
           dislike_button = driver.find_element_by_xpath(
               r'/html/body/div[1]/div/div[1]/div/main/div[1]/div/div/div[1]/div/div[2]/div[2]/button')
           dislike_button.click()
   except:
       not_intersted_button = driver.find_element_by_xpath(
           r'/html/body/div[2]/div/div/div[2]/button[2]')
       not_intersted_button.click()
   time.sleep(2)

これを実行すれば自動でスワイプが出来ます。折角なので実行の方法も説明します。

まず適当なフォルダへauto_like.pyという空のファイルを作成します。そして上記の完成版コードをコピペして、
<chromedriver.exeのパス>
<facebookに登録しているメールアドレス>
<facebookのパスワード>
にご自身の環境や情報を入力します。次にコマンドラインを開いて

python auto_like.py

と入力します。

無題のプレゼンテーション (12)

これでスクリプトが起動して自動スワイプが開始します。


9. 終了する

最後に終了の方法を紹介します。終了の方法は簡単で、

コマンドラインにて「 ctrl + c
または
立ち上がったブラウザの最小化

で終了できます。もし再開したい場合は「 ctrl + c」を入力して、再度

python auto_like.py

を実行してください。


最後に

以上で本記事は終了です!ここまで読んでいただきありがとうございます。
それでは良いTinderライフを!!

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