notmebotz-tools
Version:
Sebuah Tools yang berfungsi untuk mendownload Video atau Foto dari media sosial, serta sebagai tools yang berguna untuk aplikasi kamu seperti untuk BOT
106 lines (86 loc) • 3.22 kB
JavaScript
;
const axios = require("axios");
const { load } = require("cheerio");
const { stringify } = require("node:querystring");
const baseURL = "http://images.google.com/search?";
const exts = [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".svg"];
const srcRegex = /\["(http[^"\[\]]+?)",(\d+),(\d+)\]/g;
const defaultOptions = {
filteredDomains: ["gstatic.com"],
userAgent:
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/117.0",
queryString: "",
};
/**
* Search for images on Google.
* @param {string} searchTerm - The term to search for.
* @param {Object} options - Optional search options.
* @returns {Promise<Object>} - Returns search results in JSON format.
*/
async function search(searchTerm, options = {}) {
const opts = Object.assign({}, defaultOptions, options);
let url =
baseURL +
stringify({
tbm: "isch",
q: searchTerm,
});
opts.filteredDomains = defaultOptions.filteredDomains.concat(
options?.filteredDomains ?? []
);
if (!Array.isArray(opts.filteredDomains))
throw new TypeError("filteredDomains must be of type string[]");
url += encodeURIComponent(
opts.filteredDomains.map((s) => ` -site:${s}`).join("")
);
if (opts.queryString.length > 0) url += opts.queryString;
try {
const res = await axios({ url: url, headers: { "User-Agent": opts.userAgent } });
const $ = load(res.data);
const $scripts = $("script");
let scriptContents = [];
const isTagElement = (element) => element?.children !== null;
for (let i = 0; i < $scripts.length; ++i) {
const $script = $scripts[i];
if (isTagElement($script) && $script.children.length > 0) {
const content = $script.children[0]?.data;
if (content && srcRegex.test(content)) scriptContents.push(content);
}
}
function getSources(content) {
let srcs = [];
for (const result of content.matchAll(srcRegex)) {
if (result[1] && result[2] && result[3]) {
let src = {
url: decodeURI(result[1]),
width: parseInt(result[3]),
height: parseInt(result[2]),
};
if (
opts.filteredDomains.every(
(domain) => !src.url.includes(domain)
) &&
exts.some((ext) => src.url.includes(ext))
)
srcs.push(src);
}
}
return srcs;
}
const finalResults = scriptContents.map(getSources).flat();
// Return results as a structured JSON response
return {
author: "Herza",
status: 200,
searchTerm: searchTerm,
totalResults: finalResults.length,
images: finalResults,
};
} catch (err) {
return {
error: "Terjadi kesalahan",
message: err.message,
};
}
}
module.exports = { search };