Skip to content

Instantly share code, notes, and snippets.

@saml
Last active January 13, 2020 19:16
Show Gist options
  • Save saml/8b28ae150726451b12bb to your computer and use it in GitHub Desktop.
Save saml/8b28ae150726451b12bb to your computer and use it in GitHub Desktop.
okcupid user.js
// ==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