const app = require("express")(); app.use(require("cors")()); const fetch = require("node-fetch"); const jsdom = require("jsdom"); async function getResults(query) { return await fetch("https://www.bing.com/images/search?q=" + query) .then(response => response.text()) .then(text => new jsdom.JSDOM(text).window.document) .then(document => { const imgNodes = document.getElementsByClassName("mimg"); let results = []; for (let i = 0; i < imgNodes.length; i++) { const src = imgNodes[i].src; if (!src.startsWith("http")) { break; } results.push(src); } return results; }); } app.get(["/random/:query*.jpg" /* legacy routing */, "/:query/random.jpg", "/:query/random"], (request, response) => { getResults(request.params.query).then(results => { response.redirect(results[Math.floor(Math.random() * results.length)]); }); }); app.get("/:query/list", (request, response) => { response.writeHead(200, { "Content-Type": "application/json" }); getResults(request.params.query).then(results => { response.write(JSON.stringify(results)); response.end(); }); }); app.get(["/:query/:i.jpg", "/:query/:i"], (request, response) => { getResults(request.params.query).then(results => { response.redirect(results[request.params.i % results.length]); }); }); app.get(["/:query.jpg", "/:query"], (request, response) => { getResults(request.params.query).then(results => { response.redirect(results[0]); }); }); app.listen(process.argv[2] ? process.argv[2] : 3000);