Dcard API 踩雷記

最近在開發一個會用到 Dcard API 的 app,過程踩了許多雷,寫一篇文章記錄一下我遇到的問題。

這個 app 有一個頁面會抓文章列表,假設我們以 Dcard 廢文板為例子的話,抓取最新30篇文章的 API URL 格式長這樣:

https://www.dcard.tw/_api/forums/whysoserious/posts?popular=false&limit=30

上面 popular 改成 popular=true 就是變成抓熱門前三十篇,應該滿好猜的。

一開始以為應該滿簡單的,就是撈這個 API 的資料就好了,但實際測試發現如果我很頻繁地送 HTTP GET Request 到這個 API,資料會被快取住,會隔一段時間都撈不到新的文章,但是奇怪的是我用 Dcard APP 還是可以看到新文章。

一開始想說是不是抓到本機快取的版本,但是再三確認後確定不是這個問題。反覆測試跟研究之後終於找到問題了,問題出在 CloudFlare 上面!

Dcard 本身有用 CloudFlare,假設使用者是在登入 Dcard 過後送 Request 的話,CloudFlare 就不會返回快取後的結果,假設是在沒登入的情況的話送 Request 的話,CloudFlare 有快取就會返回快取的結果,個人推測應該是 Dcard 他們有在 CloudFlare 上做相關的設定。

整理一下這個問題的解法:

  1. 先送 HTTP POST Request 到 https://www.dcard.tw/_api/sessions 進行 Dcard 帳號登入
  2. 第一步驟做完以後就會有 cookie,這時候再送 GET Request 去抓文章列表(記得送 Request 的時候要夾帶 cookie)
comments powered by Disqus
分享至 Facebook 分享至 Google +