jackwener
9b854e6aa6
fix cli article output and reply-to parsing
2026-03-17 22:53:07 +08:00
jackwener
8cb5824ed4
build: bump twitter-cli version to 0.8.5
2026-03-17 18:04:27 +08:00
jackwener
07e7f83e6f
chore: code review cleanup + bump v0.8.4
...
- Remove _get_client_for_output() compat shim (replaced by direct _get_client calls)
- Remove unused inspect import
- Fix redundant branch in constants.get_accept_language()
- Add TWITTER_BROWSER docs to README (en + zh)
- Update all test monkeypatch signatures
- Bump version to 0.8.4
2026-03-15 19:29:34 +08:00
jackwener
eec439a801
fix: remove 200-char truncation on quoted tweet in detail view
2026-03-14 20:03:20 +08:00
jackwener
e64888083e
chore: bump version to 0.8.2
2026-03-14 13:28:01 +08:00
jackwener
80e5a62890
chore: bump version to 0.8.1
2026-03-14 04:13:02 +08:00
jackwener
e9dfae30df
chore: bump version to v0.8.0
2026-03-13 02:01:35 +08:00
jackwener
7d1b519c85
fix: harden search validation and release v0.7.1
2026-03-13 01:04:29 +08:00
jackwener
dc832f2ee2
feat: add advanced search options (--from, --to, --lang, --since, --until, --has, --exclude, --min-likes, --min-retweets)
...
Closes #17
- New search.py query builder module
- QUERY argument now optional when using advanced filters
- 21 unit tests + 3 CLI integration tests for search
- Bumped version to 0.7.0
2026-03-13 00:15:53 +08:00
jackwener
502cd28a40
chore: release v0.6.6
2026-03-12 14:53:03 +08:00
jackwener
1c0e4b0c39
chore: release v0.6.5
2026-03-11 21:00:51 +08:00
jackwener
a139b1052c
chore: bump version to 0.6.4
2026-03-11 17:09:35 +08:00
jackwener
47be88e62d
fix: use importlib.metadata for __version__ (was hardcoded stale)
2026-03-11 14:11:07 +08:00
jackwener
e96d5142f2
chore: bump version to 0.6.2
2026-03-11 13:36:22 +08:00
jackwener
d3441cf6ad
chore: bump version to v0.6.1
2026-03-11 13:09:11 +08:00
jackwener
6d6108436f
chore: bump version to 0.6.0
...
Changes since 0.5.1:
- feat: Chrome multi-profile cookie extraction (#6 )
- fix: warn on private likes (#8 )
- fix: add logger definition (CI fix)
- refactor: specific ImportError handling (#10 )
- docs: upgrade instructions in README and SKILL.md
2026-03-11 12:57:34 +08:00
jackwener
e38f2033e9
chore: bump version to 0.5.1
2026-03-11 00:45:55 +08:00
jackwener
34d2491ba2
chore: bump version to 0.5.0
...
- refactor: split client.py into graphql.py + parser.py
- refactor: structured exception hierarchy (exceptions.py)
- feat: integration smoke tests
- docs: updated project structure
2026-03-11 00:30:19 +08:00
jackwener
9cf74abd56
feat: add integration smoke tests
...
CLI-level smoke tests using --yaml output against real Twitter API.
Default skipped via @pytest.mark.smoke marker + pyproject.toml addopts.
Run locally with: uv run pytest -m smoke -v
2026-03-10 22:26:46 +08:00
jackwener
d71ad45a0a
fix: harden pagination auth and runtime headers
2026-03-10 12:33:04 +08:00
jackwener
7fb02ba18c
feat: cookie file cache with TTL + user --json
...
- Cookie cache: save to ~/.cache/twitter-cli/cookies.json (24h TTL)
- On 401/403 auth failure: auto-invalidate cache, re-extract from browser
- Cache uses 0600 permissions for security
- Add --json option to twitter user command for scripting
- Priority: env vars → cache file → browser extraction
2026-03-09 21:47:23 +08:00
jackwener
bbe0bc8de3
docs: rename rt/unrt → retweet/unretweet, update SKILL.md + README.md
...
- Rename rt/unrt commands to retweet/unretweet for clarity
- SKILL.md: fix Python version, add --output/--filter examples, safety notes
- README.md: dynamic Chrome fingerprint, write delays, --output examples
- Sync Chinese section with English changes
2026-03-09 21:20:05 +08:00
jackwener
8313a7012f
refactor: dynamic UA matching, session reuse, score Optional, --output on all commands
...
- constants.py: sync_chrome_version() aligns UA/sec-ch-ua with impersonate target
- auth.py: reuse shared cffi session instead of creating duplicate
- filter.py: eliminate double weight building in score_tweet
- models.py: Tweet.score → Optional[float] for accurate display
- cli.py: add --output to search/likes/user-posts for consistency
2026-03-09 21:15:28 +08:00
jackwener
fda9b1c3dc
fix: 431 Request Too Large — reduce FEATURES to 15 essential keys, dynamic update only updates existing keys
2026-03-09 20:59:16 +08:00
jackwener
d20c5699fd
fix: 414 URI Too Long — omit False-valued features from GET URL, add regression tests
2026-03-09 20:50:45 +08:00
jackwener
12f425abea
feat: write operation delays, dynamic FEATURES update, 30+ client.py tests, fix README proxy wording
2026-03-09 20:45:51 +08:00
jackwener
b9c226b804
fix: dynamic Chrome impersonation + in-process macOS Keychain cookie extraction ( closes #4 )
2026-03-09 20:38:47 +08:00
jackwener
59b5df7f71
fix: ClawHub publish (acceptLicenseTerms), add LICENSE, fix score display bug, remove unused var
2026-03-09 20:32:45 +08:00
jackwener
94e21fba9a
fix: remove unused requests import (CI lint), fix README wording, drop requests dep
2026-03-09 20:25:24 +08:00
jackwener
a6ad246071
fix: improve error handling for write operation rate limits (retweet/like)
2026-03-09 20:22:46 +08:00
jackwener
731151e62e
fix: use curl_cffi for ClientTransaction init to prevent TLS fingerprint leak
2026-03-09 19:14:33 +08:00
jackwener
b83abadb73
feat: full cookie forwarding from browser and TWITTER_PROXY support
2026-03-09 19:12:06 +08:00
jackwener
27d73efee5
feat: anti-detection hardening with curl_cffi TLS impersonation and request jitter
2026-03-09 17:11:59 +08:00
jackwener
3e13ed3749
chore: bump version to 0.1.1
2026-03-09 12:28:45 +08:00
jackwener
d2d971c865
refactor: deep review fixes round 3
...
- client.py:
- Remove dead _extract_cursor second branch (unreachable code)
- Cache SSL context as module-level _SSL_CTX (avoid re-reading CA certs)
- Add 404 stale-fallback retry to _graphql_post (parity with GET)
- Remove dead core.get('name')/core.get('screen_name') in fetch_user
- Set Content-Type: application/json only for POST requests
- Rename _to_int → _parse_int for clarity vs config._as_int
- Add 'not thread-safe' note on module-level caches
- cli.py:
- _fetch_and_display now accepts optional config param (fix double load)
- Refactor user_posts to use _fetch_and_display
- Pass config to all _fetch_and_display callers
- pyproject.toml:
- Move xclienttransaction/requests to optional [transaction] deps
- Add beautifulsoup4 to [transaction] optional deps
- README.md:
- Add rateLimit config section with comments
- Add constants.py to project structure tree
2026-03-08 13:58:06 +08:00
jackwener
767a466667
fix: add x-client-transaction-id header for search API
...
- Root cause: Twitter's SearchTimeline endpoint requires x-client-transaction-id
header that HomeTimeline/Bookmarks don't enforce
- Integrate XClientTransaction library for header generation
- Add requests + beautifulsoup4 dependencies
- Fix SearchTimeline variables (override base timeline vars)
- Update FEATURES dict and fallback queryIds to match live x.com values
2026-03-07 19:53:55 +08:00
jackwener
1ca62d4635
chore: add pypi publish workflow and uv-first install docs
2026-03-05 16:16:00 +08:00
jackwener
4c08d09304
refactor: harden CLI/client/config and centralize serialization
2026-03-05 16:13:54 +08:00
jackwener
7238b932ab
feat: add user commands, auto-detect browser, optimize performance
...
- Add user/user-posts/followers/following commands
- Add UserProfile model and GraphQL API methods
- Add print_user_profile and print_user_table formatters
- Auto-detect browser for cookies (Chrome → Edge → Firefox → Brave)
- Remove --browser option from all commands
- Remove cookie verification (v1.1 endpoints are gone)
- Use hardcoded fallback query IDs first (skip slow JS bundle scan)
- Update FEATURES from latest twitter-openapi config
- Fix user-posts: add required withVoice variable
- Add tweet URL links in feed output
- Add error handling to all user commands
2026-03-05 00:41:26 +08:00
jackwener
16752c3115
Initial commit: twitter-cli v0.1.0
2026-03-04 17:56:42 +08:00