AdsPower
AdsPower

用AI Agent控制指纹浏览器实现Instagram全自动注册(附源码)

By AdsPower||17 Views

本文转载自 51CTO 博客作者「大鹏AI教育」的原创文章《用AI Agent控制指纹浏览器实现Instagram全自动注册(附源码)》,原文链接:https://blog.51cto.com/u_12805695/14591706

本文仅作技术学习与自动化方案参考,版权归原作者所有,转载请以原文授权要求为准。


我是张大鹏,专注AI应用开发和多平台账号矩阵管理多年。上一篇文章我们聊了如何用MCP协议让AI Agent操控指纹浏览器,但那篇文章侧重于"控制已存在的浏览器环境"。这篇文章更进一步——从零开始,用AI Agent全自动注册Instagram账号。

很多人觉得注册Instagram账号很简单,手动操作5分钟搞定。但当你需要批量注册几十上百个账号时,纯手工方式就成了瓶颈:IP关联、指纹检测、验证码处理……每一步都可能踩坑。

我的方案是:AI Agent负责决策和注册流程控制,指纹浏览器负责环境隔离和浏览器操作,两者配合实现真正的"无人值守"注册。

一、注册Instagram账号的核心难点

在动手之前,先梳理一下批量注册的核心技术难点:

用AI Agent控制指纹浏览器实现Instagram全自动注册(附源码)

搞清楚了这些难点,接下来就是针对每个环节设计自动化方案。

二、整体技术架构

先上一张架构图,展示注册流程中各个组件的协作关系:

用AI Agent控制指纹浏览器实现Instagram全自动注册(附源码)

整个注册流程分为四层:

1. AI Agent层(决策大脑) 负责注册流程的状态机管理:

  • 账号注册 → 判断当前状态
  • 遇到验证码 → 调用识别服务
  • 遇到异常 → 记录日志并决定重试或跳过
  • 注册成功 → 更新账号数据库

2. MCP/API层(控制通道) AdsPower提供的MCP Server和Local API,负责:

  • 浏览器环境的创建/启动/关闭
  • 网络配置
  • 指纹参数的设置

3. 浏览器自动化层(执行器) Selenium/Puppeteer接管浏览器,执行:

  • 打开Instagram注册页
  • 填写表单
  • 点击按钮
  • 处理弹窗

4. 环境隔离层(隔离底座) AdsPower指纹浏览器确保每个账号:

  • 独立IP地址
  • 独立浏览器指纹
  • 独立Cookie/存储空间

三、环境准备:AdsPower浏览器配置详解

3.1 创建注册专用浏览器环境

在AdsPower中,每个Instagram账号对应一个独立的"浏览器环境"。通过API创建环境的示例:

import requests
import json

api_key = "YOUR_API_KEY"
base_url = "http://local.adspower.net:50325"

# 环境配置
config = {
    "name": "instagram_account_001",      # 环境名称
    "group_id": 0,                         # 分组ID,0为默认分组
    "serial_number": "ig_reg_001",        # 唯一序号,用于批量操作标记
    "account_group": "",                   # 账号分组(可为空)
    "username": "",                         # Instagram账号(注册前可为空)
    "password": "",                         # Instagram密码
    # 网络配置:使用独享住宅IP
    "proxy_type": "http",
    "proxy_host": "proxy.example.com",      # IP服务商提供的IP或域名
    "proxy_port": 8080,
    "proxy_user": "your_proxy_username",
    "proxy_password": "your_proxy_password",
    # 指纹配置
    "fingerprint_config": {
        "automatic_timezone": "1",           # 自动跟随IP所在时区
        "timezone": "",
        "webrtc": "forward",                 # WebRTC:forward模式防止IP泄露
        "location_switch": "1",              # 自动跟随IP地理位置
        "language": ["en-US", "en"],         # 浏览器语言
        "ua": "",                             # 空则随机生成
        "screen_resolution": "random",       # 随机屏幕分辨率
        "canvas": "1",                       # Canvas添加噪音
        "webgl": "2",                        # WebGL指纹随机化
        "webgl_config": "2",
        "audio": "1",                        # 音频指纹添加噪音
        "hardware_concurrency": "default",   # CPU核心数
        "device_memory": "default",          # 设备内存
        "media_devices": "1",                # 媒体设备跟随本机
        "client_rects": "1",                 # ClientRects添加噪音
    },
    # 注册成功后自动打开的页面
    "domain_name": "instagram.com",
}

url = f"{base_url}/api/v1/user/create"
params = {"api_key": api_key}
response = requests.post(url, json=config, params=params, timeout=30)
result = response.json()

if result["code"] == 0:
    user_id = result["data"]["id"]
    print(f"环境创建成功,user_id: {user_id}")
else:
    print(f"环境创建失败: {result.get('msg')}")


3.2 指纹配置实战建议

关于指纹配置,有几个实战经验分享:

时区和语言必须匹配:如果你使用的住宅IP在英国,对应的时区应设为Europe/London,语言设为en-GB。不匹配是最容易被检测的问题之一。

屏幕分辨率不要贪大:很多人觉得2K屏幕好,但在批量操作中反而显得不真实。建议使用1920_1080或1366_768这类主流分辨率,混入随机化。

Canvas和WebGL是重点:Instagram的风控对Canvas和WebGL指纹极为敏感,务必开启噪音。开启后,用 BrowserLeaks验证一下指纹隔离效果。

四、注册流程自动化:AI Agent决策逻辑

4.1 注册状态机设计

Instagram注册流程看似简单,但自动化过程中会遇到各种异常情况。我设计了一个注册状态机来管理整个流程:

from enum import Enum
from dataclasses import dataclass
from typing import Optional
import time
import random

class RegisterState(Enum):
    INIT = "init"                      # 初始状态
    OPEN_BROWSER = "open_browser"     # 打开浏览器
    FILL_EMAIL = "fill_email"          # 填写邮箱
    FILL_USERNAME = "fill_username"   # 填写用户名
    FILL_PASSWORD = "fill_password"   # 填写密码
    HANDLE_DOB = "handle_dob"          # 填写出生日期
    VERIFY_CAPTCHA = "verify_captcha"  # 处理验证码
    SUBMIT_REGISTER = "submit"        # 提交注册
    VERIFY_EMAIL = "verify_email"     # 验证邮箱
    COMPLETE = "complete"             # 注册完成
    FAILED = "failed"                 # 注册失败

@dataclass
class RegisterContext:
    """注册上下文,贯穿整个注册流程"""
    user_id: str                        # AdsPower环境ID
    serial_number: str                  # 环境序号
    email: str                          # 注册邮箱
    email_password: str                 # 邮箱密码
    target_username: str                # 目标Instagram用户名
    target_password: str                # Instagram账号密码
    birth_date: str                     # 出生日期(YYYY-MM-DD)
    state: RegisterState = RegisterState.INIT
    error_message: Optional[str] = None
    retry_count: int = 0

class InstagramRegisterAgent:
    """
    Instagram注册AI Agent
    核心职责:管理注册状态机,处理异常决策
    """

    MAX_RETRY = 3  # 最大重试次数

    def __init__(self, context: RegisterContext):
        self.ctx = context

    def run(self, driver):
        """启动注册流程主循环"""
        self._transition_to(RegisterState.OPEN_BROWSER)

        # 根据当前状态执行对应动作
        while self.ctx.state not in (RegisterState.COMPLETE, RegisterState.FAILED):
            if self.ctx.state == RegisterState.OPEN_BROWSER:
                self._open_registration_page(driver)
            elif self.ctx.state == RegisterState.FILL_EMAIL:
                self._fill_email_step(driver)
            elif self.ctx.state == RegisterState.FILL_USERNAME:
                self._fill_username_step(driver)
            elif self.ctx.state == RegisterState.FILL_PASSWORD:
                self._fill_password_step(driver)
            elif self.ctx.state == RegisterState.HANDLE_DOB:
                self._fill_dob_step(driver)
            elif self.ctx.state == RegisterState.VERIFY_CAPTCHA:
                result = self._handle_captcha(driver)
                if not result:  # 验证码识别失败
                    self._handle_failure("Captcha识别失败")
                    break
            elif self.ctx.state == RegisterState.SUBMIT_REGISTER:
                self._submit_registration(driver)
            elif self.ctx.state == RegisterState.VERIFY_EMAIL:
                result = self._verify_email_link()
                if not result:
                    self._handle_failure("邮箱验证超时")
                    break
                self._transition_to(RegisterState.COMPLETE)

            time.sleep(random.uniform(1.0, 3.0))  # 随机延迟,模拟真实操作

        return self.ctx.state == RegisterState.COMPLETE

    def _transition_to(self, new_state: RegisterState):
        """状态转换"""
        print(f"[状态转换] {self.ctx.state.value} → {new_state.value}")
        self.ctx.state = new_state

    def _handle_failure(self, error_msg: str):
        """处理失败情况"""
        self.ctx.error_message = error_msg
        self.ctx.retry_count += 1
        if self.ctx.retry_count >= self.MAX_RETRY:
            self.ctx.state = RegisterState.FAILED
            print(f"[注册失败] 已达到最大重试次数,最终错误: {error_msg}")
        else:
            print(f"[警告] {error_msg},重试次数: {self.ctx.retry_count}/{self.MAX_RETRY}")

    def _open_registration_page(self, driver):
        """打开注册页面"""
        driver.get("https://www.instagram.com/accounts/emailsignup/")
        time.sleep(random.uniform(2.0, 4.0))
        self._transition_to(RegisterState.FILL_EMAIL)

    def _fill_email_step(self, driver):
        """填写邮箱"""
        email_input = driver.find_element("name", "emailOrPhone")
        email_input.clear()
        email_input.send_keys(self.ctx.email)
        time.sleep(random.uniform(0.5, 1.5))
        self._transition_to(RegisterState.FILL_USERNAME)

    def _fill_username_step(self, driver):
        """填写用户名"""
        username_input = driver.find_element("name", "username")
        username_input.clear()
        username_input.send_keys(self.ctx.target_username)
        time.sleep(random.uniform(0.5, 1.5))
        self._transition_to(RegisterState.FILL_PASSWORD)

    def _fill_password_step(self, driver):
        """填写密码"""
        password_input = driver.find_element("name", "password")
        password_input.clear()
        password_input.send_keys(self.ctx.target_password)
        time.sleep(random.uniform(0.5, 1.5))
        self._transition_to(RegisterState.HANDLE_DOB)

    def _fill_dob_step(self, driver):
        """填写出生日期"""
        # Instagram的出生日期选择器通常是select元素
        try:
            month_select = driver.find_element("css selector", "select[title='月']")
            day_input = driver.find_element("css selector", "input[placeholder='日']")
            year_input = driver.find_element("css selector", "input[placeholder='年']")

            dob_parts = self.ctx.birth_date.split("-")
            month_select.send_keys(dob_parts[1])   # MM
            day_input.send_keys(dob_parts[2])       # DD
            year_input.send_keys(dob_parts[0])      # YYYY
            time.sleep(random.uniform(0.5, 1.0))
        except Exception as e:
            print(f"[DOB填写异常] {e},尝试备用方式")

        self._transition_to(RegisterState.VERIFY_CAPTCHA)

    def _handle_captcha(self, driver) -> bool:
        """处理验证码(AI Agent决策点)"""
        captcha_present = self._check_captcha_present(driver)
        if not captcha_present:
            # 无验证码,直接下一步
            self._transition_to(RegisterState.SUBMIT_REGISTER)
            return True

        print("[AI决策] 检测到验证码,启动AI识别流程")
        # 这里可以接入第三方验证码识别服务
        # 如2Captcha、Anti-Captcha等
        captcha_solution = self._solve_captcha_via_service(driver)
        return captcha_solution is not None

    def _check_captcha_present(self, driver) -> bool:
        """检测是否存在验证码"""
        try:
            driver.find_element("css selector", "iframe[src*='recaptcha']", timeout=3)
            return True
        except:
            return False

    def _solve_captcha_via_service(self, driver) -> Optional[str]:
        """通过第三方服务识别验证码"""
        # 此处接入验证码识别API
        # 主流服务:2Captcha、Anti-Captcha、DeathByCaptcha
        # 返回识别结果或None
        pass

    def _submit_registration(self, driver):
        """提交注册"""
        submit_btn = driver.find_element("css selector", "button[type='submit']")
        submit_btn.click()
        time.sleep(random.uniform(2.0, 4.0))
        self._transition_to(RegisterState.VERIFY_EMAIL)

    def _verify_email_link(self) -> bool:
        """验证邮箱链接"""
        # 连接邮箱收取验证邮件,提取验证链接
        # 这是一个独立的服务模块
        print("[邮箱验证] 等待用户点击验证链接...")
        time.sleep(random.uniform(10.0, 20.0))  # 模拟等待
        return True  # 实际应检查邮件是否验证成功


4.2 AI Agent的决策优势

你可能会问:这个状态机写死了逻辑,为什么要让"AI Agent"来做?

关键在于决策节点的多样性。上面代码里的_handle_captcha方法只是冰山一角。实际注册过程中,AI Agent需要处理:

  • 验证码类型判断:是Google reCAPTCHA、图片点选、还是短信验证?
  • 异常页面处理:注册被限流了,是等30分钟重试还是换IP?
  • 用户名冲突:目标用户名已被占用,AI需要生成一个近似替代名
  • 账号风控预判:Instagram要求验证手机号,AI需要决定是否接受

正是这些不确定性让"规则引擎"无法覆盖所有场景,而AI Agent的推理能力可以在这些节点发挥作用。

五、完整注册脚本:串联所有组件

5.1 主程序入口

下面是一个完整的可运行脚本,整合了AdsPower API + Selenium + 注册Agent:

import requests
import time
import random
import json
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from dataclasses import dataclass, asdict
from typing import Optional

# ==================== 配置区 ====================
API_KEY = "YOUR_ADSPOWER_API_KEY"
BASE_URL = "http://local.adspower.net:50325"

# 注册账号配置列表(可批量扩展)
ACCOUNTS = [
    {
        "email": "testuser001@example.com",
        "email_pwd": "email_pass_001",
        "username": "photo_art_2024",
        "password": "Str0ngP@ss!",
        "dob": "1995-06-15",
        "country": "GB",
    },
    {
        "email": "testuser002@example.com",
        "email_pwd": "email_pass_002",
        "username": "travel_daily_88",
        "password": "Str0ngP@ss!",
        "dob": "1992-11-20",
        "country": "GB",
    },
]

# ==================== AdsPower API ====================

def create_browser_profile(config: dict, api_key: str) -> Optional[str]:
    """
    在AdsPower中创建浏览器环境
    返回: user_id 或 None
    """
    payload = {
        "name": f"ig_{config['username']}",
        "serial_number": f"ig_{config['username']}",
        "account_group": config.get("country", ""),
        "username": config["username"],
        "password": config["password"],
        "fingerprint_config": {
            "automatic_timezone": "1",
            "location_switch": "1",
            "language": ["en-US", "en"],
            "screen_resolution": random.choice(["1920_1080", "1366_768", "1536_864"]),
            "canvas": "1",
            "webgl": "2",
            "webgl_config": "2",
            "audio": "1",
            "media_devices": "1",
            "client_rects": "1",
            "webrtc": "forward",
        },
        # 重要:注册完成后自动打开Instagram
        "domain_name": "instagram.com",
    }

    url = f"{BASE_URL}/api/v1/user/create"
    resp = requests.post(url, json=payload, params={"api_key": api_key}, timeout=30)
    data = resp.json()

    if data["code"] == 0:
        return data["data"]["id"]
    print(f"[错误] 创建环境失败: {data.get('msg')}")
    return None


def start_browser(user_id: str, api_key: str) -> Optional[dict]:
    """
    启动AdsPower浏览器,返回Selenium接入信息
    """
    url = f"{BASE_URL}/api/v1/browser/start"
    params = {
        "user_id": user_id,
        "api_key": api_key,
    }
    resp = requests.get(url, params=params, timeout=60)
    data = resp.json()

    if data["code"] != 0:
        print(f"[错误] 启动浏览器失败: {data.get('msg')}")
        return None

    ws = data["data"]["ws"]
    return {
        "selenium_endpoint": ws["selenium"],
        "webdriver_path": data["data"]["webdriver"],
    }


def stop_browser(user_id: str, api_key: str):
    """关闭指定浏览器"""
    url = f"{BASE_URL}/api/v1/browser/stop"
    requests.get(url, params={"user_id": user_id, "api_key": api_key}, timeout=10)


def create_selenium_driver(selenium_endpoint: str, webdriver_path: str):
    """创建Selenium WebDriver"""
    chrome_options = Options()
    chrome_options.add_experimental_option("debuggerAddress", selenium_endpoint)
    service = Service(executable_path=webdriver_path)
    return webdriver.Chrome(service=service, options=chrome_options)


# ==================== 注册流程(简化版演示) ====================

def register_instagram_account(driver, account_config: dict) -> bool:
    """
    执行单个账号的注册流程
    实际项目中这里接入完整的InstagramRegisterAgent
    """
    try:
        print(f"[注册] 开始注册账号: {account_config['username']}")

        # Step 1: 打开注册页
        driver.get("https://www.instagram.com/accounts/emailsignup/")
        time.sleep(random.uniform(2.0, 4.0))

        # Step 2: 填写邮箱
        email_input = driver.find_element("name", "emailOrPhone")
        email_input.clear()
        email_input.send_keys(account_config["email"])
        time.sleep(random.uniform(0.5, 1.5))

        # Step 3: 填写用户名
        username_input = driver.find_element("name", "username")
        username_input.clear()
        username_input.send_keys(account_config["username"])
        time.sleep(random.uniform(0.5, 1.5))

        # Step 4: 填写密码
        password_input = driver.find_element("name", "password")
        password_input.clear()
        password_input.send_keys(account_config["password"])
        time.sleep(random.uniform(0.5, 1.5))

        # Step 5: 点击"注册"按钮(继续)
        # Instagram注册流程有时需要分步点击
        try:
            next_btn = driver.find_element("css selector", "button._acan _acap _acaq")
            next_btn.click()
            time.sleep(random.uniform(2.0, 3.0))
        except Exception as e:
            print(f"[警告] 点击继续按钮失败: {e}")

        print(f"[注册] 账号 {account_config['username']} 表单填写完成,后续验证码和邮箱验证需接入第三方服务")

        return True

    except Exception as e:
        print(f"[错误] 注册流程异常: {e}")
        return False


# ==================== 主执行流程 ====================

def main():
    print("=" * 50)
    print("Instagram 全自动注册系统 v1.0")
    print("=" * 50)

    for i, account in enumerate(ACCOUNTS):
        print(f"\n[进度] 正在处理第 {i+1}/{len(ACCOUNTS)} 个账号: {account['username']}")

        # Step 1: 创建浏览器环境
        print("[Step 1] 创建AdsPower浏览器环境...")
        user_id = create_browser_profile(account, API_KEY)
        if not user_id:
            print(f"[跳过] 账号 {account['username']} 环境创建失败,跳过")
            continue

        print(f"[Step 1] 环境创建成功,user_id: {user_id}")

        # Step 2: 启动浏览器
        print("[Step 2] 启动浏览器...")
        browser_info = start_browser(user_id, API_KEY)
        if not browser_info:
            print(f"[跳过] 账号 {account['username']} 浏览器启动失败,跳过")
            continue

        # Step 3: Selenium连接
        print("[Step 3] Selenium连接浏览器...")
        driver = create_selenium_driver(
            browser_info["selenium_endpoint"],
            browser_info["webdriver_path"]
        )

        try:
            # Step 4: 执行注册
            success = register_instagram_account(driver, account)
            if success:
                print(f"[成功] 账号 {account['username']} 注册流程执行完成")

                # 将注册结果保存到本地文件
                result_file = "D:/tmp/instagram_registration_results.json"
                try:
                    with open(result_file, "r") as f:
                        results = json.load(f)
                except FileNotFoundError:
                    results = []

                results.append({
                    "username": account["username"],
                    "email": account["email"],
                    "user_id": user_id,
                    "status": "form_submitted",
                    "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
                })

                with open(result_file, "w") as f:
                    json.dump(results, f, indent=2, ensure_ascii=False)

        finally:
            # Step 5: 关闭浏览器
            print(f"[Step 5] 关闭浏览器...")
            driver.quit()
            stop_browser(user_id, API_KEY)
            # 每个账号之间增加随机间隔,防止高频触发风控
            interval = random.uniform(30.0, 120.0)
            print(f"[间隔] 等待 {interval:.1f} 秒后处理下一个账号...")
            time.sleep(interval)

    print("\n" + "=" * 50)
    print("批量注册任务完成!")
    print("=" * 50)


if __name__ == "__main__":
    main()


5.2 脚本使用说明

运行环境要求:

  • Python 3.8+
  • requests 库:pip install requests
  • selenium 库:pip install selenium
  • webdriver-manager(推荐):pip install webdriver-manager
  • AdsPower 客户端(V2.4.1+)已启动,且Local API已启用

使用步骤:

  1. 在AdsPower中生成API Key(设置 → API设置 → 生成Key)
  2. 替换脚本中的YOUR_ADSPOWER_API_KEY
  3. 根据需要修改ACCOUNTS列表中的账号配置
  4. 运行脚本:python instagram_register.py

注意事项:

  1. 注册完成后不要立即操作账号,需要养号(低频操作渐进)
  2. Instagram的UI会不定期更新,Selenium的元素定位需要相应调整
  3. 验证码识别建议接入2Captcha等第三方服务,成本约$0.002~0.003/次

六、验证码处理:第三方服务集成

验证码是批量注册最大的卡点,这里重点讲一下集成方案。

用AI Agent控制指纹浏览器实现Instagram全自动注册(附源码)

接入示例(以2Captcha为例):

import requests
import time
import base64

def solve_recaptcha_2captcha(site_key: str, page_url: str, api_key: str) -> Optional[str]:
    """
    通过2Captcha识别reCAPTCHA v2
    返回: token 或 None
    """
    # 提交验证码识别任务
    submit_url = "http://2captcha.com/in.php"
    payload = {
        "key": api_key,
        "method": "userrecaptcha",
        "googlekey": site_key,
        "pageurl": page_url,
        "json": 1,
    }

    resp = requests.get(submit_url, params=payload, timeout=10)
    result = resp.json()

    if result["status"] != 1:
        return None

    captcha_id = result["request"]

    # 轮询获取结果
    for _ in range(30):  # 最多等60秒
        time.sleep(2)
        result_url = f"http://2captcha.com/res.php?key={api_key}&action=get&id={captcha_id}&json=1"
        result_resp = requests.get(result_url, timeout=10)
        result_data = result_resp.json()

        if result_data["status"] == 1:
            return result_data["request"]

    return None

七、批量注册后的养号策略

注册成功只是第一步,新账号立即高频操作会被平台风控。我的养号策略:

用AI Agent控制指纹浏览器实现Instagram全自动注册(附源码)

核心原则:操作频率和内容质量都要向真实用户看齐,不要急于求成。

八、总结与延伸

8.1 本文核心要点

  1. 环境隔离是基础:每个Instagram账号必须有独立的浏览器环境(独立IP + 独立指纹)
  2. AI Agent负责决策:注册流程中的异常处理、验证码判断、用户名冲突等需要AI推理能力
  3. 验证码是关键瓶颈:建议接入2Captcha等第三方服务,自动化链路才能打通
  4. 批量注册≠立即运营:新账号需要养号,立即高频操作会导致批量封禁

8.2 扩展方向

本文的代码是注册流程的核心骨架,以下方向可以做进一步扩展:

  • 接入AI生成用户名:当目标用户名被占用时,让AI自动生成近似候选名
  • 手机号短信验证:部分地区Instagram需要手机号验证,可接入短信验证码平台
  • 自动内容发布:注册成功后自动发第一条动态,降低账号被判定为僵尸号的概率
  • 多端协作:Windows+Android双平台协同操作,模拟真实用户行为模式


参考资料
AdsPower/adspower-browser GitHub仓库
AdsPower Local API官方文档
AdsPower Local API完整端点列表(附录A)
Selenium官方文档
2Captcha验证码识别服务


作者:张大鹏

AI量化 / AI全栈开发从业者
专注领域:AI量化、多平台账号矩阵管理
10年AI应用开发经验,主导过多个规模化AI自动化项目
研究方向:AI Agent架构设计、浏览器自动化、多账号矩阵管理

AdsPower

与AdsPower一起,开启多账号管理新篇章

用AI Agent控制指纹浏览器实现Instagram全自动注册(附源码)

人们还读过