1) while on this website, open console in inspect element (mobile users can't do that, sorry)
2) paste this code at the very bottom in there. P.S. its not recommended to just paste random user's code in console, i know. you can ask someone who knows javascript if this is safe code, but beware, the code has this website url =D
3) FillArray(from_page, to_page) to fill array with data of your favourites.
FillArray(from_age, to_page, id) to fill array with data of somebody else's favourites (the id stands for their account id).
example: FillArray(0,2) checks page 1 and 2
4) wait until it fills. after it says finished (if you get a red error, try making gap between from_page and to_page smaller, if it still doesn't help, tell me the error and i'll try to fix it)
5) type ArrayOfFavouriteStruct = findByTagName("your_tag"). quotes are important.
6) if you type console.log(ArrayOfFavouriteStruct) it should show you all the posts with a tag.
7) you can REMOVE tags by typing removeByTagName() in a same way.
EXAMPLE:
1) #paste my code
2) FillArray(0,10);
3) #wait until it says finished
4) ArrayOfFavouriteStruct = findByTagName("sex");
5) ArrayOfFavouriteStruct = removeByTagName("futanari");
6) console.log(ArrayOfFavouriteStruct);
7) press that arrow > before Array and click the links to watch!
let ArrayOfFavouriteStruct = [];
let findByTagName = (name) => {
let foundArray = []
for(let i = 0; i < ArrayOfFavouriteStruct.length; i++)
{
const tagsSplit = ArrayOfFavouriteStruct[i].tags.split(' ');
for(k = 0; k < tagsSplit.length; k++)
{
if(tagsSplit[k] == name)
{
foundArray.push({id: ArrayOfFavouriteStruct[i].id, link: ArrayOfFavouriteStruct[i].link, previewLink: ArrayOfFavouriteStruct[i].previewLink, tags: ArrayOfFavouriteStruct[i].tags});
}
}
}
return foundArray;
}
let removeByTagName = (name) => {
let foundArray = []
for(let i =0; i < ArrayOfFavouriteStruct.length; i++)
{
const tagsSplit = ArrayOfFavouriteStruct[i].tags.split(' ');
let containsTag = false;
for(k = 0; k < tagsSplit.length; k++){
if(tagsSplit[k] == name) containsTag = true;
}
if(!containsTag) foundArray.push({id: ArrayOfFavouriteStruct[i].id, link: ArrayOfFavouriteStruct[i].link, previewLink: ArrayOfFavouriteStruct[i].previewLink, tags: ArrayOfFavouriteStruct[i].tags})
}
return foundArray;
}
async function FillArray(startAtPage, StopAfterPages, id){
ArrayOfFavouriteStruct = [];
if(id == undefined)
{
// if you want to get info about someone else's favourites, remove cookies line and change yourID to their id
const cookies = document.cookie.split('; ');
// this gets your id so it gets your favourites
id = cookies[0].split('=')[1];
}
// pid query value for link, a single page is 50. so if you want page 3, you need 100, if you want page 4, you need 150
let currentPage = startAtPage * 50;
let yourFavPage = "
rule34.xxx/index.php?page=favorites&s=view&id=" + id.toString() + "&pid=" + currentPage;
let ShouldKeepHashing = true;
const delay = ms => new Promise(res => setTimeout(res, ms));
let _id = 0;
while(ShouldKeepHashing)
{
if(currentPage / 50 >= StopAfterPages)
{
ShouldKeepHashing = false;
console.log("finished");
return;
}
await fetch(yourFavPage).then(res=>res.text().then(res=>{
const doc = new DOMParser().parseFromString(res, "text/html")
const content = doc.getElementById("content");
const contentsArray = content.getElementsByClassName("thumb");
if(contentsArray.length <= 0)
{
ShouldKeepHashing = false;
console.log("finished");
return;
}
for(let i = 0; i < contentsArray.length; i++)
{
const previewLink = contentsArray[i].children[0].children[0].src;
const link = contentsArray[i].children[0].href;
const tags = contentsArray[i].children[0].children[0].title;
ArrayOfFavouriteStruct.push({id: _id,link: link, previewLink: previewLink, tags: tags});
_id += 1;
}
// each page has 50 posts. change if it's not correct
currentPage += 50;
// remove the pid part from yourFavPage and add new in there for next while iteration
yourFavPage = yourFavPage.substring(yourFavPage.indexOf("pid")+4, -1);
yourFavPage += currentPage;
}));
await delay(250);
}
}
encoded to base64 for tabs and spaces
bGV0IEFycmF5T2ZGYXZvdXJpdGVTdHJ1Y3QgPSBbXTsKCmxldCBmaW5kQnlUYWdOYW1lID0gKG5hbWUpID0+IHsKCWxldCBmb3VuZEFycmF5ID0gW10KCWZvcihsZXQgaSA9IDA7IGkgPCBBcnJheU9mRmF2b3VyaXRlU3RydWN0Lmxlbmd0aDsgaSsrKQoJewoJCWNvbnN0IHRhZ3NTcGxpdCA9IEFycmF5T2ZGYXZvdXJpdGVTdHJ1Y3RbaV0udGFncy5zcGxpdCgnICcpOwoJCWZvcihrID0gMDsgayA8IHRhZ3NTcGxpdC5sZW5ndGg7IGsrKykKCQl7CgkJCWlmKHRhZ3NTcGxpdFtrXSA9PSBuYW1lKQoJCQl7CgkJCQlmb3VuZEFycmF5LnB1c2goe2lkOiBBcnJheU9mRmF2b3VyaXRlU3RydWN0W2ldLmlkLCBsaW5rOiBBcnJheU9mRmF2b3VyaXRlU3RydWN0W2ldLmxpbmssIHByZXZpZXdMaW5rOiBBcnJheU9mRmF2b3VyaXRlU3RydWN0W2ldLnByZXZpZXdMaW5rLCB0YWdzOiBBcnJheU9mRmF2b3VyaXRlU3RydWN0W2ldLnRhZ3N9KTsKCQkJfQoJCX0KCX0KCXJldHVybiBmb3VuZEFycmF5Owp9CmxldCByZW1vdmVCeVRhZ05hbWUgPSAobmFtZSkgPT4gewoJbGV0IGZvdW5kQXJyYXkgPSBbXQoJZm9yKGxldCBpID0wOyBpIDwgQXJyYXlPZkZhdm91cml0ZVN0cnVjdC5sZW5ndGg7IGkrKykKCXsKCQljb25zdCB0YWdzU3BsaXQgPSBBcnJheU9mRmF2b3VyaXRlU3RydWN0W2ldLnRhZ3Muc3BsaXQoJyAnKTsKCQlsZXQgY29udGFpbnNUYWcgPSBmYWxzZTsKCQlmb3IoayA9IDA7IGsgPCB0YWdzU3BsaXQubGVuZ3RoOyBrKyspewoJCQlpZih0YWdzU3BsaXRba10gPT0gbmFtZSkgY29udGFpbnNUYWcgPSB0cnVlOwoJCX0KCQlpZighY29udGFpbnNUYWcpIGZvdW5kQXJyYXkucHVzaCh7aWQ6IEFycmF5T2ZGYXZvdXJpdGVTdHJ1Y3RbaV0uaWQsIGxpbms6IEFycmF5T2ZGYXZvdXJpdGVTdHJ1Y3RbaV0ubGluaywgcHJldmlld0xpbms6IEFycmF5T2ZGYXZvdXJpdGVTdHJ1Y3RbaV0ucHJldmlld0xpbmssIHRhZ3M6IEFycmF5T2ZGYXZvdXJpdGVTdHJ1Y3RbaV0udGFnc30pCgl9CglyZXR1cm4gZm91bmRBcnJheTsKfQoKYXN5bmMgZnVuY3Rpb24gRmlsbEFycmF5KHN0YXJ0QXRQYWdlLCBTdG9wQWZ0ZXJQYWdlcywgaWQpewoJQXJyYXlPZkZhdm91cml0ZVN0cnVjdCA9IFtdOwoJaWYoaWQgPT0gdW5kZWZpbmVkKQoJewoJCQkvLyBpZiB5b3Ugd2FudCB0byBnZXQgaW5mbyBhYm91dCBzb21lb25lIGVsc2UncyBmYXZvdXJpdGVzLCByZW1vdmUgY29va2llcyBsaW5lIGFuZCBjaGFuZ2UgeW91cklEIHRvIHRoZWlyIGlkCgkJCWNvbnN0IGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsgJyk7CgkJCS8vIHRoaXMgZ2V0cyB5b3VyIGlkIHNvIGl0IGdldHMgeW91ciBmYXZvdXJpdGVzCgkJCWlkID0gY29va2llc1swXS5zcGxpdCgnPScpWzFdOwoJfQoKICAgIC8vIHBpZCBxdWVyeSB2YWx1ZSBmb3IgbGluaywgYSBzaW5nbGUgcGFnZSBpcyA1MC4gc28gaWYgeW91IHdhbnQgcGFnZSAzLCB5b3UgbmVlZCAxMDAsIGlmIHlvdSB3YW50IHBhZ2UgNCwgeW91IG5lZWQgMTUwCglsZXQgY3VycmVudFBhZ2UgPSBzdGFydEF0UGFnZSAqIDUwOwoJbGV0IHlvdXJGYXZQYWdlID0gImh0dHBzOi8vcnVsZTM0Lnh4eC9pbmRleC5waHA/cGFnZT1mYXZvcml0ZXMmcz12aWV3JmlkPSIgKyBpZC50b1N0cmluZygpICsgIiZwaWQ9IiArIGN1cnJlbnRQYWdlOwoKCWxldCBTaG91bGRLZWVwSGFzaGluZyA9IHRydWU7CgoJY29uc3QgZGVsYXkgPSBtcyA9PiBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7CgogIGxldCBfaWQgPSAwOwoJd2hpbGUoU2hvdWxkS2VlcEhhc2hpbmcpCgl7CgkJaWYoY3VycmVudFBhZ2UgLyA1MCA+PSBTdG9wQWZ0ZXJQYWdlcykKCQl7CgkJCVNob3VsZEtlZXBIYXNoaW5nID0gZmFsc2U7CgkJCWNvbnNvbGUubG9nKCJmaW5pc2hlZCIpOwoJCQlyZXR1cm47CgkJfQoKCQlhd2FpdCBmZXRjaCh5b3VyRmF2UGFnZSkudGhlbihyZXM9PnJlcy50ZXh0KCkudGhlbihyZXM9PnsKCgkJCWNvbnN0IGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcocmVzLCAidGV4dC9odG1sIikKCQkJY29uc3QgY29udGVudCA9IGRvYy5nZXRFbGVtZW50QnlJZCgiY29udGVudCIpOwoJCQljb25zdCBjb250ZW50c0FycmF5ID0gY29udGVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ0aHVtYiIpOwoKCQkJaWYoY29udGVudHNBcnJheS5sZW5ndGggPD0gMCkKCQkJewoJCQkJU2hvdWxkS2VlcEhhc2hpbmcgPSBmYWxzZTsKCQkJCWNvbnNvbGUubG9nKCJmaW5pc2hlZCIpOwoJCQkJcmV0dXJuOwoJCQl9CgkJCWZvcihsZXQgaSA9IDA7IGkgPCBjb250ZW50c0FycmF5Lmxlbmd0aDsgaSsrKQoJCQl7CgkJCQljb25zdCBwcmV2aWV3TGluayA9IGNvbnRlbnRzQXJyYXlbaV0uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uc3JjOwoJCQkJY29uc3QgbGluayA9IGNvbnRlbnRzQXJyYXlbaV0uY2hpbGRyZW5bMF0uaHJlZjsKCQkJCWNvbnN0IHRhZ3MgPSBjb250ZW50c0FycmF5W2ldLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLnRpdGxlOwoJCQkJQXJyYXlPZkZhdm91cml0ZVN0cnVjdC5wdXNoKHtpZDogX2lkLGxpbms6IGxpbmssIHByZXZpZXdMaW5rOiBwcmV2aWV3TGluaywgdGFnczogdGFnc30pOwoJCQkJX2lkICs9IDE7CgkJCX0KCQkJLy8gZWFjaCBwYWdlIGhhcyA1MCBwb3N0cy4gY2hhbmdlIGlmIGl0J3Mgbm90IGNvcnJlY3QKCQkJY3VycmVudFBhZ2UgKz0gNTA7CgoJCQkvLyByZW1vdmUgdGhlIHBpZCBwYXJ0IGZyb20geW91ckZhdlBhZ2UgYW5kIGFkZCBuZXcgaW4gdGhlcmUgZm9yIG5leHQgd2hpbGUgaXRlcmF0aW9uCgkJCXlvdXJGYXZQYWdlID0geW91ckZhdlBhZ2Uuc3Vic3RyaW5nKHlvdXJGYXZQYWdlLmluZGV4T2YoInBpZCIpKzQsIC0xKTsKCQkJeW91ckZhdlBhZ2UgKz0gY3VycmVudFBhZ2U7CgkJfSkpOwoJCWF3YWl0IGRlbGF5KDI1MCk7Cgl9Cn0=
to people who want to use it outside of this website: rule34 doesnt have cors header ‘Access-Control-Allow-Origin’, so you can't entirely do it on front end. you will have to run it outside of browser (node.js for example) for that or CORS proxy