building-journalist-outreach-list-from-twitter

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Building 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

前提条件

  • APIFY_TOKEN
    environment variable set
  • Optional: Apify MCP server installed
  • 设置
    APIFY_TOKEN
    环境变量
  • 可选:安装Apify MCP服务器

Inputs

输入参数

ParameterTypeRequiredDefaultNotes
startUrls
arrayOptional
[]
Twitter profile or tweet URLs
twitterHandles
arrayOptional
[]
Twitter usernames (without @)
twitterUserIds
arrayOptional
[]
Twitter user IDs
getFollowers
booleanOptional
false
Extract follower lists
getFollowing
booleanOptional
false
Extract following lists
getRetweeters
booleanOptional
false
Extract retweeters of a tweet URL
includeUnavailableUsers
booleanOptional
false
Include unavailable/suspended users
maxItems
numberOptionalUnlimitedMaximum users to return
customMapFunction
stringOptionalJavaScript function to transform each output object
参数类型是否必填默认值说明
startUrls
数组可选
[]
Twitter个人主页或推文URL
twitterHandles
数组可选
[]
Twitter用户名(不含@)
twitterUserIds
数组可选
[]
Twitter用户ID
getFollowers
布尔值可选
false
提取粉丝列表
getFollowing
布尔值可选
false
提取关注列表
getRetweeters
布尔值可选
false
提取推文的转发者
includeUnavailableUsers
布尔值可选
false
包含不可用/被暂停的用户
maxItems
数字可选无限制返回的最大用户数量
customMapFunction
字符串可选用于转换每个输出对象的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
undefined

Quick answer (prints table to chat)

快速回复(在聊天中打印表格)

node scripts/run_actor.js
--actor "apidojo~twitter-user-scraper"
--input '{"param": "value"}'
node scripts/run_actor.js
--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
node scripts/run_actor.js
--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
> `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
> `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

输出格式

undefined
undefined

Journalist Outreach List: [BEAT/TOPIC]

记者外联列表: [领域/主题]

Contacts found: [N] | Publication filter: [if any] | Date: [DATE]
找到的联系人数量: [N] | 出版物筛选条件: [如有] | 日期: [DATE]

Contact List

联系人列表

#Name@HandlePublicationBeatFollowersRecent Coverage
1[name]@[handle][pub][beat][N][recent tweet/article topic]
#姓名@账号所属机构领域粉丝数近期报道
1[姓名]@[账号][机构][领域][N][近期推文/文章主题]

By Publication

按出版物分类

[Publication Name] ([N] contacts)

[出版物名称] ([N]个联系人)

  1. [Name] (@[handle]) — [title from bio] | [N] followers Recent tweet: "[excerpt showing beat relevance]"
  2. [Name] (@[handle]) — [title] | [N] followers
  1. [姓名] (@[账号]) — [简介中的头衔] | [N]个粉丝 近期推文: "[显示领域相关性的摘录]"
  2. [姓名] (@[账号]) — [头衔] | [N]个粉丝

Freelancers / Independent ([N] contacts)

自由撰稿人/独立记者 ([N]个联系人)

  1. [Name] (@[handle]) — writes for [pubs mentioned in bio] | [N] followers
  1. [姓名] (@[账号]) — 为[简介中提及的机构]撰稿 | [N]个粉丝

Pitch Angle Notes

提案角度建议

Based on recent tweets, the top 5 contacts are actively covering:
  1. @[handle]: recently tweeted about [specific topic] — pitch angle: [suggestion]
  2. @[handle]: covering [topic] — pitch angle: [suggestion]
undefined
根据近期推文,排名前5的联系人正在积极报道:
  1. @[账号]: 近期发布关于[特定主题]的推文 — 提案角度: [建议]
  2. @[账号]: 报道[主题] — 提案角度: [建议]
undefined

Personalization 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的联系人。