# 3rd Party Twitter Apps
## 背景
* Tweetbot 因 Twitter 毫無預警地撤銷 API 存取權、遭到封殺而被迫終止:[Canary in the emerald mine: Tweetbot’s sudden death, open-casket funeral, and reincarnation as a Mastodon app.](https://www.theverge.com/23653556/tweetbot-twitter-api-elon-musk-mastodon)
## iOS
### [TwitterIt for Twitter](https://apps.apple.com/us/app/twitterit-for-twitter/id1484366079)
基本上是把網頁版 Twitter 包在 app 裡,很難用⋯⋯
### [Spring mini for Twitter](https://apps.apple.com/us/app/spring-mini-for-twitter/id1508706799)
是 native UI,功能正常,可以發推。
使用 Proxyman 截取網路連線,發現:
* Timeline 似乎是使用 Twitter 的 GraphQL API: `https://twitter.com/i/api/graphql/lAKISuk_McyDUlhS2Zmv4A/HomeLatestTimeline`
* 但是似乎不是通常版的 GraphQL,因為是用 `GET` 而非 `POST`,在 request 中也沒看到 GraphQL query。猜測可能是使用 pre-define 好的 query 模板,使用 URL path (`lAKISuk_McyDUlhS2Zmv4A/HomeLatestTimeline`) 指定,因此推測是 Twitter 的內部 API。
* `https://twitter.com/i/api/graphql/lI07N6Otwv1PhnEgXILM7A/FavoriteTweet`
* `https://twitter.com/i/api/graphql/ZYKSe-w7KEslx3JhSIk5LA/UnfavoriteTweet`
* `URL: https://twitter.com/i/api/2/notifications/mentions.json?...`
* `https://twitter.com/i/api/graphql/BbmLpxKh8rX8LNe2LhVujA/TweetDetail?variables=...`
* `https://twitter.com/i/api/graphql/3Ej-6N7xXONuEp5eJa1TdQ/SearchTimeline?...`
幾乎跟 Twitter web app 是使用一樣的 API。
### [Tweetx for Twitter](https://apps.apple.com/us/app/tweetx-for-twitter/id6450922671)
是 native UI,可以用 native UI 發推文,不知道是怎麼做到的。
神秘,用 Proxyman 似乎截取不到網路連線。
### [Friendly for Twitter](https://apps.apple.com/us/app/friendly-for-twitter/id1436510057)
看起來也是把 Twitter 網頁版包進去。各項功能一直載入失敗,沒辦法用。
### [FocusX for Twitter](https://apps.apple.com/us/app/focusx-for-twitter/id6450184089)
看起來仍然是 native,且功能正常,不知道是怎麼做到的?是用 Twitter API 嗎?
用 Flutter 寫的,有開源,可以研究看看: https://github.com/allentown521/FocusTwitterX
神秘,用 Proxyman 似乎截取不到網路連線。
看原始碼似乎是用 `dart_twitter_api`,所以是走官方 API?
### [TwidereX - iOS](https://github.com/TwidereProject/TwidereX-iOS)
有[開源](https://github.com/TwidereProject/TwidereX-iOS),Swift 寫的。可以發推,但時間軸和推文一直繞圈圈無法載入。User profile 的簡介部分 和 follower list 倒是有載入出來。
最後一次更新是 2023 年 9 月。不確定是不是放棄了。
## Twitter Official App 本身的分析
* iOS app 有做 SSL pinning,無法截獲 API 使用細節。
* Web app 可以看出使用了這些 API:
* **HomeTimeline**: `https://twitter.com/i/api/graphql/q1x0puFIVMzsbx2Yoh-usA/HomeTimeline?variables=...`
* **TweetDetail**: `https://twitter.com/i/api/graphql/zJvfJs3gSbrVhC0MKjt_OQ/TweetDetail?variables=...` ([request/response 範本](https://gist.github.com/zetavg/c82ae1469df43ac98b1a2d106a28f449))
* **UserByScreenName**: `https://twitter.com/i/api/graphql/qW5u-DAuXpMEG0zA1F7UGQ/UserByScreenName?variables=...`
* **UserTweets**: `https://twitter.com/i/api/graphql/9zyyd1hebl7oNWIPdA8HRw/UserTweets?variables=...`
* **FavoriteTweet**: (`POST`) `https://twitter.com/i/api/graphql/lI07N6Otwv1PhnEgXILM7A/FavoriteTweet`
* **UnfavoriteTweet**: (`POST`) `https://twitter.com/i/api/graphql/ZYKSe-w7KEslx3JhSIk5LA/UnfavoriteTweet`
* **CreateTweet**: (`POST`) `https://twitter.com/i/api/graphql/zIdRTsSqcD6R5uMtm_N0pw/CreateTweet`
* **notifications**: `https://twitter.com/i/api/2/notifications/all.json?...`