Advertisement
Guest User

Optomized Leaf Post

a guest
Jan 19th, 2017
312
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. WHAT IS THIS?
  2. -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.
  3.  
  4. TESTED ON CHROME
  5.  
  6. HOW TO USE:
  7. -go to a boards.4chan.org/YOUR_BOARD/catalog
  8. -inspect element
  9. -navigate to console in the top tabs
  10. -copy and paste code below in the input
  11. -hit enter
  12.  
  13. CODE:
  14. var LOOKOUT_FLAG = 'ca';
  15.  
  16. var DEFAULT_INTERVAL = 3;
  17. var IFRAME_DEFAULT_WIDTH = 500;
  18. var IFRAME_DEFAULT_HEIGHT = 500;
  19.  
  20. var IFrameWidth = IFRAME_DEFAULT_WIDTH;
  21. var IFrameHeight = IFRAME_DEFAULT_HEIGHT;
  22.  
  23. var URL = window.location.href.split(/\/+|\./);
  24. var HTTP = URL[0];
  25. var BOARD = URL[4];
  26.  
  27. var savedThreadFlagCounts = [];
  28.  
  29. var getElementPosition = function(el) {
  30.   el = el.getBoundingClientRect();
  31.   return {
  32.     left: el.left + window.scrollX,
  33.     top: el.top + window.scrollY
  34.   }
  35. }
  36.  
  37. var loadingDisplay = document.createElement("div");
  38. loadingDisplay.id = "loadingDisplay";
  39. loadingDisplay.style.position = "fixed";
  40. loadingDisplay.width = 300;
  41. loadingDisplay.height = 100;
  42. loadingDisplay.style.width = loadingDisplay.width + "px";
  43. loadingDisplay.style.height = loadingDisplay.height + "px";
  44. loadingDisplay.style.backgroundColor = "rgb(255,255,238)";
  45. loadingDisplay.style.borderStyle = "solid";
  46. loadingDisplay.style.borderWidth = "2px";
  47. loadingDisplay.style.borderColor = "rgb(217,191,183)";
  48. loadingDisplay.style.top = window.innerHeight/2 - loadingDisplay.height/2 + "px";
  49. loadingDisplay.style.left = window.innerWidth/2 - loadingDisplay.width/2 + "px";
  50. loadingDisplay.innerHTML = "<span style = 'font-size:15px;'>Loading: <span id = 'loadTopic'></span> <span id = 'loadPercent'></span></span> <br/> <br/> <span id='loadText'>Test</span>";
  51. document.body.appendChild(loadingDisplay);
  52. var loadingDisplay = document.getElementById("loadingDisplay");
  53. var loadTopic = document.getElementById("loadTopic");
  54. var loadPercent = document.getElementById("loadPercent");
  55. var loadText = document.getElementById("loadText");
  56.  
  57. var updateLoading = function(topic,percent,text)
  58. {
  59.     if(topic)
  60.         loadTopic.innerText = topic;
  61.     else
  62.         loadTopic.innerText = "";
  63.     if(!isNaN(percent))
  64.         loadPercent.innerText = Math.round(percent*1000)/10 + "%";
  65.     else
  66.         loadPercent.innerText = "";
  67.     if(text)
  68.         loadText.innerText = text;
  69.     else
  70.         loadText.innerText = "";
  71. }
  72. var doneLoading = function()
  73. {
  74.     loadingDisplay.parentNode.removeChild(loadingDisplay);
  75.     controlDiv.style.visibility = "visible";
  76.     document.body.scrollTop = getElementPosition(controlDiv).top;
  77. }
  78.  
  79. var retrieveThumbnails = function()
  80. {
  81.     return document.getElementsByClassName("thumb");
  82. }
  83. var retrieveThreadLinkFrom = function(thumbnail)
  84. {
  85.     return HTTP+"//boards.4chan.org/"+BOARD+"/thread/"+thumbnail.id.replace("thumb-","")
  86. }
  87. var sortThreads = function()
  88. {
  89.     updateLoading("Sorting",'sort',"Sorting catalog based on number of leafs per thread");
  90.     var sortSavedThreads = function(threadSaveA,threadSaveB)
  91.     {
  92.         return threadSaveB.flags[0].number - threadSaveA.flags[0].number;
  93.     }
  94.     savedThreadFlagCounts.sort(sortSavedThreads);
  95.     var con = document.getElementById("threads");
  96.     for(var i = savedThreadFlagCounts.length-1;i>=0;i--)
  97.     {
  98.         con.prepend(savedThreadFlagCounts[i].sourceElement.parentNode.parentNode);
  99.         allThreads[i].src = savedThreadFlagCounts[i].sourceElement.threadLink;
  100.     }
  101.  
  102.     doneLoading();
  103.     loadNextBatch();
  104. }
  105. var loadedThreads = 0;
  106. var newThreadLoaded = function()
  107. {
  108.     loadedThreads++;
  109.     updateLoading("Thread Leaf Count",loadedThreads/thumbs.length,this.sourceElement.threadLink);
  110.     var parser=new DOMParser();
  111.     var threadDoc=parser.parseFromString(this.response, "text/html");
  112.     var threadFlags = threadDoc.getElementsByClassName("flag");
  113.     var flag = function(name)
  114.     {
  115.         this.flagName = name;
  116.         this.number = 0;
  117.     }
  118.     var flagHolder = [];
  119.     flagHolder.push(new flag(LOOKOUT_FLAG));
  120.     for(var i = 0;i<threadFlags.length;i++)
  121.     {
  122.         var flagClass = threadFlags[i].className + "";
  123.         var currentFlag = flagClass.replace(/(flag.)/g,"");
  124.  
  125.         if(currentFlag != LOOKOUT_FLAG)
  126.             continue;
  127.  
  128.         for(var j = 0;j<flagHolder.length;j++)
  129.         {
  130.             if(flagHolder[j].flagName == currentFlag)
  131.             {
  132.                 flagHolder[j].number++;
  133.                 break;
  134.             }
  135.         }
  136.            
  137.     }
  138.     for(var i = 0;i<flagHolder.length;i++)
  139.     {
  140.         flagHolder[i].number/=2;
  141.     }
  142.     var threadSave = new Object();
  143.     threadSave.sourceElement = this.sourceElement;
  144.     threadSave.flags = flagHolder;
  145.     savedThreadFlagCounts.push(threadSave);
  146.     if(loadedThreads >= thumbs.length)
  147.     {
  148.         sortThreads();
  149.     }
  150. }
  151. var thumbs = retrieveThumbnails();
  152. var allThreads = [];
  153.  
  154. updateLoading("Finding Threads");
  155. for(var i = 0;i<thumbs.length;i++)
  156. {
  157.     thumbs[i].request = new XMLHttpRequest();
  158.     thumbs[i].threadLink = retrieveThreadLinkFrom(thumbs[i]);
  159.     thumbs[i].request.open("GET",thumbs[i].threadLink);
  160.     thumbs[i].request.sourceElement = thumbs[i];
  161.     thumbs[i].request.onload = newThreadLoaded;
  162.     thumbs[i].request.send();
  163.  
  164.     allThreads[i] = document.createElement("iframe");
  165. }
  166.  
  167. var interval = DEFAULT_INTERVAL;
  168. var currentThread = 0;
  169. var lastStartPoint = currentThread;
  170. var controlDiv = document.createElement("div");
  171. controlDiv.style.visibility = "hidden";
  172. controlDiv.innerHTML = "<input id = 'submittedButton' value = 'Next Batch' type = 'button'/>"
  173.         +"<span>  Thread interval:</span><input id='intervalValue' type = 'number' name='interval'/><br/>"
  174.         +"<input id = 'changeFrameDim' value = 'Change IFrame Dimensions' type = 'button'/>"
  175.         +"<span>  Width (pixels): <input id ='iframeWidth' type = 'number'/> Height (pixels): <input id = 'iframeHeight' type = 'number'/></span>"
  176.         +"<br/><br/>";
  177. document.getElementById("content").prepend(controlDiv);
  178. var donePostingButton = document.getElementById("submittedButton");
  179. var intervalTextArea = document.getElementById("intervalValue");
  180. var iframeDimButton = document.getElementById("changeFrameDim");
  181. var iframeWidthInput = document.getElementById("iframeWidth");
  182. var iframeHeightInput = document.getElementById("iframeHeight");
  183. intervalTextArea.value = interval;
  184. iframeWidthInput.value = IFrameWidth;
  185. iframeHeightInput.value = IFrameHeight;
  186.  
  187. var changeIFrameDim = function()
  188. {
  189.     IFrameHeight = iframeHeightInput.value;
  190.     IFrameWidth = iframeWidthInput.value;
  191.     for(var i = 0;i<controlDiv.children.length;i++)
  192.     {
  193.         var el = controlDiv.children[i];
  194.         if(el.tagName.toLowerCase() != "iframe")
  195.             continue;
  196.         el.width = IFrameWidth;
  197.         el.height = IFrameHeight;
  198.     }
  199. }
  200. iframeDimButton.onclick = changeIFrameDim;
  201.  
  202. var loadedThread = function(thread)
  203. {
  204.     console.log("loaded "+thread.src);
  205.     var doc = thread.contentDocument;
  206.     if(doc.querySelectorAll("input[title]")[0])
  207.     {
  208.         doc.querySelectorAll("input[title]")[0].click();
  209.         leafPostOn(thread);
  210.     }else{
  211.         console.log(thread.src + " is archived");
  212.     }
  213. };
  214. var leafPostOn = function(thread)
  215. {
  216.     var doc = thread.contentDocument;
  217.     leafs = doc.getElementsByClassName("flag-"+LOOKOUT_FLAG);
  218.     if(leafs.length<1)
  219.     {
  220.         console.log("No leafs on " + thread.src);
  221.         return 1;
  222.     }
  223.     var leafPosts = [];
  224.     var leafLinks = [];
  225.     var leafPostNumbers = [];
  226.     var postCounter = 0;
  227.     for(var i = 0;i<leafs.length;i++){
  228.         if(leafs[i].parentElement.parentElement.className=="postInfoM mobile")
  229.             continue;
  230.         leafPosts[postCounter] = leafs[i].parentElement.parentElement;
  231.         postCounter++;
  232.     }
  233.     for(var i = 0;i<leafPosts.length;i++)
  234.     {
  235.         leafLinks[i] = leafPosts[i].getElementsByClassName("postNum")[0];
  236.     }
  237.     for(var i = 0;i<leafLinks.length;i++){
  238.         leafPostNumbers[i] = leafLinks[i].children[1].innerText;
  239.     }
  240.     var LINE_LIMIT = 51;
  241.     var leafsPerLine = Math.ceil(leafPostNumbers.length/LINE_LIMIT);
  242.     if(!doc.getElementsByClassName("open-qr-wrap")[0])
  243.     {
  244.         return 1;
  245.     }
  246.     doc.getElementsByClassName("open-qr-wrap")[0].children[0].click();
  247.     var postTextArea = doc.getElementById("qrForm").getElementsByTagName("textarea")[0];
  248.     postTextArea.value = "";
  249.     postTextArea.position = "absolute";
  250.     postTextArea.left = "0px";
  251.     postTextArea.top = "0px";
  252.     var lineCounter = 0;
  253.     for(var i=0;i<leafPostNumbers.length;i++)
  254.     {
  255.         postTextArea.value += ">>"+leafPostNumbers[i]+" ";
  256.         lineCounter++;
  257.         if(lineCounter == leafsPerLine)
  258.         {
  259.             postTextArea.value+="\n";
  260.             lineCounter = 0;
  261.         }
  262.     }
  263.     if(lineCounter!=0)
  264.         postTextArea.value+="\n";
  265.     postTextArea.value+=">leaf";
  266. };
  267.  
  268. var intervalChanged = function(){
  269.     var checkedString = "";
  270.     for(var i = 0;i<intervalTextArea.value.length;i++)
  271.     {
  272.         if(!isNaN(intervalTextArea.value.charAt(i)))
  273.         {
  274.             checkedString+=intervalTextArea.value.charAt(i);
  275.         }
  276.     }
  277.     if(checkedString == "")
  278.     {
  279.         checkedString = DEFAULT_INTERVAL;
  280.     }
  281.     intervalTextArea.value = checkedString;
  282.     interval = parseInt(checkedString);
  283. };
  284. intervalTextArea.onchange = intervalChanged;
  285.  
  286. var deleteLastBatch = function(){
  287.     for(var i = lastStartPoint;i<currentThread;i++)
  288.     {
  289.         allThreads[i].parentNode.removeChild(allThreads[i]);
  290.     }
  291. };
  292. var loadNextBatch = function(){
  293.     lastStartPoint = currentThread;
  294.     for(var i = currentThread;i<(currentThread+interval);i++)
  295.     {
  296.         if(!allThreads[i])
  297.         {
  298.             alert("You've hit the last thread!");
  299.             currentThread = i;
  300.             return;
  301.         }
  302.         allThreads[i].id = allThreads[i].src;
  303.         allThreads[i].width = IFrameWidth;
  304.         allThreads[i].height = IFrameHeight;
  305.         controlDiv.append(allThreads[i]);
  306.         allThreads[i].onload = function(){
  307.             loadedThread(this);
  308.         }
  309.     }
  310.     currentThread = i;
  311. };
  312. donePostingButton.onclick = function(){deleteLastBatch();loadNextBatch();};
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement