6
IP Tracker
IP_Track adalah opsi nomor 1 pada menu GhostTrack dengan teks IP Tracker; entri di list options mengaitkan 'func': IP_Track pada nomor itu (GhostTR.py:180-1851). Pemanggilan terjadi di call_option lewat option['func']() setelah nomor opsi cocok (GhostTR.py:219-2272); urutan menu dan loop-nya dibahas di Alur Eksekusi Menu.
Fungsi ini didekorasi @is_option, dan dekorator itu menjalankan run_banner() sebelum body fungsi dieksekusi (GhostTR.py:30-333, GhostTR.py:40-414). Isi banner dan perilaku dekoratornya dijelaskan di Banner dan Dekorator is_option.
Siklus satu request ke ipwho.is
IP_Track meminta satu masukan lewat input(f"{Wh}\n Enter IP target : {Gr}") (GhostTR.py:425), mencetak header SHOW INFORMATION IP ADDRESS (GhostTR.py:446), lalu mengirim requests.get(f"http://ipwho.is/{ip}") dan mengubah req_api.text menjadi ip_data dengan json.loads (GhostTR.py:45-46). Pemanggilan itu tidak menyertakan timeout, headers, maupun params (GhostTR.py:45). Setelah balasan diterima, time.sleep(2) menahan proses dua detik sebelum pencetakan dimulai (GhostTR.py:47).
sequenceDiagram
autonumber
participant U as User
participant T as IP_Track
participant A as ipwho.is
participant S as Screen
U->>T: input Enter IP target
T->>S: print header SHOW INFORMATION IP ADDRESS
T->>A: requests.get http://ipwho.is/ip
A-->>T: req_api.text
T->>T: json.loads req_api.text menjadi ip_data
T->>T: time.sleep 2 detik
T->>S: print 28 baris field dari ip_data
%% fig: Siklus request IP_Track
%% desc: Satu request ke ipwho.is, parsing response menjadi ip_data, lalu pencetakan field ke layar.Tabel berikut merangkum kontrak request yang benar-benar tertulis di kode.
| Item | Nilai di kode | Rujukan |
|---|---|---|
| Method | requests.get | GhostTR.py:458 |
| URL | http://ipwho.is/{ip} | GhostTR.py:458 |
Sumber ip | hasil input bertipe string | GhostTR.py:425 |
Header, params, timeout | tidak ada | GhostTR.py:458 |
| Parsing response | json.loads(req_api.text) menjadi ip_data | GhostTR.py:45-467 |
| Jeda sebelum cetak | time.sleep(2) | GhostTR.py:479 |
⚠️ Skema URL memakai
http://polos dan tanpatimeout(GhostTR.py:458). Lalu lintas tidak terenkripsi, dan bila ipwho.is lambat merespons, proses akan menunggu tanpa batas. Jika DNS atau koneksi gagal, pengecualian darirequeststidak ditangkap di dalamIP_Track.
Field yang dicetak
Seluruh keluaran berasal dari satu objek ip_data. Body IP_Track memuat 28 baris print yang menyusun laporan (GhostTR.py:40-7710), dikelompokkan menurut key JSON yang dibaca.
graph TD
REQ["requests.get http://ipwho.is/{ip}"] --> RAW["req_api.text"]
RAW --> IPD["ip_data lewat json.loads"]
IPD --> GEO["Geolokasi: type, country, city, region, latitude, longitude"]
IPD --> MAPS["Maps URL dari int latitude dan int longitude"]
IPD --> META["Negara: is_eu, postal, calling_code, capital, borders, flag emoji"]
IPD --> CONN["Connection: asn, org, isp, domain"]
IPD --> TZ["Timezone: id, abbr, is_dst, offset, utc, current_time"]
style REQ fill:#336791,color:#fff
style IPD fill:#8b5cf6,color:#fff
style MAPS fill:#8b5cf6,color:#fff
style GEO fill:#2d7d46,color:#fff
style META fill:#2d7d46,color:#fff
style CONN fill:#2d7d46,color:#fff
style TZ fill:#2d7d46,color:#fff
%% fig: Percabangan ip_data ke lima kelompok cetak
%% desc: Satu response ipwho.is dipakai untuk empat kelompok field, dan koordinatnya diturunkan menjadi tautan Google Maps.| Grup | Key JSON yang dibaca | Label cetak | Rujukan |
|---|---|---|---|
| Identitas target | variabel lokal ip | IP target | GhostTR.py:4811 |
| Geolokasi | type, country, country_code, city, continent, continent_code, region, region_code, latitude, longitude | Type sampai Longitude | GhostTR.py:49-5812 |
| Turunan | int(ip_data['latitude']), int(ip_data['longitude']) | Maps | GhostTR.py:59-6113 |
| Negara | is_eu, postal, calling_code, capital, borders, flag.emoji | EU sampai Country Flag | GhostTR.py:62-6714 |
| Koneksi dan ASN | connection.asn, connection.org, connection.isp, connection.domain | ASN, ORG, ISP, Domain | GhostTR.py:68-7115 |
| Timezone | timezone.id, timezone.abbr, timezone.is_dst, timezone.offset, timezone.utc, timezone.current_time | ID sampai Current Time | GhostTR.py:72-7716 |
Baris IP target mencetak variabel ip apa adanya, bukan nilai dari response, sehingga angka yang tampil selalu sama dengan yang diketik pengguna (GhostTR.py:4811). Sementara lat dan lon dihitung ulang dari field response sebelum dirangkai menjadi tautan https://www.google.com/maps/@{lat},{lon},8z (GhostTR.py:59-6113).
Titik rawan
- Konversi
int()padalatitudedanlongitudemembuang bagian desimal koordinat (GhostTR.py:59-6113). Untuk koordinat negatif, pemotongan itu menggeser titik ke arah khatulistiwa, sehingga tautanMapstidak persis menunjuk lokasi asal. IP_Tracktidak membungkus body-nya dengantry(GhostTR.py:40-7710), berbeda dariTrackLuyang memakaiexcept Exception. Pembaca nilai sepertiip_data["connection"]["asn"]akan melemparKeyErrorbila key tidak ada, danexecute_optionhanya menangkapValueErrorsertaKeyboardInterrupt(GhostTR.py:230-24217). Karena itu kegagalanKeyErroratau kegagalan koneksi lolos ke luar; perilaku penanganan di lapisan menu dirinci di Penanganan Error dan Interupsi.- Target yang bukan IP valid tetap dikirim ke
http://ipwho.is/{ip}tanpa validasi lokal (GhostTR.py:425, GhostTR.py:458).