duck-duck-scrape
Version:
Search from DuckDuckGo and use it's spice APIs.
82 lines (81 loc) • 3.26 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseSpiceBody = exports.ensureJSON = exports.getVQD = exports.queryString = exports.SearchTimeType = exports.SafeSearchType = exports.COMMON_HEADERS = exports.VQD_REGEX = exports.SPICE_BASE = void 0;
const needle_1 = __importDefault(require("needle"));
/** @internal */
exports.SPICE_BASE = 'https://duckduckgo.com/js/spice';
/** @internal */
exports.VQD_REGEX = /vqd=['"](\d+-\d+(?:-\d+)?)['"]/;
/** @internal */
exports.COMMON_HEADERS = {
'sec-ch-ua': '"Not=A?Brand";v="8", "Chromium";v="129"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'sec-gpc': '1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'
};
/** The safe search values when searching DuckDuckGo. */
var SafeSearchType;
(function (SafeSearchType) {
/** Strict filtering, no NSFW content. */
SafeSearchType[SafeSearchType["STRICT"] = 0] = "STRICT";
/** Moderate filtering. */
SafeSearchType[SafeSearchType["MODERATE"] = -1] = "MODERATE";
/** No filtering. */
SafeSearchType[SafeSearchType["OFF"] = -2] = "OFF";
})(SafeSearchType = exports.SafeSearchType || (exports.SafeSearchType = {}));
/** The type of time ranges of the search results in DuckDuckGo. */
var SearchTimeType;
(function (SearchTimeType) {
/** From any time. */
SearchTimeType["ALL"] = "a";
/** From the past day. */
SearchTimeType["DAY"] = "d";
/** From the past week. */
SearchTimeType["WEEK"] = "w";
/** From the past month. */
SearchTimeType["MONTH"] = "m";
/** From the past year. */
SearchTimeType["YEAR"] = "y";
})(SearchTimeType = exports.SearchTimeType || (exports.SearchTimeType = {}));
function queryString(query) {
return new URLSearchParams(query).toString();
}
exports.queryString = queryString;
/**
* Get the VQD of a search query.
* @param query The query to search
* @param ia The type(?) of search
* @param options The options of the HTTP request
* @returns The VQD
*/
async function getVQD(query, ia = 'web', options) {
try {
const response = await (0, needle_1.default)('get', `https://duckduckgo.com/?${queryString({ q: query, ia })}`, options);
return exports.VQD_REGEX.exec(response.body)[1];
}
catch (e) {
throw new Error(`Failed to get the VQD for query "${query}".`);
}
}
exports.getVQD = getVQD;
function ensureJSON(body) {
if (body instanceof Buffer)
return JSON.parse(body.toString());
else if (typeof body === 'string')
return JSON.parse(body);
return body;
}
exports.ensureJSON = ensureJSON;
function parseSpiceBody(body, regex = /^ddg_spice_[\w]+\(\n?((?:.|\n)+)\n?\);?/) {
return JSON.parse(regex.exec(body.toString())[1]);
}
exports.parseSpiceBody = parseSpiceBody;