Skip to content

Instantly share code, notes, and snippets.

@iGlitch
Last active April 7, 2026 13:50
Show Gist options
  • Select an option

  • Save iGlitch/8293669cdc7fca94e8657c2d2ce8b00e to your computer and use it in GitHub Desktop.

Select an option

Save iGlitch/8293669cdc7fca94e8657c2d2ce8b00e to your computer and use it in GitHub Desktop.
ペアーズ 足あとつけるヤツ
// ==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