Pembuatan Lisensi Online Menggunakan Python
Oke berikut ini merupakan lisensi dimana satu lisensi hanya bisa digunakan untuk satu device saja, pertama kalian perlu menyiapkan databasenya, jika sudah masukan query berikut.
CREATE TABLE serial_number (
serial_number VARCHAR(255) PRIMARY KEY,
expired_date TIMESTAMP,
max_sessions INT DEFAULT 3,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE session (
id SERIAL PRIMARY KEY,
serial_number VARCHAR(255) REFERENCES serial_number(serial_number),
session_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
device_name VARCHAR(255),
UNIQUE(serial_number, device_name) -- Pastikan tidak ada duplikasi device_name untuk nomor seri yang sama
);
kode di atas akan membuat 2 table bernama serial_number dan session. jika sudah kita isikan dummy lisensinya sebagai contoh query berikut.
-- Menambahkan data awal ke tabel serial_number
INSERT INTO serial_number (serial_number, expired_date, max_sessions, created_at)
VALUES
('ABC12345', '2024-12-31 23:59:59', 3, CURRENT_TIMESTAMP),
('DEF67890', '2024-11-30 23:59:59', 3, CURRENT_TIMESTAMP),
('GHI54321', '2024-10-31 23:59:59', 2, CURRENT_TIMESTAMP);
Nah pada contoh di atas kita menambahkan 3 lisensi dengan max 3 device. jika sudah maka sekarang buat kode python untuk menanyakan lisensi tersebut sebelum memasuki program.
pertama install dulu pustaka yang dibutuhkan.
pip install psycopg2 termcolor
jika sudah buat kode berikut.
import psycopg2
from datetime import datetime
from typing import Tuple, List
import uuid
import platform
from termcolor import colored
# Konfigurasi koneksi PostgreSQL
DATABASE_CONFIG = {
'dbname': 'postgres',
'user': 'postgres.lipscnvlenwiebjwo',
'password': '4tE79324jkfZLkUoa',
'host': 'aws-0-ap-southeast-1.pooler.supabase.com',
'port': 6543
}
def get_device_uuid() -> str:
"""Generate a UUID based on system information."""
system_info = f"{platform.node()}_{platform.system()}_{platform.machine()}_{platform.processor()}"
return str(uuid.uuid5(uuid.NAMESPACE_DNS, system_info))
# Fungsi untuk memeriksa apakah perangkat terdaftar di database
def check_device(device_name: str) -> Tuple[bool, str, str, int]:
try:
conn = psycopg2.connect(**DATABASE_CONFIG)
cursor = conn.cursor()
query = """
SELECT serial_number
FROM session
WHERE device_name = %s
"""
cursor.execute(query, (device_name,))
result = cursor.fetchone()
if result:
serial_number = result[0]
cursor.execute("""
SELECT expired_date, max_sessions
FROM serial_number
WHERE serial_number = %s
""", (serial_number,))
serial_info = cursor.fetchone()
expired_date = serial_info[0] if serial_info else None
max_sessions = serial_info[1] if serial_info else 1 # Default to 1 if not set
cursor.close()
conn.close()
return True, serial_number, expired_date, max_sessions
else:
cursor.close()
conn.close()
return False, '', '', 0
except Exception as e:
print(f"Error checking device: {e}")
return False, '', '', 0
# Fungsi untuk memeriksa apakah nomor seri valid dan tidak kedaluwarsa
def check_serial_number(serial_number: str) -> Tuple[bool, int, str]:
try:
conn = psycopg2.connect(**DATABASE_CONFIG)
cursor = conn.cursor()
query = """
SELECT expired_date, max_sessions
FROM serial_number
WHERE serial_number = %s
"""
cursor.execute(query, (serial_number,))
result = cursor.fetchone()
cursor.close()
conn.close()
if result:
expired_date = result[0]
max_sessions = result[1] if result[1] else 1 # Default to 1 if not set
if expired_date:
expired_date = expired_date.replace(tzinfo=None) # Remove timezone info for comparison
if datetime.now() > expired_date:
expired_date_str = expired_date.strftime('%d-%m-%Y') if expired_date else 'N/A'
print("~" * 45)
print("The serial number has expired on", colored(f"{expired_date_str}", "yellow"))
return False, max_sessions, expired_date
return True, max_sessions, expired_date
else:
return False, 0, ''
except Exception as e:
print(f"Error checking serial number: {e}")
return False, 0, ''
# Fungsi untuk menyimpan nomor seri ke tabel session
def save_session(serial_number: str, device_name: str) -> bool:
try:
conn = psycopg2.connect(**DATABASE_CONFIG)
cursor = conn.cursor()
# Periksa tanggal expired dari serial_number
cursor.execute("SELECT expired_date FROM serial_number WHERE serial_number = %s", (serial_number,))
expired_date = cursor.fetchone()[0]
expired_date = expired_date.replace(tzinfo=None)
if datetime.now() > expired_date:
# print("Nomor seri telah kedaluwarsa.")
expired_date_str = expired_date.strftime('%d-%m-%Y, %H:%M') if expired_date else 'N/A'
print(f"Serial number telah kedaluwarsa pada {expired_date_str}")
cursor.close()
conn.close()
return False
# Periksa jumlah sesi aktif untuk nomor seri ini
cursor.execute("SELECT COUNT(*) FROM session WHERE serial_number = %s", (serial_number,))
count = cursor.fetchone()[0]
# Dapatkan batas maksimum sesi dari tabel serial_number
cursor.execute("SELECT max_sessions FROM serial_number WHERE serial_number = %s", (serial_number,))
max_sessions = cursor.fetchone()[0]
if count >= max_sessions:
print(f"The serial number is for ({max_sessions}) devices only.")
cursor.close()
conn.close()
return False
# Periksa apakah perangkat sudah terdaftar dengan nomor seri ini
cursor.execute("SELECT COUNT(*) FROM session WHERE serial_number = %s AND device_name = %s", (serial_number, device_name))
device_count = cursor.fetchone()[0]
if device_count == 0:
# Simpan sesi baru
query = """
INSERT INTO session (serial_number, device_name, session_at)
VALUES (%s, %s, CURRENT_TIMESTAMP)
"""
cursor.execute(query, (serial_number, device_name))
conn.commit()
cursor.close()
conn.close()
return True
except Exception as e:
print(f"Error saving session: {e}")
return False
# Fungsi untuk menghapus nomor seri dari tabel session
def clear_session(serial_number: str, device_name: str):
try:
conn = psycopg2.connect(**DATABASE_CONFIG)
cursor = conn.cursor()
query = "DELETE FROM session WHERE serial_number = %s AND device_name = %s"
cursor.execute(query, (serial_number, device_name))
conn.commit()
cursor.close()
conn.close()
except Exception as e:
print(f"Error clearing session: {e}")
# Fungsi untuk membaca informasi sesi dari tabel session
def read_session_info(serial_number: str) -> Tuple[int, List[str]]:
try:
conn = psycopg2.connect(**DATABASE_CONFIG)
cursor = conn.cursor()
query = """
SELECT device_name, session_at
FROM session
WHERE serial_number = %s
"""
cursor.execute(query, (serial_number,))
results = cursor.fetchall()
cursor.close()
conn.close()
device_names = [result[0] for result in results]
return len(device_names), device_names
except Exception as e:
print(f"Error reading session info: {e}")
return 0, []
# Fungsi utama aplikasi
def highlight_keywords(text):
if text.startswith("Expired:"):
return colored(text, 'cyan')
elif text.startswith("Device Max:"):
return colored(text, 'cyan')
elif text.startswith("Device Status:"):
return colored(text, 'cyan')
elif text.startswith("Device Info:"):
return colored(text, 'cyan')
return text
def display_info_in_columns(tools, max_tools_per_column=2):
columns = [tools[i:i + max_tools_per_column] for i in range(0, len(tools), max_tools_per_column)]
# Print header
print("\nLicense", colored("Active!", "green"))
# Print separator
print("~" * 100)
# Print data tools
for i in range(max_tools_per_column):
row = []
for col in columns:
if i < len(col):
highlighted_text = highlight_keywords(col[i])
row.append(f"* {highlighted_text:<45}")
else:
row.append(" " * 24) # Fill empty columns
print("".join(row))
# Print separator
print("~" * 100)
print("")
return input("Enter '0' to delete the license or press Enter to continue: ")
def main():
device_name = get_device_uuid()
# Check if device is registered in the database
device_registered, serial_number, expired_date, max_sessions = check_device(device_name)
if device_registered:
# Check if serial number has expired
expired_date = expired_date.replace(tzinfo=None)
if datetime.now() > expired_date:
expired_date_str = expired_date.strftime('%d-%m-%Y, %H:%M') if expired_date else 'N/A'
print(f"Serial number telah kedaluwarsa pada {expired_date_str}")
clear_session(serial_number, device_name)
input("")
return
expired_date_str = expired_date.strftime('%d-%m-%Y, %H:%M') if expired_date else 'N/A'
tools = [
f"Expired: {expired_date_str}",
f"Device Max: {max_sessions}",
f"Device Info: ({device_name})",
]
# Read session information
session_count, devices = read_session_info(serial_number)
devices_list = ', '.join(devices)
# tools.append(f"Device Status: {session_count} Active ({devices_list})")
tools.append(f"Device Status: {session_count} Active")
action = display_info_in_columns(tools)
if action == '0':
clear_session(serial_number, device_name)
print(colored("License has been removed.", "red"), "You need to enter the serial number again when opening the app.")
main()
return
else:
print("\n"*100)
print(colored("Welcome back!", "yellow"))
input("Berhasil masuk!!")
return
# If the device is not registered, ask for serial number from the user
serial_number = input(colored("License Number: ", "cyan"))
# Check serial number information and maximum session limit
is_valid, max_sessions, expired_date = check_serial_number(serial_number)
if not is_valid:
print(colored("invalid!", "red"), "Please try again.")
main()
return
expired_date_str = expired_date.strftime('%d-%m-%Y, %H:%M') if expired_date else 'N/A'
# Save new session
if save_session(serial_number, device_name):
tools = [
f"Expired: {expired_date_str}",
f"Device Max: {max_sessions}",
f"Device Info: ({device_name})"
]
# Read session information
session_count, devices = read_session_info(serial_number)
devices_list = ', '.join(devices)
tools.append(f"Device Status: {session_count} Active")
display_info_in_columns(tools)
print(colored("session has been saved..","yellow"))
input("Berhasil masuk!!")
else:
print(colored("The maximum number of active sessions has been reached, please remove the device beforehand..", "red"))
main()
if __name__ == "__main__":
main()