4.1
IP Tracker
IP_Track adalah satu-satunya fungsi pelacakan yang mengambil data geolokasi dari layanan eksternal ipwho.is. Fungsi ini terdaftar sebagai opsi menu pertama dengan 'num': 1 dan teks 'IP Tracker', sehingga call_option memanggilnya lewat kunci 'func' (GhostTR.py:180-1851, GhostTR.py:219-2272). Dekorator is_option membungkusnya: wrapper menjalankan run_banner lebih dulu, lalu memanggil IP_Track tanpa argumen (GhostTR.py:29-363).
Siklus satu request
Satu eksekusi IP_Track adalah satu request HTTP ke ipwho.is yang hasilnya langsung dicetak ke stdout.
sequenceDiagram
autonumber
actor U as User
participant M as main / execute_option
participant C as call_option
participant D as is_option wrapper
participant T as IP_Track
participant A as ipwho.is
U->>M: Select Option 1
M->>C: execute_option lalu call_option
C->>C: is_in_options
C->>D: option func = IP_Track
D->>D: run_banner
D->>T: func
T->>U: Enter IP target
U-->>T: ip
T->>T: print header SHOW INFORMATION IP ADDRESS
T->>A: GET http://ipwho.is/ + ip
A-->>T: req_api.text
T->>T: json.loads
T->>T: time.sleep 2
T->>U: print 28 baris keterangan
T-->>M: return
M->>U: Press enter to continue
M->>M: main
%% fig: Siklus satu request IP_Track
%% desc: User memilih opsi 1 sehingga wrapper is_option mencetak banner, IP_Track mengambil IP target, memanggil ipwho.is, lalu mencetak hasilnya sebelum menu dimuat ulang.Prompt Enter IP target : muncul setelah banner, dan nilai ip disisipkan apa adanya ke URL http://ipwho.is/{ip} tanpa pemeriksaan format. Body respons dibaca sebagai teks lalu diubah dengan json.loads, bukan lewat req_api.json(), dan status_code tidak pernah diperiksa. Setelah payload siap, time.sleep(2) menahan proses dua detik sebelum baris pertama dicetak (GhostTR.py:40-474). Ketika fungsi selesai, execute_option meminta Press enter to continue lalu memanggil main() kembali (GhostTR.py:230-2345).
Kelompok data yang dicetak
IP_Track mencetak 28 baris keterangan, semuanya lewat akses key langsung ip_data["..."]. Tiga blok data pada respons ipwho.is dipetakan ke blok cetak yang berbeda.
| Blok cetak | Key JSON | Baris |
|---|---|---|
| IP target | variabel lokal ip, bukan dari respons | GhostTR.py:486 |
| Tipe dan negara | type, country, country_code | GhostTR.py:49-517 |
| Wilayah | city, continent, continent_code, region, region_code | GhostTR.py:52-568 |
| Koordinat mentah | latitude, longitude | GhostTR.py:57-589 |
| Turunan Maps | lat = int(...), lon = int(...), URL https://www.google.com/maps/@{lat},{lon},8z | GhostTR.py:59-6110 |
| Administrasi dan bendera | is_eu, postal, calling_code, capital, borders, flag.emoji | GhostTR.py:62-6711 |
| Koneksi | connection.asn, connection.org, connection.isp, connection.domain | GhostTR.py:68-7112 |
| Zona waktu | timezone.id, timezone.abbr, timezone.is_dst, timezone.offset, timezone.utc, timezone.current_time | GhostTR.py:72-7713 |
graph LR
IN["ip dari input"] --> REQ["requests.get http://ipwho.is/{ip}"]
REQ --> J["json.loads ip_data"]
J --> GEO["Geolocation: type, country, city, region"]
J --> COORD["latitude dan longitude"]
J --> CONN["connection: asn, org, isp, domain"]
J --> TZ["timezone: id, abbr, offset, utc"]
J --> FLAG["flag.emoji"]
COORD --> MAPS["Maps URL dengan zoom 8z"]
GEO --> OUT["stdout terminal"]
MAPS --> OUT
CONN --> OUT
TZ --> OUT
FLAG --> OUT
style REQ fill:#f59e0b,color:#000
style J fill:#8b5cf6,color:#fff
style GEO fill:#336791,color:#fff
style COORD fill:#336791,color:#fff
style CONN fill:#336791,color:#fff
style TZ fill:#336791,color:#fff
style FLAG fill:#8b5cf6,color:#fff
style MAPS fill:#2d7d46,color:#fff
style OUT fill:#2d7d46,color:#fff
%% fig: Pemetaan payload ipwho.is ke blok cetak
%% desc: Satu payload JSON dipecah menjadi blok geolokasi, koneksi, zona waktu, dan bendera, lalu seluruhnya bermuara pada cetakan ke stdout.Baris Maps adalah satu-satunya nilai turunan: int() membuang bagian desimal dari latitude dan longitude, sehingga URL Google Maps bisa bergeser sampai nyaris satu derajat dari posisi sebenarnya (GhostTR.py:59-6110).
Jalur gagal
Tidak ada try di dalam IP_Track, jadi kegagalan request maupun key yang hilang keluar sebagai traceback.
| Kondisi | Yang terjadi | Rujukan |
|---|---|---|
ipwho.is lambat atau tidak merespons | requests.get dipanggil tanpa argumen timeout, sehingga proses menunggu tanpa batas sampai diinterupsi | GhostTR.py:45-4614 |
| IP tidak valid atau kosong | respons tetap di-parse, lalu ip_data["latitude"] memicu KeyError karena key tersebut tidak ada | GhostTR.py:57-589 |
| Host tidak terjangkau | requests.exceptions.ConnectionError naik ke pemanggil; execute_option hanya menangkap ValueError dan KeyboardInterrupt | GhostTR.py:235-23815 |
| Koordinat pecahan | int() memotong desimal sebelum URL Maps disusun | GhostTR.py:59-6110 |
⚠️ URL request memakai skema
http, bukanhttps, sehingga alamat IP target dan hasil pelacakan melintas tanpa enkripsi. Ganti kehttpsbila tool dijalankan di jaringan yang tidak dipercaya (GhostTR.py:45-4614).
Karena IP_Track tidak menangani KeyboardInterrupt sendiri, Ctrl+C saat prompt IP baru ditangani di lapisan pemanggil; rinciannya ada di Penanganan Error dan Interrupt.
Hubungan dengan bagian lain
Pemilihan opsi 1 sampai eksekusi fungsi dijelaskan di Loop Menu dan Dispatch Opsi, sedangkan banner dan konstanta warna yang dipakai setiap baris print dijelaskan di Banner, Warna ANSI, dan Helper. Jangan tertukar dengan Show Your IP: opsi 2 itu hanya menanyakan IP publik mesin sendiri lewat api.ipify.org dan tidak memanggil ipwho.is (GhostTR.py:169-17616).
Untuk memperoleh IP target, README menyarankan kombinasi dengan tool Seeker, dan menautkan tangkapan layar contoh keluaran menu IP Tracker (README.md:29-3117).