feat: add multi-tab fetching to news command for 5x more headlines
Completely rewrites the news command to fetch from multiple Explore tabs (For You, News, Sports, Entertainment) using GenericTimelineById GraphQL API instead of just the ExplorePage initialTimeline. This delivers 15+ AI-curated headlines instead of 3, a 5x improvement in content discovery. Key Changes: - Add GenericTimelineById query ID support with auto-refresh capability - Implement multi-tab fetching with cross-tab headline deduplication - Add CLI flags for granular tab filtering (--for-you, --news-only, --sports, --entertainment, --trending-only) - Fetch from 4 tabs by default (excludes trending to reduce noise) - Add early stopping optimization when count is reached - Handle tab-level errors gracefully without failing entire request Implementation: - Added TIMELINE_IDS constant with base64 timeline identifiers - Created fetchTimelineTab() method for GenericTimelineById requests - Created parseTimelineTabItems() for new response structure - Removed old parseNewsItems() and extractNewsItemsFromInstructions() - Updated all 7 tests to mock GenericTimelineById responses API Changes: - NewsFetchOptions: Added `tabs?: ExploreTab[]` option - ExploreTab type exported for library consumers - Backward compatible - existing code continues to work Documentation: - Added comprehensive "News & Trending" section with examples - Updated command reference with all new flags - Added library usage examples with tab filtering - Updated JSON schema documentation Testing: - All 268 tests passing - Real-world verified: fetches 15+ AI headlines across tabs - Tab filtering verified: --sports, --entertainment, etc all work Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
This commit is contained in:
committed by
Peter Steinberger
co-authored by
Claude Sonnet 4.5
parent
57d1498f1d
commit
fb092f5cec
@@ -65,6 +65,10 @@ bird unbookmark https://x.com/user/status/1234567890123456789
|
||||
# Likes
|
||||
bird likes -n 5
|
||||
|
||||
# News and trending topics (AI-curated from Explore tabs)
|
||||
bird news --ai-only -n 10
|
||||
bird news --sports -n 5
|
||||
|
||||
# Lists
|
||||
bird list-timeline 1234567890 -n 20
|
||||
bird list-timeline https://x.com/i/lists/1234567890 --all --json
|
||||
@@ -82,6 +86,42 @@ bird followers --user 12345678 -n 10 # by user ID
|
||||
bird query-ids --fresh
|
||||
```
|
||||
|
||||
## News & Trending
|
||||
|
||||
Fetch AI-curated news and trending topics from X's Explore page tabs:
|
||||
|
||||
```bash
|
||||
# Fetch 10 news items from all tabs (default: For You, News, Sports, Entertainment)
|
||||
bird news -n 10
|
||||
|
||||
# Fetch only AI-curated news (filters out regular trends)
|
||||
bird news --ai-only -n 20
|
||||
|
||||
# Fetch from specific tabs
|
||||
bird news --news-only --ai-only -n 10
|
||||
bird news --sports -n 15
|
||||
bird news --entertainment --ai-only -n 5
|
||||
|
||||
# Include related tweets for each news item
|
||||
bird news --with-tweets --tweets-per-item 3 -n 10
|
||||
|
||||
# Combine multiple tab filters
|
||||
bird news --sports --entertainment -n 20
|
||||
|
||||
# JSON output
|
||||
bird news --json -n 5
|
||||
bird news --json-full --ai-only -n 10 # includes raw API response
|
||||
```
|
||||
|
||||
Tab options (can be combined):
|
||||
- `--for-you` — Fetch from For You tab only
|
||||
- `--news-only` — Fetch from News tab only
|
||||
- `--sports` — Fetch from Sports tab only
|
||||
- `--entertainment` — Fetch from Entertainment tab only
|
||||
- `--trending-only` — Fetch from Trending tab only
|
||||
|
||||
By default, the command fetches from For You, News, Sports, and Entertainment tabs (Trending excluded to reduce noise). Headlines are automatically deduplicated across tabs.
|
||||
|
||||
## Library
|
||||
|
||||
`bird` can be used as a library (same GraphQL client as the CLI):
|
||||
@@ -95,8 +135,15 @@ const client = new TwitterClient({ cookies });
|
||||
// Search for tweets
|
||||
const searchResult = await client.search('from:steipete', 50);
|
||||
|
||||
// Fetch news and trending topics
|
||||
const newsResult = await client.getNews(10, { aiOnly: true, withTweets: true });
|
||||
// Fetch news and trending topics from all tabs (default: For You, News, Sports, Entertainment)
|
||||
const newsResult = await client.getNews(10, { aiOnly: true });
|
||||
|
||||
// Fetch from specific tabs with related tweets
|
||||
const sportsNews = await client.getNews(10, {
|
||||
aiOnly: true,
|
||||
withTweets: true,
|
||||
tabs: ['sports', 'entertainment']
|
||||
});
|
||||
```
|
||||
|
||||
## Commands
|
||||
@@ -122,6 +169,14 @@ const newsResult = await client.getNews(10, { aiOnly: true, withTweets: true });
|
||||
- `bird followers [--user <userId>] [-n count] [--json]` — list users that follow you (or another user).
|
||||
- `bird whoami` — print which Twitter account your cookies belong to.
|
||||
- `bird check` — show which credentials are available and where they were sourced from.
|
||||
- `bird likes [-n count] [--json]` — list your liked tweets.
|
||||
- `bird news [-n count] [--ai-only] [--with-tweets] [--tweets-per-item n] [--for-you] [--news-only] [--sports] [--entertainment] [--trending-only] [--json]` — fetch news and trending topics from X's Explore tabs (fetches from For You, News, Sports, and Entertainment tabs by default).
|
||||
- `bird trending` — alias for `news` command.
|
||||
- `bird list-timeline <list-id-or-url> [-n count] [--all] [--max-pages n] [--cursor string] [--json]` — get tweets from a list timeline; `--max-pages` implies `--all`.
|
||||
- `bird following [--user <userId>] [-n count] [--json]` — list users that you (or another user) follow.
|
||||
- `bird followers [--user <userId>] [-n count] [--json]` — list users that follow you (or another user).
|
||||
- `bird whoami` — print which Twitter account your cookies belong to.
|
||||
- `bird check` — show which credentials are available and where they were sourced from.
|
||||
|
||||
Global options:
|
||||
- `--auth-token <token>`: set the `auth_token` cookie manually.
|
||||
|
||||
Reference in New Issue
Block a user