2024-06-06 19:38:01 +03:00
|
|
|
|
import { distance } from "fastest-levenshtein";
|
|
|
|
|
import { getFinalURL, getTelegramMessage } from "../utils.js";
|
|
|
|
|
import { JSDOM } from "jsdom";
|
|
|
|
|
import { asyncMap } from "modern-async";
|
|
|
|
|
import fs from "node:fs/promises";
|
|
|
|
|
|
2024-06-08 19:23:22 +03:00
|
|
|
|
const OUTPUT_FILE = "data/03_ozon-wb-dpr.json";
|
|
|
|
|
|
2024-06-06 19:38:01 +03:00
|
|
|
|
const MAIN_URL = "https://t.me/ozon_wb_dpr/627";
|
|
|
|
|
|
|
|
|
|
const QR_FOR_PVZ_STRING = "QR для ПВЗ";
|
|
|
|
|
|
|
|
|
|
const closestObj = (str, arr, key) => {
|
|
|
|
|
let min_distance = Infinity;
|
|
|
|
|
let min_index = 0;
|
|
|
|
|
for (let i = 0; i < arr.length; i++) {
|
|
|
|
|
const dist = distance(str, arr[i][key]);
|
|
|
|
|
if (dist < min_distance) {
|
|
|
|
|
min_distance = dist;
|
|
|
|
|
min_index = i;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return arr[min_index];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
async function getPVZFromPost(post) {
|
|
|
|
|
const message = await getTelegramMessage(post);
|
|
|
|
|
const dom = new JSDOM(message.text);
|
|
|
|
|
const document = dom.window.document;
|
|
|
|
|
|
|
|
|
|
const linkElement = document.querySelector(
|
|
|
|
|
'a[href*="vk.cc"],a[href*="ozon.ru"]'
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const link = await getFinalURL(linkElement["href"]).then((u) => {
|
|
|
|
|
const final = new URL(u);
|
|
|
|
|
final.search = "";
|
|
|
|
|
return final.toString();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return link;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function getFromTelegram() {
|
|
|
|
|
const message = await getTelegramMessage(MAIN_URL);
|
|
|
|
|
|
|
|
|
|
const dom = new JSDOM(message.text);
|
|
|
|
|
const document = dom.window.document;
|
|
|
|
|
|
|
|
|
|
const links = document.querySelectorAll("a");
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
await asyncMap(links, async (link) => {
|
|
|
|
|
const textContent = link.textContent;
|
|
|
|
|
|
|
|
|
|
if (textContent.startsWith(QR_FOR_PVZ_STRING)) {
|
|
|
|
|
const address = textContent.replace(QR_FOR_PVZ_STRING, "").trim();
|
|
|
|
|
|
|
|
|
|
let postLink = link["href"];
|
|
|
|
|
// TEMP FIX
|
|
|
|
|
if (address === "г.Донецк, ул.Университетская, 76") {
|
|
|
|
|
postLink = "https://t.me/ozon_wb_dpr/774";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
name: `ПВЗ ${address}`,
|
|
|
|
|
address,
|
|
|
|
|
link: await getPVZFromPost(postLink),
|
|
|
|
|
operationTime: "пн-вс с 9:00 до 17:45",
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
).filter(Boolean);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function getFromSite() {
|
|
|
|
|
const res = await fetch("https://ozon-wb-dpr.ru/");
|
|
|
|
|
const html = await res.text();
|
|
|
|
|
|
|
|
|
|
const dom = new JSDOM(html);
|
|
|
|
|
const document = dom.window.document;
|
|
|
|
|
|
|
|
|
|
const scripts = document.querySelectorAll("script");
|
|
|
|
|
|
|
|
|
|
for (let script of scripts) {
|
|
|
|
|
if (script.textContent.includes('descr: "Бесплатный озон')) {
|
|
|
|
|
let x = script.textContent.split("[\n{\n").pop().split("\n},\n]")[0];
|
|
|
|
|
|
|
|
|
|
if (x) {
|
|
|
|
|
const points = new Function(`return [{${x}}]`)();
|
|
|
|
|
return points;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function ozonWbDpr() {
|
|
|
|
|
const telegramPoints = await getFromTelegram();
|
|
|
|
|
let points = (await getFromSite()).map((point) => ({
|
|
|
|
|
coordinates: [parseFloat(point["lng"]), parseFloat(point["lat"])],
|
|
|
|
|
name: point.title,
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
points = points.map((point) => {
|
|
|
|
|
const obj = closestObj(point.name, telegramPoints, "name");
|
|
|
|
|
return {
|
|
|
|
|
coordinates: point.coordinates,
|
|
|
|
|
...obj,
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await fs.writeFile(
|
2024-06-08 19:23:22 +03:00
|
|
|
|
OUTPUT_FILE,
|
2024-06-06 19:38:01 +03:00
|
|
|
|
JSON.stringify(
|
|
|
|
|
{
|
|
|
|
|
name: "ПВЗ ДНР",
|
|
|
|
|
source: MAIN_URL,
|
|
|
|
|
points,
|
|
|
|
|
},
|
|
|
|
|
undefined,
|
|
|
|
|
4
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default ozonWbDpr;
|