Paste Search Dynamic
Recent pastes
ipc.js
  1. const btoaUTF8=function(c,b){"use strict";return function(a,d){return c((d?"\u00ef\u00bb\u00bf":"")+a.replace(/[\x80-\uD7ff\uDC00-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]?/g,b))}}(btoa,function(c){return function(b){var a=b.charCodeAt(0);if(55296<=a&&56319>=a)if(b=b.charCodeAt(1),b===b&&56320<=b&&57343>=b){if(a=1024*(a-55296)+b-56320+65536,65535<a)return c(240|a>>>18,128|a>>>12&63,128|a>>>6&63,128|a&63)}else return c(239,191,189);return 127>=a?inputString:2047>=a?c(192|a>>>6,128|a&63):c(224|a>>>12,128|a>>>6&63,
  2. 128|a&63)}}(String.fromCharCode));
  3.  
  4. document.body.insertAdjacentHTML("afterbegin", `
  5.   <div id="gisipcwindowcontext" style="display:none">${JSON.stringify({gisipcblobid:0, gisipcblobfullsize:""})}</div>
  6.   <div id="gisipcajaxcontent" style="display:none"></div>
  7. `);
  8.  
  9. // another future-proofing failsafe strategy
  10. //
  11. // the images, if for some reason cannot be found in the window object,
  12. // can maybe be found by transparently intercepting all the ajax as the user scrolls
  13. // and adding the responses to a large string that can be combed thru later
  14. // to find the full size image based on the thumb,
  15. // simliar to crawling through the window object
  16. // this can be strategy number 3 since ff wont support cyclical window stringify
  17.  
  18. var imagepoolfromallresponsestext = ""
  19.  
  20. ;(function(open) {
  21.   XMLHttpRequest.prototype.open = function(a, b, c, d, e) {
  22.     this.addEventListener("readystatechange", function() {
  23.       try {
  24.         if ( this
  25.           && this.readyState
  26.           && this.readyState === 4
  27.           && this.responseText
  28.           && this.responseText.length > 0 ) {
  29.           imagepoolfromallresponsestext = imagepoolfromallresponsestext + this.responseText
  30.           var gisipcajaxcontent = document.getElementById("gisipcajaxcontent")
  31.           gisipcajaxcontent.innerHTML = btoaUTF8(imagepoolfromallresponsestext)
  32.         }
  33.       }
  34.       catch(e) {
  35.         console.error(e)
  36.       }
  37.     }, false)
  38.     open.call(this, a, b, c, d, e)
  39.   }
  40. })(XMLHttpRequest.prototype.open);
  41.  
  42. // gisipcprocess(391, "https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcRwoVCofjadFKP2kZYbTTMtiaHE1Ts-N_J-NQXullw0dwg_dZR1")
  43.  
  44. function gisipcprocess(gisipcblobid, gisipcblobdata) {
  45.  
  46.   // new method via jscontrol (for firefox since ff throws permission error when converting circular json to string)
  47.  
  48.   //
  49.   var fullsize = ""  
  50.   var realfullsizeimage = null
  51.   // initial images
  52.   try {
  53.     var clipf = "Cf"
  54.     var smef = document.querySelectorAll(`c-wiz.P3Xfjc`)[0].__jscontroller.o.H[0][clipf]
  55.     if (smef && !smef.j) {
  56.       clipf = "Of"
  57.     }
  58.     var tarlength = document.querySelectorAll(`c-wiz.P3Xfjc`)[0].__jscontroller.o.H[0][clipf].j[0].j[3].length
  59.     for (let i=0;i<tarlength;i++) {
  60.       try {
  61.         let reqei = gisipcblobdata
  62.         let basei = document.querySelectorAll(`c-wiz.P3Xfjc`)[0].__jscontroller.o.H[0][clipf].j[0].j[3][i]
  63.         var subasei = basei.j[2].j[3].H[0]
  64.         if (subasei === reqei) {
  65.           try {
  66.             realfullsizeimage = basei.j[2].j[4].H[0]
  67.           }
  68.           catch(e) {
  69.            
  70.           }
  71.           break
  72.         }
  73.       }
  74.       catch(e) {
  75.         // console.error(e)  
  76.       }
  77.     }
  78.   }
  79.   catch(e) {
  80.     console.error("primary fullsize method not found.. onward")
  81.   }
  82.  
  83.   if (realfullsizeimage !== null) {
  84.     console.log("1n f")
  85.     fullsize = realfullsizeimage
  86.     document.getElementById("gisipcwindowcontext").innerText = JSON.stringify({gisipcblobid:gisipcblobid, gisipcblobfullsize:fullsize})
  87.     return
  88.   }  
  89.  
  90.   try {
  91.     var thumbn = gisipcblobdata
  92.     var cwizzes = document.querySelectorAll("c-wiz")
  93.     var gisarray = (data) => {
  94.       return Object.prototype.toString.call(data) == '[object Array]'
  95.     }
  96.     var xfound = false
  97.     var control = null
  98.     for (let i=0;i<cwizzes.length;i++) {
  99.       if (xfound) {
  100.         break
  101.       }
  102.       if (cwizzes[i].__jscontroller) {
  103.         let controller = cwizzes[i].__jscontroller
  104.         for (j in controller) {
  105.           control = controller[j]
  106.           if ( typeof control === "object"
  107.             && control !== null
  108.             && control !== 'undefined'
  109.             && !gisarray(control) ) {
  110.             xfound = true
  111.             break
  112.           }
  113.         }
  114.       }
  115.     }
  116.     if (control) {
  117.       function loopcwiz(maincwiz) {
  118.         var findarraylength = document.querySelectorAll(`div.${document.querySelectorAll('div[data-ri="0"]')[0].classList[0]}`).length
  119.         var full = null
  120.         var itemfound = false
  121.         var largearrayfound = false
  122.         function faketraverse(data) {
  123.           if (!data) {
  124.             return
  125.           }
  126.           if (itemfound) {
  127.             return
  128.           }
  129.           if ( typeof data === "object"
  130.             && gisarray(data)
  131.             && data.length === findarraylength) {
  132.             itemfound = true
  133.             full = data
  134.             return
  135.           }
  136.           if (typeof data === "object"
  137.             && data !== "null"
  138.             && data !== "undefined"
  139.             && data instanceof Element === false) {
  140.             var keys = Object.keys(data)
  141.             for (let i=0;i<keys.length;i++) {
  142.               var item = keys[i]
  143.               if (item.toString().length < 4) {
  144.                 if ( item.toString() === "j"
  145.                   || item.toString() === "o"
  146.                   || item.toString() === "H"
  147.                   || !isNaN(item.toString()) === true
  148.                   || ( item.toString().length === 2 && item.toString().slice(-1) === "f" )) {
  149.                   if (!itemfound) {
  150.                     faketraverse(data[item])
  151.                   }
  152.                 }
  153.               }
  154.             }
  155.           }
  156.           return
  157.         }
  158.         faketraverse(maincwiz)
  159.         return full
  160.       }
  161.       var maincwiz = document.querySelectorAll(`c-wiz.P3Xfjc`)[0].__jscontroller
  162.       var largearray = loopcwiz(maincwiz)
  163.       if (largearray !== null) {
  164.         for (let i=0;i<largearray.length;i++) {
  165.           var item = largearray[i]
  166.           if ( item
  167.             && item.j
  168.             && item.j[2]
  169.             && item.j[2].j
  170.             && item.j[2].j[3]
  171.             && item.j[2].j[3].H
  172.             && item.j[2].j[3].H[0] ) {
  173.             var encs = item.j[2].j[3].H[0]
  174.             if (encs === thumbn) {
  175.               if (item.j[2].j[4] && item.j[2].j[4].H && item.j[2].j[4].H[0]) {
  176.                 var fullnx = item.j[2].j[4].H[0]
  177.                 realfullsizeimage = fullnx
  178.               }
  179.               break
  180.             }
  181.           }
  182.         }
  183.       }
  184.       else {
  185.         console.log("couldnt find large array")
  186.       }
  187.     }
  188.     else {
  189.       console.log("no control found")
  190.     }
  191.   }
  192.   catch(e) {
  193.     console.log("secondary fullsize method not found.. onward")
  194.   }
  195.  
  196.   if (realfullsizeimage !== null) {
  197.     console.log("2n f")
  198.     fullsize = realfullsizeimage
  199.     document.getElementById("gisipcwindowcontext").innerText = JSON.stringify({gisipcblobid:gisipcblobid, gisipcblobfullsize:fullsize})
  200.     return
  201.   }
  202.  
  203.   try {
  204.     var getCircularReplacer = () => {
  205.       const seen = new WeakSet()
  206.       return (key, value) => {
  207.         if (typeof value === "object" && value !== null) {
  208.           if (seen.has(value)) {
  209.             return
  210.           }
  211.           seen.add(value)
  212.         }
  213.         return value
  214.       }
  215.     }
  216.     // text string of full window object
  217.     let AgisXp = JSON.stringify(window, getCircularReplacer())
  218.  
  219.     // search for full size url based on thumbnail url
  220.     try {
  221.       var Xfindenc = gisipcblobdata
  222.       var pstart = AgisXp.indexOf(Xfindenc)
  223.       if (pstart === -1) {
  224.         throw new Error("less than one")
  225.       }
  226.       AgisXp = AgisXp.slice(pstart + Xfindenc.length)
  227.       var Xrealurlstart = AgisXp.indexOf(`"http`)
  228.      AgisXp = AgisXp.slice(Xrealurlstart + 1)
  229.      var Xendquote = AgisXp.indexOf(`"`)
  230.       if (Xendquote === -1) {
  231.         throw new Error("less than one")
  232.       }
  233.       AgisXp = AgisXp.substring(0,Xendquote)
  234.       // update the DOM with full size url accessible from content script
  235.       document.getElementById("gisipcwindowcontext").innerText = JSON.stringify({gisipcblobid:gisipcblobid, gisipcblobfullsize:AgisXp})
  236.       // console.log("updated")
  237.       // console.log(document.getElementById("gisipcwindowcontext").innerText)
  238.       return
  239.     }
  240.     catch(e) {
  241.       console.error(e)
  242.       // console.log("couldnt find the real url with this scheme.. try the other scheme")
  243.       throw new Error(e)
  244.     }
  245.  
  246.   }
  247.   catch(e) {
  248.     // console.error(e)
  249.     // console.log("cross origin blocked trying workaround")
  250.     var startlogging = false
  251.     var fullsizematch = "0"
  252.     try {
  253.       var getCircularReplacer = () => {
  254.         var seen = new WeakSet()
  255.         return (key, value) => {
  256.           if (startlogging && typeof value === "string" && value.startsWith("http")) {
  257.             // console.log(value)
  258.             fullsizematch = value
  259.             // absurd workaround
  260.             throw new Error("got what we needed")
  261.           }
  262.           if (value === gisipcblobdata) {
  263.             startlogging = true
  264.           }
  265.           if (typeof value === "object" && value !== null) {
  266.             if (seen.has(value)) {
  267.               return
  268.             }
  269.             seen.add(value)
  270.           }
  271.           return value
  272.         }
  273.       }
  274.       JSON.stringify(window, getCircularReplacer())
  275.     }
  276.     catch(e) {
  277.       // console.log("finished normally")
  278.       // console.log(fullsizematch)
  279.       document.getElementById("gisipcwindowcontext").innerText = JSON.stringify({gisipcblobid:gisipcblobid, gisipcblobfullsize:fullsizematch})
  280.     }    
  281.   }
  282. }
  283.  
  284. function gisipcreceivemessage(e) {
  285.   try {
  286.     if (e && e.data) {
  287.       let blob = JSON.parse(e.data)
  288.       if (blob.gisipcblob) {
  289.         // console.log("IPC BLOB")
  290.         // console.log(blob.gisipcblob)
  291.         // {
  292.         //   gisipcblob: {
  293.         //     id: int, // random number, used as uuid
  294.         //     data: string // http://encrypted.googleetc/thumbnailurl
  295.         //   }
  296.         // }
  297.         gisipcprocess(blob.gisipcblob.id, blob.gisipcblob.data)
  298.         return
  299.       }
  300.     }
  301.   }
  302.   catch(e) {
  303.    
  304.   }
  305. }
  306.  
  307. window.addEventListener("message", gisipcreceivemessage, false);
Parsed in 0.064 seconds