Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- WHAT IS THIS?
- -Reorders a catalogue on a 4chan board based on the LOOKOUT_FLAG var (defaulted to leafs), then opens the threads in iframes (defaulted to 3 threads at a time in DEFAULT_INTERVAL) with automated post replies along with ">leaf". User only needs to submit an image (optional), solve the captcha, and hit post.
- TESTED ON CHROME
- HOW TO USE:
- -go to a boards.4chan.org/YOUR_BOARD/catalog
- -inspect element
- -navigate to console in the top tabs
- -copy and paste code below in the input
- -hit enter
- CODE:
- var LOOKOUT_FLAG = 'ca';
- var DEFAULT_INTERVAL = 3;
- var IFRAME_DEFAULT_WIDTH = 500;
- var IFRAME_DEFAULT_HEIGHT = 500;
- var IFrameWidth = IFRAME_DEFAULT_WIDTH;
- var IFrameHeight = IFRAME_DEFAULT_HEIGHT;
- var URL = window.location.href.split(/\/+|\./);
- var HTTP = URL[0];
- var BOARD = URL[4];
- var savedThreadFlagCounts = [];
- var getElementPosition = function(el) {
- el = el.getBoundingClientRect();
- return {
- left: el.left + window.scrollX,
- top: el.top + window.scrollY
- }
- }
- var loadingDisplay = document.createElement("div");
- loadingDisplay.id = "loadingDisplay";
- loadingDisplay.style.position = "fixed";
- loadingDisplay.width = 300;
- loadingDisplay.height = 100;
- loadingDisplay.style.width = loadingDisplay.width + "px";
- loadingDisplay.style.height = loadingDisplay.height + "px";
- loadingDisplay.style.backgroundColor = "rgb(255,255,238)";
- loadingDisplay.style.borderStyle = "solid";
- loadingDisplay.style.borderWidth = "2px";
- loadingDisplay.style.borderColor = "rgb(217,191,183)";
- loadingDisplay.style.top = window.innerHeight/2 - loadingDisplay.height/2 + "px";
- loadingDisplay.style.left = window.innerWidth/2 - loadingDisplay.width/2 + "px";
- loadingDisplay.innerHTML = "<span style = 'font-size:15px;'>Loading: <span id = 'loadTopic'></span> <span id = 'loadPercent'></span></span> <br/> <br/> <span id='loadText'>Test</span>";
- document.body.appendChild(loadingDisplay);
- var loadingDisplay = document.getElementById("loadingDisplay");
- var loadTopic = document.getElementById("loadTopic");
- var loadPercent = document.getElementById("loadPercent");
- var loadText = document.getElementById("loadText");
- var updateLoading = function(topic,percent,text)
- {
- if(topic)
- loadTopic.innerText = topic;
- else
- loadTopic.innerText = "";
- if(!isNaN(percent))
- loadPercent.innerText = Math.round(percent*1000)/10 + "%";
- else
- loadPercent.innerText = "";
- if(text)
- loadText.innerText = text;
- else
- loadText.innerText = "";
- }
- var doneLoading = function()
- {
- loadingDisplay.parentNode.removeChild(loadingDisplay);
- controlDiv.style.visibility = "visible";
- document.body.scrollTop = getElementPosition(controlDiv).top;
- }
- var retrieveThumbnails = function()
- {
- return document.getElementsByClassName("thumb");
- }
- var retrieveThreadLinkFrom = function(thumbnail)
- {
- return HTTP+"//boards.4chan.org/"+BOARD+"/thread/"+thumbnail.id.replace("thumb-","")
- }
- var sortThreads = function()
- {
- updateLoading("Sorting",'sort',"Sorting catalog based on number of leafs per thread");
- var sortSavedThreads = function(threadSaveA,threadSaveB)
- {
- return threadSaveB.flags[0].number - threadSaveA.flags[0].number;
- }
- savedThreadFlagCounts.sort(sortSavedThreads);
- var con = document.getElementById("threads");
- for(var i = savedThreadFlagCounts.length-1;i>=0;i--)
- {
- con.prepend(savedThreadFlagCounts[i].sourceElement.parentNode.parentNode);
- allThreads[i].src = savedThreadFlagCounts[i].sourceElement.threadLink;
- }
- doneLoading();
- loadNextBatch();
- }
- var loadedThreads = 0;
- var newThreadLoaded = function()
- {
- loadedThreads++;
- updateLoading("Thread Leaf Count",loadedThreads/thumbs.length,this.sourceElement.threadLink);
- var parser=new DOMParser();
- var threadDoc=parser.parseFromString(this.response, "text/html");
- var threadFlags = threadDoc.getElementsByClassName("flag");
- var flag = function(name)
- {
- this.flagName = name;
- this.number = 0;
- }
- var flagHolder = [];
- flagHolder.push(new flag(LOOKOUT_FLAG));
- for(var i = 0;i<threadFlags.length;i++)
- {
- var flagClass = threadFlags[i].className + "";
- var currentFlag = flagClass.replace(/(flag.)/g,"");
- if(currentFlag != LOOKOUT_FLAG)
- continue;
- for(var j = 0;j<flagHolder.length;j++)
- {
- if(flagHolder[j].flagName == currentFlag)
- {
- flagHolder[j].number++;
- break;
- }
- }
- }
- for(var i = 0;i<flagHolder.length;i++)
- {
- flagHolder[i].number/=2;
- }
- var threadSave = new Object();
- threadSave.sourceElement = this.sourceElement;
- threadSave.flags = flagHolder;
- savedThreadFlagCounts.push(threadSave);
- if(loadedThreads >= thumbs.length)
- {
- sortThreads();
- }
- }
- var thumbs = retrieveThumbnails();
- var allThreads = [];
- updateLoading("Finding Threads");
- for(var i = 0;i<thumbs.length;i++)
- {
- thumbs[i].request = new XMLHttpRequest();
- thumbs[i].threadLink = retrieveThreadLinkFrom(thumbs[i]);
- thumbs[i].request.open("GET",thumbs[i].threadLink);
- thumbs[i].request.sourceElement = thumbs[i];
- thumbs[i].request.onload = newThreadLoaded;
- thumbs[i].request.send();
- allThreads[i] = document.createElement("iframe");
- }
- var interval = DEFAULT_INTERVAL;
- var currentThread = 0;
- var lastStartPoint = currentThread;
- var controlDiv = document.createElement("div");
- controlDiv.style.visibility = "hidden";
- controlDiv.innerHTML = "<input id = 'submittedButton' value = 'Next Batch' type = 'button'/>"
- +"<span> Thread interval:</span><input id='intervalValue' type = 'number' name='interval'/><br/>"
- +"<input id = 'changeFrameDim' value = 'Change IFrame Dimensions' type = 'button'/>"
- +"<span> Width (pixels): <input id ='iframeWidth' type = 'number'/> Height (pixels): <input id = 'iframeHeight' type = 'number'/></span>"
- +"<br/><br/>";
- document.getElementById("content").prepend(controlDiv);
- var donePostingButton = document.getElementById("submittedButton");
- var intervalTextArea = document.getElementById("intervalValue");
- var iframeDimButton = document.getElementById("changeFrameDim");
- var iframeWidthInput = document.getElementById("iframeWidth");
- var iframeHeightInput = document.getElementById("iframeHeight");
- intervalTextArea.value = interval;
- iframeWidthInput.value = IFrameWidth;
- iframeHeightInput.value = IFrameHeight;
- var changeIFrameDim = function()
- {
- IFrameHeight = iframeHeightInput.value;
- IFrameWidth = iframeWidthInput.value;
- for(var i = 0;i<controlDiv.children.length;i++)
- {
- var el = controlDiv.children[i];
- if(el.tagName.toLowerCase() != "iframe")
- continue;
- el.width = IFrameWidth;
- el.height = IFrameHeight;
- }
- }
- iframeDimButton.onclick = changeIFrameDim;
- var loadedThread = function(thread)
- {
- console.log("loaded "+thread.src);
- var doc = thread.contentDocument;
- if(doc.querySelectorAll("input[title]")[0])
- {
- doc.querySelectorAll("input[title]")[0].click();
- leafPostOn(thread);
- }else{
- console.log(thread.src + " is archived");
- }
- };
- var leafPostOn = function(thread)
- {
- var doc = thread.contentDocument;
- leafs = doc.getElementsByClassName("flag-"+LOOKOUT_FLAG);
- if(leafs.length<1)
- {
- console.log("No leafs on " + thread.src);
- return 1;
- }
- var leafPosts = [];
- var leafLinks = [];
- var leafPostNumbers = [];
- var postCounter = 0;
- for(var i = 0;i<leafs.length;i++){
- if(leafs[i].parentElement.parentElement.className=="postInfoM mobile")
- continue;
- leafPosts[postCounter] = leafs[i].parentElement.parentElement;
- postCounter++;
- }
- for(var i = 0;i<leafPosts.length;i++)
- {
- leafLinks[i] = leafPosts[i].getElementsByClassName("postNum")[0];
- }
- for(var i = 0;i<leafLinks.length;i++){
- leafPostNumbers[i] = leafLinks[i].children[1].innerText;
- }
- var LINE_LIMIT = 51;
- var leafsPerLine = Math.ceil(leafPostNumbers.length/LINE_LIMIT);
- if(!doc.getElementsByClassName("open-qr-wrap")[0])
- {
- return 1;
- }
- doc.getElementsByClassName("open-qr-wrap")[0].children[0].click();
- var postTextArea = doc.getElementById("qrForm").getElementsByTagName("textarea")[0];
- postTextArea.value = "";
- postTextArea.position = "absolute";
- postTextArea.left = "0px";
- postTextArea.top = "0px";
- var lineCounter = 0;
- for(var i=0;i<leafPostNumbers.length;i++)
- {
- postTextArea.value += ">>"+leafPostNumbers[i]+" ";
- lineCounter++;
- if(lineCounter == leafsPerLine)
- {
- postTextArea.value+="\n";
- lineCounter = 0;
- }
- }
- if(lineCounter!=0)
- postTextArea.value+="\n";
- postTextArea.value+=">leaf";
- };
- var intervalChanged = function(){
- var checkedString = "";
- for(var i = 0;i<intervalTextArea.value.length;i++)
- {
- if(!isNaN(intervalTextArea.value.charAt(i)))
- {
- checkedString+=intervalTextArea.value.charAt(i);
- }
- }
- if(checkedString == "")
- {
- checkedString = DEFAULT_INTERVAL;
- }
- intervalTextArea.value = checkedString;
- interval = parseInt(checkedString);
- };
- intervalTextArea.onchange = intervalChanged;
- var deleteLastBatch = function(){
- for(var i = lastStartPoint;i<currentThread;i++)
- {
- allThreads[i].parentNode.removeChild(allThreads[i]);
- }
- };
- var loadNextBatch = function(){
- lastStartPoint = currentThread;
- for(var i = currentThread;i<(currentThread+interval);i++)
- {
- if(!allThreads[i])
- {
- alert("You've hit the last thread!");
- currentThread = i;
- return;
- }
- allThreads[i].id = allThreads[i].src;
- allThreads[i].width = IFrameWidth;
- allThreads[i].height = IFrameHeight;
- controlDiv.append(allThreads[i]);
- allThreads[i].onload = function(){
- loadedThread(this);
- }
- }
- currentThread = i;
- };
- donePostingButton.onclick = function(){deleteLastBatch();loadNextBatch();};
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement