From 33ff6cea9dac1965feb81689bb476ce479b215c4 Mon Sep 17 00:00:00 2001 From: Daniel Odendahl Jr Date: Tue, 28 Aug 2018 17:01:30 +0000 Subject: [PATCH] Scrape google, fall back to custom search, then lmgtfy --- commands/search/google.js | 48 +++++++++++++++++++++++++++++++-------- package.json | 2 +- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/commands/search/google.js b/commands/search/google.js index d828df3c..4a6d5ac2 100644 --- a/commands/search/google.js +++ b/commands/search/google.js @@ -1,5 +1,7 @@ const Command = require('../../structures/Command'); const request = require('node-superfetch'); +const cheerio = require('cheerio'); +const querystring = require('querystring'); const { GOOGLE_KEY, CUSTOM_SEARCH_ID } = process.env; module.exports = class GoogleCommand extends Command { @@ -25,18 +27,44 @@ module.exports = class GoogleCommand extends Command { } async run(msg, { query }) { + let href; try { - const { body } = await request - .get('https://www.googleapis.com/customsearch/v1') - .query({ - key: GOOGLE_KEY, - cx: CUSTOM_SEARCH_ID, - q: query - }); - if (!body.items) return msg.say('Could not find any results.'); - return msg.say(body.items[0].formattedUrl); + href = await this.searchGoogle(query, msg.channel.nsfw); } catch (err) { - return msg.say(`http://lmgtfy.com/?iie=1&q=${encodeURIComponent(query)}`); + try { + href = await this.customSearch(query, msg.channel.nsfw); + } catch (err) { + href = `http://lmgtfy.com/?iie=1&q=${encodeURIComponent(query)}`; + } } + if (!href) return msg.say('Could not find any results.'); + return msg.say(href); + } + + async searchGoogle(query, nsfw) { + const { text } = await request + .get('https://www.google.com/search') + .query({ + safe: nsfw ? 'off' : 'on', + q: query + }); + const $ = cheerio.load(text); + let href = $('.r').first().find('a').first().attr('href'); + if (!href) return null; + href = querystring.parse(href.replace('/url?', '')); + return href.q; + } + + async customSearch(query, nsfw) { + const { body } = await request + .get('https://www.googleapis.com/customsearch/v1') + .query({ + key: GOOGLE_KEY, + cx: CUSTOM_SEARCH_ID, + safe: nsfw ? 'off' : 'active', + q: query + }); + if (!body.items) return null; + return body.items[0].formattedUrl; } }; diff --git a/package.json b/package.json index 8235e98a..045d9055 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "xiao", - "version": "87.5.0", + "version": "87.5.1", "description": "Your personal server companion.", "main": "Xiao.js", "scripts": {