Files
atomk-hermes-skills/skills/archived/atomk-auto-generate/SKILL.md
T

6.8 KiB

name, description
name description
atomk-auto-generate Automatically log into AtomK, select a claimed product, choose an e-commerce platform, and AI-generate listing data.

AtomK Auto Generate Listing

Automates logging into AtomK, opening a claimed product's editor, selecting a target platform (e.g., 速卖通, 亚马逊, Temu), and triggering AI generation.

Trigger

Use when user asks to: "一键生成", "生成速卖通资料", "生成亚马逊资料", or generate product info for a specific platform.

Prerequisites

  • Node.js with Playwright installed at: /home/ubuntu/.hermes/hermes-agent/node_modules/playwright
  • Playwright Chromium at: /home/ubuntu/.cache/ms-playwright/chromium-1217/

Critical Findings

  • Always use https://www.atomlisting.combt109atomk.sh3.ikuai7.com silently fails on login (stays on /login). Both serve the same "九个网AtomK" app.
  • Direct editor URLs work best: /editor/{product_id} allows bypassing the "My Products" scrolling/indexing problem entirely.
  • Generation status detection: Check body text for "已生成" AND absence of "选择图片并点击" to confirm a listing already exists. "已生成" alone may appear in the AI generate button text.
  • DrissionPage works: Use DrissionPage (installed in venv) rather than Playwright for consistency with other automation scripts.
  • Login form uses standard inputs; press Enter on password field to submit.
  • AtomK is a Next.js app (uses turbopack chunks, _rsc server components)

Execution Steps

  1. Kill hung browser instances: killall -9 chrome chromium chrome-headless-shell 2>/dev/null
  2. Save the script to /tmp/atomk_generate.py
  3. Execute via terminal:
    /home/ubuntu/.hermes/hermes-agent/venv/bin/python3 /tmp/atomk_generate.py <username> <password> <platform_name> [product_index]
    
    • platform_name: e.g., "速卖通", "亚马逊", "Temu"
    • product_index: defaults to 0 (first product in list)
    • Set timeout to ~30s for generation.

For generating listings for multiple products efficiently, use direct editor URLs instead of navigating via the "My Products" page:

from DrissionPage import ChromiumPage, ChromiumOptions
import random, time

TARGET_IDS = [607, 606, 605, 604]  # product IDs to generate
PLATFORM = "Temu"

def generate_for_product(page, product_id):
    page.get(f'https://www.atomlisting.com/editor/{product_id}')
    time.sleep(4)
    
    # Check if already generated
    body_text = page.ele('tag:body').text
    if '已生成' in body_text and '选择图片并点击' not in body_text:
        print(f"ID={product_id}: already generated, skipping")
        return True
    
    # Select platform
    platform_btn = page.ele(f'text:{PLATFORM}')
    if platform_btn:
        platform_btn.click()
        time.sleep(1)
    
    # Find and click generate button
    for btn in page.eles('tag:button'):
        if '生成' in btn.text:
            btn.click()
            print(f"ID={product_id}: generating...")
            break
    
    # Poll for completion (up to 20s)
    for i in range(20):
        time.sleep(1)
        body = page.ele('tag:body').text
        if '已生成' in body or '标题' in body:
            print(f"ID={product_id}: success!")
            return True
    return False

Why direct URLs are better:

  • My Products page requires scrolling to load all products
  • Edit button index mapping is unreliable (page may show 100+ products)
  • Direct /editor/{id} is O(1) vs O(n) scrolling

Python Script (/tmp/atomk_generate.py)

import sys
import time
from DrissionPage import ChromiumPage, ChromiumOptions

def batch_generate(username, password, platform_name, product_ids):
    """Generate AI listings for multiple products by ID."""
    co = ChromiumOptions()
    co.set_browser_path('/home/ubuntu/.cache/ms-playwright/chromium-1217/chrome-linux64/chrome')
    co.headless(True)
    co.set_argument('--headless=new')
    co.set_argument('--no-sandbox')
    co.set_argument('--disable-dev-shm-usage')
    co.set_argument('--disable-gpu')
    co.set_argument('--window-size=1440,900')
    co.set_user_agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36')
    co.set_local_port(0)
    co.set_user_data_path(f'/tmp/dpcache_{int(time.time())}')
    page = ChromiumPage(addr_or_opts=co)
    
    try:
        print("Logging in...")
        page.get('https://www.atomlisting.com')
        time.sleep(2)
        page.ele('css:input[placeholder="请输入用户名"]').input(username)
        page.ele('css:input[placeholder="请输入密码"]').input(password)
        page.ele('css:input[placeholder="请输入密码"]').input('\n')  # press Enter to submit
        time.sleep(5)
        
        success = 0
        for pid in product_ids:
            print(f"\nProcessing product {pid}...")
            page.get(f'https://www.atomlisting.com/editor/{pid}')
            time.sleep(4)
            
            body_text = page.ele('tag:body').text
            if '已生成' in body_text and '选择图片并点击' not in body_text:
                print(f"  Already generated, skipping.")
                success += 1
                continue
            
            # Select platform
            platform_btn = page.ele(f'text:{platform_name}')
            if platform_btn:
                platform_btn.click()
                time.sleep(1)
            
            # Click generate button
            gen_btn = None
            for b in page.eles('tag:button'):
                if '生成' in b.text:
                    gen_btn = b
                    break
            
            if gen_btn:
                print(f"  Clicking: {gen_btn.text}")
                gen_btn.click()
                
                # Poll for completion
                for i in range(20):
                    time.sleep(1)
                    body = page.ele('tag:body').text
                    if '已生成' in body or '标题' in body:
                        print(f"  Generation successful!")
                        success += 1
                        break
                else:
                    print(f"  Timed out, may still be processing.")
            else:
                print("  Generate button not found.")
            
            time.sleep(2)
        
        print(f"\nDone! {success}/{len(product_ids)} products processed.")
    except Exception as e:
        print("Fatal Error:", e)
    finally:
        page.quit()

if __name__ == "__main__":
    if len(sys.argv) < 5:
        print("Usage: python3 atomk_generate.py <username> <password> <platform_name> <product_id1> [product_id2 ...]")
        sys.exit(1)
    user = sys.argv[1]
    pwd = sys.argv[2]
    plat = sys.argv[3]
    ids = [int(x) for x in sys.argv[4:]]
    batch_generate(user, pwd, plat, ids)