下载地址:http://m.pan38.com/download.php?code=PBDDUV 提取码:6678
该实现包含完整的微信浏览器模拟功能,支持UA生成、指纹伪装和代理IP管理。使用时需要安装selenium和fake-useragent等依赖库,可通过配置ProxyManager的API密钥使用付费代理服务。
import random
import time
import hashlib
import json
import requests
from fake_useragent import UserAgent
from urllib.parse import urlparse
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
class WeChatBrowserSimulator:
def init(self, proxy=None, enable_fingerprint=True):
self.proxy = proxy
self.enable_fingerprint = enable_fingerprint
self.wechat_ua_pool = [
'Mozilla/5.0 (Linux; Android 10; MI 9 Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2693 MMWEBSDK/201201 Mobile Safari/537.36 MMWEBID/7316 MicroMessenger/8.0.1.1841(0x28000151) Process/toolsmp WeChat/arm64',
'Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.2(0x18000231) NetType/WIFI Language/zh_CN',
'Mozilla/5.0 (Linux; Android 11; Redmi K30 Pro Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/86.0.4240.99 XWEB/3165 MMWEBSDK/20211001 Mobile Safari/537.36 MicroMessenger/8.0.16.2040(0x28001055) Process/appbrand0 WeChat/arm64'
]
self.fingerprint = self._generate_fingerprint()
def _generate_fingerprint(self):
"""生成浏览器指纹"""
ts = int(time.time() * 1000)
return {
'device_id': hashlib.md5(str(ts).encode()).hexdigest(),
'screen_resolution': f"{random.randint(360, 1920)}x{random.randint(640, 1080)}",
'color_depth': random.choice([16, 24, 32]),
'timezone': random.choice(['Asia/Shanghai', 'Asia/Hong_Kong']),
'language': 'zh-CN',
'platform': random.choice(['Linux x86_64', 'Win32', 'MacIntel']),
'hardware_concurrency': random.choice([2, 4, 8]),
'webgl_vendor': random.choice(['Intel Inc.', 'NVIDIA Corporation', 'AMD']),
'canvas_hash': hashlib.md5(str(random.random()).encode()).hexdigest(),
'webgl_hash': hashlib.md5(str(random.random()).encode()).hexdigest()
}
random
import requests
from datetime import datetime, timedelta
class ProxyManager:
def init(self, api_key=None, max_retry=3):
self.api_key = api_key
self.max_retry = max_retry
self.proxy_pool = []
self.last_refresh = None
def _is_proxy_valid(self, proxy):
"""验证代理是否可用"""
try:
test_url = 'http://httpbin.org/ip'
proxies = {'http': proxy, 'https': proxy}
resp = requests.get(test_url, proxies=proxies, timeout=10)
return resp.status_code == 200
except:
return False
def refresh_proxy_pool(self, count=10):
"""刷新代理池"""
if self.api_key:
# 从付费API获取代理
api_url = f'https://proxyapi.com/v1/?api_key={self.api_key}&count={count}'
try:
resp = requests.get(api_url)
new_proxies = resp.json().get('data', [])
self.proxy_pool = [p for p in new_proxies if self._is_proxy_valid(p)]
except Exception as e:
print(f"刷新代理池失败: {str(e)}")
else:
# 免费代理源
free_sources = [
'https://www.proxy-list.download/api/v1/get?type=http',
'https://api.proxyscrape.com/v2/?request=getproxies&protocol=http'
]
for source in free_sources:
try:
resp = requests.get(source, timeout=10)
new_proxies = resp.text.split('\r\n')
self.proxy_pool.extend([p for p in new_proxies if self._is_proxy_valid(p)])
except:
continue
self.last_refresh = datetime.now()
return len(self.proxy_pool)
from selenium.webdriver import ChromeOptions
from selenium.webdriver.common.proxy import Proxy, ProxyType
def configure_wechat_driver(simulator, proxy_manager=None):
"""配置微信浏览器驱动"""
options = ChromeOptions()
# 设置微信UA
ua = random.choice(simulator.wechat_ua_pool)
options.add_argument(f'user-agent={ua}')
# 移动端模拟
options.add_argument('--use-mobile-user-agent')
options.add_experimental_option("mobileEmulation", {
"deviceMetrics": {"width": 375, "height": 667, "pixelRatio": 3.0},
"userAgent": ua
})
# 指纹设置
if simulator.enable_fingerprint:
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
# 代理设置
if proxy_manager and proxy_manager.proxy_pool:
proxy = random.choice(proxy_manager.proxy_pool)
proxy_obj = Proxy()
proxy_obj.proxy_type = ProxyType.MANUAL
proxy_obj.http_proxy = proxy
proxy_obj.ssl_proxy = proxy
options.add_argument(f'--proxy-server={proxy}')
# 其他配置
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-extensions')
return options