-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnik.py
More file actions
179 lines (156 loc) · 7.74 KB
/
nik.py
File metadata and controls
179 lines (156 loc) · 7.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# This script is open source 🤭
import requests
import inquirer
from halo import Halo
from termcolor import colored
import os
import json
# ---------- ASCII BANNER ----------
def show_banner():
banner = r"""
⣿⣿⣿⠛⠻⢿⣿⣿⣿⣷⣾⣝⡻⢿⣿⣯⣽⣹⡚⣽⣖⣺⣯⠭⣽⣿⣿⣉⠻⣙⣤⣾⠏ ⢛⣫⣶⣿⣿
⣿⣿⣿ ⠑⢦⣤⣉⣉⠛⠛⡷⢿⡗⢉⣉⠉⣉⢍⣁⡒⢶⣶⣾⣩⠝⣫⣵⣿⣿⠿⣁⣠⣶ ⢿⣿⡿⠿⢛
⣿⣿⡇ ⠙⠿⣿⣿⣿⡶⣢⣺⡿⣡⡾⣿⢧⡪⡹⢷⣍⠿⣟⡟⢟⢿⣽⡶⢊⣼⣿⣿⣀⡀ ⢰⣾⣿⣿
⣿⣿⣷ ⠈⢿⣿⣕⠻⢿⢋⣾⢷⡏⣼⣿⠇⣿⡘⣷⡹⣮⡻⣷⡙⣷⣌⠮⢋⣴⣿⣿⣿⣿⣿⣿⠗⣸⣿⣿⣿
⣿⣿⣿⡄⣠⣾⣿⣿⡿⡲⢣⡿⡏⣰⣿⡿⠈⣿⡇⢿⣷⠹⠷⣈⢾⡞⠿⣶⣘⠻⣿⣿⣿⣿⣷⣆ ⣿⣿⣿⣿
⣿⣿⣿⣿ ⣿⣿⣿⣧⠉⣹⣿⡷⠐⣕⢏⢼⢣⣷⣝⢃⢣⡿⡇⢘⣭⣆⣿⠟⣥⠳⡜⡝⢿⣧⡹⣿⣿⡿⣿⣿
⣿⣿⣿⣧⠸⠿⣿⡁⣾⢡⣞⡦⢈⢿⡟⡎⣼⣶⠇⣿⣿⠿⡐⢿⣻⣧⡹⡌⢎⢿⡧⡈⠁ ⣰⣿⣿⣿⣿
⣿⣿⣿⣿⣿⡆⢀⣼⠇⣾⡾⡅⢸⡎⠜⢘⠻⣣⢏ ⣵⣿⡟⠎⠿⠿⣷⣡⠃⡱⡨⣞⣇ ⢰⡀⢹⣿⣿⣿⣿
⣿⣿⣿⣿⣿⠁⢠⡟⢠⣿⣿⢠⠘ ⠄⡌⣿⣿⢸⡄⣯⡶⢀⣿⣆⢙⢿⣕⠪⣶⡕⠝⣿⡈⠌⡇⢹⣿⣿⣿⣿
⣿⣿⣿⣿⡿ ⢾⠇⢼⣿⢟⠈⣄⠲⡇⡇⣿⠛⣼⡇⣿⠃⡨⠛⠉⠉ ⠐ ⣿⣿⣎⢪⣧⠘⢠⠸⣿⣿⣿⣿
⣿⣿⣿⣿⡇⠈⢸⠘⣼⡿⣿⠐⠛⡀⠁⠒⠉⢰⣿⠇⣱⣧⣷⣿⢂⠰⡤⢉⡄⣿⣟⣿⠈⣿⠠⡘⡀⢿⣿⣿⣿
⣿⣿⣿⣿⣧ ⢸⡇⢾⣿⡄⢀⢺⡗⣦⣀⢸⣿⣿⣿⣿⣿⣿⣿⣮⣭⣵⣿⢸⣿⣿⢿⡆⣯⠁⠄⡇⠸⣿⣿⣿
⣿⣿⣿⣿⡇ ⠘⡅⣺⢯⡇⠈⢷⣽⣶⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢇⡟⣸⢯⡟⡆⣿⠰⢐⠘⡀⢿⣿⣿
⣿⣿⣿⣿⣷ ⢳⢸⢯⡇⢰⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⡼⠁⡿⣯⢁⡇⢾ ⡌ ⠐⠘⣿⣿
⣿⣿⣿⣿⣿ ⡐⠈⠸⣏⡇ ⠁⠹⣿⣿⣿⣿⣿⣿⣛⣿⣿⣿⣿⣿⠑⠁⡸⢻⡍⢸ ⢸⡂⠱ ⠇ ⣿⣿
⣿⣿⣿⣿⠏⢠⡝⠱⡀⡻⣼ ⠐ ⠊⠛⠿⣿⣿⣿⣿⣿⣿⣿⠿⠃⡀⠠⢡⡟ ⡿ ⢸ ⠃⠄ ⡀⢸⣿
⡟⡻⢛⡡⠊⣠⠇ ⡗⢸⢱ ⢶⣶⠂⣤⣤⣀⡉⠛⠿⢟⡫⠕⣊⢠⡄⢠⡗ ⣸⠱ ⡐⠆⠁⢢ ⠁⢸⣿
⣷⣦⡄ ⣜⠃ ⢠⠘⠆⠂⢇ ⠉ ⠾⣟⣿⢿⣷⣦⣥⣒⠿⠇⠈⡄⠞⡐⢀⣃⣃⡀⠑⠖ ⠩⡄⠂⢸⣿
⣿⣿⡃⡜⢡⢂ ⣸⢸⢀⠃⠈⡜⡙⡄⢠⣤⣈⡉⠙⠋⠻⠿⠿⡆⠸⡅⠸⢡⢀⡤⠖⠰⢿⣆ ⠈ ⣿
⣿⣿⢁⠃⠸⡌⢰⡱⠈⢀⠺⠿⣦⡘⠃⢸⣿⣻⡿⣿⠷⣶⣶⡤⡄⠓⡇⠡⠊⢠⠶⠗⠖⢿⡟⡄ ⢀⣴⣿
"""
print(colored(banner, 'cyan'))
# ---------- Helper Functions ----------
def c(text, color):
return colored(text, color)
def box(title, body):
lines = body.splitlines()
width = max(len(title), max(len(line) for line in lines)) + 4
top = '┏' + '━' * (width - 2) + '┓'
mid = '┃ ' + title.ljust(width - 3) + '┃'
bot = '┣' + '━' * (width - 2) + '┫'
print(top)
print(mid)
print(bot)
for line in lines:
print('┃ ' + line.ljust(width - 3) + '┃')
print('┗' + '━' * (width - 2) + '┛')
def save_parsed_nik(nik, parsed_data):
"""Simpan atau timpa data NIK di nik.json (format: { "NIK": { ... } })"""
filename = 'nik.json'
# Muat data lama jika ada
if os.path.exists(filename):
try:
with open(filename, 'r', encoding='utf-8') as f:
db = json.load(f)
except (json.JSONDecodeError, ValueError):
db = {}
else:
db = {}
# Simpan/replace berdasarkan NIK
db[nik] = parsed_data
# Tulis kembali ke file
with open(filename, 'w', encoding='utf-8') as f:
json.dump(db, f, indent=2, ensure_ascii=False)
# ---------- NIK Parser ----------
def parse_nik():
# Input NIK dengan validasi
answers = inquirer.prompt([
inquirer.Text(
'nik',
message='Masukkan NIK:',
validate=lambda _, x: (x.isdigit() and len(x) == 16) or 'NIK harus 16 digit angka!'
)
])
nik = answers['nik']
spinner = Halo(text='Mengambil data dari API...', spinner='dots')
spinner.start()
try:
# Panggil API
resp = requests.get(f'https://api.fikmydomainsz.xyz/tools/nik?nik={nik}', timeout=15)
resp.raise_for_status()
data = resp.json()
if data.get('status'):
spinner.succeed('Data berhasil diperoleh!')
r = data['result']
# Format tampilan hasil
content = (
f"NIK: {c(r['nik'], 'yellow')}\n"
f"Jenis Kelamin: {c(r['kelamin'], 'yellow')}\n"
f"Tanggal Lahir: {c(r['lahir'], 'yellow')}\n"
f"Lahir Lengkap: {c(r['lahir_lengkap'], 'yellow')}\n"
f"Provinsi: {c(r['provinsi']['nama'], 'yellow')}\n"
f"Kota/Kab: {c(r['kotakab']['nama'], 'yellow')}\n"
f"Kecamatan: {c(r['kecamatan']['nama'], 'yellow')}\n"
f"Nomor Urut: {c(r['nomor_urut'], 'yellow')}\n\n"
f"{c('INFORMASI TAMBAHAN', 'cyan')}\n"
f"Pasaran: {c(r['tambahan']['pasaran'], 'yellow')}\n"
f"Usia: {c(r['tambahan']['usia'], 'yellow')}\n"
f"Kategori: {c(r['tambahan']['kategori_usia'], 'yellow')}\n"
f"Ultah Berikutnya: {c(r['tambahan']['ultah'], 'yellow')}\n"
f"Zodiak: {c(r['tambahan']['zodiak'], 'yellow')}"
)
box('HASIL PARSING NIK', content)
# Siapkan data untuk disimpan
record = {
"kelamin": r['kelamin'],
"lahir": r['lahir'],
"lahir_lengkap": r['lahir_lengkap'],
"provinsi": r['provinsi']['nama'],
"kota_kab": r['kotakab']['nama'],
"kecamatan": r['kecamatan']['nama'],
"nomor_urut": r['nomor_urut'],
"tambahan": r['tambahan']
}
# Simpan ke file JSON
save_parsed_nik(nik, record)
print(c("\n✅ Data NIK berhasil disimpan ke nik.json", "green"))
else:
spinner.fail('Gagal memproses NIK!')
print(c("❌ API mengembalikan status gagal.", "red"))
except requests.exceptions.Timeout:
spinner.fail('Waktu permintaan habis!')
print(c("⏰ Timeout: Server tidak merespons dalam 15 detik.", "red"))
except requests.exceptions.ConnectionError:
spinner.fail('Gagal terhubung ke API!')
print(c("🌐 Periksa koneksi internet Anda.", "red"))
except requests.exceptions.HTTPError as e:
spinner.fail('Error HTTP dari API!')
print(c(f"📡 HTTP Error: {e}", "red"))
except ValueError:
spinner.fail('Respon API tidak valid!')
print(c("📦 API tidak mengembalikan data JSON yang valid.", "red"))
except Exception as e:
spinner.fail('Terjadi kesalahan tak terduga!')
print(c(f"💥 Error: {e}", "red"))
# ---------- Main Program ----------
def main():
os.system('cls' if os.name == 'nt' else 'clear')
show_banner()
while True:
parse_nik()
# Tanya ulang
lagi = inquirer.prompt([
inquirer.List('lagi', message='Ingin cek NIK lagi?', choices=['Ya', 'Keluar'])
])['lagi']
if lagi == 'Keluar':
print(c("\n📁 Semua data tersimpan di file: nik.json", "green"))
print(c("Terima kasih telah menggunakan NIK Parser! 👋", "cyan"))
break
# ---------- Entry Point ----------
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print(c("\n\n⚠️ Program dihentikan oleh pengguna.", "yellow"))
exit(0)