Twitter, WTF?
- 因為前端 API 被爬爆所以弄了資料 API
- 有人賺不夠所以推出 100鎂/月的 read access API,前端 API 又被爬爆
- 設置流量限制,課金玩家才有資格看推特 ← 現在在這
總之 Twitter 又差點把自己搞砸,
還好有人在 GitHub 上
提到 embedded tweet 用的 syndication.twitter.com API 還沒被處理,
雖然一次只能抓 20 篇推文,不過對於我的 use case 來說應該是足夠的,
本文主要記錄 /srv/timeline-profile/screen-name/[screen-name] 這個 endpoint
在開始之前
所有的資料都是從 https://publish.twitter.com/ 來的, 所以如果要找跟推文有關的 endpoint 也可以利用這個網站 + Developer Tools 去看
JSON 資料
Embedded 的版本一樣是用 react (更正確來說是 Next.js) 去作渲染,
不過要渲染的資料已經透過 Server-Side Rendering 放在 <script id="__NEXT_DATA__">裡面了,
所以在 Python 下可以使用 requests + BeautifulSoup 直接把資料 dump 出來,
不用搭配 Selenium 去渲染再爬
主要的資料在 data['props']['pageProps'] (假設 script 標籤的資料是 data) 底下,
其中最重要的是
| key | data | type |
|---|---|---|
| latest_tweet_id | 最新推文的 ID | string |
| timeline | 推文們 | object |
有的時候
latest_tweet_id會不見,不知道為什麼,目前可以確定的是latest_tweet_id不見的時候timeline會沒有推文
timeline
這個物件只有一個 key entries,裡面會保存最新 20 篇的推文資料
每一個 entry 有以下的 key
dict_keys(['type', 'entry_id', 'sort_index', 'content'])
其中最重要的是 content 這個 key 底下的 tweet,主要的內容整理如下
說時遲那時快,在我寫到這裡的時候 syndication API 就掛了,way to go Elon
| key | data | type |
|---|---|---|
| id_str | 推文 ID | string |
| entities | hashtag、圖片、連結、@使用者等資訊 | object |
| full_text | 推文全文 | string |
| permalink | 推文連結 (去掉 https://twitter.com) | string |
| user | 推文者的資訊 | object |
| quoted_status | 引用的推文 | tweet object |
| quoted_status_permalink.expanded | 引用推文的 url | string |
| retweeted_status | 轉推的推文 | tweet object |
| retweeted_status_permalink.expanded | 轉推推文的 url | string |
entities.media[]
重要的只有 media_url_https,提供直接連結到圖片的 url,可以用於 discord、ptt 等直接開圖