x-recruiter
用于在 X (x.com) 发布招聘帖子。包含文案规范、图片生成提示和自动化发布脚本。发布 AI 相关岗位或设计类岗位时优先使用。
Packaged view
This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.
Install command
npx @skill-hub/cli install iofficeai-aionui-x-recruiter
Repository
Skill path: skills/x-recruiter
用于在 X (x.com) 发布招聘帖子。包含文案规范、图片生成提示和自动化发布脚本。发布 AI 相关岗位或设计类岗位时优先使用。
Open repositoryBest for
Primary workflow: Analyze Data & AI.
Technical facets: Full Stack, Data / AI.
Target audience: everyone.
License: Unknown.
Original source
Catalog source: SkillHub Club.
Repository owner: iOfficeAI.
This is still a mirrored public skill entry. Review the repository before installing into production workflows.
What it helps with
- Install x-recruiter into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
- Review https://github.com/iOfficeAI/AionUi before adding x-recruiter to shared team environments
- Use x-recruiter for development workflows
Works across
Favorites: 0.
Sub-skills: 0.
Aggregator: No.
Original source / Raw SKILL.md
---
name: x-recruiter
description: 用于在 X (x.com) 发布招聘帖子。包含文案规范、图片生成提示和自动化发布脚本。发布 AI 相关岗位或设计类岗位时优先使用。
---
# X Recruiter (X 招聘助手)
本技能用于快速在 X 发布招聘信息,包含文案规则、封面/详情图提示与自动化发布脚本。
## 核心工作流
### 1. 信息收集
向用户确认:
- **岗位名称**
- **核心职责 & 要求**
- **投递邮箱/链接**
### 2. 生成视觉素材
使用 `scripts/generate_images.js` 生成图片。
- **操作**:
```bash
node scripts/generate_images.js
```
- **产出**:`cover.png`, `jd_details.png`
### 3. 生成文案
生成符合 X 调性的文案,控制在 280 字符内。
- **规则**:参考 `assets/rules.md`。
- **要求**:简洁、清晰、带核心职责与投递方式。
### 4. 自动化发布
使用 `scripts/publish_x.py` 启动浏览器进行发布。
**前置要求**:
- 安装 Playwright: `pip install playwright`
- 安装浏览器驱动: `playwright install chromium`
**执行命令**:
```bash
python3 scripts/publish_x.py "post_content.txt" "cover.png" "jd_details.png"
```
**交互流程(更清晰的步骤说明)**:
1. 观察浏览器窗口:脚本已打开 X 首页或发帖页。
2. 若出现登录页,请完成登录。
3. 登录完成后,脚本会自动填充文案与图片。
4. 请在浏览器中检查内容,确认无误后点击“Post”。
## 资源文件
- **assets/rules.md**: 文案规则与限制。
- **assets/design_philosophy.md**: 视觉风格指南。
- **scripts/generate_images.js**: 图片生成脚本。
- **scripts/publish_x.py**: 发布自动化脚本。
---
## Referenced Files
> The following files are referenced in this skill and included for context.
### scripts/generate_images.js
```javascript
const fs = require('fs');
// Placeholder generator instructions. Replace with real image generation if needed.
const output = ['Generate cover.png and jd_details.png with 1080x1350 resolution.', 'Cover: role title + short tagline + company name.', 'Details: responsibilities, requirements, apply method.'].join('\n');
fs.writeFileSync('image_instructions.txt', output);
console.log('Wrote image_instructions.txt');
```
### scripts/publish_x.py
```python
import sys
import time
from pathlib import Path
from playwright.sync_api import sync_playwright
def read_text(path: str) -> str:
return Path(path).read_text(encoding="utf-8").strip()
def main() -> None:
if len(sys.argv) < 2:
print("用法: python3 scripts/publish_x.py <post_content.txt> [cover.png] [jd_details.png]")
sys.exit(1)
content_path = sys.argv[1]
cover_path = sys.argv[2] if len(sys.argv) > 2 else None
details_path = sys.argv[3] if len(sys.argv) > 3 else None
content = read_text(content_path)
print("🚀 X 发布脚本已启动")
print("操作指南:")
print("1) 观察浏览器窗口:脚本会打开 X 首页或发帖页。")
print("2) 若出现登录页,请完成登录。")
print("3) 登录完成后,脚本会自动填充文案与图片。")
print("4) 请在浏览器中检查内容,确认无误后点击“Post”。")
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page()
page.goto("https://x.com/home", wait_until="domcontentloaded")
page.wait_for_timeout(2000)
# If not logged in, X will redirect to login or show a login wall.
if "login" in page.url or "i/flow/login" in page.url:
print("⏳ [步骤 2] 等待登录:请在浏览器窗口完成登录。")
print(" 脚本将自动检测登录完成后继续;如检测不到,请回到终端按 Enter 继续。")
try:
page.wait_for_url("https://x.com/home", timeout=120000)
except Exception:
input("登录完成后回到终端,按 Enter 继续...")
page.goto("https://x.com/home", wait_until=\"domcontentloaded\")
page.wait_for_timeout(2000)
# Focus composer
composer = page.locator("div[role='textbox'][data-testid='tweetTextarea_0']")
if not composer.is_visible():
# Try clicking the compose button if needed
compose_btn = page.locator("a[data-testid='SideNav_NewTweet_Button'], div[data-testid='SideNav_NewTweet_Button']")
if compose_btn.is_visible():
compose_btn.click()
page.wait_for_timeout(1000)
composer = page.locator("div[role='textbox'][data-testid='tweetTextarea_0']")
composer.wait_for(timeout=10000)
composer.click()
composer.fill(content)
# Upload images if provided
if cover_path or details_path:
files = [p for p in [cover_path, details_path] if p]
file_input = page.locator("input[type='file'][data-testid='fileInput']")
file_input.set_input_files(files)
page.wait_for_timeout(3000)
# Click Post
post_btn = page.locator("div[data-testid='tweetButtonInline']")
post_btn.wait_for(timeout=10000)
post_btn.click()
# Wait a bit to ensure posting
page.wait_for_timeout(3000)
print("✅ 已提交发布,请在 X 上确认。")
time.sleep(5)
context.close()
browser.close()
if __name__ == "__main__":
main()
```
### assets/rules.md
```markdown
# X Post Rules
- Keep within 280 characters.
- Include role title, key requirements, and application method.
- Avoid sensitive or discriminatory language.
- Prefer 1-2 relevant hashtags.
```