PKMNhntai
03/30/24 07:20AM
Search for favorited posts
There should be an easier way for users like myself to search for posts listed as favorites. I want to suggest one of the following two ideas for this update:
1.add a search bar to the favorites list
2.include a favorites label for when searching so it's more convenient.

This way, it could be easier to look for favorites for users to revisit what they like without losing track.
PuppyEkutiB3
04/01/24 01:16AM
hope this becomes a thing -w-
qwer133
04/04/24 07:26PM
There was a third party search tool, but it seems to have been blocked and now no longer works.
Drp987
04/04/24 08:56PM
+1

This is a feature I've wanted for ages
vxstro
04/04/24 09:12PM
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
vxstro
04/04/24 11:43PM
vxstro said:
blah blah blah a lot of words. the message i'm quoting is right above this message btw

i spent too much time on this, but it was fun
1


Reply | Forum Index