Manage AdsPower antidetect browser profiles for multi-account marketing automation and campaigns
---
name: adspower-antidetect-browser
description: Manage AdsPower antidetect browser profiles for multi-account marketing automation and campaigns
triggers:
- "create adspower browser profile"
- "manage multiple browser profiles for marketing"
- "set up antidetect browser automation"
- "configure adspower profiles for campaigns"
- "automate multi-account browser sessions"
- "use adspower api for browser control"
- "launch adspower profiles programmatically"
- "manage browser fingerprints for marketing"
---
# AdsPower Antidetect Browser Skill
> Skill by [ara.so](https://ara.so) — Marketing Skills collection.
## Overview
AdsPower is an antidetect browser platform that allows marketing teams to manage multiple browser profiles with unique fingerprints for multi-account operations, ad campaigns, and automation workflows. Each profile has isolated cookies, storage, and unique browser fingerprints to prevent account association and detection.
## Installation
AdsPower requires the desktop application installed on your system:
1. Download AdsPower from the official website
2. Install the application for your operating system (Windows/macOS)
3. Launch AdsPower and create an account
4. Enable API access in Settings → API Settings
## API Access
AdsPower provides a local HTTP API (default port: 50325) for programmatic control.
### Base Configuration
```python
import requests
import os
# AdsPower local API endpoint
ADSPOWER_API_BASE = "http://localhost:50325/api/v1"
# Optional: If using cloud API
ADSPOWER_API_KEY = os.getenv("ADSPOWER_API_KEY")
```
```javascript
const axios = require('axios');
const ADSPOWER_API_BASE = 'http://localhost:50325/api/v1';
const API_KEY = process.env.ADSPOWER_API_KEY;
```
## Core Operations
### Create Browser Profile
```python
def create_profile(name, group_id=None, fingerprint_config=None):
"""Create a new browser profile"""
url = f"{ADSPOWER_API_BASE}/user/create"
payload = {
"name": name,
"group_id": group_id or "0",
"domain_name": "",
"open_urls": [],
"repeat_config": fingerprint_config or []
}
response = requests.post(url, json=payload)
data = response.json()
if data.get("code") == 0:
return data["data"]["id"]
else:
raise Exception(f"Failed to create profile: {data.get('msg')}")
# Usage
profile_id = create_profile(
name="Campaign_Profile_1",
group_id="marketing_team"
)
print(f"Created profile: {profile_id}")
```
```javascript
async function createProfile(name, groupId = '0') {
const response = await axios.post(`${ADSPOWER_API_BASE}/user/create`, {
name: name,
group_id: groupId,
domain_name: '',
open_urls: []
});
if (response.data.code === 0) {
return response.data.data.id;
}
throw new Error(`Failed to create profile: ${response.data.msg}`);
}
// Usage
const profileId = await createProfile('Campaign_Profile_1', 'marketing_team');
console.log(`Created profile: ${profileId}`);
```
### Launch Browser Profile
```python
def start_profile(profile_id, launch_args=None):
"""Launch a browser profile and return connection details"""
url = f"{ADSPOWER_API_BASE}/browser/start"
params = {
"user_id": profile_id,
"launch_args": launch_args or []
}
response = requests.get(url, params=params)
data = response.json()
if data.get("code") == 0:
return {
"ws_endpoint": data["data"]["ws"]["puppeteer"],
"selenium_endpoint": data["data"]["ws"]["selenium"],
"debug_port": data["data"]["debug_port"]
}
else:
raise Exception(f"Failed to start profile: {data.get('msg')}")
# Usage
connection = start_profile(profile_id)
print(f"WebSocket: {connection['ws_endpoint']}")
```
```javascript
async function startProfile(profileId) {
const response = await axios.get(`${ADSPOWER_API_BASE}/browser/start`, {
params: { user_id: profileId }
});
if (response.data.code === 0) {
return {
wsEndpoint: response.data.data.ws.puppeteer,
seleniumEndpoint: response.data.data.ws.selenium,
debugPort: response.data.data.debug_port
};
}
throw new Error(`Failed to start profile: ${response.data.msg}`);
}
```
### Close Browser Profile
```python
def stop_profile(profile_id):
"""Close a running browser profile"""
url = f"{ADSPOWER_API_BASE}/browser/stop"
params = {"user_id": profile_id}
response = requests.get(url, params=params)
data = response.json()
return data.get("code") == 0
# Usage
stop_profile(profile_id)
```
## Automation Integration
### With Selenium
```python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def connect_selenium(profile_id):
"""Connect Selenium to AdsPower profile"""
connection = start_profile(profile_id)
chrome_options = Options()
chrome_options.add_experimental_option(
"debuggerAddress",
f"127.0.0.1:{connection['debug_port']}"
)
driver = webdriver.Chrome(options=chrome_options)
return driver
# Usage
driver = connect_selenium(profile_id)
driver.get("https://example.com")
# Perform automation tasks
driver.quit()
stop_profile(profile_id)
```
### With Puppeteer
```javascript
const puppeteer = require('puppeteer-core');
async function connectPuppeteer(profileId) {
const connection = await startProfile(profileId);
const browser = await puppeteer.connect({
browserWSEndpoint: connection.wsEndpoint,
defaultViewport: null
});
return browser;
}
// Usage
(async () => {
const browser = await connectPuppeteer(profileId);
const page = await browser.newPage();
await page.goto('https://example.com');
// Perform automation tasks
await browser.disconnect();
await stopProfile(profileId);
})();
```
### With Playwright
```python
from playwright.sync_api import sync_playwright
def connect_playwright(profile_id):
"""Connect Playwright to AdsPower profile"""
connection = start_profile(profile_id)
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(connection['ws_endpoint'])
return browser
# Usage
browser = connect_playwright(profile_id)
page = browser.new_page()
page.goto("https://example.com")
# Perform automation tasks
browser.close()
stop_profile(profile_id)
```
## Profile Management
### List All Profiles
```python
def list_profiles(group_id=None, page=1, page_size=100):
"""Get all browser profiles"""
url = f"{ADSPOWER_API_BASE}/user/list"
params = {
"page": page,
"page_size": page_size
}
if group_id:
params["group_id"] = group_id
response = requests.get(url, params=params)
data = response.json()
if data.get("code") == 0:
return data["data"]["list"]
return []
# Usage
profiles = list_profiles(group_id="marketing_team")
for profile in profiles:
print(f"{profile['user_id']}: {profile['name']}")
```
### Update Profile Configuration
```python
def update_profile(profile_id, updates):
"""Update profile settings"""
url = f"{ADSPOWER_API_BASE}/user/update"
payload = {
"user_id": profile_id,
**updates
}
response = requests.post(url, json=payload)
data = response.json()
return data.get("code") == 0
# Usage
update_profile(profile_id, {
"name": "Updated_Campaign_Profile",
"remark": "Main account for Facebook ads"
})
```
### Delete Profile
```python
def delete_profile(profile_id):
"""Delete a browser profile"""
url = f"{ADSPOWER_API_BASE}/user/delete"
params = {"user_ids": [profile_id]}
response = requests.post(url, json=params)
data = response.json()
return data.get("code") == 0
```
## Common Patterns
### Campaign Profile Automation
```python
import time
class CampaignAutomation:
def __init__(self, profile_ids):
self.profile_ids = profile_ids
def run_campaign_tasks(self, task_function):
"""Execute tasks across multiple profiles"""
for profile_id in self.profile_ids:
try:
print(f"Starting profile {profile_id}")
driver = connect_selenium(profile_id)
# Execute custom task
task_function(driver)
driver.quit()
stop_profile(profile_id)
# Delay between profiles
time.sleep(5)
except Exception as e:
print(f"Error with profile {profile_id}: {e}")
stop_profile(profile_id)
# Usage
def post_ad_campaign(driver):
driver.get("https://ads.platform.com")
# Perform ad posting logic
pass
automation = CampaignAutomation([profile_id, profile_id_2])
automation.run_campaign_tasks(post_ad_campaign)
```
### Profile Pool Manager
```python
class ProfilePool:
def __init__(self, group_name):
self.group_name = group_name
self.active_profiles = {}
def get_available_profile(self):
"""Get next available profile from pool"""
profiles = list_profiles(group_id=self.group_name)
for profile in profiles:
profile_id = profile['user_id']
if profile_id not in self.active_profiles:
connection = start_profile(profile_id)
self.active_profiles[profile_id] = connection
return profile_id, connection
raise Exception("No available profiles in pool")
def release_profile(self, profile_id):
"""Release profile back to pool"""
if profile_id in self.active_profiles:
stop_profile(profile_id)
del self.active_profiles[profile_id]
# Usage
pool = ProfilePool("marketing_team")
profile_id, connection = pool.get_available_profile()
# Use profile
pool.release_profile(profile_id)
```
### Batch Profile Creation
```python
def create_campaign_profiles(campaign_name, count=10):
"""Create multiple profiles for a campaign"""
profile_ids = []
for i in range(count):
profile_name = f"{campaign_name}_Profile_{i+1}"
profile_id = create_profile(
name=profile_name,
group_id=campaign_name
)
profile_ids.append(profile_id)
print(f"Created: {profile_name} ({profile_id})")
return profile_ids
# Usage
campaign_profiles = create_campaign_profiles("BlackFriday2026", count=5)
```
## Fingerprint Configuration
### Custom Fingerprint Settings
```python
def create_profile_with_fingerprint(name, config):
"""Create profile with specific fingerprint configuration"""
url = f"{ADSPOWER_API_BASE}/user/create"
payload = {
"name": name,
"group_id": "0",
"fingerprint_config": {
"ua": config.get("user_agent"),
"language": config.get("language", "en-US"),
"timezone": config.get("timezone", "America/New_York"),
"webrtc": config.get("webrtc", "proxy"),
"location": config.get("location", "ask"),
"canvas": config.get("canvas", "noise"),
}
}
response = requests.post(url, json=payload)
data = response.json()
if data.get("code") == 0:
return data["data"]["id"]
raise Exception(f"Failed to create profile: {data.get('msg')}")
# Usage
fingerprint_config = {
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)...",
"language": "en-US,en;q=0.9",
"timezone": "America/Los_Angeles",
"webrtc": "proxy"
}
profile_id = create_profile_with_fingerprint(
"Custom_Fingerprint_Profile",
fingerprint_config
)
```
## Troubleshooting
### Connection Issues
```python
def check_api_status():
"""Verify AdsPower API is accessible"""
try:
response = requests.get(f"{ADSPOWER_API_BASE}/status", timeout=5)
return response.status_code == 200
except requests.exceptions.RequestException:
return False
if not check_api_status():
print("AdsPower API not accessible. Ensure the application is running.")
```
### Profile Not Starting
```python
def safe_start_profile(profile_id, max_retries=3):
"""Start profile with retry logic"""
for attempt in range(max_retries):
try:
connection = start_profile(profile_id)
return connection
except Exception as e:
print(f"Attempt {attempt + 1} failed: {e}")
time.sleep(2)
raise Exception(f"Failed to start profile after {max_retries} attempts")
```
### Clean Up Stuck Profiles
```python
def force_close_all_profiles():
"""Close all running browser profiles"""
profiles = list_profiles()
for profile in profiles:
profile_id = profile['user_id']
try:
stop_profile(profile_id)
print(f"Closed profile: {profile_id}")
except Exception as e:
print(f"Error closing {profile_id}: {e}")
```
## Environment Variables
```bash
# Optional: For cloud API access
export ADSPOWER_API_KEY="your_api_key_here"
# Custom API port if not using default
export ADSPOWER_API_PORT="50325"
```
## Best Practices
1. **Always close profiles** after use to free resources
2. **Add delays** between profile launches to avoid detection
3. **Use profile groups** to organize campaigns and teams
4. **Monitor active profiles** to prevent resource exhaustion
5. **Implement error handling** for network and API failures
6. **Rotate profiles** regularly for long-running campaigns
7. **Back up important profiles** and fingerprint configurations
Creator's repository · aradotso/marketing-skills