Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // AUTHOR GIENETIC + FIX NORMALIZER
- const axios = require("axios");
- const qs = require("qs");
- const BASE_URL_RESI = "https://loman.id/resapp/";
- const BASE_URL_ONGKIR = "https://loeman.loman.id/";
- const HEADER_DEFAULT = {
- "user-agent": "Dart/3.6 (dart:io)",
- "accept-encoding": "gzip",
- };
- /**
- * Cek status pengiriman berdasarkan nomor resi dan ekspedisi.
- * Hasil selalu dinormalisasi agar seragam.
- */
- async function cekResi(resi, ekspedisi) {
- try {
- const payload = qs.stringify({ resi, ex: ekspedisi });
- const response = await axios.post(BASE_URL_RESI, payload, {
- headers: {
- ...HEADER_DEFAULT,
- "content-type": "application/x-www-form-urlencoded; charset=utf-8",
- },
- });
- const raw = response.data;
- if (raw.status !== "berhasil") {
- return {
- status: "gagal",
- message: raw.message || raw.details || "Resi tidak ditemukan",
- };
- }
- // Normalisasi ke format konsisten
- const details = raw.details || raw.infopengiriman || {};
- const history = raw.history || raw.tracking || [];
- return {
- status: "berhasil",
- details: {
- status: details.status || raw.status || "-",
- infopengiriman:
- details.infopengiriman ||
- raw.infopengiriman ||
- "Tidak ada info pengiriman",
- ucapan:
- details.ucapan ||
- raw.ucapan ||
- "Selamat paket berhasil dilacak",
- },
- history: history.map((h) => ({
- tanggal: h.tanggal || h.date || "-",
- details: h.details || h.desc || h.keterangan || "-",
- })),
- };
- } catch (error) {
- return {
- status: "gagal",
- message: error.message,
- };
- }
- }
- /**
- * Cek ongkos kirim antar lokasi (kab/kota/kecamatan).
- */
- async function cekOngkir(asal, tujuan, berat) {
- try {
- const asalResult = await cariIdKotaDenganSaran(asal);
- const tujuanResult = await cariIdKotaDenganSaran(tujuan);
- if (!asalResult.id || !tujuanResult.id) {
- let pesan = `Lokasi `;
- if (!asalResult.id) pesan += `asal \"${asal}\" tidak ditemukan.`;
- if (!tujuanResult.id)
- pesan += `${!asalResult.id ? "\n" : ""}tujuan \"${tujuan}\" tidak ditemukan.`;
- const saran = [];
- if (asalResult.saran.length)
- saran.push(
- `🔍 Mungkin maksud asal:\n- ${asalResult.saran.map((x) => x.nama).join("\n- ")}`,
- );
- if (tujuanResult.saran.length)
- saran.push(
- `🔍 Mungkin maksud tujuan:\n- ${tujuanResult.saran.map((x) => x.nama).join("\n- ")}`,
- );
- return {
- status: "gagal",
- message: `${pesan}${saran.length ? "\n\n" + saran.join("\n\n") : ""}`,
- };
- }
- const payload = {
- idAsal: asalResult.id,
- idTujuan: tujuanResult.id,
- berat: String(berat),
- };
- const response = await axios.post(BASE_URL_ONGKIR, payload, {
- headers: {
- ...HEADER_DEFAULT,
- "content-type": "application/json; charset=utf-8",
- },
- });
- return {
- ...response.data,
- detail: {
- dari: asalResult.nama,
- menuju: tujuanResult.nama,
- berat: berat + " kg",
- },
- };
- } catch (error) {
- return {
- status: "gagal",
- message: error.message,
- };
- }
- }
- /**
- * Ambil daftar ekspedisi dari API.
- */
- async function cekEkspedisi() {
- try {
- const res = await axios.get(BASE_URL_RESI + "getdropdown.php", {
- headers: HEADER_DEFAULT,
- });
- return res.data.status === "berhasil"
- ? res.data.data.map((item) => item.title)
- : [];
- } catch (error) {
- return [];
- }
- }
- /**
- * Cari daftar lokasi berdasarkan keyword (bisa kota/kecamatan/kabupaten).
- */
- async function cariKota(keyword) {
- try {
- const url = `${BASE_URL_ONGKIR}?cari=${encodeURIComponent(keyword)}`;
- const response = await axios.get(url, { headers: HEADER_DEFAULT });
- return Array.isArray(response.data) ? response.data : [];
- } catch (error) {
- return [];
- }
- }
- /**
- * Ambil ID lokasi dan saran berdasarkan nama lokasi.
- */
- async function cariIdKotaDenganSaran(namaKota) {
- const keywords = namaKota.toLowerCase().split(/\s+/).filter(Boolean);
- const candidates = await Promise.all(keywords.map((k) => cariKota(k)));
- const semua = Object.values(
- [].concat(...candidates).reduce((acc, item) => {
- acc[item.id] = item;
- return acc;
- }, {}),
- );
- const cocok = semua.find((item) => {
- const name = item.nama.toLowerCase();
- return keywords.every((k) => name.includes(k));
- });
- return {
- id: cocok ? cocok.id : null,
- nama: cocok ? cocok.nama : namaKota,
- saran: cocok ? [] : semua.slice(0, 5),
- };
- }
- module.exports = {
- cekResi,
- cekOngkir,
- cekEkspedisi,
- };
Advertisement
Add Comment
Please, Sign In to add comment