// ==UserScript==
// @name Tinder自動スワイプ_自分用v24.05
// @namespace http://tampermonkey.net/
// @version 24.05.01
// @description Auto swipe for Tinder
// @author spr
// @match https://tinder.com/*
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant none
// ==/UserScript==
(function () {
"use strict";
let SPEED = 2.5; // スワイプ速度 何秒ごとにスワイプするか ※BANされないように2秒以上にしてください
let NOPE_RATE = 0.1; // Nopeする確率 何割の確率でNopeするか
let BIOLEN = 150; // Nopeするプロフの半角英数文字数 プロフに何文字以上の半角英数が含まれていたらNopeするか
let NAMELEN = 1; // Nopeする名前の半角英数文字数 名前に何文字以上の半角英数が含まれていたらNopeするか
let KANJILEN = 1; // 名前に何文字以上の漢字が含まれていたらNopeするか
let DELAY_NOPE_RATE = 3; // 待機Nopeする確率 何割以下の確率で待機してからNopeするか
let DELAY_SECONDS = 3.0; // 待機する時間 何秒間の待機Nopeするか
let RELOAD_COUNT = 50; // エラーをするまでのカウント 何回エラーが出たら再読み込みするか
let result = [];
let likeCnt = 0;
let nopeCnt = 0;
let i = 1;
let bioSelector;
let errCnt = 0;
let nameSelector;
// try {
setInterval(clickLikeButton, SPEED * 1000);
function clickLikeButton() {
// if (likeCnt + nopeCnt >= i * 50) {
console.log("【結果発表】\nLIKE:" + likeCnt + " NOPE:" + nopeCnt);
// i++;
// }
try {
try {
setTimeout(function () {
clickInfo();
}, 500);
setTimeout(function () {}, 1500);
} catch (infoErr) {
console.warn("info err");
}
try {
bioSelector = document.evaluate(
'//div[contains(@class, "c-ds-text-secondary") and contains(@class, "BreakWord")]',
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue.innerText;
} catch (bioE) {
bioSelector = "";
console.log("bio not exists. click info");
setTimeout(function () {
clickInfo();
}, 1000);
try {
bioSelector = document.evaluate(
'//div[contains(@class, "c-ds-text-secondary") and contains(@class, "BreakWord")]',
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue.innerText;
console.log("プロフ:" + bioSelector);
} catch (bioE) {
bioSelector = "";
console.log("bio not exists. click info");
setTimeout(function () {
clickInfo();
}, 1000);
}
}
nameSelector = document.evaluate(
'//div[contains(@class, "c-ds-text-primary")]//div[contains(@class, "Ell")]',
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue.innerText;
if (
bioCheck() ||
engCount(bioSelector) >= BIOLEN ||
engCount(nameSelector) >= NAMELEN ||
kanjiCount(nameSelector) >= KANJILEN
) {
console.log("名前:" + nameSelector + "\nプロフ:" + bioSelector);
clickNopeButton();
} else {
let random = Math.random() * 11;
if (random > NOPE_RATE) {
likeCnt++;
///////////////////////////////////
likecreateAutoDismissTextBox('LIKEします', 2000);
} else if (random <= DELAY_NOPE_RATE * 0.1 * NOPE_RATE) {
// console.log("待機")
setTimeout(function () {
clickNopeButton();
}, DELAY_SECONDS * 1000);
} else {
clickNopeButton();
}
}
} catch (error) {
console.warn("カードがありません:" + errCnt + "回目");
//debugger;
console.log(error.message);
errCnt++;
if (errCnt > RELOAD_COUNT) {
location.reload();
}
}
}
function clickInfo() {
let infoBtn = document
.evaluate(
'//div//button//span[normalize-space(text())="プロフィールを開く"]',
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
)
.singleNodeValue.click();
}
function clickNopeButton() {
nopeCnt++;
///////////////////////////////////
nopecreateAutoDismissTextBox('NOPEします', 2000);
}
function engCount(n) {
let nagasa = 0;
for (i = 0; i < n.length; i++) {
if (n[i].match(/^[a-zA-Z]*$/)) {
nagasa += 1;
} else {
}
}
return nagasa;
}
function kanjiCount(n) {
let kanjiCnt = 0;
for (i = 0; i < n.length; i++) {
if (n[i].match(/^[\u4E00-\u9FFF\u3005-\u3007]+$/)) {
kanjiCnt += 1;
} else {
}
}
return kanjiCnt;
}
function nopecreateAutoDismissTextBox(message, timeout) {
const textBox = document.createElement('input');
textBox.type = 'text';
textBox.value = message;
textBox.style.position = 'fixed';
textBox.style.top = '50%';
textBox.style.left = '50%';
textBox.style.backgroundColor = 'white';
textBox.style.transform = 'translate(-50%, -50%)';
textBox.style.zIndex = 1000; // Ensure the textbox is on top of other elements
// document.body.appendChild(textBox);
setTimeout(() => {
// document.body.removeChild(textBox);
}, timeout);
let nopeButtons = document.evaluate(
'//button//span[normalize-space(text())="Nope"]',
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue;
setTimeout(() => {
nopeButtons.click();
}, 1000);
}
function likecreateAutoDismissTextBox(message, timeout) {
const textBox = document.createElement('input');
textBox.type = 'text';
textBox.value = message;
textBox.style.position = 'fixed';
textBox.style.top = '50%';
textBox.style.left = '50%';
textBox.style.backgroundColor = 'white';
textBox.style.transform = 'translate(-50%, -50%)';
textBox.style.zIndex = 1000; // Ensure the textbox is on top of other elements
//document.body.appendChild(textBox);
setTimeout(() => {
//document.body.removeChild(textBox);
}, timeout);
let likeBTN = document.evaluate(
'//button//span[normalize-space(text())="Like"]',
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
).singleNodeValue;
setTimeout(() => {
likeBTN.click();
}, 1000);
}
//////////////////////////////////////////////////
//以下に除外したいワードを設定してください
//////////////////////////////////////////////////
function bioCheck() {
let NG_FLG =
bioSelector.includes("sta") ||
bioSelector.includes("witt") ||
bioSelector.includes("DM") ||
bioSelector.includes("I'm") ||
bioSelector.includes("from") ||
bioSelector.includes("スタ") ||
bioSelector.includes("Hi") ||
bioSelector.includes("ついった") ||
bioSelector.includes("ins") ||
bioSelector.includes("glish") ||
bioSelector.includes("デブ") ||
bioSelector.includes("ぽちゃ") ||
bioSelector.includes("ぽっちゃり") ||
bioSelector.includes("いんすた") ||
bioSelector.includes("TW") ||
bioSelector.includes("マネージャー") ||
bioSelector.includes("マネ") ||
bioSelector.includes("IG") ||
bioSelector.includes("セフレ") ||
bioSelector.includes("t") ||
bioSelector.includes("T") ||
bioSelector.includes("w") ||
bioSelector.includes("セ フ レ") ||
bioSelector.includes("→") ||
bioSelector.includes("⇨") ||
bioSelector.includes("@") ||
bioSelector.includes("つ");
return NG_FLG;
}
})();
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme