agentsclimarketplace

Adspower

Skill pencil20388-eng/browser-automation-skills/skills/adspower

🌐 Drop-in skills that teach Claude Code, Cursor & Codex CLI how to automate browsers. Playwright, Selenium, Puppeteer, Web Scraping, AdsPower & more.

Install
npx -y skills add pencil20388-eng/browser-automation-skills --skill adspower

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

5.1 KB, as published. Nobody here has run it

AdsPower Local API Automation Skill

Automate AdsPower antidetect browser operations through its Local API. This skill handles profile creation, browser control, proxy management, cookie operations, and fingerprint verification.

Prerequisites

  • AdsPower installed and running locally (paid plan with API access)
  • API Key generated (AdsPower β†’ Automation β†’ API β†’ Generate)
  • Python 3.8+ with requests installed

API Basics

Base URL: http://local.adspower.net:50325

All requests require the Authorization header:

Authorization: Bearer YOUR_API_KEY

Success response: {"code": 0, "msg": "success", "data": {...}} Error response: {"code": -1, "msg": "error description"}

Core Operations

1. Check API Status

curl -s -H "Authorization: Bearer $API_KEY" \
  "http://local.adspower.net:50325/api/v1/status"

2. Create a Profile

import requests

resp = requests.post(
    "http://local.adspower.net:50325/api/v1/user/create",
    headers={"Authorization": f"Bearer {API_KEY}"},
    json={
        "name": "profile_001",
        "group_id": "0",
        "fingerprint_config": {
            "automatic_timezone": "1",
            "language": ["en-US", "en"],
        },
    },
).json()
profile_id = resp["data"]["id"]

3. Open a Browser Profile

resp = requests.get(
    f"http://local.adspower.net:50325/api/v1/browser/start?user_id={profile_id}",
    headers={"Authorization": f"Bearer {API_KEY}"},
    timeout=30,  # 30s timeout for slow proxies
).json()

# Connection info for automation frameworks:
webdriver_path = resp["data"]["webdriver"]
selenium_address = resp["data"]["ws"]["selenium"]     # For Selenium
puppeteer_ws = resp["data"]["ws"]["puppeteer"]         # For Playwright

4. Close a Browser Profile

requests.get(
    f"http://local.adspower.net:50325/api/v1/browser/stop?user_id={profile_id}",
    headers={"Authorization": f"Bearer {API_KEY}"},
)

5. Connect Selenium

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

service = Service(executable_path=webdriver_path)
options = Options()
options.add_experimental_option("debuggerAddress", selenium_address)
driver = webdriver.Chrome(service=service, options=options)
driver.get("https://www.browserscan.net/")

6. Connect Playwright

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(puppeteer_ws)
    context = browser.contexts[0]
    page = context.pages[0] if context.pages else context.new_page()
    page.goto("https://www.browserscan.net/")

7. Update Proxy

requests.post(
    "http://local.adspower.net:50325/api/v1/user/update",
    headers={"Authorization": f"Bearer {API_KEY}"},
    json={
        "user_id": profile_id,
        "user_proxy_config": {
            "proxy_soft": "other",
            "proxy_type": "http",       # http | https | socks5
            "proxy_host": "1.2.3.4",
            "proxy_port": "8080",       # Must be string
            "proxy_user": "username",
            "proxy_password": "password",
        },
    },
).json()

8. Query Profiles

resp = requests.get(
    "http://local.adspower.net:50325/api/v1/user/list",
    headers={"Authorization": f"Bearer {API_KEY}"},
    params={"page": 1, "page_size": 100, "group_name": "My Campaign"},
).json()
profiles = resp["data"]["list"]

9. Create a Group

resp = requests.post(
    "http://local.adspower.net:50325/api/v1/group/create",
    headers={"Authorization": f"Bearer {API_KEY}"},
    json={"group_name": "My Campaign"},
).json()
group_id = resp["data"]["group_id"]

Rate Limits

Profile countMax frequency
0–2002 req/sec
200–50005 req/sec
> 500010 req/sec

Profile creation is always limited to 1 req/sec. Add time.sleep(1.1) between batch operations.

Common Errors

ErrorCauseFix
Connection refusedAdsPower not runningStart AdsPower, check API status
Invalid API keyWrong or expired keyRegenerate in Automation β†’ API
Error 100044Browser start timeoutCheck proxy, clear cache, increase timeout
Error 100001Browser failed to startRepair profile, update AdsPower
Too many requestsRate limit exceededAdd sleep between API calls
Profile not foundWrong user_idQuery /api/v1/user/list to get correct IDs

Important Notes

  • proxy_port must be a string, not an integer
  • user_id is the internal ID from creation, not the profile name or UI number
  • The API port (default 50325) can change between sessions β€” verify in AdsPower settings
  • Always close browsers via API after automation to prevent resource leaks
  • Use resp["data"]["ws"]["selenium"] for Selenium, resp["data"]["ws"]["puppeteer"] for Playwright

Resources

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.