Last active
January 13, 2020 19:16
-
-
Save saml/8b28ae150726451b12bb to your computer and use it in GitHub Desktop.
okcupid user.js
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 My Fancy New Userscript | |
// @namespace http://your.homepage/ | |
// @version 0.1 | |
// @description enter something useful | |
// @author You | |
// @match *://www.okcupid.com/* | |
// @grant none | |
// ==/UserScript== | |
// Collects user profile urls. Hides the users. And sends messages. | |
var message = "Hello,\n\nAre you ready to fall in love with me?"; | |
var key = "toVisit"; | |
var bucketSize = 32;// max number of urls per bucket. | |
function empty() { | |
var bucketIndex = 0; | |
while (true) { | |
var bucketKey = key+bucketIndex; | |
var value = localStorage.getItem(bucketKey); | |
if (value) { | |
localStorage.removeItem(bucketKey); | |
} else { | |
break; | |
} | |
bucketIndex++; | |
} | |
} | |
function put(arr) { | |
empty(); | |
var bucket = []; | |
var bucketIndex = 0; | |
var bucketTrigger = bucketSize - 1; | |
for (var i = 0; i < arr.length; i++) { | |
bucket.push(arr[i]); | |
if (i % bucketSize === bucketTrigger) { | |
localStorage.setItem(key+bucketIndex, JSON.stringify(bucket)); | |
bucket = []; | |
bucketIndex++; | |
} | |
} | |
if (bucket.length > 0) { | |
localStorage.setItem(key+bucketIndex, JSON.stringify(bucket)); | |
} | |
} | |
function get() { | |
var urls = []; | |
var bucketIndex = 0; | |
while (true) { | |
var value = localStorage.getItem(key+bucketIndex); | |
bucketIndex++; | |
if (value) { | |
urls = urls.concat(JSON.parse(value)); | |
} else { | |
break; | |
} | |
} | |
return urls; | |
} | |
function pop() { | |
var urls = get(); | |
var url = urls.pop(); | |
put(urls); | |
return url; | |
} | |
function toSet(arr) { | |
var obj = {}; | |
arr.forEach(function(x) { | |
obj[x] = true; | |
}); | |
return obj; | |
} | |
function fromSet(obj) { | |
var arr = []; | |
for (var x in obj) { | |
arr.push(x); | |
} | |
return arr; | |
} | |
function collectUrls() { | |
var users = document.querySelectorAll('.match_card_wrapper'); | |
if (users.length === 0) { | |
setTimeout(collectUrls,1000); | |
} | |
var urls = toSet(get()); | |
for (var i = 0; i < users.length; i++) { | |
var user = users[i]; | |
var card = user.querySelector('.match_card'); | |
if (card) { | |
var hasContacted = !!card.querySelector('.last_contact'); | |
var link = card.querySelector('.ajax_load_profile_link'); | |
var profileUrl = link ? link.href : null; | |
var hideElem = user.querySelector('a[href="#Hide"]'); | |
var alreadyHidden = profileUrl in urls; // we hide users as soon as see them. So, contained in urls means already hidden. | |
if (!hasContacted && profileUrl) { | |
urls[profileUrl] = true; | |
} | |
if (hideElem && !alreadyHidden) { | |
hideElem.click(); | |
} | |
} | |
} | |
put(fromSet(urls)); | |
} | |
function startCollectingUrls() { | |
collectUrls(); | |
var target = document.querySelector('#match_results'); | |
var obs = new MutationObserver(function(mutations) { | |
mutations.forEach(function(mutation) { | |
var nodes = mutation.addedNodes; | |
var n = nodes.length; | |
for (var i = 0; i < n; i++) { | |
var node = nodes[i]; | |
if (node.nodeName === 'DIV' && node.className.indexOf('infinity') >= 0) { | |
//infinite scroll added new users. | |
collectUrls(); | |
} | |
} | |
}); | |
}); | |
if (target) { | |
obs.observe(target, {childList: true, subtree: true}); | |
} | |
return obs; | |
} | |
function doMessage() { | |
var obs = new MutationObserver(function(mutations) { | |
var target = document.querySelector('#global_messaging_container'); | |
var messages = target.querySelector('.messages'); | |
if (messages && messages.children.length > 0) {//already messaged | |
obs.disconnect(); | |
next(); | |
} else if (target.children.length < 1) { //user message maxed out | |
obs.disconnect(); | |
next(); | |
} else if (target.querySelector('.first_message_success')) { | |
target.querySelector('a.close').click(); | |
obs.disconnect(); | |
next(); | |
} else { | |
target.querySelector('form.compose textarea[id]').value = message; | |
target.querySelector('form.compose button[type="submit"]').click(); | |
} | |
}); | |
if (document.body) { | |
obs.observe(document.body, {childList:true, subtree: true}); | |
var messageOpen = document.querySelector('#actions a'); | |
if (messageOpen.querySelector('.last_contact')) { | |
obs.disconnect(); | |
next(); | |
} else { | |
messageOpen.click(); | |
} | |
} else { | |
setTimeout(doMessage,1000); | |
} | |
} | |
function next() { | |
var url = pop(); | |
if (url) { | |
location.href = url; | |
} | |
} | |
function rmMessages() { | |
var messageIdentification = 'are you ready to fall in love'; | |
var lines = document.querySelectorAll('.previewline'); | |
for (var i = 0; i < lines.length; i++) { | |
var line = lines[i]; | |
foreachline(line); | |
} | |
setTimeout(function() { | |
var button = document.querySelector('#message_delete_button'); | |
if (button) { | |
button.click(); | |
} | |
},500); | |
function foreachline(el) { | |
if (el.textContent.replace(/\W+/g, ' ').toLowerCase().indexOf(messageIdentification) >= 0) { | |
var ctrlClick = jQuery.Event('click'); | |
ctrlClick.ctrlKey = true; | |
jQuery(el.parentNode.parentNode.parentNode).trigger(ctrlClick); | |
} | |
} | |
} | |
function main() { | |
if (location.pathname === '/match') { | |
var obs = startCollectingUrls(); | |
var button = document.createElement('button'); | |
button.onclick = function() { | |
obs.disconnect(); | |
next(); | |
}; | |
button.innerHTML = "START"; | |
var header = document.querySelector('#header'); | |
if (header) { | |
header.appendChild(button); | |
} | |
} else if (/^\/profile\/[^/]+$/.exec(location.pathname)) { | |
setTimeout(function() { | |
location.reload(); | |
}, 5*1000); | |
doMessage(); | |
} else if (location.pathname === '/messages' && location.search.indexOf('folder=2') >= 0) { | |
// rmMessages(); | |
} | |
} | |
main(); | |
/* | |
okrm: | |
javascript:(function() { var messageIdentification = 'are you ready to fall in love';var lines = document.querySelectorAll('.previewline'); for (var i = 0; i < lines.length; i++) { var line = lines[i]; foreachline(line); } setTimeout(function() { var button = document.querySelector('#message_delete_button'); if (button) { button.click(); } },500); function foreachline(el) { if (el.textContent.replace(/\W+/g, ' ').toLowerCase().indexOf(messageIdentification) >= 0) { var ctrlClick = jQuery.Event('click'); ctrlClick.ctrlKey = true; jQuery(el.parentNode.parentNode.parentNode).trigger(ctrlClick); } } })(); | |
okhide: | |
javascript:(function(){jQuery('.last_contact').parent().parent().parent().parent().find('.under_card a').each(function() { this.click(); });}()); | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment