Last active
April 7, 2026 13:50
-
-
Save iGlitch/8293669cdc7fca94e8657c2d2ce8b00e to your computer and use it in GitHub Desktop.
ペアーズ 足あとつけるヤツ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // ==UserScript== | |
| // @name Pairs自動クリッカー | |
| // @namespace http://pairs.lv/ | |
| // @version 1.2 | |
| // @description 足あとつけるヤツ | |
| // @match https://pairs.lv/search/all | |
| // @grant none | |
| // ==/UserScript== | |
| (function () { | |
| 'use strict'; | |
| // === 設定 === | |
| const START_DELAY = 2500; // 開始までの待機時間(ミリ秒) | |
| const SCROLL_PAUSE = 700; // スクロール間の待機(ミリ秒) | |
| const SCROLL_REPEATS = 15; // 下スクロール回数 | |
| const DELAY_BETWEEN_PROFILES = 5000; // 次へボタン押した後の待機(ミリ秒) | |
| function sleep(ms) { | |
| return new Promise(resolve => setTimeout(resolve, ms)); | |
| } | |
| function simulateFullClick(el) { | |
| const rect = el.getBoundingClientRect(); | |
| const x = rect.left + rect.width / 2; | |
| const y = rect.top + rect.height / 2; | |
| const common = { bubbles: true, cancelable: true, view: window, clientX: x, clientY: y }; | |
| el.dispatchEvent(new PointerEvent('pointerdown', common)); | |
| el.dispatchEvent(new MouseEvent('mousedown', common)); | |
| el.dispatchEvent(new PointerEvent('pointerup', common)); | |
| el.dispatchEvent(new MouseEvent('mouseup', common)); | |
| el.dispatchEvent(new PointerEvent('click', common)); | |
| el.dispatchEvent(new MouseEvent('click', common)); | |
| } | |
| function findNextButton() { | |
| const titles = document.querySelectorAll('svg title'); | |
| for (const title of titles) { | |
| if (title.textContent === '次のお相手') { | |
| const button = title.closest('button'); | |
| if (button) return button; | |
| } | |
| } | |
| return null; | |
| } | |
| async function scrollToLoadAll() { | |
| console.log('[自動クリッカー] 全結果を読み込むためスクロール開始'); | |
| for (let i = 0; i < SCROLL_REPEATS; i++) { | |
| window.scrollTo(0, document.body.scrollHeight); | |
| console.log(`[自動クリッカー] スクロール ${i + 1}/${SCROLL_REPEATS}`); | |
| await sleep(SCROLL_PAUSE); | |
| } | |
| window.scrollTo(0, 0); | |
| await sleep(500); | |
| console.log('[自動クリッカー] トップに戻りました'); | |
| } | |
| async function run() { | |
| // Step 1: 下までスクロールを繰り返して全結果を読み込む | |
| await scrollToLoadAll(); | |
| // Step 2: 最初のプロフィールをクリック | |
| const firstLink = document.querySelector('#maincontent ul li > a'); | |
| if (!firstLink) { | |
| console.log('[自動クリッカー] リンクが見つかりません'); | |
| return; | |
| } | |
| console.log('[自動クリッカー] 最初のプロフィールをクリック'); | |
| simulateFullClick(firstLink); | |
| await sleep(DELAY_BETWEEN_PROFILES); | |
| // Step 3: 「次のお相手」ボタンを繰り返し押す | |
| let count = 1; | |
| while (true) { | |
| const nextBtn = findNextButton(); | |
| if (!nextBtn) { | |
| console.log('[自動クリッカー] 「次のお相手」ボタンが見つかりません。終了します'); | |
| break; | |
| } | |
| console.log(`[自動クリッカー] プロフィール ${count}: 「次のお相手」をクリック`); | |
| simulateFullClick(nextBtn); | |
| count++; | |
| await sleep(DELAY_BETWEEN_PROFILES); | |
| } | |
| console.log(`[自動クリッカー] 全て完了(${count - 1}件処理)`); | |
| } | |
| window.addEventListener('load', () => { | |
| console.log(`[自動クリッカー] ${START_DELAY / 1000}秒後に開始します...`); | |
| setTimeout(run, START_DELAY); | |
| }); | |
| })(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment