您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Bumble auto swipe bot
- /* eslint-disable func-names */
- // ==UserScript==
- // @name Bumble Auto Swipe Bot
- // @namespace http://tampermonkey.net/
- // @version 0.1
- // @license GNU GPLv3
- // @description Bumble auto swipe bot
- // @author Aamir khan
- // @url github.com/iamaamir
- // @namespace https://github.com/iamaamir
- // @match https://bumble.com/app
- // @icon https://www.google.com/s2/favicons?domain=bumble.com
- // @grant none
- // ==/UserScript==
- (function (win) {
- const swipes = []; // save all the swipes
- const minTime = 5000;
- const maxTime = 2500;
- // helpers
- const b = (obj, f) => obj[f].bind(obj);
- const select = b(document, 'querySelector');
- const el = b(document, 'createElement');
- const log = b(console, 'log');
- // icons
- const swipeIcon = '<svg viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor"><path d="M30.4 17.6c-1.8-1.9-4.2-3.2-6.7-3.7-1.1-.3-2.2-.5-3.3-.6 2.8-3.3 2.3-8.3-1-11.1s-8.3-2.3-11.1 1-2.3 8.3 1 11.1c.6.5 1.2.9 1.8 1.1v2.2l-1.6-1.5c-1.4-1.4-3.7-1.4-5.2 0-1.4 1.4-1.5 3.6-.1 5l4.6 5.4c.2 1.4.7 2.7 1.4 3.9.5.9 1.2 1.8 1.9 2.5v1.9c0 .6.4 1 1 1h13.6c.5 0 1-.5 1-1v-2.6c1.9-2.3 2.9-5.2 2.9-8.1v-5.8c.1-.4 0-.6-.2-.7zm-22-9.4c0-3.3 2.7-5.9 6-5.8 3.3 0 5.9 2.7 5.8 6 0 1.8-.8 3.4-2.2 4.5v-5a3.4 3.4 0 0 0-3.4-3.2c-1.8-.1-3.4 1.4-3.4 3.2v5.2c-1.7-1-2.7-2.9-2.8-4.9zM28.7 24c.1 2.6-.8 5.1-2.5 7.1-.2.2-.4.4-.4.7v2.1H14.2v-1.4c0-.3-.2-.6-.4-.8-.7-.6-1.3-1.3-1.8-2.2-.6-1-1-2.2-1.2-3.4 0-.2-.1-.4-.2-.6l-4.8-5.7c-.3-.3-.5-.7-.5-1.2 0-.4.2-.9.5-1.2.7-.6 1.7-.6 2.4 0l2.9 2.9v3l1.9-1V7.9c.1-.7.7-1.3 1.5-1.2.7 0 1.4.5 1.4 1.2v11.5l2 .4v-4.6c.1-.1.2-.1.3-.2.7 0 1.4.1 2.1.2v5.1l1.6.3v-5.2l1.2.3c.5.1 1 .3 1.5.5v5l1.6.3v-4.6c.9.4 1.7 1 2.4 1.7l.1 5.4z"/></svg>';
- const stopSwipeIcon = '<svg class="has-solid" viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor"><path class="clr-i-outline clr-i-outline-path-1" d="M30 32H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h24a2 2 0 0 1 2 2v24a2 2 0 0 1-2 2ZM6 6v24h24V6Z"/></svg>';
- const toJsonIcon = '<svg viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor"><path d="M28.09 9.74a4 4 0 0 0-1.16.19c-.19-1.24-1.55-2.18-3.27-2.18a4 4 0 0 0-1.53.25A3.37 3.37 0 0 0 19 6.3a3.45 3.45 0 0 0-2.87 1.32 3.65 3.65 0 0 0-1.89-.51A3.05 3.05 0 0 0 11 9.89v.91c-1.06.4-4.11 1.8-4.91 4.84s.34 8 2.69 11.78a25.21 25.21 0 0 0 5.9 6.41.9.9 0 0 0 .53.17h10.34a.92.92 0 0 0 .55-.19 13.13 13.13 0 0 0 3.75-6.13A25.8 25.8 0 0 0 31.41 18v-5.5a3.08 3.08 0 0 0-3.32-2.76ZM29.61 18a24 24 0 0 1-1.47 9.15 12.46 12.46 0 0 1-2.94 5.05h-9.73a23.75 23.75 0 0 1-5.2-5.72c-2.37-3.86-3-8.23-2.48-10.39A5.7 5.7 0 0 1 11 12.76v7.65a.9.9 0 0 0 1.8 0V9.89c0-.47.59-1 1.46-1s1.49.52 1.49 1v5.72h1.8v-6.8c0-.28.58-.71 1.46-.71s1.53.48 1.53.75v6.89h1.8V10l.17-.12a2.1 2.1 0 0 1 1.18-.32c.93 0 1.5.44 1.5.68v6.5H27v-4.87a1.91 1.91 0 0 1 1.12-.33c.86 0 1.52.51 1.52.94Z" class="clr-i-outline clr-i-outline-path-1"/></svg>';
- // css selectors
- const actionBarClass = '.encounters-controls__hotkeys';
- const usernameClass = '.encounters-story-profile__user';
- const profileBoxClass = 'picture.media-box__picture';
- const townClass = '.location-widget';
- const likeBtnClass = '.encounters-action--like';
- const addAction = (title, cb = log, icon) => {
- log('making a new action', title);
- const action = el('div');
- const actionBar = select(actionBarClass);
- action.addEventListener('click', cb);
- const html = `<div class="hotkey tooltip-activator" title=${title}>
- <div class="hotkey__icon">
- <span class="icon icon--size-stretch" role="presentation" data-qa-role="icon">
- ${icon}
- </span>
- </div>
- </div>`;
- action.innerHTML = html;
- actionBar.appendChild(action);
- };
- function eventFire(target, etype) {
- if (target.fireEvent) {
- target.fireEvent(`on${etype}`);
- } else {
- const evObj = document.createEvent('Events');
- evObj.initEvent(etype, true, false);
- target.dispatchEvent(evObj);
- }
- }
- function getNextSwipeTime(min, max) {
- return Math.floor(Math.random() * (max - min) + min);
- }
- function getUserName() {
- return select(usernameClass).textContent;
- }
- function getProfilebox() {
- return document.querySelectorAll(profileBoxClass);
- }
- function getSrc(pic) {
- return pic.firstChild.src;
- }
- function getTown() {
- return select(townClass).textContent;
- }
- let timer = null;
- const bumbleBot = {
- startSwiping: function swipe() {
- const likeBtn = select(likeBtnClass);
- if (!likeBtn) return;
- const nextSwipeTime = getNextSwipeTime(minTime, maxTime);
- log('Next Swipe is in ', nextSwipeTime);
- timer = setTimeout(() => {
- swipes.push([`${getUserName()} from ${getTown()}`, Array.from(getProfilebox()).flatMap(getSrc)]);
- eventFire(likeBtn, 'click');
- swipe();
- }, nextSwipeTime);
- },
- toJson(write = false) {
- this.stopSwiping();
- const data = JSON.stringify(swipes, null, 2);
- const logger = write ? document.write : log;
- logger(data);
- },
- stopSwiping: function stopSwiping() {
- log('Swiping stopped');
- clearTimeout(timer);
- },
- };
- function waitForElm(selector) {
- return new Promise((resolve) => {
- if (select(selector)) return resolve(select(selector));
- const observer = new MutationObserver(() => {
- if (select(selector)) {
- resolve(select(selector));
- observer.disconnect();
- }
- });
- observer.observe(document.body, {
- childList: true,
- subtree: true,
- });
- });
- }
- if (win) {
- win.onload = function () {
- log('loading auto swipe script');
- waitForElm(actionBarClass).then(() => {
- log('Action bar is ready');
- addAction('AutoSwipe', bumbleBot.startSwiping, swipeIcon);
- addAction('StopSwipe', bumbleBot.stopSwiping, stopSwipeIcon);
- addAction('Collect', b(bumbleBot, 'toJson'), toJsonIcon);
- });
- };
- }
- }(window));