From 3d21a7658a4bd542e57584645b5f2bbeeb36dd3f Mon Sep 17 00:00:00 2001 From: G <52905881+giga-a@users.noreply.github.com> Date: Wed, 30 Dec 2020 14:33:44 -0800 Subject: [PATCH] =?UTF-8?q?2020.V.01.16=20added=20CLI=20=F0=9F=91=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 +- app.js | 1134 ++++++++++++++++++++++++++++++++++++++++++++++++++ info | 4 +- package.json | 5 +- sites.json | 8 +- 5 files changed, 1160 insertions(+), 10 deletions(-) create mode 100644 app.js diff --git a/README.md b/README.md index 59ad123..23f33cf 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ I have been getting requests from all over the place asking me to add a python C **Please submit your contribution in a Pull Request!** ## Updates +- (New) Added a small CLI (You can use this project from Command Line) 👏 - Added an optional timeout and implicit wait for each detection (Some websites have a delay logic implemented in the backend) - Added logs (user request) - Added 5 seconds timeout to https.get (user request) @@ -50,7 +51,7 @@ Profile images **will not** be blurred. If you want them to be blurred, turn tha ## Special Detections - facebook -## Install and run (Nodejs + NPM + Firefox) +## Install and run as web app (Nodejs + NPM + Firefox) ```bash sudo add-apt-repository ppa:mozillateam/ppa sudo apt-get update @@ -63,7 +64,21 @@ npm install npm start ``` -## Install and run (docker) +## Install and run as cli (Nodejs + NPM + Firefox) +```bash +sudo add-apt-repository ppa:mozillateam/ppa +sudo apt-get update +sudo apt-get install -y firefox-esr tesseract-ocr git +git clone https://github.com/qeeqbox/social-analyzer.git +cd social-analyzer +rm -rf package-lock.json node_modules +npm install lodash +npm install +# if you want to list all websites use node app.js -c -l +node app.js -c -u "username" -w "youtube pinterest tumblr" +``` + +## Install and run as web app (docker) ```bash git clone https://github.com/qeeqbox/social-analyzer.git cd social-analyzer diff --git a/app.js b/app.js new file mode 100644 index 0000000..6c4d83b --- /dev/null +++ b/app.js @@ -0,0 +1,1134 @@ +var google_api_key = ""; +var google_api_cs = ""; + +console.log('[!] Detections are updated every often, make sure to get the most updated ones'); + +var semver = require('semver'); +if (semver.satisfies(process.version, '>13 || <13')) { + console.log('[Good] NodeJS Version Check'); +} else { + console.log('[Error] NodeJS Version Check'); + process.exit(1); +} + +var argv = require('yargs') + .alias('c', 'cli') + .alias('u', 'user') + .alias('w', 'website') + .alias('o', 'output') + .alias('l', 'list') + .usage('Usage: $0 -s "user" -w "website" -o "output"') + .example('$0 -s "joe" -w "facebook"', 'check user joe in facebook website') + .example('$0 -s "natalie" -w "facebook wordpress"', 'check if user natalie in facebook & wordpress website') + .describe('u', 'a user or stirng') + .describe('w', 'a website or websites sparated with space') + .describe('o', 'option output file') + .describe('l', 'list all available websites') + .help('h') + .alias('h', 'help') + .argv; + +var tmp = require("tmp"); +var express = require("express"); +var fs = require("fs"); +var tokenizer = require("wink-tokenizer"); +var axios = require("axios") +var WordsNinjaPack = require("wordsninja"); +var generatorics = require("generatorics"); +var { + findWord +} = require("most-common-words-by-language"); +var tesseract = require("node-tesseract-ocr"); +var url = require("url"); +var sanitizeHtml = require("sanitize-html"); +var firefox = require("selenium-webdriver/firefox"); +var { + Builder, + By +} = require("selenium-webdriver"); +var util = require('util'); +var https = require("follow-redirects").https; +var async = require("async"); +var PrettyError = require('pretty-error'); +var pe = new PrettyError(); +require('express-async-errors'); +//var jsdom = require('jsdom'); +//var dom = new jsdom.JSDOM(); +//var window = dom.window; +//var document = window.document; +//var $ = require('jquery')(window); +const { + htmlToText +} = require('html-to-text'); +var _tokenizer = tokenizer(); +var parsed_json = JSON.parse(fs.readFileSync("dict.json")); +var parsed_sites = JSON.parse(fs.readFileSync("sites.json")); +var app = express(); + +var WordsNinja = new WordsNinjaPack(); +app.use(express.urlencoded({ + extended: true +})); +app.use(express.json()); +app.use(express.static("public")); + +if (!fs.existsSync('logs')) { + fs.mkdirSync('logs'); +} + +var logs_queue = Promise.resolve(); + +function log_to_file_queue(uuid, msg) { + logs_queue = logs_queue.then(function() { + return new Promise(function(resolve) { + fs.appendFile("logs/" + uuid + "_log.txt", msg + "\n", function(err, data) { + console.log(msg) + resolve(); + }); + }); + }); +} + +app.post("/get_logs", async function(req, res, next) { + var last_line = "nothinghere" + if (req.body.uuid != "") { + req.body.uuid = req.body.uuid.replace(/[^a-zA-Z0-9\-]+/g, ''); + var data = fs.readFileSync("logs/" + req.body.uuid + "_log.txt").toString(); + if (typeof data !== 'undefined' && data) { + last_line = data.split('\n').slice(-2)[0]; + } + res.send(last_line) + } +}) + +function get_site_from_url(_url) { + temp = url.parse(_url.replace("{username}", "nothinghere")).hostname + return temp.replace("nothinghere.", "") +} + +async function find_username_special(req) { + const time = new Date(); + const functions = []; + parsed_sites.forEach((site) => { + if ("status" in site) { + if (site.status == "bad") { + return Promise.resolve(); + } + } + if ("name" in site) { + if (site.name == "facebook") { + if (site.selected == "true") { + functions.push(find_username_site_special_facebook_1.bind(null, req.body.uuid, req.body.string, site)); + } + } + } + }); + const results = await async.parallelLimit(functions, 5); + console.log(`Total time ${new Date() - time}`); + return results.filter(item => item !== undefined) +} + +async function find_username_site_special_facebook_1(uuid, username, site) { + return new Promise(async (resolve, reject) => { + log_to_file_queue(uuid, "[Checking] " + get_site_from_url(site.url)) + let driver = new Builder() + .forBrowser("firefox") + .setFirefoxOptions(new firefox.Options().headless().windowSize({ + width: 640, + height: 480 + })) + .build(); + + try { + var timeouts = { + implicit: 0, + pageLoad: 10000, + script: 10000 + }; + + var source = ""; + var data = ""; + var text_only = "unavailable"; + var title = "unavailable"; + var temp_profile = { + "found": 0, + "image": "", + "link": "", + rate: "", + title: "", + text: "" + }; + var link = "https://mbasic.facebook.com/login/identify/?ctx=recoveqr"; + await driver.manage().setTimeouts(timeouts); + await driver.get(link);; + await driver.findElement(By.id('identify_search_text_input')).sendKeys(username); + await driver.findElement(By.id('did_submit')).click(); + source = await driver.getPageSource(); + text_only = await driver.findElement(By.tagName("body")).getText(); + await driver.quit() + if (source.includes("Try Entering Your Password")) { + temp_found = "true"; + temp_profile.found += 1 + } + if (temp_profile.found > 0) { + temp_profile.text = "unavailable"; + temp_profile.title = "unavailable"; + temp_profile.rate = "%" + ((temp_profile.found / 1) * 100).toFixed(2); + temp_profile.link = site.url.replace("{username}", username); + resolve(temp_profile); + } else { + resolve(undefined) + } + } catch (err) { + if (driver !== undefined) { + try { + await driver.quit() + } catch (err) { + console.log("Driver Session Issue") + } + } + resolve(undefined) + } + }); +} + +async function find_username_advanced(req) { + const time = new Date(); + const functions = []; + parsed_sites.forEach((site) => { + if ("status" in site) { + if (site.status == "bad") { + return Promise.resolve(); + } + } + if (site.selected == "true" && site.detections.length > 0) { + functions.push(find_username_site_new.bind(null, req.body.uuid, req.body.string, req.body.option, site)); + } + }); + const results = await async.parallelLimit(functions, 5); + console.log(`Total time ${new Date() - time}`); + return results.filter(item => item !== undefined) +} + +async function find_username_site_new(uuid, username, options, site) { + return new Promise(async (resolve, reject) => { + log_to_file_queue(uuid, "[Checking] " + get_site_from_url(site.url)) + let driver = new Builder() + .forBrowser("firefox") + .setFirefoxOptions(new firefox.Options().headless().windowSize({ + width: 640, + height: 480 + })) + .build(); + + try { + + var timeouts = { + implicit: 0, + pageLoad: 5000, + script: 5000 + }; + + var timeout = (site.timeout != 0) ? site.timeout * 1000 : 5000; + var implicit = (site.implicit != 0) ? site.implicit * 1000 : 0; + + timeouts = { + implicit: implicit, + pageLoad: timeout, + script: timeout + }; + + console.log(timeouts) + + var source = ""; + var data = ""; + var text_only = "unavailable"; + var title = "unavailable"; + var temp_profile = { + "found": 0, + "image": "", + "link": "", + rate: "", + title: "", + text: "" + }; + var link = site.url.replace("{username}", username); + await driver.manage().setTimeouts(timeouts); + await driver.get(link);; + source = await driver.getPageSource(); + data = await driver.takeScreenshot(); + title = await driver.getTitle(); + text_only = await driver.findElement(By.tagName("body")).getText(); + await driver.quit() + if (options.includes("ShowUserProflesSlow")) { + temp_profile["image"] = "data:image/png;base64,{image}".replace("{image}", data); + } + if (site.selected == "true" && site.detections.length > 0 && options.includes("FindUserProflesSlow")) { + await Promise.all(site.detections.map(async detection => { + try { + if ("status" in detection) { + if (detection.status == "bad") { + return; + } + } + var temp_found = "false" + if (detection.type == "ocr" && data != "") { + tmpobj = tmp.fileSync(); + fs.writeFileSync(tmpobj.name, Buffer.from(data, "base64")); + await tesseract.recognize(tmpobj.name, { + lang: "eng", + oem: 1, + psm: 3, + }) + .then(text => { + text = text.replace(/[^A-Za-z0-9]/gi, ""); + detection.string = detection.string.replace(/[^A-Za-z0-9]/gi, ""); + if (text != "") { + if (text.toLowerCase().includes(detection.string.toLowerCase())) { + temp_found = "true"; + } + if (detection.return == temp_found) { + //console.log(text); + //console.log(detection.string," > Found ocr"); + temp_profile.found += 1; + } + } + }) + .catch(error => { + console.log(error.message); + }) + tmpobj.removeCallback(); + } else if (detection.type == "normal" && source != "") { + if (source.toLowerCase().includes(detection.string.replace("{username}", username).toLowerCase())) { + temp_found = "true"; + } + if (detection.return == temp_found) { + //console.log(detection.string," > normal"); + temp_profile.found += 1 + } + } + + } catch (err) { + + } + })); + } + if (temp_profile.found > 0 || temp_profile.image != "") { + temp_profile.text = sanitizeHtml(text_only); + temp_profile.title = sanitizeHtml(title); + temp_profile.rate = "%" + ((temp_profile.found / site.detections.length) * 100).toFixed(2); + temp_profile.link = site.url.replace("{username}", username); + resolve(temp_profile); + } else { + resolve(undefined) + } + } catch (err) { + if (driver !== undefined) { + try { + await driver.quit() + } catch (err) { + console.log("Driver Session Issue") + } + } + resolve(undefined) + } + }); +} + +async function find_username_normal(req) { + + var functions = []; + var detections_result = []; + + async function find_username_site(uuid, username, options, site, body) { + try { + log_to_file_queue(uuid, "[Checking] " + get_site_from_url(site.url)) + var detections_count = 0; + var source = body; + var text_only = "unavailable"; + var title = "unavailable"; + var temp_profile = { + "found": 0, + "image": "", + "link": "", + rate: "", + title: "", + text: "" + }; + await Promise.all(site.detections.map(async detection => { + var temp_found = "false"; + if (detection.type == "normal" && options.includes("FindUserProflesFast") && source != "" && detection.return == "true") { + detections_count += 1 + if (source.toLowerCase().includes(detection.string.replace("{username}", username).toLowerCase())) { + temp_found = "true"; + } + if (detection.return == temp_found) { + //console.log(detection.string, " > normal"); + temp_profile.found += 1 + } + } + })); + if (temp_profile.found > 0 && detections_count != 0) { + temp_profile.text = htmlToText(body, { + wordwrap: false, + hideLinkHrefIfSameAsText: true, + ignoreHref: true, + ignoreImage: true + }); + if (temp_profile.text == "") { + temp_profile.text = "unavailable" + } + temp_profile.title = sanitizeHtml(title); + temp_profile.rate = "%" + ((temp_profile["found"] / detections_count) * 100).toFixed(2); + temp_profile.link = site.url.replace("{username}", username); + return Promise.resolve(temp_profile); + } + return Promise.resolve(); + } catch (err) { + return Promise.reject(); + } + } + + async function find_username_sites(uuid, username, options, parsed_sites) { + + await parsed_sites.forEach(site => { + if ("status" in site) { + if (site.status == "bad") { + return; + } + } + if (site.selected == "true" && site.detections.length > 0) { + functions.push(function(callback) { + var request = https.get(site.url.replace("{username}", username), function(res) { + var body = "" + res.on("data", function(chunk) { + body += chunk; + }); + res.on("end", async function() { + var results = await find_username_site(uuid, username, options, site, body); + detections_result.push(results); + callback(null, "Done!"); + }); + }); + request.on('error', function(e) { + callback(null, "Done!"); + }); + request.on('socket', function(socket) { + var timeout = (site.timeout != 0) ? site.timeout * 1000 : 5000; + socket.setTimeout(timeout, function() { + request.abort(); + }); + }); + }); + } + }); + } + + await find_username_sites(req.body.uuid, req.body.string, req.body.option, parsed_sites); + await async.parallelLimit(functions, 100); + return detections_result.filter(item => item !== undefined); +} + +async function find_username_advanced_2(username, options) { + + var detections_result = []; + + async function find_username_site(username, options, driver, site) { + try { + if ("status" in site) { + if (site.status == "bad") { + return Promise.resolve(); + } + } + if (site.selected == "true" && site.detections.length > 0 || site.selected == "true" && options.includes("ShowUserProflesSlow")) { + var source = ""; + var data = ""; + var text_only = "unavailable"; + var title = "unavailable"; + var temp_profile = { + "found": 0, + "image": "", + "link": "", + rate: "", + title: "", + text: "" + }; + var link = site.url.replace("{username}", username); + await driver.get(link);; + source = await driver.getPageSource(); + data = await driver.takeScreenshot(); + title = await driver.getTitle(); + text_only = await driver.findElement(By.tagName("body")).getText(); + if (options.includes("ShowUserProflesSlow")) { + temp_profile["image"] = "data:image/png;base64,{image}".replace("{image}", data); + } + if (site.selected == "true" && site.detections.length > 0 && options.includes("FindUserProflesSlow")) { + await Promise.all(site.detections.map(async detection => { + if ("status" in detection) { + if (detection.status == "bad") { + return; + } + } + var temp_found = "false" + if (detection.type == "ocr" && data != "") { + tmpobj = tmp.fileSync(); + fs.writeFileSync(tmpobj.name, Buffer.from(data, "base64")); + await tesseract.recognize(tmpobj.name, { + lang: "eng", + oem: 1, + psm: 3, + }) + .then(text => { + text = text.replace(/[^A-Za-z0-9]/gi, ""); + detection.string = detection.string.replace(/[^A-Za-z0-9]/gi, ""); + if (text != "") { + if (text.toLowerCase().includes(detection.string.toLowerCase())) { + temp_found = "true"; + } + if (detection.return == temp_found) { + //console.log(text); + //console.log(detection.string," > Found ocr"); + temp_profile.found += 1; + } + } + }) + .catch(error => { + console.log(error.message); + }) + tmpobj.removeCallback(); + } else if (detection.type == "normal" && source != "") { + if (source.toLowerCase().includes(detection.string.replace("{username}", username).toLowerCase())) { + temp_found = "true"; + } + if (detection.return == temp_found) { + //console.log(detection.string," > normal"); + temp_profile.found += 1 + } + } + })); + } + if (temp_profile.found > 0 || temp_profile.image != "") { + temp_profile.text = sanitizeHtml(text_only); + temp_profile.title = sanitizeHtml(title); + temp_profile.rate = "%" + ((temp_profile.found / site.detections.length) * 100).toFixed(2); + temp_profile.link = site.url.replace("{username}", username); + return Promise.resolve(temp_profile); + } + } + return Promise.resolve(); + } catch (err) { + return Promise.reject(); + } + } + + async function find_username_sites(username, options, driver, parsed_sites) { + for (var site of parsed_sites) { + var result = await find_username_site(username, options, driver, site); + detections_result.push(result); + } + + return detections_result; + } + + let driver = new Builder() + .forBrowser("firefox") + .setFirefoxOptions(new firefox.Options().headless().windowSize({ + width: 640, + height: 480 + })) + .build(); + + var timeouts = { + implicit: 0, + pageLoad: 10000, + script: 10000 + }; + + await driver.manage().setTimeouts(timeouts); + var results = await find_username_sites(username, options, driver, parsed_sites); + await driver.quit(); + return results.filter(item => item !== undefined); +} + +app.get("/get_settings", async function(req, res, next) { + temp_list = []; + temp_list = await Promise.all(parsed_sites.map(async (site, index) => { + var temp_url = ""; + if ("status" in site) { + if (site.status == "bad") { + return Promise.resolve(); + } + } + if (site.detections.length > 0) { + temp_url = url.parse(site.url.replace("{username}", "nothinghere")).hostname + temp_url = temp_url.replace("nothinghere.", ""); + if (temp_url != "nothinghere") { + temp_selected = "false"; + if ("selected" in site) { + if (site.selected == "true") { + temp_selected = "true"; + } + } + return Promise.resolve({ + "index": index, + "url": temp_url, + "selected": temp_selected + }); + } + } + + return Promise.resolve(); + })); + + temp_list = temp_list.filter(item => item !== undefined); + temp_list.sort(function(a, b) { + var keyA = a.url, + keyB = b.url; + // Compare the 2 dates + if (keyA < keyB) return -1; + if (keyA > keyB) return 1; + return 0; + }); + res.json({ + google: [google_api_key.substring(0, 10) + "******", google_api_cs.substring(0, 10) + "******"], + detections: temp_list + }); +}); + +app.post("/save_settings", async function(req, res, next) { + await parsed_sites.forEach(function(value, i) { + parsed_sites[i].selected = "false" + }); + if ("detections" in req.body) { + if (req.body.detections.length > 0) { + await req.body.detections.split(',').forEach(item => { + parsed_sites[Number(item)].selected = "true"; + }); + } + } + if (req.body.google_key != google_api_key.substring(0, 10) + "******") { + google_api_key = req.body.google_key; + } + if (req.body.google_cv != google_api_cs.substring(0, 10) + "******") { + google_api_cs = req.body.google_cv; + } + + res.json("Done"); +}); + +app.get("/generate", async function(req, res, next) { + var list_of_combinations = [] + if (req.body.option == "Generate") { + if (req.body.words != undefined && req.body.words.length > 1 && req.body.words.length < 8) { + for (var perm of generatorics.permutationCombination(req.body.words)) { + if (perm.join("") !== "") { + list_of_combinations.push(perm.join("")); + } + } + } + } + res.json({ + combinations: list_of_combinations + }); + +}); + +async function get_words_info(all_words, words_info) { + var temp_added = [] + for (let all_words_key of Object.keys(all_words)) { + for (let all_words_word of all_words[all_words_key]) { + if (!temp_added.includes(all_words_word)) { + temp_added.push(all_words_word); + var temp_words_info = { + "word": all_words_word, + "text": "", + "results": [] + } + try { + var url1 = "https://api.duckduckgo.com/?q={0}&format=json&pretty=1&no_html=1&skip_disambig=1".replace("{0}", all_words_word); + var url2 = "https://api.duckduckgo.com/?q={0}&format=json&pretty=1".replace("{0}", all_words_word); + var response1 = await axios.get(url1); + var response2 = await axios.get(url2); + if (response2.status === 200) { + if ("RelatedTopics" in response2.data) { + if (response2.data.RelatedTopics.length > 0) { + if (response1.status === 200) { + if ("AbstractText" in response1.data && response1.data.AbstractText != "") { + temp_words_info.text = response1.data.AbstractText; + } else if ("Abstract" in response1.data && response1.data.AbstractText != "") { + temp_words_info.text = response1.data.Abstract; + } else { + temp_words_info.text = "unknown"; + } + } + response2.data.RelatedTopics.forEach(function(item) { + if ("Name" in item) { + item.Topics.forEach(function(topic) { + temp_words_info.results.push({ + "type": item.Name, + "text": topic.Text, + "url": topic.FirstURL + }); + }); + } else { + temp_words_info.results.push({ + "type": "Related", + "text": item.Text, + "url": item.FirstURL + }); + } + }); + } + } + } + + if (temp_words_info.results.length > 0) { + words_info.push(temp_words_info); + } + } catch (error) { + console.log(error); + } + } + } + } +} + +async function check_engines(req, info) { + try { + if (google_api_key == "" || google_api_cs == "") { + return + } + var url = "https://www.googleapis.com/customsearch/v1?key={0}&cx={1}&q={2}".replace("{0}", google_api_key).replace("{1}", google_api_cs).replace("{2}", req.body.string); + var response = await axios.get(url); + if (response.status === 200) { + try { + info.original = response.data.queries.request[0].searchTerms + } catch (e) {} + try { + info.corrected = response.data.spelling.correctedQuery + } catch (e) {} + try { + info.total = response.data.searchInformation.totalResults + } catch (e) {} + try { + response.data.items.forEach(function(item) { + info["items"].push({ + "title": item.title, + "snippet": item.snippet + }); + }); + } catch (e) {} + try { + if (info.total == 0 && info.corrected != "") { + info.checking = info.original + " [Error]
Try this: " + info.corrected; + } else if (info.total > 0 && info.corrected != "") { + info.checking = info.original + " [Good]
Suggested word: " + info.corrected + "
Total lookups: " + info.total; + } else if (info.total > 0 && info.corrected == "") { + info.checking = info.original + " [Good]
Total lookups: " + info.total; + } else { + info.checking = "Using " + info.original + " with no lookups"; + } + } catch (e) {} + } + } catch (error) { + console.log(error); + } +} + +function most_common1(all_words, temp_words) { + var temp_list = [] + Object.keys(all_words).forEach(function(key) { + all_words[key].forEach(function(item) { + if (!temp_list.includes(item) && item.length > 1) { + temp_list.push(item); + var temp = findWord(item); + if (Object.keys(temp).length != 0) { + var languages = Object.keys(temp).map(function(key) { + return [key, temp[key]]; + }); + languages.sort(function(first, second) { + return second[1] - first[1] + }).reverse(); + temp_words.push({ + "word": item, + "languages": languages.map(e => e.join(":")).join(" ") + }); + } + } + }); + }); +} + +async function most_common(all_words, temp_words) { + var temp_list = [] + Object.keys(all_words).forEach(function(key) { + all_words[key].forEach(function(item) { + if (!temp_list.includes(item) && item.length > 1) { + temp_list.push(item); + var temp = findWord(item); + if (Object.keys(temp).length != 0) { + var languages = Object.keys(temp).map(function(key) { + return [key, temp[key]]; + }); + languages.sort(function(first, second) { + return second[1] - first[1] + }).reverse(); + temp_words.push({ + "word": item, + "languages": languages.map(e => e[0]).join(", ") + }); + } + } + }); + }); +} + +function find_other(all_words) { + var words = WordsNinja.splitSentence(req.body.string); + + words.forEach(function(word) { + var value = false + Object.keys(all_words).forEach(function(key) { + if (all_words[key].includes(word)) { + value = true + } + }); + + if (!value && !all_words.maybe.includes(word)) { + all_words.maybe.push(word); + } + }); +} + +function remove_word(str, sub_string) { + part1 = str.substring(0, str.indexOf(sub_string)); + part2 = str.substring(str.indexOf(sub_string) + sub_string.length, str.length); + temp = (part1 + part2).replace(/[ \[\]:"\\|,.<>\/?~`!@#$%^&*()_+\-={};"]/gi, ""); + return temp; +} + +async function analyze_name(req, all_words) { + log_to_file_queue(req.body.uuid, "[Starting] String analysis") + temp_rr_names = [] + string_to_check = req.body.string + parsed_json.prefix.forEach(function(item, index) { + if (string_to_check.indexOf(item) == 0 && !all_words.prefix.includes(item)) { + all_words.prefix.push(item); + temp = remove_word(string_to_check, item); + if (temp !== null && temp !== "" && !all_words.unknown.includes(temp) && !all_words.maybe.includes(temp) && temp.length > 1) { + all_words.unknown.push(temp); + } + } + }); + parsed_json.m_names.forEach(function(item, index) { + if (string_to_check.indexOf(item) >= 0 && !all_words.name.includes(item)) { + all_words.name.push(item); + temp = remove_word(string_to_check, item); + if (temp !== null && temp !== "" && !all_words.unknown.includes(temp) && !all_words.maybe.includes(temp) && temp.length > 1) { + all_words.unknown.push(temp); + } + } + }); + parsed_json.f_names.forEach(function(item, index) { + if (string_to_check.indexOf(item) >= 0 && !all_words.name.includes(item)) { + all_words.name.push(item); + temp = remove_word(string_to_check, item); + if (temp !== null && temp !== "" && !all_words.unknown.includes(temp) && !all_words.maybe.includes(temp) && temp.length > 1) { + all_words.unknown.push(temp); + } + } + }); + + all_words.prefix.forEach(function(h_item, index) { + all_words.unknown.forEach(function(r_item, index) { + if (r_item.indexOf(h_item) == 0) { + temp = remove_word(r_item, h_item); + if (temp !== null && temp !== "" && !temp_rr_names.includes(temp) && !all_words.maybe.includes(temp) && temp.length > 1) { + temp_rr_names.push(temp); + } + } + }); + }); + + var temp_r_concat = all_words.unknown.concat(temp_rr_names.filter((item) => all_words.unknown.indexOf(item) < 0)); + + all_words.unknown = temp_r_concat + temp_rr_names = [] + + all_words.number.forEach(function(n_item, index) { + all_words.unknown.forEach(function(r_item, index) { + if (r_item.indexOf(n_item) >= 0) { + temp = remove_word(r_item, n_item); + if (temp !== null && temp !== "" && !temp_rr_names.includes(temp) && !all_words.maybe.includes(temp) && temp.length > 1) { + temp_rr_names.push(temp); + } + } + }); + }); + + var temp_r_concat = all_words.unknown.concat(temp_rr_names.filter((item) => all_words.unknown.indexOf(item) < 0)); + all_words.unknown = temp_r_concat + log_to_file_queue(req.body.uuid, "[Done] String analysis") +} + +app.post("/url", async function(req, res, next) { + await WordsNinja.loadDictionary(); + var info = { + "items": [], + "original": "", + "corrected": "", + "total": 0, + "checking": "Using " + req.body.string + " with no lookups" + } + var user_info_normal = { + data: {}, + type: "all" + } + var user_info_advanced = { + data: {}, + type: "all" + } + var user_info_special = { + data: {}, + type: "all" + } + var all_words = { + "prefix": [], + "name": [], + "number": [], + "symbol": [], + "unknown": [], + "maybe": [] + } + var words_info = [] + var temp_words = [] + if (req.body.string == null || req.body.string == "") { + res.json("Error"); + } else { + req.body.uuid = req.body.uuid.replace(/[^a-zA-Z0-9\-]+/g, ''); + if (req.body.option.includes("FindUserProflesSpecial")) { + log_to_file_queue(req.body.uuid, "[Starting] Checking user profiles special") + user_info_special.data = await find_username_special(req); + log_to_file_queue(req.body.uuid, "[Done] Checking user profiles special") + } + if (req.body.option.includes("FindUserProflesFast")) { + log_to_file_queue(req.body.uuid, "[Starting] Checking user profiles normal") + user_info_advanced.data = await find_username_normal(req); + log_to_file_queue(req.body.uuid, "[Done] Checking user profiles normal") + } + if (req.body.option.includes("FindUserProflesSlow") || req.body.option.includes("ShowUserProflesSlow")) { + if (!req.body.option.includes("FindUserProflesSlow")) { + user_info_normal.type = "show" + } else if (!req.body.option.includes("ShowUserProflesSlow")) { + user_info_normal.type = "noshow" + } + log_to_file_queue(req.body.uuid, "[Starting] Checking user profiles advanced") + user_info_normal.data = await find_username_advanced(req); + log_to_file_queue(req.body.uuid, "[Done] Checking user profiles advanced") + } + if (req.body.option.includes("LookUps")) { + log_to_file_queue(req.body.uuid, "[Starting] Lookup") + await check_engines(req, info); + log_to_file_queue(req.body.uuid, "[Done] Lookup") + } + if (req.body.option.includes("SplitWordsByUpperCase")) { + try { + req.body.string.match(/[A-Z][a-z]+/g).forEach((item) => { + if (item.length > 1 && !all_words.unknown.includes(item) && !all_words.maybe.includes(item)) { + all_words.unknown.push(item.toLowerCase()); + } + }); + log_to_file_queue(req.body.uuid, "[Done] Split by UpperCase") + } catch (err) {} + } + + if (req.body.option.includes("SplitWordsByAlphabet")) { + try { + req.body.string.match(/[A-Za-z]+/g).forEach((item) => { + if (item.length > 1 && !all_words.unknown.includes(item) && !all_words.maybe.includes(item)) { + all_words.unknown.push(item.toLowerCase()); + } + }); + log_to_file_queue(req.body.uuid, "[Done] Split by Alphabet") + } catch (err) {} + } + + req.body.string = req.body.string.toLowerCase(); + + if (req.body.option.includes("ConvertNumbers")) { + numbers_to_letters = { + "4": "a", + "8": "b", + "3": "e", + "1": "l", + "0": "o", + "5": "s", + "7": "t", + "2": "z" + } + + temp_value = "" + for (i = 0; i < req.body.string.length; i++) { + _temp = numbers_to_letters[req.body.string.charAt(i)] + if (_temp != undefined) { + temp_value += numbers_to_letters[req.body.string.charAt(i)]; + } else { + temp_value += req.body.string.charAt(i); + } + } + req.body.string = temp_value + log_to_file_queue(req.body.uuid, "[Done] Convert numbers to letters") + } + + if (req.body.option.includes("LookUps") || + req.body.option.includes("WordInfo") || + req.body.option.includes("MostCommon") || + req.body.option.includes("SplitWordsByUpperCase") || + req.body.option.includes("SplitWordsByAlphabet") || + req.body.option.includes("FindSymbols") || + req.body.option.includes("FindNumbers") || + req.body.option.includes("ConvertNumbers")) { + if (req.body.option.includes("FindNumbers")) { + try { + req.body.string.match(/(\d+)/g).forEach((item) => { + if (!all_words.number.includes(item)) { + all_words.number.push(item); + } + }); + } catch (err) {} + } + + if (req.body.option.includes("FindSymbols")) { + try { + req.body.string.match(/[ \[\]:"\\|,.<>\/?~`!@#$%^&*()_+\-={};']/gi).forEach((item) => { + if (item !== " " && !all_words.symbol.includes(item)) { + all_words.symbol.push(item); + } + }); + } catch (err) {} + } + + if (req.body.option.includes("SplitUpperCase")) { + req.body.string = req.body.string.replace(/([A-Z]+)/g, " $1"); + if (req.body.string.startsWith(" ")) { + req.body.string = req.body.string.substring(1); + } + } + all_words.maybe = WordsNinja.splitSentence(req.body.string).filter(function(elem, index, self) { + return index === self.indexOf(elem); + }).filter(word => word.length > 1); + await analyze_name(req, all_words); + //find_other(all_words) + Object.keys(all_words).forEach((key) => (all_words[key].length == 0) && delete all_words[key]); + + if (req.body.option.includes("MostCommon")) { + await most_common(all_words, temp_words); + } + if (req.body.option.includes("WordInfo")) { + await get_words_info(all_words, words_info); + } + } else if (req.body.option.includes("NormalAnalysis@@")) { + var maybe_words = WordsNinja.splitSentence(req.body.string); + all_words.maybe = maybe_words.filter(function(elem, index, self) { + return index === self.indexOf(elem); + }); + list_of_tokens = _tokenizer.tokenize(req.body.string); + list_of_tokens.forEach(function(item, index) { + if (item.tag in all_words) { + all_words[item.tag].push(item.token); + } else { + all_words[item.tag] = [] + all_words[item.tag].push(item.token); + } + }); + + Object.keys(all_words).forEach((key) => (all_words[key].length == 0) && delete all_words[key]); + } + res.json({ + info, + table: all_words, + common: temp_words, + words_info: words_info, + user_info_normal: user_info_normal, + user_info_advanced: user_info_advanced, + user_info_special: user_info_special + }); + } +}); + +app.use((err, req, res, next) => { + console.log(" --- Global Error ---") + console.log(pe.render(err)); + res.json("Error"); +}); + +process.on('uncaughtException', function(err) { + console.log(" --- Uncaught Error ---") + console.log(pe.render(err)); +}) + + +process.on('unhandledRejection', function(err) { + console.log(" --- Uncaught Rejection ---") + console.log(pe.render(err)); +}) + +const server_host = '0.0.0.0'; +const server_port = process.env.PORT || 9005; + + +async function check_user_cli(username,websites) { + var ret = [] + var random_string = Math.random().toString(36).substring(2); + var req = {'body':{'uuid':random_string, 'string':username, 'option':'FindUserProflesFast'}} + await parsed_sites.forEach(async function(value, i) { + parsed_sites[i].selected = "false" + if (websites.length > 0) { + await websites.split(' ').forEach(item => { + if (parsed_sites[i].url.toLowerCase().includes(item.toLowerCase())) { + parsed_sites[i].selected = "true" + } + }); + } + }); + ret = await find_username_normal(req) + if (typeof ret === 'undefined' || ret === undefined || ret.length == 0){ + log_to_file_queue(req.body.uuid,'User does not exist (try FindUserProflesSlow or FindUserProflesSpecial)'); + } + else{ + await ret.forEach(item => { + delete item['title'] + delete item['image'] + delete item['text'] + item['link'] = get_site_from_url(item['link']) + log_to_file_queue(req.body.uuid,item); + }); + } + //console.log(util.inspect(ret, { colors: true })); +}; + +async function list_all_websites() { + var temp_arr = [] + await parsed_sites.forEach(item => { + temp_arr.push(get_site_from_url(item.url)) + }); + console.log('[Listing] Available websites\n' + temp_arr.join('\n')) +} + +if ('cli' in argv) { + if ('list' in argv) + { + list_all_websites(); + } + else if ('user' in argv && 'website' in argv) { + if (argv.user != "" && argv.website != "") { + check_user_cli(argv.user,argv.website) + } else { + console.log("user or website is empty, use -h for help") + } + } +} else { + var server = app.listen(server_port, server_host, function() { + console.log("Server started at http://%s:%s/app.html", server_host, server_port); + }); +} diff --git a/info b/info index c5bdfda..d36097d 100644 --- a/info +++ b/info @@ -1,8 +1,8 @@ -{"version":"2020.V.01.15", +{"version":"2020.V.01.16", "build":"pass", "test":"pass", "websites":"255", "detections":"765", "special":"1", "awaiting_verification":"64", - "auto_testing":"5ebdf895-46ae-4d37-89d8-da427b6609d1"} + "auto_testing":"ebe64ae3-3d15-46f7-82e3-57c047cf47d8"} diff --git a/package.json b/package.json index d75d5e9..cd6a04b 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "server.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "start": "node server.js" + "start": "node app.js" }, "dependencies": { "async": "3.2.0", @@ -26,7 +26,8 @@ "semver": "7.3.4", "tmp": "0.2.1", "wink-tokenizer": "1.1.0", - "wordsninja": "1.0.0" + "wordsninja": "1.0.0", + "yargs": "16.2.0" }, "author": "QeeqBox", "license": "AGPL 3.0" diff --git a/sites.json b/sites.json index 00879f2..972d255 100644 --- a/sites.json +++ b/sites.json @@ -1760,7 +1760,7 @@ "implicit": 0 }, { - "url": "https://www.fl.ru/users/{username}/portfolio", + "url": "https://fl.ru/users/{username}/portfolio", "detections": [{ "return": "false", "string": "404 Not Found", @@ -2082,7 +2082,7 @@ "implicit": 0 }, { - "url": "https://www.fotolog.com/author/{username}", + "url": "https://fotolog.com/author/{username}", "detections": [{ "return": "false", "string": "That page doesn’t exist or is private", @@ -2126,7 +2126,7 @@ "implicit": 0 }, { - "url": "https://www.freelancer.com/u/{username}", + "url": "https://freelancer.com/u/{username}", "detections": [{ "return": "false", "string": "Looks like the page you are looking", @@ -4389,7 +4389,7 @@ "implicit": 0 }, { - "url": "https://www.quora.com/profile/{username}", + "url": "https://quora.com/profile/{username}", "detections": [{ "return": "false", "string": "Page Not Found",