0
0
mirror of https://github.com/Maks1mS/free-ozon-dpr.git synced 2024-12-25 03:14:37 +03:00
free-ozon-dpr/scripts/update/ozon-wb-dpr.js

127 lines
3.1 KiB
JavaScript
Raw Normal View History

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;