Submit Directories
Overview
Full lifecycle for submitting a product to 800+ AI tool directories: collect product info → analyze directories → build submission plan → discover forms → auto-submit → manual browser submissions → track progress.
Setup
Install dependencies
CODEBLOCK0
Configure credentials via environment variables
Never hardcode credentials in scripts. Set these before running any pipeline step:
CODEBLOCK1
Tip: save these to a local .env file (already in .gitignore) and load with:
CODEBLOCK2
Place assets
- -
logo.png — product logo (used for file upload fields) - INLINECODE3 — product screenshot (used for file upload fields)
Both should be in the same directory as the scripts.
Phase 0: Collect Product Info
Ask one at a time (never dump all at once):
| # | Field | Question |
|---|
| 1 | Product URL | "What is your product/startup website URL?" |
| 2 |
Product Name | "What is your product name?" |
| 3 | Tagline | "Give me a one-line tagline." |
| 4 | Description | "Write 2-3 sentences: what it does, who it's for, what makes it different." |
| 5 | Pricing | "What is your pricing model?" (Free / Freemium / Open Source / Paid) |
| 6 | Keywords | "List 5-7 category keywords." |
| 7 | Email | "What email for submissions?" |
| 8 | Name | "What name on submissions?" (get first + last separately too) |
| 9 | Username | "Preferred username for sites requiring registration?" |
| 10 | Password | "Throwaway password for sites requiring registration?" ⚠️ Use a throwaway — never a real password. Set via
SUBMIT_PASSWORD env var; passwords are stripped from
submission_plan.json before saving. |
| 11 | GitHub URL | (optional) |
| 12 | Twitter/X | (optional) |
Then ask submission preferences:
- - "Submit to Google-login directories? (You complete auth manually)"
- "Skip all paid directories, or flag for review?"
- "Fill forms on captcha sites and pause for you to solve, or skip?"
Assets: Tell user to place logo.png and site-image.png in project root.
Phase 1: Configure
- 1. Set all required environment variables (see Setup section above)
- Generate 30 unique copy variations (title + description pairs):
- Different angles: features, benefits, pricing, use case, comparison
- Vary length: short punchy vs. detailed
- Different keywords, never same opening
- 3. Store in INLINECODE8
- Update
checkpoint.md with product info (omit passwords)
Phase 2: Analyze & Classify
CODEBLOCK3
Report auth type breakdown when done.
Phase 3: Build Submission Plan
Filter directories.json:
- - INLINECODE11
- INLINECODE12 OR INLINECODE13
- Include
google_only / google_and_email only if user opted in
Create submission_plan.json entries with copy variation (rotate evenly), credentials, status: pending.
Phase 4: Discover Forms
CODEBLOCK4
Visits each submission URL, extracts form field metadata, updates submission_plan.json. Report: discovered / not found / timeout counts.
Phase 5: Auto-Submit
CODEBLOCK5
Report: submitted / no matching fields / timed out / needs manual attention.
Phase 6: Manual Browser Submissions
Use Playwright MCP (mcp__playwright namespace) for sites needing manual interaction.
Captcha sites
- 1.
browser_navigate → submission URL - INLINECODE21 → understand page
- INLINECODE22 /
browser_type → fill all fields - Ask user to solve captcha
- INLINECODE24 submit → verify confirmation
Google login sites
- 1.
browser_navigate → login page - Click "Sign in with Google"
- Ask user to complete Google auth
- After login, proceed to submission form
- Use
browser_tabs to switch between OAuth popup and main tab
Rich text / complex forms
- - TinyMCE/Quill: use
browser_evaluate to set content directly - Combobox/select:
browser_click dropdown → click option - Multi-step forms:
browser_snapshot after each step for new fields - Custom upload widgets: use
browser_file_upload for logo/screenshot
Phase 7: GitHub PR Submissions
Requirements: gh CLI installed and authenticated (gh auth login). Set SUBMIT_GITHUB_URL if you want your repo linked in entries.
For awesome-list directories:
CODEBLOCK6
Record PR URL in checkpoint.md.
Tracking
Update checkpoint.md after each phase with: counts by status, successful list, failed list with reasons, next steps.
Status Values
| Status | Meaning |
|---|
| INLINECODE36 | Confirmed submitted |
| INLINECODE37 |
Requires payment |
|
skipped_login_required | Requires account creation |
|
captcha | Needs manual captcha solve |
|
no_form_found | No submission form on page |
|
no_fields_matched | Form exists, no fields matched |
|
timeout /
submit_timeout | Page/submit timed out |
|
cloudflare_blocked | Cloudflare challenge |
|
domain_parked | Dead domain |
Rules
- 1. Never assume — unclear about product/preferences? Ask.
- Never commit real passwords — use env vars only; passwords are stripped from
submission_plan.json automatically before each save. - Report after every phase — never run pipeline silently.
- Explain every skip — tell user why a directory was skipped.
- Verify submissions — check for confirmation or error states.
- Rate limit — max 5 concurrent submissions to avoid IP blocks.
- Strip personal data before git push — search for email, name, password in all files.
Common Submission Blockers
| Blocker | Frequency | Detection |
|---|
| Paid listing | ~20% | Pricing page, Stripe links, "$" on submit page |
| reCAPTCHA / Turnstile |
~10% |
iframe[src*=recaptcha] or
[data-turnstile] |
| Login required | ~15% | Redirect to
/login on submit URL |
| Newsletter-only forms | ~10% | Looks like submit but is email signup |
| Domain parked/dead | ~8% | No content, DNS failure |
| Cloudflare blocked | ~3% | Challenge page, 403 |
| Reciprocal link required | ~5% | Old web directories requiring backlink |
Best ROI Directory Types
- 1. AI tool directories with simple HTML forms
- Startup directories using Google Forms
- GitHub awesome-lists accepting PRs (free, high-quality backlinks)
- NoCode/SaaS aggregators
- General web directories with DA≥30
File Reference
| File | Purpose |
|---|
| INLINECODE50 | Master database (827+ directories) |
| INLINECODE51 |
Targets with copy, fields, status (no credentials stored) |
|
checkpoint.md | Progress tracking — source of truth |
|
analyze_directories.py | HTTP-level analysis |
|
cleanup_and_categorize.py | Triage + browser check list |
|
browser_verify.py | Playwright browser verification |
|
discover_forms.py | Form field discovery |
|
submit_directories.py | Auto-submission engine |
提交目录
概述
将产品提交至800+个AI工具目录的完整生命周期:收集产品信息 → 分析目录 → 构建提交计划 → 发现表单 → 自动提交 → 手动浏览器提交 → 跟踪进度。
设置
安装依赖
bash
pip install -r requirements.txt
playwright install chromium
通过环境变量配置凭据
切勿在脚本中硬编码凭据。在运行任何管道步骤前设置以下变量:
bash
必填
export SUBMIT
PRODUCTURL=https://yourproduct.com
export SUBMIT
PRODUCTNAME=您的产品名称
export SUBMIT_TAGLINE=您的单行标语
export SUBMIT_EMAIL=you@throwaway.com # 使用临时邮箱
export SUBMIT
AUTHORNAME=张三
推荐
export SUBMIT
AUTHORFIRST=三
export SUBMIT
AUTHORLAST=张
export SUBMIT_USERNAME=youruser
export SUBMIT_PASSWORD=throwaway-pass # 使用临时密码
可选
export SUBMIT
GITHUBURL=https://github.com/you/repo
export SUBMIT
TWITTERURL=https://twitter.com/yourhandle
export SUBMIT_KEYWORDS=ai,saas,marketing,automation
export SUBMIT_LOGO=logo.png # 相对于脚本目录
export SUBMIT_SCREENSHOT=site-image.png # 相对于脚本目录
提示:将这些变量保存到本地.env文件(已在.gitignore中),并使用以下命令加载:
bash
set -a && source .env && set +a
放置资源文件
- - logo.png — 产品标志(用于文件上传字段)
- site-image.png — 产品截图(用于文件上传字段)
两者应放在与脚本相同的目录中。
阶段0:收集产品信息
逐一询问(切勿一次性全部抛出):
| # | 字段 | 问题 |
|---|
| 1 | 产品URL | 您的产品/创业公司网站URL是什么? |
| 2 |
产品名称 | 您的产品名称是什么? |
| 3 | 标语 | 请提供一行标语。 |
| 4 | 描述 | 写2-3句话:它的功能、目标用户、独特之处。 |
| 5 | 定价 | 您的定价模式是什么?(免费/免费增值/开源/付费) |
| 6 | 关键词 | 列出5-7个分类关键词。 |
| 7 | 邮箱 | 提交用的邮箱是什么? |
| 8 | 姓名 | 提交用的姓名是什么?(同时获取名和姓) |
| 9 | 用户名 | 需要注册的网站首选用户名? |
| 10 | 密码 | 需要注册的网站临时密码? ⚠️ 使用临时密码——切勿使用真实密码。通过SUBMIT
PASSWORD环境变量设置;密码在保存前会从submissionplan.json中移除。 |
| 11 | GitHub URL | (可选) |
| 12 | Twitter/X | (可选) |
然后询问提交偏好:
- - 是否提交到Google登录的目录?(您手动完成认证)
- 跳过所有付费目录,还是标记待审?
- 在验证码网站上填写表单并暂停让您解决,还是跳过?
资源文件: 告知用户将logo.png和site-image.png放置在项目根目录。
阶段1:配置
- 1. 设置所有必需的环境变量(参见上方设置部分)
- 生成30个独特的文案变体(标题+描述配对):
- 不同角度:功能、优势、定价、用例、对比
- 长度变化:简短有力 vs. 详细描述
- 不同关键词,避免相同开头
- 3. 存储在submission_plan.json中
- 使用产品信息更新checkpoint.md(省略密码)
阶段2:分析与分类
bash
.venv/bin/python analyze_directories.py # HTTP层面:认证、验证码、定价、失效域名
.venv/bin/python cleanupandcategorize.py # 分类错误,构建browserchecklist.json
.venv/bin/python browser_verify.py # Playwright验证(10个并发工作进程)
.venv/bin/python browser_verify.py --recheck-unknown # 深度重新检查未知项
完成后报告认证类型分布。
阶段3:构建提交计划
筛选directories.json:
- - sitestatus = active
- authtype = none 或 authtype = emailpassword
- 仅当用户选择加入时包含googleonly / googleand_email
使用文案变体(均匀轮换)、凭据、status: pending创建submission_plan.json条目。
阶段4:发现表单
bash
.venv/bin/python discover_forms.py
访问每个提交URL,提取表单字段元数据,更新submission_plan.json。报告:已发现/未找到/超时计数。
阶段5:自动提交
bash
.venv/bin/python submit_directories.py
报告:已提交/无匹配字段/超时/需手动处理。
阶段6:手动浏览器提交
使用Playwright MCP(mcpplaywright命名空间)处理需要手动交互的网站。
验证码网站
- 1. browsernavigate → 提交URL
- browsersnapshot → 理解页面
- browserfillform / browsertype → 填写所有字段
- 请求用户解决验证码
- browserclick 提交 → 验证确认
Google登录网站
- 1. browsernavigate → 登录页面
- 点击使用Google登录
- 请求用户完成Google认证
- 登录后,进入提交表单
- 使用browsertabs在OAuth弹出窗口和主标签页之间切换
富文本/复杂表单
- - TinyMCE/Quill:使用browserevaluate直接设置内容
- 组合框/选择框:browserclick下拉菜单 → 点击选项
- 多步骤表单:每一步后使用browsersnapshot获取新字段
- 自定义上传组件:使用browserfile_upload上传标志/截图
阶段7:GitHub PR提交
要求: 已安装并认证gh CLI(gh auth login)。如果希望在条目中链接您的仓库,请设置SUBMITGITHUBURL。
对于awesome-list目录:
bash
gh repo fork /
创建分支,按照仓库格式添加产品条目
gh pr create
在checkpoint.md中记录PR URL。
跟踪
每个阶段后更新checkpoint.md,包含:按状态统计、成功列表、失败列表及原因、后续步骤。
状态值
| 状态 | 含义 |
|---|
| submitted | 已确认提交 |
| skipped_paid |
需要付费 |
| skipped
loginrequired | 需要创建账户 |
| captcha | 需要手动解决验证码 |
| no
formfound | 页面上无提交表单 |
| no
fieldsmatched | 表单存在,无匹配字段 |
| timeout / submit_timeout | 页面/提交超时 |
| cloudflare_blocked | Cloudflare挑战 |
| domain_parked | 失效域名 |
规则
- 1. 切勿假设 — 对产品或偏好不清楚?请询问。
- 切勿提交真实密码 — 仅使用环境变量;密码在每次保存前自动从submission_plan.json中移除。
- 每个阶段后报告 — 切勿静默运行管道。
- 解释每次跳过 — 告知用户为何跳过某个目录。
- 验证提交 — 检查确认或错误状态。
- 速率限制 — 最多5个并发提交以避免IP封锁。
- 推送前移除个人数据 — 在所有文件中搜索邮箱、姓名、密码。
常见提交障碍
| 障碍 | 频率 | 检测方式 |
|---|
| 付费列表 | ~20% | 定价页面、Stripe链接、提交页面上$符号 |
| reCAPTCHA / Turnstile |
~10% | iframe[src*=recaptcha] 或 [data-turnstile] |
| 需要登录 | ~15% | 提交URL重定向到/login |
| 仅新闻通讯表单 | ~10% | 看似提交表单实为邮箱注册 |
| 域名停放/失效 | ~8% | 无内容、DNS失败 |
| Cloudflare拦截 | ~3% | 挑战页面、403 |
|