from pathlib import Path
html = r"""
صفحة تسجيل تجريبية
"""
py = r'''import customtkinter as ctk
import random, time, threading, subprocess, sys, os, tempfile
from pathlib import Path
FIRST_NAMES = ["James","John","Robert","Michael","William","David","Richard","Joseph","Thomas","Charles",
"Christopher","Daniel","Matthew","Anthony","Mark","Paul","Steven","Andrew","Kenneth","Sarah"]
LAST_NAMES = ["Smith","Johnson","Williams","Brown","Jones","Garcia","Miller","Davis","Wilson","Taylor",
"Moore","Jackson","Martin","Anderson","Thomas","White","Harris","Clark","Lewis","Young"]
HTML_FILE = Path(__file__).with_name("signup_demo.html")
class DemoAutomationGUI(ctk.CTk):
def __init__(self):
super().__init__()
self.title("لوحة تحكم أتمتة صفحة HTML تجريبية")
self.geometry("1000x750")
self.resizable(False, False)
self.is_running = False
self.is_paused = False
self.font_title = ctk.CTkFont(family="Arial", size=22, weight="bold")
self.font_header = ctk.CTkFont(family="Arial", size=16, weight="bold")
self.font_btn = ctk.CTkFont(family="Arial", size=15, weight="bold")
self.font_body = ctk.CTkFont(family="Arial", size=14)
self.title_label = ctk.CTkLabel(
self, text="أتمتة صفحة تسجيل HTML تجريبية", font=self.font_title)
self.title_label.pack(pady=(15, 10))
top = ctk.CTkFrame(self, fg_color="transparent")
top.pack(fill="x", padx=20, pady=5)
top.grid_columnconfigure((0,1), weight=1)
box = ctk.CTkFrame(top, fg_color="#2A2A32")
box.grid(row=0,column=0,padx=10,sticky="nsew")
ctk.CTkLabel(box,text="بيانات الحساب التجريبي",font=self.font_header).pack(anchor="w",padx=15,pady=8)
self.fname = ctk.CTkEntry(box,placeholder_text="الاسم الأول",font=self.font_body,height=38)
self.fname.pack(fill="x",padx=15,pady=5)
self.lname = ctk.CTkEntry(box,placeholder_text="اسم العائلة",font=self.font_body,height=38)
self.lname.pack(fill="x",padx=15,pady=5)
self.email = ctk.CTkEntry(box,placeholder_text="البريد الإلكتروني",font=self.font_body,height=38)
self.email.pack(fill="x",padx=15,pady=5)
self.password = ctk.CTkEntry(box,placeholder_text="كلمة المرور",show="*",font=self.font_body,height=38)
self.password.pack(fill="x",padx=15,pady=5)
self.dob = ctk.CTkEntry(box,placeholder_text="تاريخ الميلاد: 1999-05-15",font=self.font_body,height=38)
self.dob.pack(fill="x",padx=15,pady=5)
self.gender = ctk.CTkComboBox(box,values=["ذكر","أنثى"],font=self.font_body,height=38)
self.gender.pack(fill="x",padx=15,pady=5)
self.btn_names = ctk.CTkButton(box,text="توليد اسم عشوائي",font=self.font_btn,
command=self.generate_names,height=38)
self.btn_names.pack(fill="x",padx=15,pady=7)
box2 = ctk.CTkFrame(top, fg_color="#2A2A32")
box2.grid(row=0,column=1,padx=10,sticky="nsew")
ctk.CTkLabel(box2,text="إعدادات التشغيل",font=self.font_header).pack(anchor="w",padx=15,pady=8)
self.url_entry = ctk.CTkEntry(box2,font=self.font_body,height=38)
self.url_entry.insert(0, HTML_FILE.as_uri())
self.url_entry.pack(fill="x",padx=15,pady=5)
ctk.CTkLabel(box2,text="التأخير بين الخطوات (ثوانٍ)",font=self.font_body).pack(anchor="w",padx=15,pady=(12,3))
self.delay = ctk.CTkSlider(box2,from_=0.5,to=4.0,number_of_steps=14)
self.delay.set(1.5)
self.delay.pack(fill="x",padx=15,pady=5)
self.btn_open = ctk.CTkButton(box2,text="فتح الصفحة التجريبية",font=self.font_btn,
command=self.open_page,height=38)
self.btn_open.pack(fill="x",padx=15,pady=8)
mid = ctk.CTkFrame(self,fg_color="#2A2A32")
mid.pack(fill="both",expand=True,padx=20,pady=10)
ctk.CTkLabel(mid,text="سجل العمليات",font=self.font_header).pack(anchor="w",padx=15,pady=5)
self.log = ctk.CTkTextbox(mid,font=self.font_body,fg_color="#1E1E24",text_color="#DDD")
self.log.pack(fill="both",expand=True,padx=10,pady=5)
actions = ctk.CTkFrame(self,fg_color="#2A2A32")
actions.pack(fill="x",padx=20,pady=10)
self.btn_stop = ctk.CTkButton(actions,text="إيقاف نهائي",fg_color="#C0392B",
command=self.stop,height=45)
self.btn_stop.pack(side="left",padx=10,pady=15,expand=True,fill="x")
self.btn_pause = ctk.CTkButton(actions,text="إيقاف مؤقت",fg_color="#F39C12",
command=self.pause,height=45)
self.btn_pause.pack(side="left",padx=10,pady=15,expand=True,fill="x")
self.btn_start = ctk.CTkButton(actions,text="بدء الأتمتة",fg_color="#27AE60",
command=self.start,height=45)
self.btn_start.pack(side="left",padx=10,pady=15,expand=True,fill="x")
self.status = ctk.CTkLabel(self,text="جاهز ⚪",font=self.font_body)
self.status.pack(pady=(0,8))
self.log_msg("تم تشغيل البرنامج. الصفحة التجريبية جاهزة.")
def log_msg(self,msg):
self.after(0,lambda:self.log.insert("end",f"[{time.strftime('%H:%M:%S')}] {msg}\n"))
self.after(0,lambda:self.log.see("end"))
def generate_names(self):
self.fname.delete(0,"end"); self.fname.insert(0,random.choice(FIRST_NAMES))
self.lname.delete(0,"end"); self.lname.insert(0,random.choice(LAST_NAMES))
self.log_msg("تم توليد اسم تجريبي.")
def open_page(self):
if not HTML_FILE.exists():
self.log_msg("ملف HTML غير موجود.")
return
os.startfile(HTML_FILE) if sys.platform=="win32" else subprocess.Popen(["xdg-open",str(HTML_FILE)])
self.log_msg("تم فتح صفحة HTML التجريبية.")
def start(self):
if self.is_running:
return
self.is_running=True
self.is_paused=False
self.status.configure(text="جاري التشغيل 🟢")
threading.Thread(target=self.run_automation,daemon=True).start()
def pause(self):
if self.is_running:
self.is_paused=not self.is_paused
self.status.configure(text="موقوف مؤقتاً 🟡" if self.is_paused else "جاري التشغيل 🟢")
self.log_msg("تم تغيير حالة الإيقاف المؤقت.")
def stop(self):
self.is_running=False
self.is_paused=False
self.status.configure(text="متوقف 🔴")
self.log_msg("تم إيقاف العملية.")
def wait(self):
while self.is_running and self.is_paused:
time.sleep(0.2)
def run_automation(self):
data = {
"الاسم الأول": self.fname.get().strip(),
"اسم العائلة": self.lname.get().strip(),
"البريد الإلكتروني": self.email.get().strip(),
"كلمة المرور": self.password.get(),
"تاريخ الميلاد": self.dob.get().strip(),
"النوع": self.gender.get().strip()
}
if not all(data.values()):
self.log_msg("املأ كل البيانات أولاً.")
self.is_running=False
return
self.open_page()
steps = [
"فتح الصفحة التجريبية",
"قراءة بيانات الحساب من النافذة",
"ملء الاسم الأول",
"ملء اسم العائلة",
"ملء البريد الإلكتروني",
"ملء كلمة المرور",
"ملء تاريخ الميلاد",
"اختيار النوع",
"مراجعة البيانات",
"إرسال النموذج التجريبي"
]
for step in steps:
if not self.is_running: break
self.wait()
self.log_msg(step + "...")
time.sleep(float(self.delay.get()) + random.uniform(0.2,0.8))
self.log_msg(step + " تم")
if self.is_running:
self.log_msg("اكتملت محاكاة التسجيل التجريبي بنجاح.")
self.status.configure(text="اكتملت العملية 🔵")
self.is_running=False
if __name__=="__main__":
app=DemoAutomationGUI()
app.mainloop()
'''
base = Path("/mnt/data")
(base/"signup_demo.html").write_text(html, encoding="utf-8")
(base/"demo_automation.py").write_text(py, encoding="utf-8")
(base/"README.txt").write_text(
"""طريقة التشغيل:
1) ثبّت Python 3.10+.
2) ثبّت CustomTkinter:
pip install customtkinter
3) ضع signup_demo.html و demo_automation.py في نفس المجلد.
4) شغّل:
python demo_automation.py
هذه نسخة تجريبية تعمل على صفحة HTML محلية ولا تتصل بفيسبوك.
""", encoding="utf-8")
import zipfile
zip_path = base/"HTML_Automation_Demo.zip"
with zipfile.ZipFile(zip_path,"w",zipfile.ZIP_DEFLATED) as z:
z.write(base/"demo_automation.py","demo_automation.py")
z.write(base/"signup_demo.html","signup_demo.html")
z.write(base/"README.txt","README.txt")
print(zip_path)