demo_visit_facebook_dealer.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. """
  2. Facebook 摩洛哥汽车经销商主页访问演示
  3. - 启动 AdsPower
  4. - 在 Facebook 搜索摩洛哥汽车经销商
  5. - 点击第一个结果进入主页
  6. - 截图并停留,不发送任何信息
  7. """
  8. import time
  9. import random
  10. import argparse
  11. from pathlib import Path
  12. from urllib.parse import urlencode
  13. from playwright.sync_api import Page
  14. try:
  15. from .ads_power_client import AdsPowerClient
  16. except ImportError:
  17. import sys
  18. sys.path.insert(0, str(Path(__file__).parent))
  19. from ads_power_client import AdsPowerClient
  20. def search_and_visit(
  21. profile_id: str,
  22. query: str = "Morocco car dealer",
  23. ads_power_url: str = "http://127.0.0.1:50325",
  24. api_key: str = "",
  25. screenshot_path: str = "facebook_dealer_visited.png",
  26. stay_seconds: int = 60
  27. ):
  28. """搜索并访问第一个经销商主页"""
  29. client = AdsPowerClient(ads_power_url, api_key=api_key)
  30. page: Page = None
  31. try:
  32. print(f"启动 AdsPower profile: {profile_id}")
  33. client.start_browser(profile_id, headless=False)
  34. page = client.get_open_page() or client.new_page()
  35. page.set_viewport_size({"width": 1280, "height": 800})
  36. # 构建 Facebook 搜索 URL
  37. encoded_query = urlencode({"q": query})
  38. search_url = f"https://www.facebook.com/search/pages/?{encoded_query}"
  39. print(f"访问搜索页: {search_url}")
  40. page.goto(search_url, wait_until="domcontentloaded", timeout=60000)
  41. time.sleep(random.uniform(4, 6))
  42. # 截图搜索结果
  43. page.screenshot(path=f"{screenshot_path}_search.png", full_page=False)
  44. print(f"搜索结果已截图: {screenshot_path}_search.png")
  45. # 收集页面链接
  46. links = set()
  47. elements = page.query_selector_all('a[href*="/"]')
  48. for el in elements:
  49. href = el.get_attribute("href")
  50. if href and _is_valid_page_link(href):
  51. links.add(_normalize_url(href))
  52. links = list(links)
  53. print(f"找到 {len(links)} 个可能的主页链接")
  54. if not links:
  55. print("未找到任何主页链接,请检查搜索词或页面是否已加载")
  56. return
  57. # 访问第一个主页
  58. first_link = links[0]
  59. print(f"准备进入第一个主页: {first_link}")
  60. page.goto(first_link, wait_until="domcontentloaded", timeout=60000)
  61. time.sleep(random.uniform(3, 5))
  62. # 截图主页
  63. page.screenshot(path=screenshot_path, full_page=False)
  64. print(f"主页已截图: {screenshot_path}")
  65. print(f"当前页面标题: {page.title()}")
  66. print(f"当前 URL: {page.url}")
  67. # 停留,不发送任何信息
  68. print(f"浏览器将停留 {stay_seconds} 秒,不执行任何发送操作...")
  69. print("请勿关闭此窗口,关闭后浏览器会自动关闭")
  70. time.sleep(stay_seconds)
  71. finally:
  72. print("断开 Playwright 连接,AdsPower 浏览器保持打开")
  73. client.close_browser()
  74. def _is_valid_page_link(href: str) -> bool:
  75. """判断是否是有效的 Facebook 主页链接"""
  76. from urllib.parse import urlparse
  77. parsed = urlparse(href)
  78. if parsed.netloc not in ["www.facebook.com", "facebook.com", "m.facebook.com"]:
  79. return False
  80. excluded = ["/search/", "/watch", "/groups", "/marketplace",
  81. "/messages", "/notifications", "/settings",
  82. "/photo.php", "/videos", "/posts", "/reel",
  83. "/profile.php"]
  84. for pattern in excluded:
  85. if pattern in parsed.path:
  86. return False
  87. path = parsed.path.strip("/")
  88. if not path or "/" in path:
  89. return False
  90. return True
  91. def _normalize_url(url: str) -> str:
  92. """标准化 Facebook URL"""
  93. from urllib.parse import urlparse
  94. parsed = urlparse(url)
  95. path = parsed.path.strip("/").split("/")[0]
  96. return f"https://www.facebook.com/{path}/"
  97. def main():
  98. parser = argparse.ArgumentParser(description="Facebook 摩洛哥汽车经销商主页访问演示")
  99. parser.add_argument("--profile-id", required=True, help="AdsPower profile ID")
  100. parser.add_argument("--query", default="Morocco car dealer", help="搜索关键词")
  101. parser.add_argument("--ads-power-url", default="http://127.0.0.1:50325", help="AdsPower API URL")
  102. parser.add_argument("--api-key", default="", help="AdsPower API Key(如已开启认证)")
  103. parser.add_argument("--screenshot", default="facebook_dealer_visited.png", help="截图保存路径")
  104. parser.add_argument("--stay", type=int, default=60, help="停留秒数")
  105. args = parser.parse_args()
  106. search_and_visit(
  107. profile_id=args.profile_id,
  108. query=args.query,
  109. ads_power_url=args.ads_power_url,
  110. api_key=args.api_key,
  111. screenshot_path=args.screenshot,
  112. stay_seconds=args.stay
  113. )
  114. if __name__ == "__main__":
  115. main()