building-journalist-outreach-list-from-twitter
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseBuilding a Journalist Outreach List from Twitter
从Twitter构建记者外联列表
Finds journalists and media professionals on Twitter/X who cover a specific beat, industry, or topic. Journalists are the heaviest users of Twitter for professional networking — it's the best platform to build a media contact list.
在Twitter/X上寻找报道特定领域、行业或主题的记者和媒体从业者。记者是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 |
| 布尔值 | 可选 | | 提取粉丝列表 |
| 布尔值 | 可选 | | 提取关注列表 |
| 布尔值 | 可选 | | 提取推文的转发者 |
| 布尔值 | 可选 | | 包含不可用/被暂停的用户 |
| 数字 | 可选 | 无限制 | 返回的最大用户数量 |
| 字符串 | 可选 | — | 用于转换每个输出对象的JavaScript函数 |
Workflow
工作流程
Progress:
- [ ] Step 1: Define beat, industry, and target publications
- [ ] Step 2: Search for journalists tweeting about the beat
- [ ] Step 3: Enrich profiles to extract publication affiliation
- [ ] Step 4: Filter and verify journalist signals
- [ ] Step 5: Deliver press contact list进度:
- [ ] 步骤1:确定领域、行业和目标出版物
- [ ] 步骤2:搜索发布相关领域推文的记者
- [ ] 步骤3:丰富个人资料以提取所属机构信息
- [ ] 步骤4:筛选并验证记者标识
- [ ] 步骤5:交付媒体联系人列表Step 1: Clarify Parameters
步骤1:明确参数
Ask the user for:
- Beat/topic (e.g., "artificial intelligence", "climate tech", "fintech", "B2B SaaS")
- Target publications (optional — e.g., "TechCrunch", "Forbes", "Wired", "any tier-1 tech media")
- Type — staff writers, freelancers, or both
- Geography (optional — US, UK, global)
- List size (default: 30 contacts)
向用户询问:
- 领域/主题(例如:"artificial intelligence"、"climate tech"、"fintech"、"B2B SaaS")
- 目标出版物(可选——例如:"TechCrunch"、"Forbes"、"Wired"、"一线科技媒体")
- 类型——专职撰稿人、自由撰稿人,或两者都要
- 地域(可选——美国、英国、全球)
- 列表规模(默认:30个联系人)
Step 2: Search for Beat-Relevant Tweets
步骤2:搜索与领域相关的推文
Find journalists actively tweeting about the beat — recency of coverage matters for outreach.
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": [
"[TOPIC] journalist",
"[TOPIC] reporter",
"writing about [TOPIC]",
"[TOPIC] story [current year]"
],
"maxItems": 300,
"tweetLanguage": "en"
}
Also run a second query for article link tweets (journalists tweet their published work):Input:
{
"searchTerms": ["[TOPIC] [publication_domain OR article link signal]"],
"maxItems": 200
}
**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": ["[TOPIC] journalist", "[TOPIC] reporter", "writing about [TOPIC]"],
"maxItems": 300
}'Collect unique author usernames from all results.
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`必须在环境变量或`.env`文件中设置。
**如果Apify MCP可用:**工具: apify:run-actor
Actor: "apidojo~tweet-scraper"
输入:
{
"searchTerms": [
"[TOPIC] journalist",
"[TOPIC] reporter",
"writing about [TOPIC]",
"[TOPIC] story [current year]"
],
"maxItems": 300,
"tweetLanguage": "en"
}
同时运行第二个查询,搜索包含文章链接的推文(记者会分享已发表的作品):输入:
{
"searchTerms": ["[TOPIC] [publication_domain OR article link signal]"],
"maxItems": 200
}
**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": ["[TOPIC] journalist", "[TOPIC] reporter", "writing about [TOPIC]"],
"maxItems": 300
}'从所有结果中收集唯一的作者用户名。
Step 3: Enrich Profiles
步骤3:丰富个人资料信息
If Apify MCP is available:
Tool: apify:run-actor
Actor: "apidojo~twitter-user-scraper"
Input:
{
"usernames": ["[username1]", "...", "up to 150 usernames"]
}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": ["[username1]", "[username2]"]}'如果Apify MCP可用:
工具: apify:run-actor
Actor: "apidojo~twitter-user-scraper"
输入:
{
"usernames": ["[username1]", "...", "最多150个用户名"]
}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": ["[username1]", "[username2]"]}'Step 4: Filter for Journalist Signals
步骤4:筛选记者标识
Keep accounts where bio contains ANY of:
- Publication names (e.g., "TechCrunch", "@Forbes", "Bloomberg", "@Wired")
- Journalist titles: "reporter", "journalist", "editor", "correspondent", "writer at", "staff writer", "freelance writer", "contributing editor"
- Byline signals: "bylines at", "writes for", "covering"
- Press credentials: "press", "media"
Follower range: 1,000–500,000 (removes complete unknowns and major TV anchors who don't respond to pitches)
Remove: PR/comms people (bio says "PR", "communications", "agency"), brand accounts, academics without journalist credentials.
保留简介中包含以下任意内容的账号:
- 出版物名称(例如:"TechCrunch"、"@Forbes"、"Bloomberg"、"@Wired")
- 记者头衔:"reporter"、"journalist"、"editor"、"correspondent"、"writer at"、"staff writer"、"freelance writer"、"contributing editor"
- 署名标识:"bylines at"、"writes for"、"covering"
- 媒体资质:"press"、"media"
粉丝数范围: 1000–500000(排除完全不知名的用户和不回复提案的知名主播)
移除: PR/公关人员(简介包含"PR"、"communications"、"agency")、品牌账号、无记者资质的学者。
Step 5: Format Output
步骤5:格式化输出
Output Format
输出格式
undefinedundefinedJournalist Outreach List: [BEAT/TOPIC]
记者外联列表: [领域/主题]
Contacts found: [N] | Publication filter: [if any] | Date: [DATE]
找到的联系人数量: [N] | 出版物筛选条件: [如有] | 日期: [DATE]
Contact List
联系人列表
| # | Name | @Handle | Publication | Beat | Followers | Recent Coverage |
|---|---|---|---|---|---|---|
| 1 | [name] | @[handle] | [pub] | [beat] | [N] | [recent tweet/article topic] |
| # | 姓名 | @账号 | 所属机构 | 领域 | 粉丝数 | 近期报道 |
|---|---|---|---|---|---|---|
| 1 | [姓名] | @[账号] | [机构] | [领域] | [N] | [近期推文/文章主题] |
By Publication
按出版物分类
[Publication Name] ([N] contacts)
[出版物名称] ([N]个联系人)
-
[Name] (@[handle]) — [title from bio] | [N] followers Recent tweet: "[excerpt showing beat relevance]"
-
[Name] (@[handle]) — [title] | [N] followers
-
[姓名] (@[账号]) — [简介中的头衔] | [N]个粉丝 近期推文: "[显示领域相关性的摘录]"
-
[姓名] (@[账号]) — [头衔] | [N]个粉丝
Freelancers / Independent ([N] contacts)
自由撰稿人/独立记者 ([N]个联系人)
- [Name] (@[handle]) — writes for [pubs mentioned in bio] | [N] followers
- [姓名] (@[账号]) — 为[简介中提及的机构]撰稿 | [N]个粉丝
Pitch Angle Notes
提案角度建议
Based on recent tweets, the top 5 contacts are actively covering:
- @[handle]: recently tweeted about [specific topic] — pitch angle: [suggestion]
- @[handle]: covering [topic] — pitch angle: [suggestion]
undefined根据近期推文,排名前5的联系人正在积极报道:
- @[账号]: 近期发布关于[特定主题]的推文 — 提案角度: [建议]
- @[账号]: 报道[主题] — 提案角度: [建议]
undefinedPersonalization Tip
个性化提示
Before pitching, read the journalist's last 3 tweets and their most recent published article. Reference something specific. Generic pitches fail. The recent tweet data in this output enables that personalization without additional research.
在发送提案前,阅读记者的最新3条推文和最近发表的文章。引用具体内容。通用提案会失败。此输出中的近期推文数据无需额外调研即可实现这种个性化。
Troubleshooting
故障排除
Too many non-journalists in results: Strengthen bio filter — require "reporter" OR "journalist" OR "editor" as exact words, not just a publication name.
Can't find journalists for obscure beats: Widen the search to adjacent beats or try the publication name directly as a search term.
Follower counts seem stale: For final outreach list, spot-check the top 10 contacts directly on Twitter.
结果中非记者账号过多: 强化简介筛选条件——要求精确包含"reporter"或"journalist"或"editor",而不仅仅是出版物名称。
无法找到小众领域的记者: 将搜索范围扩大到相邻领域,或直接使用出版物名称作为搜索词。
粉丝数看起来过时: 对于最终的外联列表,直接在Twitter上抽查排名前10的联系人。