9
Username Tracker
TrackLu adalah handler untuk opsi menu nomor 4, Username Tracker, yang didaftarkan pada list options bersama func miliknya. Fungsi ini menerima satu username, menyusun URL dari setiap entri social_media, lalu mencatat hasil per platform ke dictionary results berdasarkan response.status_code GhostTR.py:198-2011 GhostTR.py:121-1242.
Karena TrackLu didekorasi is_option, banner digambar lebih dulu sebelum prompt Enter Username muncul. Mekanisme dekorator itu dibahas di Banner dan Dekorator is_option; halaman ini hanya membahas isi fungsi.
Template URL per platform
Sumber seluruh pemeriksaan adalah list social_media berisi 24 entri, masing-masing sebuah dictionary dengan kunci url (template bertanda {}) dan name (label platform). Hanya Snapchat yang muncul dua kali, sehingga jumlah platform unik adalah 23 GhostTR.py:125-1513.
name | template url |
|---|---|
| https://www.facebook.com/{} | |
| https://www.twitter.com/{} | |
| https://www.instagram.com/{} | |
| https://www.linkedin.com/in/{} | |
| GitHub | https://www.github.com/{} |
| https://www.pinterest.com/{} | |
| Tumblr | https://www.tumblr.com/{} |
| Youtube | https://www.youtube.com/{} |
| SoundCloud | https://soundcloud.com/{} |
| Snapchat | https://www.snapchat.com/add/{} |
| TikTok | https://www.tiktok.com/@{} |
| Behance | https://www.behance.net/{} |
| Medium | https://www.medium.com/@{} |
| Quora | https://www.quora.com/profile/{} |
| Flickr | https://www.flickr.com/people/{} |
| Periscope | https://www.periscope.tv/{} |
| Twitch | https://www.twitch.tv/{} |
| Dribbble | https://www.dribbble.com/{} |
| StumbleUpon | https://www.stumbleupon.com/stumbler/{} |
| Ello | https://www.ello.co/{} |
| Product Hunt | https://www.producthunt.com/@{} |
| Snapchat (entri kedua) | https://www.snapchat.com/add/{} |
| Telegram | https://www.telegram.me/{} |
| We Heart It | https://www.weheartit.com/{} |
Alur fan-out satu username
Satu input username disebar ke seluruh entri list: site['url'].format(username) menghasilkan URL konkret, requests.get(url) memanggil situs itu, dan hasilnya dipetakan kembali ke results dengan kunci site['name'] GhostTR.py:152-1584. Diagram berikut menunjukkan bentuk fan-out tersebut beserta dua cabang hasilnya.
graph TD
IN["TrackLu: Enter Username"] --> LOOP["for site in social_media (24 entri)"]
CFG["social_media: kunci 'url' + 'name'"] --> LOOP
LOOP --> FMT["site['url'].format(username)"]
FMT --> REQ["requests.get(url)"]
REQ --> FB["Facebook"]
REQ --> GH["GitHub"]
REQ --> IG["Instagram"]
REQ --> TK["TikTok"]
REQ --> TW["Twitch"]
REQ --> REST["We Heart It dan 18 situs lain"]
FB --> D{"status_code == 200 ?"}
GH --> D
IG --> D
TK --> D
TW --> D
REST --> D
D -->|"ya"| HIT["results[site['name']] = url"]
D -->|"tidak"| MISS["results[site['name']] = 'Username not found !'"]
RES["results = {}"] --> HIT
HIT --> RES
MISS --> RES
RES --> PRINT["for site, url in results.items(): print"]
PRINT --> FIN["SHOW INFORMATION USERNAME"]
style RES fill:#336791,color:#fff
style IN fill:#8b5cf6,color:#fff
style CFG fill:#f59e0b,color:#000
style REQ fill:#f59e0b,color:#000
style HIT fill:#2d7d46,color:#fff
style MISS fill:#dc2626,color:#fff
style PRINT fill:#336791,color:#fff
%% fig: Fan-out satu username ke 24 entri social_media
%% desc: Username diformat per entri list, diperiksa lewat requests.get, lalu dicatat ke results sesuai status_code sebelum dicetak.Setiap entri selalu mengisi satu kunci di results, apa pun hasil pemeriksaannya. Konsekuensinya, tahap cetak menampilkan seluruh 23 platform: yang cocok sebagai URL, yang tidak cocok sebagai teks Username not found ! GhostTR.py:152-1584 GhostTR.py:159-1665.
Kondisi response.status_code | Nilai results[site['name']] |
|---|---|
== 200 | url hasil format(username) |
selain 200 | string f"{Ye}Username not found {Ye}!", bukan URL |
Siklus satu request dan jalur kegagalan
Urutan pemanggilan berjalan serial di dalam satu for, tanpa jeda antar situs dan tanpa argumen timeout pada requests.get GhostTR.py:152-1584. Seluruh blok try membungkus input sekaligus loop, sehingga satu exception dari requests langsung melompat ke except Exception as e, mencetak Error : {e}, lalu return sebelum header SHOW INFORMATION USERNAME sempat dicetak. Artinya results yang sudah terisi sebagian dibuang tanpa ditampilkan GhostTR.py:159-1665.
sequenceDiagram
participant U as user
participant T as TrackLu
participant Q as requests
participant S as situs target
U->>T: Enter Username
loop setiap site di social_media
T->>T: url = site['url'].format(username)
T->>Q: requests.get(url)
Q->>S: HTTP GET tanpa timeout
S-->>Q: response
Q-->>T: response
alt status_code == 200
T->>T: results[site['name']] = url
else status_code != 200
T->>T: results[site['name']] = 'Username not found !'
end
end
alt Exception terangkat di mana pun di dalam try
T-->>U: 'Error : {e}' lalu return
else loop selesai penuh
T-->>U: 'SHOW INFORMATION USERNAME' dan semua isi results
end
style U fill:#8b5cf6,color:#fff
style T fill:#f59e0b,color:#000
%% fig: Siklus satu request TrackLu
%% desc: Setiap situs dipanggil berurutan; exception di tengah loop mengakhiri fungsi sebelum tahap cetak, sedangkan loop yang selesai penuh mencetak seluruh results.⚠️
requests.get(url)dipanggil tanpatimeoutdan tanpatime.sleepdi antara situs. Satu situs yang menggantung menahan seluruh 24 pemeriksaan, dan exception apa pun membatalkan laporan yang sudah hampir lengkap GhostTR.py:152-1584.
⚠️ Pemeriksaan hanya memakai
status_code == 200. Halaman login, halaman404yang dikembalikan dengan status200, atau blokir bot akan terbaca sebagai username ditemukan; sebaliknya301/403yang tetap menandakan akun ada akan dicatat sebagaiUsername not found !GhostTR.py:155-1586.
Setelah fungsi selesai mencetak, kendali kembali ke execute_option, yang meminta Press enter to continue lalu menjalankan main() lagi; alur kembali ke menu itu dijelaskan di Validasi Opsi dan Loop Menu. Cara clear() dan run_banner() membersihkan layar sebelum hasil tampil ada di Struktur Berkas dan Arsitektur.