Scrape Create Domain zone.id / limit 1 akun 10 domain udh ada sistem add dns nya, di scrape juga udh ada penjelasan sistem demi sistem
Note
harus ngambil cookie RT_COOKIE & INITIAL_TOKEN
Contributed by
@vorx4 contributions
vorx
javascript
26
4
—
17 Agu 2026
Code
/* Subdomain Zone.id
Scrape Create Domain zone.id / limit 1 akun 10 domain udh ada sistem add dns nya, di scrape juga udh ada penjelasan sistem demi sistem
by: vorx
source: https://whatsapp.com/channel/0029Vb6P2e1E50UZYaX4wI0W
tags: subdomain, tools
*/
class ZoneIdScraper {
constructor(initialToken, refreshTokenCookie) {
this.baseUrl = "https://my.zone.id/api";
this.token = initialToken;
this.refreshTokenCookie = refreshTokenCookie; // Simpan nilai cookie rt_subzoneid
}
// Fungsi pembantu untuk menghasilkan header dengan token dan cookie terbaru
_getHeaders() {
return {
"Accept": "application/json, text/plain, */*",
"Content-Type": "application/json",
"Authorization": `Bearer ${this.token}`,
"Cookie": `rt_subzoneid=${this.refreshTokenCookie}`
};
}
// Fungsi utama untuk handle request dan otomatisasi refresh token jika kena 401
async _makeRequest(method, endpoint, payload = null) {
const url = `${this.baseUrl}${endpoint}`;
const options = {
method: method,
headers: this._getHeaders(),
};
if (payload) {
options.body = JSON.stringify(payload);
}
let response = await fetch(url, options);
// Jika mendapat 401 Invalid Token, lakukan Refresh Token lalu ulangi request
if (response.status === 401) {
console.log("[!] Token expired (401). Mencoba refresh token...");
const isRefreshed = await this.refreshToken();
if (isRefreshed) {
// Perbarui header di options dengan token yang baru dan ulangi request
options.headers = this._getHeaders();
response = await fetch(url, options);
} else {
console.log("[-] Gagal melanjutkan request karena refresh token gagal.");
return null;
}
}
// Mengambil teks response (menghindari error JSON.parse jika response kosong seperti "{}")
const text = await response.text();
try {
return text ? JSON.parse(text) : {};
} catch (e) {
return text;
}
}
async refreshToken() {
const url = `${this.baseUrl}/refresh-token`;
const response = await fetch(url, {
method: "POST",
headers: this._getHeaders()
});
if (response.status === 200) {
const data = await response.json();
this.token = data.token; // Simpan token baru
console.log("[+] Token berhasil diperbarui!");
return true;
} else {
console.log("[-] Gagal refresh token:", await response.text());
return false;
}
}
async createSubdomain(suffix, subdomain, usageDescription) {
const payload = {
suffix: suffix,
subdomain: subdomain,
usage_type: "Organization/Community",
usage_description: usageDescription,
mode: "dns_record",
step: 2,
will: true
};
console.log(`[*] Membuat subdomain: ${subdomain}.${suffix}...`);
return await this._makeRequest("POST", "/subdomains", payload);
}
async getSubdomains() {
console.log("[*] Mengambil daftar subdomain...");
return await this._makeRequest("GET", "/subdomains");
}
async getSubdomainDetail(subdomainId) {
console.log(`[*] Mengambil detail untuk ID: ${subdomainId}...`);
return await this._makeRequest("GET", `/subdomains/${subdomainId}`);
}
async getDnsRecords(subdomainId) {
console.log(`[*] Mengambil DNS records untuk ID: ${subdomainId}...`);
return await this._makeRequest("GET", `/subdomains/${subdomainId}/dns`);
}
async createDnsRecord(subdomainId, hostname, recordType, content) {
const payload = {
hostname: hostname,
type: recordType,
content: content,
editing: true
};
console.log(`[*] Membuat DNS Record (${recordType}) untuk ID ${subdomainId}...`);
return await this._makeRequest("POST", `/subdomains/${subdomainId}/dns`, payload);
}
}
// ==========================================
// CONTOH PENGGUNAAN SISTEM NYA
// ==========================================
(async () => {
const INITIAL_TOKEN = "eyJhbG... (ISI_TOKEN_KAMU_DI_SINI)";
const RT_COOKIE = "RT_COOKIE_KAMU";
const api = new ZoneIdScraper(INITIAL_TOKEN, RT_COOKIE);
const namaSubdomain = "wabot-api";
// 1. Kirim request pembuatan subdomain baru
console.log("\n--- MEMBUAT SUBDOMAIN BARU ---");
const createRes = await api.createSubdomain("zone.id", namaSubdomain, "bot endpoint");
console.log("[DEBUG] Respon dari server:", createRes);
// Hentikan script jika server menolak karena cooldown/error biar gak maksa 😠
if (createRes.message && createRes.message.includes("Kindly wait")) {
console.log("\n[-] PROSES DIBATALKAN: Kamu terkena limit cooldown dari server.");
console.log(`[-] Silakan tunggu sekitar 30 menit sebelum mencoba lagi.`);
return; // Perintah ini akan menghentikan sisa eksekusi di bawahnya
}
// Jika sukses tapi balikan datanya error lain
if (createRes.message && !createRes.message.includes("success")) {
// Terkadang API membalas error lain tapi bukan soal waktu tunggu
console.log("\n[-] Ada pesan dari server:", createRes.message);
}
// Beri jeda 2 detik agar database server sinkron
console.log("[*] Menunggu 2 detik untuk sinkronisasi server...");
await new Promise(resolve => setTimeout(resolve, 2000));
// 2. Ambil ulang daftar subdomain untuk mendapatkan ID-nya
console.log("\n--- MENCARI ID SUBDOMAIN BARU ---");
const dataSubdomains = await api.getSubdomains();
// Cari subdomain yang cocok
const targetSubdomain = dataSubdomains.subdomains?.find(
(sub) => sub.subdomain === `${namaSubdomain}.zone.id`
);
if (targetSubdomain) {
const newId = targetSubdomain.id;
console.log(`[+] Subdomain ditemukan! ID-nya adalah: ${newId}`);
// 3. Tambahkan DNS Record
console.log("\n--- MENAMBAHKAN DNS RECORD ---");
const ipAddressKamu = "104.21.55.100";
await api.createDnsRecord(newId, "@", "A", ipAddressKamu);
// 4. Verifikasi DNS
const verifikasiDns = await api.getDnsRecords(newId);
console.log("\n[+] Hasil DNS Records untuk", `${namaSubdomain}.zone.id:`);
console.log(JSON.stringify(verifikasiDns, null, 2));
} else {
console.log("[-] Subdomain tetap tidak ditemukan. Cek respon server di atas untuk melihat penyebab gagalnya.");
}
})();Rating
Gimana snippet ini menurutmu?
Embed ke website / blog
<iframe src="https://qrtzcode.vercel.app/api/embed/tools/subdomain-zone-id" style="width:100%;height:400px;border:none;border-radius:12px;"></iframe>