#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 网站刷量广告机器人 (专业版) 专门用于刷量和广告互动 针对Fun Games Hub网站优化 """ import requests import time import random import json import os import logging from urllib.parse import urlparse, urljoin import re from real_user_database import RealUserDatabase # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler('ad_bot.log', encoding='utf-8'), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) class WebsiteAdBot: def __init__(self, config_file='config.json'): """ 初始化广告刷量机器人 """ self.config = self.load_config(config_file) self.session = None self.user_db = RealUserDatabase() self.current_profile = None self.current_behavior = None # 🎮 基于网站截图的真实游戏列表 self.games_list = [ {"name": "2048", "url": "/games/2048/index.html", "category": "puzzle"}, {"name": "Snake", "url": "/games/snake/index.html", "category": "arcade"}, {"name": "DIY Doll", "url": "/games/diy-doll/index.html", "category": "puzzle"}, {"name": "Sprunki", "url": "/games/sprunki/index.html", "category": "arcade"}, {"name": "FlightBird", "url": "/games/flightbird/index.html", "category": "action"}, {"name": "Diy Doll Factory", "url": "/games/iframe-games.html?game=diy-doll-factory", "category": "puzzle"}, {"name": "Super Sprunki Adventure", "url": "/games/iframe-games.html?game=super-sprunki-adventure", "category": "action"}, ] # 🎯 游戏分类列表 self.game_categories = [ {"name": "Puzzle", "games": 4}, {"name": "Arcade", "games": 3}, {"name": "Action", "games": 2}, {"name": "Strategy", "games": 1}, {"name": "All", "games": 10} ] # 🎯 真实的访问来源(针对游戏网站) self.game_traffic_sources = [ # 游戏相关搜索 "https://www.google.com/search?q=free+online+games", "https://www.google.com/search?q=2048+game+play+online", "https://www.google.com/search?q=snake+game+browser", "https://www.google.com/search?q=puzzle+games+online+free", "https://www.google.com/search?q=fun+games+hub", "https://www.google.com/search?q=html5+games+no+download", "https://www.google.com/search?q=browser+games+2024", # 游戏社区来源 "https://www.reddit.com/r/WebGames/", "https://www.reddit.com/r/incremental_games/", "https://news.ycombinator.com/", "https://www.producthunt.com/", "https://github.com/topics/game", "https://github.com/topics/html5-game", # 中文游戏搜索 "https://www.google.com/search?q=在线小游戏", "https://www.google.com/search?q=免费网页游戏", "https://www.google.com/search?q=2048数字游戏", "https://www.baidu.com/s?wd=网页小游戏", "https://www.baidu.com/s?wd=在线游戏平台", ] def load_config(self, config_file): """加载配置文件""" try: with open(config_file, 'r', encoding='utf-8') as f: config = json.load(f) logger.info(f"配置文件加载成功: {config_file}") return config except FileNotFoundError: logger.error(f"配置文件未找到: {config_file}") raise except json.JSONDecodeError as e: logger.error(f"配置文件格式错误: {e}") raise def setup_session(self): """设置请求会话 - 广告友好版""" self.session = requests.Session() self.session.cookies.clear() # 生成真实用户配置 self.current_profile = self.user_db.get_random_user_profile() self.current_behavior = self.user_db.get_visit_behavior() # 设置代理 proxy_config = self.config.get('proxy') if proxy_config: proxy_url = f"http://{proxy_config['username']}:{proxy_config['password']}@{proxy_config['host']}:{proxy_config['port']}" self.session.proxies = { 'http': proxy_url, 'https': proxy_url } logger.info(f"已配置代理: {proxy_config['host']}:{proxy_config['port']}") # 🎯 广告友好的用户代理 - 移动端为主 if random.random() < 0.8: # 80%概率使用移动端(广告收益更高) mobile_agents = [ "Mozilla/5.0 (iPhone; CPU iPhone OS 17_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1", "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1", "Mozilla/5.0 (Linux; Android 14; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36", "Mozilla/5.0 (Linux; Android 13; SM-A515F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Mobile Safari/537.36", "Mozilla/5.0 (iPad; CPU OS 17_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1", ] user_agent = random.choice(mobile_agents) is_mobile = True else: user_agent = self.current_profile["user_agent"] is_mobile = "Mobile" in user_agent # 完整的广告友好头部 headers = { "User-Agent": user_agent, "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Sec-Fetch-Dest": "document", "Sec-Fetch-Mode": "navigate", "Sec-Fetch-Site": "none", "Sec-Fetch-User": "?1", "Cache-Control": "max-age=0", "DNT": "0", # 不启用DNT,对广告友好 "Pragma": "no-cache", } # 移动端特殊头部 if is_mobile: headers.update({ "Sec-CH-UA-Mobile": "?1", "Viewport-Width": str(random.choice([375, 414, 390, 393, 412])), "Device-Memory": str(random.choice([4, 6, 8])), }) self.session.headers.update(headers) logger.info(f"🎭 广告机器人配置:") logger.info(f" 📱 User-Agent: {user_agent}") logger.info(f" 📱 移动端模式: {is_mobile}") logger.info(f" 🎯 访问模式: {self.current_behavior['pattern_type']}") # 获取当前IP current_ip = self.get_current_ip() if current_ip: print(f"🌍 当前IP: {current_ip}") print(f"🎯 广告刷量模式: 移动端={is_mobile}, 模式={self.current_behavior['pattern_type']}") def get_current_ip(self): """获取当前IP地址""" try: response = self.session.get('https://httpbin.org/ip', timeout=10) if response.status_code == 200: data = response.json() return data.get('origin', 'Unknown') except: pass return None def simulate_traffic_source(self): """模拟真实的游戏网站访问来源""" source = random.choice(self.game_traffic_sources) try: logger.info(f"🔗 模拟从游戏相关来源访问: {source}") # 根据来源类型设置不同的停留时间 if "google.com" in source or "baidu.com" in source: stay_time = random.uniform(2, 8) # 搜索引擎停留较短 logger.info(f"🔍 搜索引擎停留: {stay_time:.1f}秒") elif "reddit.com" in source: stay_time = random.uniform(8, 20) # Reddit停留较长 logger.info(f"🔍 Reddit社区停留: {stay_time:.1f}秒") elif "github.com" in source: stay_time = random.uniform(5, 15) # GitHub中等停留 logger.info(f"🔍 GitHub停留: {stay_time:.1f}秒") else: stay_time = random.uniform(3, 12) # 其他网站 logger.info(f"🔍 其他来源停留: {stay_time:.1f}秒") # 模拟来源网站行为 self._simulate_source_behavior(stay_time) # 设置referrer self.session.headers.update({ 'Referer': source, 'Sec-Fetch-Site': 'cross-site' }) return True except Exception as e: logger.error(f"来源访问模拟失败: {e}") return False def _simulate_source_behavior(self, total_time): """模拟在来源网站的行为""" actions = [ "浏览搜索结果", "阅读页面内容", "查看相关链接", "滚动浏览页面", "点击相关内容" ] segments = random.randint(2, 4) segment_time = total_time / segments for i in range(segments): if i > 0: time.sleep(random.uniform(0.5, 2)) action = random.choice(actions) logger.info(f" 🔍 {action}") time.sleep(segment_time * random.uniform(0.7, 1.3)) def visit_homepage_with_ads(self): """访问首页并重点关注广告""" main_site = self.config['targets']['main_site'] try: logger.info(f"🏠 访问首页并关注广告: {main_site}") # 人工延迟 pre_delay = random.uniform(3, 7) logger.info(f"🕐 访问前延迟: {pre_delay:.1f}秒") time.sleep(pre_delay) # 发起请求 response = self.session.get(main_site, timeout=20, allow_redirects=True) if response.status_code == 200: logger.info(f"✅ 首页访问成功 ({response.status_code})") logger.info(f"📦 页面大小: {len(response.content)} 字节") # 🎯 专注于首页停留和广告交互 self._simulate_homepage_ad_interaction(response) return True else: logger.error(f"❌ 首页访问失败 ({response.status_code})") return False except Exception as e: logger.error(f"首页访问出错: {e}") return False def _simulate_homepage_ad_interaction(self, response): """模拟首页广告交互""" base_url = response.url # 🎯 首页深度停留 - 广告需要更长的展示时间 homepage_stay_time = random.uniform(15, 45) # 15-45秒深度停留 logger.info(f"🏠 首页深度停留时间: {homepage_stay_time:.1f}秒") # 分阶段模拟首页行为 stages = [ {"name": "初始加载", "duration": 0.2, "actions": ["页面加载", "渲染广告"]}, {"name": "浏览游戏", "duration": 0.3, "actions": ["查看热门游戏", "浏览游戏分类"]}, {"name": "广告互动", "duration": 0.3, "actions": ["查看广告", "广告展示", "可能点击"]}, {"name": "深度探索", "duration": 0.2, "actions": ["滚动页面", "查看更多游戏"]} ] for stage in stages: stage_time = homepage_stay_time * stage["duration"] logger.info(f"🎯 {stage['name']}阶段: {stage_time:.1f}秒") # 执行该阶段的行为 action_count = len(stage["actions"]) action_time = stage_time / action_count for action in stage["actions"]: logger.info(f" 📱 {action}") # 特殊处理广告相关行为 if "广告" in action: self._simulate_ad_behavior(base_url, action_time) else: time.sleep(action_time * random.uniform(0.8, 1.2)) # 动作间随机间隔 if random.random() < 0.7: time.sleep(random.uniform(0.5, 2)) # 🎯 额外的广告专项行为 if random.random() < 0.8: # 80%概率进行广告专项行为 self._simulate_dedicated_ad_behavior(base_url) def _simulate_ad_behavior(self, base_url, duration): """模拟广告行为""" logger.info(f" 💰 广告行为开始,持续 {duration:.1f}秒") # 模拟广告加载时间 ad_load_time = random.uniform(1, 3) logger.info(f" 📺 广告加载: {ad_load_time:.1f}秒") time.sleep(ad_load_time) # 模拟广告展示时间 ad_display_time = duration - ad_load_time if ad_display_time > 0: logger.info(f" 👀 广告展示: {ad_display_time:.1f}秒") time.sleep(ad_display_time) # 模拟可能的广告点击 if random.random() < 0.15: # 15%概率点击广告 self._simulate_ad_click(base_url) def _simulate_ad_click(self, base_url): """模拟广告点击""" logger.info(f" 🖱️ 模拟广告点击") # 模拟点击延迟 click_delay = random.uniform(0.5, 2) time.sleep(click_delay) # 模拟广告相关请求 ad_endpoints = [ "/ads/click", "/advertising/track", "/ad/impression", "/analytics/ad", "/track/click" ] for endpoint in random.sample(ad_endpoints, random.randint(1, 2)): try: parsed_url = urlparse(base_url) ad_url = f"{parsed_url.scheme}://{parsed_url.netloc}{endpoint}" ad_headers = self.session.headers.copy() ad_headers.update({ "X-Requested-With": "XMLHttpRequest", "Content-Type": "application/json", "Referer": base_url, "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", }) response = self.session.get(ad_url, headers=ad_headers, timeout=5) logger.info(f" 📊 广告请求: {endpoint} ({response.status_code})") time.sleep(random.uniform(0.5, 1.5)) except Exception as e: logger.debug(f" ⚠️ 广告请求失败 {endpoint}: {e}") def _simulate_dedicated_ad_behavior(self, base_url): """专项广告行为模拟""" logger.info(f"💰 开始专项广告行为") # 模拟滚动到广告位置 scroll_time = random.uniform(2, 5) logger.info(f" 📜 滚动到广告区域: {scroll_time:.1f}秒") time.sleep(scroll_time) # 模拟在广告区域停留 ad_focus_time = random.uniform(8, 20) logger.info(f" 👁️ 广告区域停留: {ad_focus_time:.1f}秒") time.sleep(ad_focus_time) # 模拟广告交互 if random.random() < 0.25: # 25%概率进行广告交互 logger.info(f" 🔄 广告交互行为") self._simulate_ad_interaction(base_url) def _simulate_ad_interaction(self, base_url): """模拟广告交互""" interactions = [ "悬停在广告上", "查看广告详情", "广告展开", "关闭广告", "点击广告" ] selected_interactions = random.sample(interactions, random.randint(1, 3)) for interaction in selected_interactions: logger.info(f" 🎯 {interaction}") if interaction == "点击广告": self._simulate_ad_click(base_url) else: time.sleep(random.uniform(1, 4)) def browse_games_with_ads(self): """浏览游戏页面并关注广告""" main_site = self.config['targets']['main_site'] base_url = main_site.rstrip('/') # 随机选择要浏览的游戏数量 games_to_browse = random.randint(3, 6) selected_games = random.sample(self.games_list, min(games_to_browse, len(self.games_list))) logger.info(f"🎮 开始浏览 {games_to_browse} 个游戏页面") for i, game in enumerate(selected_games): game_url = base_url + game["url"] try: logger.info(f"🎯 游戏 {i+1}/{games_to_browse}: {game['name']} ({game['category']})") # 设置referrer if i == 0: self.session.headers.update({ 'Referer': main_site, 'Sec-Fetch-Site': 'same-origin' }) else: prev_game_url = base_url + selected_games[i-1]["url"] self.session.headers.update({ 'Referer': prev_game_url, 'Sec-Fetch-Site': 'same-origin' }) # 访问游戏页面 response = self.session.get(game_url, timeout=15, allow_redirects=True) if response.status_code == 200: logger.info(f"✅ 游戏页面访问成功") # 模拟游戏页面的广告行为 self._simulate_game_page_ad_behavior(response, game) else: logger.warning(f"⚠️ 游戏页面访问失败 ({response.status_code})") # 页面间切换延迟 if i < len(selected_games) - 1: switch_delay = random.uniform(2, 6) logger.info(f" ⚡ 切换延迟: {switch_delay:.1f}秒") time.sleep(switch_delay) except Exception as e: logger.error(f"游戏页面访问出错: {e}") continue return True def _simulate_game_page_ad_behavior(self, response, game): """模拟游戏页面的广告行为""" # 游戏页面停留时间(包含广告时间) game_stay_time = random.uniform(20, 60) logger.info(f" 🎮 游戏页面停留: {game_stay_time:.1f}秒") # 分配时间 game_time = game_stay_time * 0.6 # 60%时间玩游戏 ad_time = game_stay_time * 0.4 # 40%时间看广告 logger.info(f" 🎯 游戏时间: {game_time:.1f}秒") logger.info(f" 💰 广告时间: {ad_time:.1f}秒") # 模拟游戏加载 load_time = random.uniform(2, 5) logger.info(f" 🔄 游戏加载: {load_time:.1f}秒") time.sleep(load_time) # 模拟游戏前广告 if random.random() < 0.7: # 70%概率有游戏前广告 pre_ad_time = random.uniform(5, 15) logger.info(f" 📺 游戏前广告: {pre_ad_time:.1f}秒") time.sleep(pre_ad_time) # 模拟跳过广告或看完广告 if random.random() < 0.3: # 30%概率跳过 logger.info(f" ⏭️ 跳过广告") time.sleep(random.uniform(1, 2)) else: logger.info(f" ✅ 看完广告") # 模拟游戏过程 self._simulate_game_play(game, game_time) # 模拟游戏中广告 if random.random() < 0.5: # 50%概率有游戏中广告 mid_ad_time = random.uniform(3, 10) logger.info(f" 📺 游戏中广告: {mid_ad_time:.1f}秒") time.sleep(mid_ad_time) # 模拟游戏结束广告 if random.random() < 0.8: # 80%概率有结束广告 end_ad_time = random.uniform(5, 15) logger.info(f" 📺 游戏结束广告: {end_ad_time:.1f}秒") time.sleep(end_ad_time) def _simulate_game_play(self, game, duration): """模拟游戏过程""" logger.info(f" 🎮 开始游戏: {game['name']}") # 根据游戏类型模拟不同行为 if game["category"] == "puzzle": self._simulate_puzzle_game(duration) elif game["category"] == "arcade": self._simulate_arcade_game(duration) elif game["category"] == "action": self._simulate_action_game(duration) else: self._simulate_general_game(duration) def _simulate_puzzle_game(self, duration): """模拟益智游戏""" actions = ["思考", "移动", "尝试", "撤销", "重新开始"] segments = random.randint(3, 6) segment_time = duration / segments for i in range(segments): action = random.choice(actions) logger.info(f" 🧩 {action}") time.sleep(segment_time * random.uniform(0.7, 1.3)) def _simulate_arcade_game(self, duration): """模拟街机游戏""" actions = ["开始游戏", "快速操作", "躲避", "收集", "游戏结束"] segments = random.randint(4, 8) segment_time = duration / segments for i in range(segments): action = random.choice(actions) logger.info(f" 🕹️ {action}") time.sleep(segment_time * random.uniform(0.6, 1.4)) def _simulate_action_game(self, duration): """模拟动作游戏""" actions = ["移动", "攻击", "跳跃", "技能", "闯关"] segments = random.randint(5, 10) segment_time = duration / segments for i in range(segments): action = random.choice(actions) logger.info(f" ⚔️ {action}") time.sleep(segment_time * random.uniform(0.5, 1.2)) def _simulate_general_game(self, duration): """模拟一般游戏""" actions = ["开始", "操作", "进行", "暂停", "继续"] segments = random.randint(3, 6) segment_time = duration / segments for i in range(segments): action = random.choice(actions) logger.info(f" 🎯 {action}") time.sleep(segment_time * random.uniform(0.8, 1.2)) def run_ad_focused_visit(self): """执行以广告为重点的访问流程""" logger.info("🚀 开始广告重点访问流程") # 设置会话 self.setup_session() try: # 1. 模拟来源访问 if not self.simulate_traffic_source(): logger.warning("⚠️ 来源访问失败,继续执行") # 2. 访问首页并重点关注广告 if not self.visit_homepage_with_ads(): logger.error("❌ 首页广告访问失败") return False # 3. 浏览游戏页面并关注广告 if not self.browse_games_with_ads(): logger.error("❌ 游戏页面广告访问失败") return False logger.info("✅ 广告重点访问流程完成!") return True except Exception as e: logger.error(f"❌ 访问流程出错: {e}") return False finally: if self.session: self.session.close() def run_continuous_ad_visits(self, total_visits=None, delay_range=None): """连续执行广告重点访问""" if total_visits is None: total_visits = self.config['settings']['default_visits'] if delay_range is None: delay_range = ( self.config['settings']['min_delay'], self.config['settings']['max_delay'] ) success_count = 0 total_ad_time = 0 logger.info(f"🎯 开始连续广告访问,目标: {total_visits} 次") for i in range(total_visits): logger.info(f"{'='*60}") logger.info(f"🔄 第 {i+1}/{total_visits} 次广告访问") logger.info(f"{'='*60}") visit_start_time = time.time() if self.run_ad_focused_visit(): success_count += 1 visit_time = time.time() - visit_start_time total_ad_time += visit_time logger.info(f"✅ 第 {i+1} 次访问成功!耗时: {visit_time:.1f}秒") logger.info(f"📊 累计成功: {success_count}, 总广告时间: {total_ad_time:.1f}秒") else: logger.error(f"❌ 第 {i+1} 次访问失败!") # 访问间隔 if i < total_visits - 1: delay = random.uniform(delay_range[0], delay_range[1]) logger.info(f"⏳ 等待 {delay:.1f} 秒") time.sleep(delay) success_rate = (success_count / total_visits) * 100 avg_ad_time = total_ad_time / success_count if success_count > 0 else 0 logger.info(f"🎉 广告访问任务完成!") logger.info(f"📊 成功率: {success_count}/{total_visits} ({success_rate:.1f}%)") logger.info(f"💰 总广告时间: {total_ad_time:.1f}秒") logger.info(f"📈 平均每次广告时间: {avg_ad_time:.1f}秒") return success_count def main(): """主函数""" config_file = 'config.json' if not os.path.exists(config_file): print(f"❌ 配置文件 {config_file} 不存在!") return try: bot = WebsiteAdBot(config_file) print("=" * 60) print("💰 网站广告刷量机器人 (专业版)") print("=" * 60) print("🎯 专为Fun Games Hub游戏网站优化") print("💰 重点关注广告展示和交互") print("📱 移动端优先(广告收益更高)") print("⚠️ 请确保仅用于测试自己的网站!") print() print(f"🎯 目标网站: {bot.config['targets']['main_site']}") print(f"🎮 游戏类型: {len(bot.games_list)} 个游戏") print(f"📱 移动端概率: 80%") print() print("请选择运行模式:") print("1. 💎 单次广告重点访问测试") print("2. 🚀 连续广告访问 (使用配置参数)") print("3. ⚙️ 自定义连续广告访问") choice = input("请输入选择 (1/2/3): ").strip() if choice == "1": logger.info("🎬 开始单次广告重点访问测试") success = bot.run_ad_focused_visit() if success: print("🎉 单次广告访问测试成功!") else: print("😞 单次广告访问测试失败!") elif choice == "2": logger.info("🎬 开始连续广告访问") success_count = bot.run_continuous_ad_visits() total = bot.config['settings']['default_visits'] print(f"🎉 连续广告访问完成!成功: {success_count}/{total}") elif choice == "3": try: visit_count = int(input("请输入访问次数: ").strip()) min_delay = int(input("请输入最小延迟秒数: ").strip()) max_delay = int(input("请输入最大延迟秒数: ").strip()) logger.info(f"🎬 开始自定义广告访问,次数: {visit_count}") success_count = bot.run_continuous_ad_visits( total_visits=visit_count, delay_range=(min_delay, max_delay) ) print(f"🎉 自定义广告访问完成!成功: {success_count}/{visit_count}") except ValueError: print("❌ 输入参数错误!") else: print("❌ 无效选择!") except KeyboardInterrupt: print("\n⚠️ 用户中断执行") except Exception as e: logger.error(f"程序执行出错: {e}") print("❌ 程序执行出错,请查看日志文件 ad_bot.log") if __name__ == "__main__": main()