finding-freelancers-by-skill-on-twitter
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseFinding Freelancers And Independent Contractors on Twitter
在Twitter上寻找自由职业者和独立承包商
Discovers freelancers and independent contractors on Twitter via skill keywords, portfolio/project signals, and open-to-work indicators. Twitter surfaces professionals who actively discuss their craft — a strong passive candidate signal.
通过技能关键词、作品集/项目信号以及“开放求职”标识在Twitter上发掘自由职业者和独立承包商。Twitter上会展示那些积极讨论自身专业技能的从业者——这是一个很强的被动候选人信号。
Prerequisites
前提条件
- environment variable set
APIFY_TOKEN - Optional: Apify MCP server installed
- 环境变量已设置
APIFY_TOKEN - 可选:已安装Apify MCP服务器
Inputs
输入参数
| Parameter | Type | Required | Default | Notes |
|---|---|---|---|---|
| array | Optional | | Twitter profile or tweet URLs |
| array | Optional | | Twitter usernames (without @) |
| array | Optional | | Twitter user IDs |
| boolean | Optional | | Extract follower lists |
| boolean | Optional | | Extract following lists |
| boolean | Optional | | Extract retweeters of a tweet URL |
| boolean | Optional | | Include unavailable/suspended users |
| number | Optional | Unlimited | Maximum users to return |
| string | Optional | — | JavaScript function to transform each output object |
| 参数 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| 数组 | 可选 | | Twitter个人主页或推文URL |
| 数组 | 可选 | | Twitter用户名(不含@) |
| 数组 | 可选 | | Twitter用户ID |
| 布尔值 | 可选 | | 提取粉丝列表 |
| 布尔值 | 可选 | | 提取关注列表 |
| 布尔值 | 可选 | | 提取推文URL的转发者 |
| 布尔值 | 可选 | | 包含不可用/被封禁用户 |
| 数字 | 可选 | 无限制 | 返回的最大用户数量 |
| 字符串 | 可选 | — | 用于转换每个输出对象的JavaScript函数 |
Workflow
工作流程
Progress:
- [ ] Step 1: Search for role-specific tweets
- [ ] Step 2: Collect unique handles
- [ ] Step 3: Enrich profiles
- [ ] Step 4: Score candidate fit
- [ ] Step 5: Deliver candidate list进度:
- [ ] 步骤1:搜索特定角色的推文
- [ ] 步骤2:收集唯一账号昵称
- [ ] 步骤3:丰富个人资料信息
- [ ] 步骤4:对候选人适配度评分
- [ ] 步骤5:交付候选人名单Step 1: Search Queries
步骤1:搜索查询
Recommended — run_actor.js (handles waiting, output, and file saving automatically):
bash
undefined推荐使用 — run_actor.js(自动处理等待、输出和文件保存):
bash
undefinedQuick answer (prints table to chat)
快速查看结果(在聊天窗口打印表格)
node scripts/run_actor.js
--actor "apidojo~twitter-user-scraper"
--input '{"param": "value"}'
--actor "apidojo~twitter-user-scraper"
--input '{"param": "value"}'
node scripts/run_actor.js
--actor "apidojo~twitter-user-scraper"
--input '{"param": "value"}'
--actor "apidojo~twitter-user-scraper"
--input '{"param": "value"}'
Save as CSV
保存为CSV文件
node scripts/run_actor.js
--actor "apidojo~twitter-user-scraper"
--input '{"param": "value"}'
--output YYYY-MM-DD_results.csv --format csv
--actor "apidojo~twitter-user-scraper"
--input '{"param": "value"}'
--output YYYY-MM-DD_results.csv --format csv
node scripts/run_actor.js
--actor "apidojo~twitter-user-scraper"
--input '{"param": "value"}'
--output YYYY-MM-DD_results.csv --format csv
--actor "apidojo~twitter-user-scraper"
--input '{"param": "value"}'
--output YYYY-MM-DD_results.csv --format csv
Save as JSON
保存为JSON文件
node scripts/run_actor.js
--actor "apidojo~twitter-user-scraper"
--input '{"param": "value"}'
--output YYYY-MM-DD_results.json --format json
--actor "apidojo~twitter-user-scraper"
--input '{"param": "value"}'
--output YYYY-MM-DD_results.json --format json
> `APIFY_TOKEN` must be set in environment or `.env` file.
**If Apify MCP is available:**Tool: apify:run-actor
Actor: "apidojo~tweet-scraper"
Input:
{
"searchTerms": ["freelance [SKILL]", "[SKILL] for hire", "available for contract [SKILL]"],
"maxItems": 300,
"tweetLanguage": "en"
}
**REST API fallback:**
```bash
curl -X POST \
"https://api.apify.com/v2/acts/apidojo~tweet-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchTerms": ["freelance [SKILL]", "[SKILL] for hire", "available for contract [SKILL]"], "maxItems": 300}'Collect unique from results.
author.usernamenode scripts/run_actor.js
--actor "apidojo~twitter-user-scraper"
--input '{"param": "value"}'
--output YYYY-MM-DD_results.json --format json
--actor "apidojo~twitter-user-scraper"
--input '{"param": "value"}'
--output YYYY-MM-DD_results.json --format json
> 必须在环境变量或`.env`文件中设置`APIFY_TOKEN`。
**如果Apify MCP可用:**工具: apify:run-actor
Actor: "apidojo~tweet-scraper"
输入:
{
"searchTerms": ["freelance [SKILL]", "[SKILL] for hire", "available for contract [SKILL]"],
"maxItems": 300,
"tweetLanguage": "en"
}
**REST API备选方案:**
```bash
curl -X POST \
"https://api.apify.com/v2/acts/apidojo~tweet-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchTerms": ["freelance [SKILL]", "[SKILL] for hire", "available for contract [SKILL]"], "maxItems": 300}'从结果中收集唯一的。
author.usernameStep 2: Enrich Profiles
步骤2:丰富个人资料信息
If Apify MCP is available:
Tool: apify:run-actor
Actor: "apidojo~twitter-user-scraper"
Input: {"usernames": ["[username1]", "[username2]", "..."]}REST API fallback:
bash
curl -X POST \
"https://api.apify.com/v2/acts/apidojo~twitter-user-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"usernames": ["handle1", "handle2"]}'如果Apify MCP可用:
工具: apify:run-actor
Actor: "apidojo~twitter-user-scraper"
输入: {"usernames": ["[username1]", "[username2]", "..."]}REST API备选方案:
bash
curl -X POST \
"https://api.apify.com/v2/acts/apidojo~twitter-user-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"usernames": ["handle1", "handle2"]}'Step 3: Filter and Score
步骤3:筛选与评分
Skill confirmation: bio contains keywords: "freelance", "independent", "for hire", "consulting", "contract", "available", "hire me", "DM for work"
availability_signal = bio or recent tweets contain 'available', 'taking clients', 'open for projects', 'DM for rates'
Candidate score:
candidate_score = (skill_confirmed ? 1 : 0) * 0.35
+ (open_to_work_signal ? 1 : 0) * 0.30
+ (followerCount in 200..20000 ? 1 : 0.6) * 0.20
+ (tweeted_in_last_30_days ? 1 : 0) * 0.15Activity: active (< 30 days) | passive (30–90 days) | dormant (> 90 days)
技能确认: 个人简介包含以下关键词:"freelance"、"independent"、"for hire"、"consulting"、"contract"、"available"、"hire me"、"DM for work"
可雇佣性信号 = 个人简介或近期推文包含'available'、'taking clients'、'open for projects'、'DM for rates'
候选人评分:
candidate_score = (skill_confirmed ? 1 : 0) * 0.35
+ (open_to_work_signal ? 1 : 0) * 0.30
+ (followerCount in 200..20000 ? 1 : 0.6) * 0.20
+ (tweeted_in_last_30_days ? 1 : 0) * 0.15活跃度:活跃(<30天)| 被动(30–90天)| 休眠(>90天)
Step 4: Edge Cases
步骤4:边缘情况
- Company/brand accounts in results: Filter where AND bio contains no personal pronouns; these are likely brand accounts
followerCount > 50K - < 20 candidates found: Broaden skill term; remove location or seniority filter; try adjacent skills
- Bot detection: Flag AND
followerCount / followingCount < 0.05as potential bottweetsCount < 20 - Location not matching: Bio location is free text — use fuzzy match; accept partial city/country names
- 结果中出现公司/品牌账号: 筛选掉且个人简介不含人称代词的账号;这些很可能是品牌账号
followerCount > 50K - 找到的候选人不足20位: 扩大技能术语范围;移除地点或资历筛选;尝试相关技能
- 机器人检测: 将且
followerCount / followingCount < 0.05的账号标记为潜在机器人tweetsCount < 20 - 地点不匹配: 个人简介中的地点是自由文本——使用模糊匹配;接受部分城市/国家名称
Output Format
输出格式
undefinedundefinedFreelancers And Independent Contractors Candidates: [FREELANCE_SKILL]
自由职业者与独立承包商候选人:[FREELANCE_SKILL]
Profiles found: [N] | Open-to-work: [N] | Active: [N] | Date: [DATE]
找到的资料数量:[N] | 开放求职:[N] | 活跃状态:[N] | 日期:[DATE]
Priority: Open-to-Work Candidates
优先级别:开放求职候选人
| Name | @Handle | Specialty | Location | Followers | Last Active | Score |
|---|
| 姓名 | @账号昵称 | 专业领域 | 地点 | 粉丝数 | 最后活跃时间 | 评分 |
|---|
Passive Candidates
被动候选人
| Name | @Handle | Specialty | Location | Followers | Score |
|---|
| 姓名 | @账号昵称 | 专业领域 | 地点 | 粉丝数 | 评分 |
|---|
Bio Highlights (Top 5)
个人简介亮点(前5位)
- @[handle]: "[bio excerpt]"
undefined- @[账号昵称]: "[个人简介摘录]"
undefinedTroubleshooting
故障排除
All results are agencies/companies not individuals: Add personal pronouns filter or search , .
Role too generic returns too many results: Add location OR seniority qualifier.
No open-to-work signals: Most candidates don't signal publicly — treat passive candidates as warm leads with personalized outreach referencing their recent content.
"I am a [role]""I do [skill]"所有结果都是代理机构/公司而非个人: 添加人称代词筛选,或搜索、。
角色过于宽泛导致结果过多: 添加地点或资历限定词。
没有“开放求职”信号: 大多数候选人不会公开发出信号——将被动候选人视为潜在客户,结合他们近期的内容进行个性化沟通。
"I am a [role]""I do [skill]"