| import asyncio |
| import random |
| import logging |
| import requests |
| import sys |
| from playwright.async_api import async_playwright |
| from playwright_stealth import stealth_async |
|
|
| |
| TARGET_URL = "https://yourwebsite.com" |
| MAX_BOTS = 2 |
| MIN_STAY = 60 |
| MAX_STAY = 150 |
|
|
| |
| PROXY_API_URL = "https://api.proxyscrape.com/v2/?request=displayproxies&protocol=http&timeout=10000&country=all&ssl=all&anonymity=all" |
|
|
| |
| logging.basicConfig( |
| level=logging.INFO, |
| format='%(asctime)s | %(levelname)s | %(message)s', |
| datefmt='%H:%M:%S', |
| handlers=[logging.StreamHandler(sys.stdout)] |
| ) |
|
|
| def fetch_free_proxies(): |
| """ดึง Proxy ฟรีจาก API อัตโนมัติ""" |
| try: |
| logging.info("🌐 [SYSTEM] กำลังดึงรายชื่อ Proxy ใหม่ล่าสุด...") |
| response = requests.get(PROXY_API_URL, timeout=15) |
| if response.status_code == 200: |
| proxies = response.text.splitlines() |
| active_proxies = [f"http://{p.strip()}" for p in proxies if p.strip()] |
| logging.info(f"✅ [SYSTEM] ดึงสำเร็จ! พบ Proxy ทั้งหมด {len(active_proxies)} ตัว") |
| return active_proxies |
| except Exception as e: |
| logging.error(f"❌ [SYSTEM] ดึง Proxy ไม่สำเร็จ: {e}") |
| return [] |
|
|
| async def simulate_human_behavior(page, bot_id): |
| """จำลองการอ่านเว็บแบบละเอียด""" |
| try: |
| action = random.choice(["SCROLL", "MOUSE_MOVE", "WAIT"]) |
| |
| if action == "SCROLL": |
| pix = random.randint(300, 900) |
| await page.mouse.wheel(0, pix) |
| logging.info(f"🖱️ [BOT-{bot_id}] Action: เลื่อนหน้าจอลง {pix} px") |
| |
| elif action == "MOUSE_MOVE": |
| x, y = random.randint(100, 1000), random.randint(100, 800) |
| await page.mouse.move(x, y) |
| logging.info(f"📍 [BOT-{bot_id}] Action: ขยับเมาส์ไปที่ ({x}, {y})") |
| |
| |
| if random.random() < 0.3: |
| links = await page.query_selector_all("a") |
| internal = [] |
| for l in links: |
| href = await l.get_attribute("href") |
| if href and (href.startswith("/") or TARGET_URL in href): |
| internal.append(l) |
| |
| if internal: |
| target = random.choice(internal) |
| target_href = await target.get_attribute("href") |
| logging.info(f"🔗 [BOT-{bot_id}] กำลังคลิก Link ภายใน: {target_href}") |
| await target.click() |
| await page.wait_for_load_state("networkidle") |
| logging.info(f"📄 [BOT-{bot_id}] โหลดหน้าใหม่สำเร็จ") |
| except Exception as e: |
| logging.debug(f"⚠️ [BOT-{bot_id}] พฤติกรรมจำลองติดขัดเล็กน้อย") |
|
|
| async def run_bot(bot_id, proxy_list): |
| """ฟังก์ชันหลักของบอทแต่ละตัว""" |
| logging.info(f"🚀 [BOT-{bot_id}] เริ่มต้นการทำงาน...") |
| |
| while True: |
| proxy_url = random.choice(proxy_list) if proxy_list else None |
| |
| async with async_playwright() as p: |
| browser_args = [ |
| "--no-sandbox", |
| "--disable-setuid-sandbox", |
| "--disable-dev-shm-usage", |
| "--disable-blink-features=AutomationControlled" |
| ] |
| |
| launch_options = {"headless": True, "args": browser_args} |
| if proxy_url: |
| launch_options["proxy"] = {"server": proxy_url} |
|
|
| try: |
| logging.info(f"🛰️ [BOT-{bot_id}] พยายามเชื่อมต่อผ่าน IP: {proxy_url if proxy_url else 'DIRECT'}") |
| |
| browser = await p.chromium.launch(**launch_options) |
| context = await browser.new_context( |
| user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0", |
| viewport={'width': 1366, 'height': 768} |
| ) |
| page = await context.new_page() |
| await stealth_async(page) |
|
|
| |
| stay_duration = random.randint(MIN_STAY, MAX_STAY) |
| logging.info(f"🌍 [BOT-{bot_id}] กำลังเข้าเว็บ: {TARGET_URL}") |
| |
| response = await page.goto(TARGET_URL, wait_until="domcontentloaded", timeout=60000) |
| |
| if response and response.status == 200: |
| logging.info(f"✅ [BOT-{bot_id}] เข้าเว็บสำเร็จ (Status: 200). จะแช่อยู่ {stay_duration} วินาที") |
| |
| |
| start_time = asyncio.get_event_loop().time() |
| while asyncio.get_event_loop().time() - start_time < stay_duration: |
| await simulate_human_behavior(page, bot_id) |
| await asyncio.sleep(random.randint(5, 12)) |
| |
| logging.info(f"🏆 [BOT-{bot_id}] ภารกิจเสร็จสิ้น (Session Completed)") |
| else: |
| status = response.status if response else "No Response" |
| logging.warning(f"⚠️ [BOT-{bot_id}] เว็บตอบกลับด้วยสถานะ: {status}") |
|
|
| await browser.close() |
| |
| except Exception as e: |
| logging.error(f"💢 [BOT-{bot_id}] เกิดข้อผิดพลาด/Proxy ตาย: {str(e)[:100]}...") |
| |
| |
| wait_next = random.randint(30, 60) |
| logging.info(f"💤 [BOT-{bot_id}] พักเครื่อง {wait_next} วินาที ก่อนเริ่มรอบถัดไป...") |
| await asyncio.sleep(wait_next) |
|
|
| async def main(): |
| logging.info("🔥 [SYSTEM] เริ่มการทำงานระบบ SEO Booster (Real-time Log Mode)") |
| |
| |
| proxy_list = fetch_free_proxies() |
| |
| if not proxy_list: |
| logging.warning("⚠️ [SYSTEM] ไม่พบ Proxy ระบบจะทำงานด้วย IP ตรง (เสี่ยงโดนแบน)") |
|
|
| |
| tasks = [run_bot(i+1, proxy_list) for i in range(MAX_BOTS)] |
| await asyncio.gather(*tasks) |
|
|
| if __name__ == "__main__": |
| try: |
| asyncio.run(main()) |
| except KeyboardInterrupt: |
| logging.info("🛑 [SYSTEM] หยุดการทำงานโดยผู้ใช้") |
| |