mono/packages/search/dist-in/lib/googlemaps.js
2026-01-20 18:25:36 +01:00

492 lines
44 KiB
JavaScript

import * as path from 'path';
import { CONFIG_DEFAULT, DEFAULT_ROOTS, pathInfo, filesEx } from '@polymech/commons';
import { cleanObjectStrings } from './googlemaps-utils.js';
import { parse as parseProfile } from '@polymech/commons/profile';
import { isFile, resolve, substitute } from '@polymech/commons';
import { zodSchema, zodSchemaEach, yargsOptions, yargsOptionsEach, ResolveFlags, } from './googlemaps-zod.js';
import { parseCustomUrl, resolvePath } from './googlemaps-utils.js';
export { zodSchema, zodSchemaEach, yargsOptions, yargsOptionsEach, ResolveFlags };
import { clone } from '../options.js';
import { sync as write } from '@polymech/fs/write';
import { sync as read } from '@polymech/fs/read';
import { sync as exists } from '@polymech/fs/exists';
import { isArray, isObject } from '@polymech/core/primitives';
import pMap from 'p-map';
import { get_cached_object, set_cached_object } from '@polymech/cache/lib';
import { OSR_CACHE } from '@polymech/commons';
import { logger } from '../index.js';
import { cleanOptions, SearchProviders } from './providers.js';
import { findEMail } from './email.js';
import { defaultEngine, defaultFromLocation, defaultGoogleDomain, defaultLanguage, PAGE_SIZE, SEARCH_AI_PROMPTS } from './constants.js';
import { meta } from './html.js';
import { reverse, REVERSE_DEFAULT } from './geo.js';
import { writeReport } from '../lib/report_map.js';
import { geocode_forward } from './geo.js';
import { store as getStore } from '@polymech/registry';
import axios from 'axios';
const MODULE_NAME = 'osr-search';
const queryExtras = '';
export var SearchQueriesES;
(function (SearchQueriesES) {
SearchQueriesES["INJECTION"] = "inyecci\u00F3n de plastico";
})(SearchQueriesES || (SearchQueriesES = {}));
export const locationString = (coords, zoom = 13) => `@${coords},${zoom}z`;
export const store = async (storePath, ns = 'osr-search') => getStore(storePath, ns);
export const getStored = async (title, storePath, ns = 'osr-search') => getStore(storePath, ns).get(title);
export const searchVendor = async (name, dst, opts) => {
let q = name;
let ret = await SearchProviders.scaleserp({
api_key: opts.api_key,
q: q + queryExtras,
});
let urls = ret.organic_results.filter((u) => {
return !opts.blacklist.includes(new URL(u.link).hostname);
});
urls = urls.map((u) => u.link);
dst && write(dst, urls);
return urls;
};
export const defaultParamsGoogleES = (query, mixin) => {
return {
location: defaultFromLocation,
hl: defaultLanguage,
gl: defaultLanguage,
google_domain: defaultGoogleDomain,
q: query,
...mixin
};
};
export const defaultSearchParamsMapsES = (query, zoom, mixin = {}) => {
return {
engine: defaultEngine,
type: 'search',
q: query,
ll: locationString('41.6911354,2.1652746', zoom),
google_domain: defaultGoogleDomain,
hl: defaultLanguage,
...mixin,
};
};
export const searchVendorSA = async (query, location, key, opts) => {
const googleParams = {
api_key: key,
location: location,
hl: "en",
gl: "us",
google_domain: "google.com",
...opts,
q: query + queryExtras,
};
return await SearchProviders.serpApi("google", googleParams);
};
export const searchGoogleMap = async (query, key, opts) => {
const roundCoords = (coords, decimals = 3) => {
const [latitude, longitude, zoom] = coords.split(',').map((part, index) => {
if (index < 2) {
return parseFloat(parseFloat(part).toFixed(decimals));
}
return part;
});
return `@${latitude},${longitude},${zoom}`;
};
const googleParams = {
...opts,
api_key: key,
q: query + queryExtras,
ll: opts.searchCoord
};
let results = [];
let pageIdx = 0;
let index = opts.index ? read(opts.index, 'json') || {} : {};
const params = googleParams;
let cached;
const cache_key = {
engine: params.engine,
type: params.type,
q: params.q,
google_domain: params.google_domain,
hl: params.hl,
zoom: params.zoom,
searchFrom: params.searchFrom,
limit: params.limit
};
if (opts.searchCache && OSR_CACHE()) {
cached = await get_cached_object(cache_key, MODULE_NAME);
}
let page = cached || await SearchProviders.serpApi(googleParams.engine, {
...googleParams
});
while (page && page.local_results) {
page.local_results.forEach((r) => {
r.page = pageIdx;
});
results.push(...page.local_results);
if (results.length >= opts.limit)
break;
pageIdx++;
page = await page.next?.();
}
if (page && page.place_results && !isArray(page.place_results)) {
page.place_results = [page.place_results];
}
while (page && page.place_results) {
page.place_results.forEach((r) => {
r.page = pageIdx;
});
results.push(...page.place_results);
if (results.length >= opts.limit)
break;
pageIdx++;
page = await page.next?.();
}
if (opts.searchCache && OSR_CACHE()) {
set_cached_object(cache_key, MODULE_NAME, results);
}
let idx = 0;
//const cachedLoc = async (title: string) => getStored(title, opts.store, MODULE_NAME)
await enrichResults(results, index, opts);
logger.debug(`search ${query} with ${params.ll} / ${params.searchFrom} @ ${opts.zoom} | ${results.length} results before filters`);
if (opts.filterCity) {
results = results.filter((r) => r.geo.city.toLowerCase() === opts.filterCity.toLowerCase());
}
if (opts.filterCountry) {
results = results.filter((r) => r.geo.countryName.toLowerCase() === opts.filterCountry.toLowerCase());
}
if (opts.filterContinent) {
results = results.filter((r) => r.geo.continent.toLowerCase() === opts.filterContinent.toLowerCase());
}
if (opts.filterType) {
results = results.filter((r) => r.type === opts.filterType);
}
if (opts.excludedTypes && opts.excludedTypes.length > 0) {
results = results.filter((r) => {
// If result has no types, keep it (conservative)
if (!r.types || r.types.length === 0)
return true;
// If ANY of result types matches ANY of excluded types, filter it OUT
return !r.types.some(t => opts.excludedTypes.includes(t));
});
}
results = results.filter((r) => r.gps_coordinates);
const beforeCached = results.length;
const newResults = results.filter((r) => {
return index[r.title] == null || !index[r.title].geo || !index[r.title].meta;
});
logger.info(`found ${newResults.length} new items for "${query}" (Zoom: ${opts.zoom} | Limit: ${opts.limit}) from "${params.searchFrom}" | ${beforeCached} total before cache filtering`);
const processedResults = newResults.slice(0, opts.limit);
await enrichResults(processedResults, index, opts);
return results;
};
const enrichResults = async (results, index, opts) => {
let idx = 0;
await pMap(results, async (entry) => {
idx++;
entry.position = entry.page * PAGE_SIZE + idx;
try {
if (index[entry.title] && index[entry.title].geo) {
entry.geo = index[entry.title].geo;
return;
}
return reverse(entry, opts);
}
catch (e) {
logger.error(`Error reverse geocoding ${entry.title}`);
entry.geo = REVERSE_DEFAULT;
}
}, { concurrency: opts.concurrency });
if (opts.meta) {
await pMap(results, (entry) => {
if (entry.meta || !entry.website || entry.rejected) {
return;
}
try {
if (index[entry.title] && index[entry.title].meta) {
entry.meta = index[entry.title].meta;
return;
}
return meta(entry, opts);
}
catch (e) {
// entry.meta = {}
}
}, { concurrency: 1 });
}
if (opts.findEMail && opts.meta) {
await pMap(results, async (entry) => {
if (index[entry.title] && index[entry.title].email) {
entry.email = index[entry.title].email;
return;
}
if (entry.meta && entry.website && !entry.email) {
try {
return findEMail(SEARCH_AI_PROMPTS.GET_EMAIL, entry.website, opts, entry);
}
catch (e) {
logger.error(`Error retrieving EMail data ${entry.title}`);
}
}
}, { concurrency: 1 });
}
if (opts.resolve?.includes(ResolveFlags.PHOTOS)) {
await pMap(results, async (entry) => {
if (entry.google_media || !entry.data_id) {
return;
}
if (index[entry.title] && index[entry.title].google_media) {
entry.google_media = index[entry.title].google_media;
return;
}
try {
if (!entry.photos_link)
return;
const url = `${entry.photos_link}&api_key=${opts.api_key}`;
const response = await axios.get(url);
const photos = response.data;
if (photos) {
entry.google_media = photos;
}
}
catch (e) {
logger.error(`Error retrieving photo data for ${entry.title}`, e);
}
}, { concurrency: opts.concurrency });
}
return results;
};
export const parse = (argv) => {
const args = argv;
logger.settings.minLevel = args.logLevel || 2;
const config = CONFIG_DEFAULT(args.env_key);
if (!config) {
logger.warn('No config found!');
return;
}
if (config && !config.serpapi.key) {
logger.warn('No serpapi key found in config!');
return;
}
let opts = {
query: argv.query,
...defaultSearchParamsMapsES(argv.query, argv.zoom),
...argv,
api_key: argv.api_key || config.serpapi.key,
geocode_key: argv.geocode_key || config.geocoder.key,
openai: config.openai,
headless: argv.headless ? true : false,
bigdata: { key: config.bigdata.key }
};
opts = zodSchema().parse(opts);
/*
opts.source && isString(opts.source) && (opts.source = path.resolve(resolve(args.source, false)))
if (opts.source && isString(opts.source)) {
if (exists(opts.source)) {
opts.source = read(opts.source, 'json')
} else {
logger.error(`Source file ${args.source} not found : ${opts.source}`)
return
}
}
*/
if (!opts.source && !opts.query) {
logger.warn(`Invalid source and query`);
return;
}
if (opts.index) {
opts.index = path.resolve(resolve(opts.index, false));
}
if (opts.store) {
opts.store = path.resolve(resolve(opts.store, false));
}
if (!opts.api_key) {
logger.error('No Serpapi key found in config or options!');
return;
}
if (!opts.query) {
logger.error('No query specified');
return;
}
return opts;
};
export const googleMaps = async (opts) => {
opts = parse(opts);
if (!opts) {
logger.error('Invalid options', opts);
return;
}
try {
const searchFrom = substitute(false, opts.searchFrom, opts.variables);
if (searchFrom && opts.geocode_key && !opts.searchCoord) {
const coords = await geocode_forward(searchFrom, opts.geocode_key);
if (coords) {
opts.searchCoord = locationString(coords, opts.zoom);
}
else {
logger.error(`Error geocoding "${searchFrom}"`);
}
}
}
catch (error) {
logger.error(`Error geocoding "${opts.searchFrom}"`, error, error.stack);
}
let ret = [];
const search = async (query, category, opts) => {
opts = clone(opts);
if (opts.dst) {
opts.dst = resolvePath(path.join(opts.cwd || '', opts.dst || ''), query, category, opts);
logger.debug(`output destination --dst "${opts.dst}"`);
}
if (opts.dst && opts.cache !== false && exists(opts.dst + '.json')) {
const cachedPath = opts.dst + '.json';
const cached = read(cachedPath, 'json') || [];
logger.debug(`Searching ${opts.query} with ${opts.searchFrom} :: returning cached ${cached.length}`);
ret = [...ret, ...cached];
return cached;
}
try {
const sr = await searchGoogleMap(query, opts.api_key, { ...opts });
if (sr && sr.length && opts.dst) {
write(opts.dst + '.json', sr);
writeReport(sr, opts.dst, opts);
const parts = path.parse(opts.dst);
write(path.join(parts.dir, parts.name + '_options.json'), cleanOptions(opts));
}
ret = [...ret, ...sr];
return sr;
}
catch (error) {
logger.error('Error searching GoogleMaps : ' + error.message, error, error.stack);
return [];
}
};
// @todos : retry, ...
const all = (await pMap(Object.keys(opts.source), (k) => {
return pMap(opts.source[k], (t) => {
return search(t, k, opts);
}, {
concurrency: 1,
});
}, {
concurrency: 1,
})).flat(2);
if (opts.dst) {
opts.dst = resolvePath(opts.dst, 'all', 'all', opts);
let existingResults = [];
if (exists(opts.dst + '.json')) {
existingResults = read(opts.dst + '.json', 'json') || [];
}
// Combine, deduplicate, clean, and process URLs in a single chain
const finalResults = Array.from([...existingResults, ...ret].reduce((map, obj) => {
if (obj.place_id) {
map.set(obj.place_id, obj);
}
return map;
}, new Map()).values()).map(cleanObjectStrings)
.map((r) => {
if (r.website && typeof r.website === 'string' && r.website.startsWith('/url?q=')) {
try {
const urlString = r.website.substring('/url?q='.length);
const decodedUrl = decodeURIComponent(urlString);
const urlParts = decodedUrl.split('&');
r.website = urlParts[0];
}
catch (e) {
logger.warn(`Could not parse website URL: ${r.website}`);
}
}
return r;
});
write(opts.dst + '.json', finalResults);
writeReport(finalResults, opts.dst, opts);
}
if (opts.index) {
let index = read(opts.index, 'json') || {};
ret.forEach((r) => {
if (!index[r.title]) {
index[r.title] = r;
}
});
write(opts.index, index);
}
return all;
};
export const migrate = async (opts) => {
if (!opts.store) {
logger.error('No store provided');
return;
}
if (!opts.index) {
logger.error('No index provided');
return;
}
let index = read(opts.index, 'json') || {};
if (!isArray(index) && isObject(index)) {
index = Object.keys(index).map((k) => index[k]);
}
const ns = 'osr-search';
let _store = store(opts.store, ns);
const ret = await pMap(index, async (r) => {
// return _store.set(r.title, r)
});
return ret;
};
export const each = async (opts) => {
logger.settings.minLevel = opts.logLevel || 2;
let items = [];
if (!opts.list) {
logger.error('No list provided for each command');
return;
}
let listPath = path.resolve(resolve(opts.list));
const profile = parseProfile(opts.profile, {
variables: {
AREA: opts.area,
COUNTRY: opts.country,
...DEFAULT_ROOTS
}, includes: [], env: {}
}, { env: opts.env });
opts = parse(opts);
if (!opts) {
logger.error('Invalid options', opts);
return;
}
if (opts.migrate) {
return migrate(opts);
}
const list = await parseCustomUrl(substitute(false, opts.list, profile.variables));
if (isArray(list)) {
items = list;
}
else if (exists(listPath) && isFile(listPath) && path.parse(listPath).ext === '.json') {
items = read(listPath, 'json') || [];
}
else if (pathInfo(opts.list).IS_GLOB) {
items = filesEx(path.resolve(resolve(opts.cwd)) || './', opts.list) || [];
}
if (!items || items.length === 0) {
logger.error('osr-cli::each: invalid list or empty list');
return;
}
items = items.filter((item) => !!item);
logger.debug(`${items.length} items`);
write(path.join(path.resolve(resolve(opts.cwd), 'list.json')), items);
const all = await pMap(items, (KEY) => {
const variables = {
KEY,
TOWN: KEY,
...profile.variables
};
const googleOpts = {
...opts,
query: substitute(false, opts.query, variables),
dst: substitute(false, opts.dst, variables),
searchFrom: substitute(false, opts.searchFrom, variables),
variables
};
const ret = googleMaps(googleOpts);
return ret;
}, { concurrency: 1 });
opts.log && write(path.resolve(resolve(opts.log)), all);
return all;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlbWFwcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZ29vZ2xlbWFwcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQTtBQUU1QixPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBWSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDOUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFFMUQsT0FBTyxFQUFFLEtBQUssSUFBSSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQTtBQUVqRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUUvRCxPQUFPLEVBQ0gsU0FBUyxFQUNULGFBQWEsRUFDYixZQUFZLEVBQ1osZ0JBQWdCLEVBS2hCLFlBQVksR0FDZixNQUFNLHFCQUFxQixDQUFBO0FBQzVCLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDbkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFvRyxZQUFZLEVBQUUsQ0FBQTtBQUVuTCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRXJDLE9BQU8sRUFBRSxJQUFJLElBQUksS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDbEQsT0FBTyxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsSUFBSSxJQUFJLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ3BELE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFZLE1BQU0sMkJBQTJCLENBQUE7QUFDdkUsT0FBTyxJQUFJLE1BQU0sT0FBTyxDQUFBO0FBQ3hCLE9BQU8sRUFBRSxp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