-
Notifications
You must be signed in to change notification settings - Fork 6
/
js_code.js
128 lines (124 loc) · 3.58 KB
/
js_code.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/**
* simulate a right-click event so we can grab the image URL using the
* context menu alleviating the need to navigate to another page
*
*
* @param {object} element DOM Element
*
* @return {void}
*/
function simulateRightClick(element) {
var event1 = new MouseEvent("mousedown", {
bubbles: true,
cancelable: false,
view: window,
button: 2,
buttons: 2,
clientX: element.getBoundingClientRect().x,
clientY: element.getBoundingClientRect().y,
});
element.dispatchEvent(event1);
var event2 = new MouseEvent("mouseup", {
bubbles: true,
cancelable: false,
view: window,
button: 2,
buttons: 0,
clientX: element.getBoundingClientRect().x,
clientY: element.getBoundingClientRect().y,
});
element.dispatchEvent(event2);
var event3 = new MouseEvent("contextmenu", {
bubbles: true,
cancelable: false,
view: window,
button: 2,
buttons: 0,
clientX: element.getBoundingClientRect().x,
clientY: element.getBoundingClientRect().y,
});
element.dispatchEvent(event3);
}
/**
* grabs a URL Parameter from a query string because Google Images
* stores the full image URL in a query parameter
*
* @param {string} queryString The Query String
* @param {string} key The key to grab a value for
*
* @return {string} value
*/
function getURLParam(queryString, key) {
var vars = queryString.replace(/^\?/, "").split("&");
for (let i = 0; i < vars.length; i++) {
let pair = vars[i].split("=");
if (pair[0] == key) {
return pair[1];
}
}
return false;
}
/**
* Generate and automatically download a txt file from the URL contents
*
* @param {string} contents The contents to download
*
* @return {void}
*/
function createDownload(contents) {
var hiddenElement = document.createElement("a");
hiddenElement.href = "data:attachment/text," + encodeURI(contents);
hiddenElement.target = "_blank";
hiddenElement.download = "urls.txt";
hiddenElement.click();
}
/**
* grab all URLs va a Promise that resolves once all URLs have been
* acquired
*
* @return {object} Promise object
*/
function grabUrls() {
var urls = [];
return new Promise(function (resolve, reject) {
var count = document.querySelectorAll(".isv-r a:first-of-type").length,
index = 0;
Array.prototype.forEach.call(
document.querySelectorAll(".isv-r a:first-of-type"),
function (element) {
// using the right click menu Google will generate the
// full-size URL; won't work in Internet Explorer
// (http://pyimg.co/byukr)
simulateRightClick(element.querySelector(":scope img"));
// Wait for it to appear on the <a> element
var interval = setInterval(function () {
if (element.href.trim() !== "") {
clearInterval(interval);
// extract the full-size version of the image
let googleUrl = element.href.replace(/.*(\?)/, "$1"),
fullImageUrl = decodeURIComponent(
getURLParam(googleUrl, "imgurl")
);
if (fullImageUrl !== "false") {
urls.push(fullImageUrl);
}
// sometimes the URL returns a "false" string and
// we still want to count those so our Promise
// resolves
index++;
if (index == count - 1) {
resolve(urls);
}
}
}, 10);
}
);
});
}
/**
* Call the main function to grab the URLs and initiate the download
*/
grabUrls().then(function (urls) {
urls = urls.join("\n");
createDownload(urls);
});