node-goo
Version:
A command line google/question answering utility
90 lines (75 loc) • 2.05 kB
JavaScript
;
var request = require('request');
var cheerio = require('cheerio');
var url = require('url');
var htmlentities = require('html-entities').AllHtmlEntities;
var Strategies = require('../../strategies');
var Cache = require('../cache/Cache');
var ChalkHelper = require('../../helpers').ChalkHelper;
module.exports = {
Search: Search,
More: More,
Again: Again
};
function Search(query, n) {
Cache.writeLastRequest(query, n);
var url = 'https://google.com/search?q=' + query;
return Cache.get(url)
.then(function(results) {
return results;
})
.then(filterResults)
.then(function(results) {
return getResultHTML(results[0], n);
}).then(ChalkHelper.prettyPrint.bind(query));
}
function More() {
var last = lastCaress();
if(last) {
Search(last.query, last.n + 1).then(function(data) {
Cache.writeLastRequest(last.query, last.n + 1);
})
}
}
function Again() {
var last = lastCaress();
if (last) {
Search(last.query, 0);
}
}
function lastCaress() {
var last_query = Cache.getLastRequest();
if (last_query == null) {
console.log('No Last Query! IDIOT');
return null;
}
return last_query;
}
function getResultHTML(result, n) {
return Cache.get(result.href).then(function(data) {
for (var strat in Strategies) {
if (Strategies[strat].Domain === result.hostname) {
return Strategies[strat].Scrape(data, n);
}
}
});
}
function filterResults(html) {
var $ = cheerio.load(html);
var allResults = $('.g .r a[href^="/url"]');
var filteredResults = [];
allResults.each(function(i, el) {
var urlObj = getUrlFromResult(el);
for (var service in Strategies) {
if (urlObj.host.indexOf(Strategies[service].Domain) != -1) {
filteredResults.push(urlObj);
}
}
});
return filteredResults;
}
function getUrlFromResult(el) {
var x = htmlentities.decode(el.attribs.href);
var decodedUrl = url.parse(htmlentities.decode(el.attribs.href), true);
return url.parse(decodedUrl.query.q);
}