C#とSeleniumでPairs自動足跡ツールを作ってみた話

最近ペアーズを始めましたかめいです。

今回作ってみたのはペアーズで自動で足跡をたくさん付けるツールです。

Pairsとは

マッチングアプリです。日本では一番登録者数が多いらしい。

足跡とは

Pairsで相手のプロフィールページを見ると足跡がついて、相手に通知される仕組みがあります。
昔、mixiをやっていた人ならよく分かると思います。

マッチングするためには

相手とメッセージを送るためにはマッチングする必要があります。
マッチングするためには双方からいいねする必要があります。
ただし、いいねできる回数に制限があるので、手当たり次第にいいねすることはできません(女性はできるのかな?)。

作戦

つまり、今回の作戦は足跡をつけまくって、相手からいいねをもらいうことでマッチング数を増やすという戦略です。
こっちから好みの子にいいねをつけてもマッチングするとは限らないですからね。

使った技術

  • Selenium
  • ChromeDriver
  • C#

seleniumとは

ブラウザを自動操作するツールです、Webアプリケーションのテストに主に使用されます。
様々な言語に対応していますが、今回はC#を使います。
そんなに使い方変わらないと思うので、好きな言語で試してみてください。

準備

読んでる人は普段C#を使ってる人だと思うのでC#の環境(VisualStudio)の説明は省略します。

最新のChromeDriverをダウンロードします。
chromedriver.chromium.org
実行ファイルと同じ場所にchromedriver.exeを置きます。

Seleniumをソリューションに追加します。
chromedriver.chromium.org

Selenium準備

WebDriverを初期化します。

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
            var driverService = ChromeDriverService.CreateDefaultService();
            driverService.HideCommandPromptWindow = true;    //プロンプトを表示しない
            var options = new ChromeOptions();
            if (this.data.IsHideBrowser)
            {
                options.AddArgument("--headless");    // ブラウザを表示しない
            }
            IWebDriver chrome = new ChromeDriver(driverService, options)

ログイン処理

PairsはFacebookでログインします。
ログインページでメールアドレスとパスワードを入力してログインボタンを押す処理をしています。
ログインできているかの確認はログインボタンがあるかどうかで判定しています(ここほかにいい方法あるような気がする)。

        private bool FacebookLogin(IWebDriver _webDriver)
        {
            _webDriver.Url = "https://www.facebook.com/login";
            _webDriver.FindElement(By.Id("email")).SendKeys("hogehoge@huga");
            _webDriver.FindElement(By.Id("pass")).SendKeys("password");
            _webDriver.FindElement(By.Id("loginbutton")).Click();

            // 確認
            try
            {
                // ログインボタンがあったらログイン失敗
                _webDriver.FindElement(By.Id("loginbutton"));
            }
            catch (Exception e)
            {
                return true;
            }
            return false;
        }

足跡をつける処理

Pairsのページに行き、ログイン処理を待ちます。
https://pairs.lv/#/search/one/*にアクセスするとプロフィール画面になります。
これで足跡が付きます。
ランダムで0.5-1.5秒待って次のプロフィールにアクセスします(人が操作してる感を出すため)。
検索条件は前回アプリやWebで検索した条件が保存されているので、事前に検索しておきます。

private void PairsLike(IWebDriver _webDriver)
        {
            try
            {
                // pairs行く
                _webDriver.Url = "https://pairs.lv/#/login";
                System.Threading.Thread.Sleep(10000);    //ログイン処理終わるの待つ

                // 検索して足跡残す
                for (int i = 1; i < 1000; i++)
                {
                    string url = "https://pairs.lv/#/search/one/" + i.ToString();
                    _webDriver.Url = url;
                    Random r = new Random(System.DateTime.Now.Millisecond);
                    Console.WriteLine(i.ToString() + "人に足跡を付けました");
                    System.Threading.Thread.Sleep( r.Next(500, 1500));
                }
            }
            catch(Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
    }

はまったところ

ChromeDriverがx86なのでプロジェクトの対象プラットフォームをx86にしないと動かないです。

まとめ

Seleniumは触ったことなかったんですが、簡単にWebページを操作できていいですね。
APIが公開されていないサービスの自動化もできるので応用は無限大ですね!

アカウント凍結の可能性もあるのでやる場合は自己責任でお願いします。