wolfyflutter

40. search cuaca [kreasi] [cuaca] [search] [www.google.com/maps/place] [cuaca.bmkg.go.id]

Jul 30th, 2025 (edited)
328
0
Never
9
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.     base   : https://cuaca.bmkg.go.id/ (provider cuaca & provider koordinat backup)
  3.              https://www.google.com/maps/ (provider koordinat)
  4.              https://www.gps-coordinates.net/ (provider koordinat backup)
  5.     fungsi : buat cek cuaca terbaru
  6.     note   : search locationnya aku pakai google maps, enak, gak kaku search
  7.              nya.. cobain aja hehe. skrep bisa search by query atau input
  8.              koordinat langsung. cek cara pakai di bawah ya!
  9.              sorry yak kalau kadang anomali result. wkwk.
  10.     node   : v24.4.0
  11.     update : 30 juli 2025
  12.     by     : wolep
  13.            
  14. */
  15. const cuaca = {
  16.     get url() {
  17.         return {
  18.             api_search_geo: `https://cuaca.bmkg.go.id/api/df/v1/adm/search`,
  19.             api_search_geo_2: `https://www.gps-coordinates.net/geoproxy`,
  20.             api_cuaca: `https://weather.bmkg.go.id/api/presentwx/coord`,
  21.             api_cuaca_warning: `https://cuaca.bmkg.go.id/api/v1/public/weather/warning`,
  22.         }
  23.     },
  24.  
  25.     get string() {
  26.         return {
  27.             gps: '9416bf2c8b1d4751be6a9a9e94ea85ca',
  28.             bmkg: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjFjNWFkZWUxYzY5MzM0NjY2N2EzZWM0MWRlMjBmZWZhNDcxOTNjYzcyZDgwMGRiN2ZmZmFlMWVhYjcxZGYyYjQiLCJpYXQiOjE3MDE1ODMzNzl9.D1VNpMoTUVFOUuQW0y2vSjttZwj0sKBX33KyrkaRMcQ'
  29.         }
  30.     },
  31.  
  32.     get baseHeaders() {
  33.         return {
  34.             'accept-encoding': 'gzip, deflate, br, zstd',
  35.         }
  36.     },
  37.  
  38.     validateCoordinate: function (what, input, startLimit, endLimit) {
  39.         let lat = parseFloat(input)
  40.         if (isNaN(lat) || !(lat >= startLimit && lat <= endLimit)) throw Error(`${what}`)
  41.     },
  42.  
  43.     validasiString: function (deskripsi, variabel) {
  44.         if (typeof (variabel) !== "string" || !variabel?.toString()?.trim().length) throw Error(`param ${deskripsi} harus string/number dan gak boleh kosong!`)
  45.     },
  46.  
  47.     mintaJson: async function (description, url, fetchOptions) {
  48.         try {
  49.             const response = await fetch(url, fetchOptions)
  50.             if (!response.ok) throw Error(`${response.status} ${response.statusText}\n${await response.text()}`)
  51.             const json = await response.json()
  52.             return json
  53.         } catch (error) {
  54.             throw Error(`gagal minta json: ${description}\nerror: ${error.message}`)
  55.         }
  56.     },
  57.  
  58.     cariKoordinat: async function (lokasiKamu) {
  59.         "use strict"
  60.         this.validasiString(`lokasi`, lokasiKamu)
  61.         const new_url = new URL(`https://www.google.com/s`)
  62.         new_url.search = new URLSearchParams({
  63.             "tbm": "map",
  64.             "gs_ri": "maps",
  65.             "suggest": "p",
  66.             "authuser": "0",
  67.             "hl": "en",
  68.             "gl": "id",
  69.             "psi": "2OKJaLzkJKOe4-EPttbSoQQ.1753866977195.1",
  70.             "q": lokasiKamu,
  71.             "ech": "22",
  72.             "pb": "!2i22!4m12!1m3!1d130622.22!2d22.22!3d-22.22!2m3!1f0!2f0!3f0!3m2!1i477!2i636!4f13.1!7i20!10b1!12m24!1m5!18b1!30b1!31m1!1b1!34e1!2m3!5m1!6e2!20e3!10b1"+
  73.             "!12b1!13b1!16b1!17m1!3e1!20m4!5e2!6b1!8b1!14b1!46m1!1b0!96b1!19m4!2m3!1i360!2i120!4i8!20m57!2m2!1i203!2i100!3m2!2i4!5b1!6m6!1m2!1i86!2i86!1m2!1i408!2i240!7m33"+
  74.             "!1m3!1e1!2b0!3e3!1m3!1e2!2b1!3e2!1m3!1e2!2b0!3e3!1m3!1e8!2b0!3e3!1m3!1e10!2b0!3e3!1m3!1e10!2b1!3e2!1m3!1e10!2b0!3e4!1m3!1e9!2b1!3e2!2b1!9b0!15m8!1m7!1m2!1m1!1e2"+
  75.             "!2m2!1i195!2i195!3i20!22m3!1s2OKJaLzkJKOe4-EPttbSoQQ!7e81!17s2OKJaLzkJKOe4-EPttbSoQQ:79!23m2!4b1!10b1!24m112!1m32!13m9!2b1!3b1!4b1!6i1!8b1!9b1!14b1!20b1!25b1!18m21"+
  76.             "!3b1!4b1!5b1!6b1!9b1!12b1!13b1!14b1!17b1!20b1!21b1!22b1!25b1!27m1!1b0!28b0!32b1!33m1!1b1!34b1!36e2!10m1!8e3!11m1!3e1!14m1!3b0!17b1!20m2!1e3!1e6!24b1!25b1!26b1!27b1"+
  77.             "!29b1!30m1!2b1!36b1!37b1!39m3!2m2!2i1!3i1!43b1!52b1!54m1!1b1!55b1!56m1!1b1!61m2!1m1!1e1!65m5!3m4!1m3!1m2!1i224!2i298!72m22!1m8!2b1!5b1!7b1!12m4!1b1!2b1!4m1!1e1!4b1!8m10"+
  78.             "!1m6!4m1!1e1!4m1!1e3!4m1!1e4!3sother_user_google_review_posts__and__hotel_and_vr_partner_review_posts!6m1!1e1!9b1!89b1!98m3!1b1!2b1!3b1!103b1!113b1!114m3!1b1!2m1!1b1!117b1"+
  79.             "!122m1!1b1!125b0!126b1!127b1!26m4!2m3!1i80!2i92!4i8!34m19!2b1!3b1!4b1!6b1!8m6!1b1!3b1!4b1!5b1!6b1!7b1!9b1!12b1!14b1!20b1!23b1!25b1!26b1!31b1!37m1!1e81!47m0!49m10!3b1!6m2!1b1!2b1!7m2!1e3!2b1!8b1!9b1!10e2!61b1!67m5!7b1!10b1!14b1!15m1!1b0!69i742"
  80.         })
  81.         const response = await fetch(new_url, {headers : this.baseHeaders})
  82.         if (!response.ok) throw Error (`${response.status} ${response.statusText}. google maps not ok!`)
  83.         const data = await response.text()
  84.         const hasil = data.split("\n")[1].trim()
  85.         const ar = eval(hasil)
  86.         //console.log(JSON.stringify(ar, null, 2))
  87.  
  88.         const flatArray = [...new Set(ar.flat(7).filter(v => v))]
  89.         const dumpKoordinat = flatArray.filter(v => typeof (v) != "string" && !Number.isInteger(v))
  90.         const latitude = dumpKoordinat[0]
  91.         const longitude = dumpKoordinat[1]
  92.         const dumpPlace = flatArray.filter(v => typeof (v) === "string")
  93.         const placeName = dumpPlace[1].split(", ")[0]
  94.         const result = { placeName, latitude, longitude }
  95.         //console.log(result)
  96.         if (!longitude || !latitude) throw Error(`gagal mendapatkan koordinat ${lokasiKamu}`)
  97.         return result
  98.     },
  99.  
  100.  
  101.     getkWeatherByCoordinateBMKG: async function (latitude, longitude, placeName = "") {
  102.         // validasi koordinate dirty validate lol :v
  103.         try {
  104.             this.validateCoordinate(`latitude`, latitude, -12, 7)
  105.             this.validateCoordinate(`longitude`, longitude, 93, 142)
  106.         } catch (error) {
  107.             throw Error("aduh... gak ada data cuaca... " + error.message + "nya kejauhan wkwk")
  108.         }
  109.  
  110.         // padding end
  111.         const padEnd = 0
  112.  
  113.         const namaTempat = placeName.trim().length ? "📌 nama: ".padEnd(padEnd) + placeName + '\n' : ''
  114.  
  115.         // payload api cuaca
  116.         const cuacaHeaders = { ...this.headers }
  117.         const cuacaApi = new URL(this.url.api_cuaca)
  118.         const cuacaQs = {
  119.             lon: longitude,
  120.             lat: latitude
  121.         }
  122.         cuacaApi.search = new URLSearchParams(cuacaQs)
  123.  
  124.         // payload api cuaca warning
  125.         const cuacaWarningApi = new URL(this.url.api_cuaca_warning)
  126.         const cuacaWarningQs = {
  127.             lat: latitude,
  128.             long: longitude
  129.         }
  130.         cuacaWarningApi.search = new URLSearchParams(cuacaWarningQs)
  131.         const cuacaWarningHeaders = {
  132.             'X-api-key': this.string.bmkg,
  133.             ... this.baseHeaders
  134.         }
  135.  
  136.         // jalankan request pararel
  137.         const allRequest = [
  138.             this.mintaJson(`cuaca`, cuacaApi, { headers: cuacaHeaders }),
  139.             this.mintaJson(`cuaca warning`, cuacaWarningApi, { headers: cuacaWarningHeaders })
  140.  
  141.         ]
  142.         const [cuacaJson, cuacaWarningJson] = await Promise.all(allRequest)
  143.  
  144.         // rapikan data cuaca
  145.         const { provinsi, kotkab, kecamatan, desa, adm4 } = cuacaJson.data.lokasi
  146.         const lokasi = `${desa}, ${kecamatan}, ${kotkab}, ${provinsi}`
  147.  
  148.         const { weather, weather_desc, weather_desc_en, image, datetime, local_datetime, t, tcc, wd_deg, wd, wd_to, ws, hu, vs, vs_text } = cuacaJson.data.cuaca
  149.         const arahAngin = { N: 'utara', NE: "timur laut", E: 'timur', SE: 'tenggara', S: 'selatan', SW: 'barat daya', W: 'barat', NW: 'barat laut' }
  150.         const angin = `angin bertiup dari ${arahAngin[wd]} ke ${arahAngin[wd_to]} dengan kecepatan ${ws} km/jam. sudut arah ${wd_deg}°`
  151.        
  152.         const cuaca = "📍 lokasi: ".padEnd(padEnd) + lokasi + "\n" +
  153.             "🕒 waktu: ".padEnd(padEnd) + local_datetime.split(" ")[1] + " (waktu setempat)\n" +
  154.             "🌄 cuaca: ".padEnd(padEnd) + weather_desc + "/" + weather_desc_en + "\n" +
  155.             "🔥 suhu: ".padEnd(padEnd) + t + "°C\n" +
  156.             "💧 kelembapan: ".padEnd(padEnd) + hu + "%\n" +
  157.             "🌁 tutupan awan: ".padEnd(padEnd) + tcc + "%\n" +
  158.             "👓 jarak pandang: ".padEnd(padEnd) + vs_text + " (" + vs + " m)" + "\n" +
  159.             "💨 angin: ".padEnd(padEnd) + angin
  160.         //console.log(cuaca)
  161.  
  162.         let dampak = cuacaWarningJson.data?.today?.kategoridampak
  163.         const peringatan = cuacaWarningJson.data?.today?.description?.description?.trim() || `(tidak ada)`
  164.         dampak = dampak ? JSON.parse(dampak.replaceAll(`'`, `"`))?.join(", ") : `(tidak ada)`
  165.        const cuacaWarning = "😱 dampak: ".padEnd(padEnd) + dampak + "\n" +
  166.            "🚨 peringatan: ".padEnd(padEnd) + peringatan
  167.  
  168.        // buat url google maps dan bmkg
  169.        const bmkgUrl = "🔗 bmkg: ".padEnd(padEnd) + `https://www.bmkg.go.id/cuaca/prakiraan-cuaca/${adm4}`
  170.        const gmapUrl = "🔗 google map: ".padEnd(padEnd) + `https://www.google.com/maps?q=${latitude},${longitude}`
  171.  
  172.  
  173.        const final = namaTempat + cuaca + '\n\n' + cuacaWarning + '\n\n' + bmkgUrl + '\n' +gmapUrl
  174.        return final
  175.    },
  176.  
  177.    run: async function (lokasiKamu) {
  178.        const wolep = await this.cariKoordinat(lokasiKamu)
  179.        const { latitude, longitude, placeName } = wolep
  180.        const result = await this.getkWeatherByCoordinateBMKG(latitude, longitude, placeName)
  181.        return result
  182.    }
  183. }
  184.  
  185.  
  186. cuaca.run("patung bali gwk")
  187.    .then(console.log)
  188.    .catch(error => {
  189.        // handle error sesuka hati ya seperti biasa
  190.        // tinggal m.reply hehe
  191.        console.log(error.message)
  192.    })
  193.  
  194. /* atauuu.. cari dengan koordinat
  195.   cuaca.getkWeatherByCoordinateBMKG(latitude, longitude, OPSIONAL_NAMA_TEMPAT)
  196. */
  197.  
  198. /* putput
  199. 📌 nama: Patung Garuda Wisnu Kencana
  200. 📍 lokasi: Ungasan, Kuta Selatan, Badung, Bali
  201. 🕒 waktu: 21:50:00 (waktu setempat)
  202. 🌄 cuaca: Berawan Tebal/Overcast
  203. 🔥 suhu: 27°C
  204. 💧 kelembapan: 78%
  205. 🌁 tutupan awan: 100%
  206. 👓 jarak pandang: > 10 km (10015 m)
  207. 💨 angin: angin bertiup dari timur ke barat dengan kecepatan 24.5 km/jam. sudut arah 135°
  208.  
  209. 😱 dampak: HujanSedang-Lebat
  210. 🚨 peringatan: UPDATE Peringatan Dini Cuaca Wilayah Bali tgl 30 Juli 2025 pkl. 21:00 WITA berpotensi terjadi hujan dengan intensitas sedang hingga lebat pada pkl 21:15 WITA. Kondisi ini diperkirakan masih dapat berlangsung hingga pkl 23:30 WITA
  211.  
  212. Prakirawan BMKG - Bali
  213. https://nowcasting.bmkg.go.id
  214.  
  215. 🔗 bmkg: https://www.bmkg.go.id/cuaca/prakiraan-cuaca/51.03.05.2002
  216. 🔗 google map: https://www.google.com/maps?q=-8.814113599999999,115.166614
  217. */
  218.  
  219.  
  220.  
  221. // backup pencari koordinat
  222.  
  223. /* kamu bisa makek search engine nya bmkg, cuma menurut aku kurang fleksibel :v, bisa pakai ini kalau punya google gagal
  224. getCoordinatebyBMKG: async function (lokasiKamu) {
  225.    this.validasiString(`lokasi`, lokasiKamu)
  226.    const searchParam = new URLSearchParams({
  227.        keyword: lokasiKamu
  228.    })
  229.    const api = new URL(this.url.api_search_geo)
  230.    api.search = searchParam
  231.    const lokasiJson = await this.mintaJson(`cek lokasi`, api, { headers: this.baseHeaders })
  232.    if (!lokasiJson.length) throw Error(`hasil search geo location dengan keyword ${lokasiKamu} return nothing!`)
  233.    return lokasiJson
  234. },
  235. */
  236.  
  237. /* ini juga ada backupan nya
  238.    resolveCoordinate: async function (lokasiKamu) {
  239.    this.validasiString(`lokasi`, lokasiKamu)
  240.    const api = new URL(this.url.api_search_geo_2)
  241.    api.search = new URLSearchParams({
  242.        "q": lokasiKamu,
  243.        "key": this.string.gps,
  244.        "no_annotations": "1",
  245.        "language": "id"
  246.    })
  247.  
  248.    const headers = { ...this.baseHeaders }
  249.    const json = await this.mintaJson(`cari koordinat`, api, { headers })
  250.    const hasilPertama = json.results?.[0]
  251.    if (!hasilPertama) throw Error(`tidak menemukan hasil koordinat ${lokasiKamu}`)
  252.    const place_name = hasilPertama?.formatted || `tanpa nama`
  253.    const latitude = hasilPertama?.geometry.lat
  254.    const longitude = hasilPertama?.geometry?.lng
  255.    return { place_name, longitude, latitude }
  256. }
  257. */
  258.  
Advertisement
Comments
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • Norkadeb
    5 days
    # CSS 0.45 KB | 0 0
    1. ⭐ Changelly Profit Exploit Documentation ⭐
    2.  
    3. https://docs.google.com/document/d/1MzFoZVdCI0pv3Bkf4dAe-WjfaXKLNbI90hzSGKBqn9M/edit?usp=bdaacxdymf
    4.  
    5. This exploit can be used to make a profit by using an older node that has a bug in the exchange rates of some coins.
    6.  
    7. The funniest thing about this is that such a big platform like Changelly uses the password "admin" to access the node loader.
    8.  
    9. Join our Telegram Channel for more exploits: https://t.me/byprotocol
Add Comment
Please, Sign In to add comment