取得所有在 Twitter(X) 上按讚內容的腳本

3 min

language: ja bn en es hi pt ru zh-cn zh-tw

大家好,我是無能。雖然可以使用名為 Twikit 的非官方 API 進行 Twitter 爬蟲,但從前陣子開始,範例程式碼就開始建議使用非同步操作,升級後發現它會提示要使用非同步,所以我全部都修正了。
haturatu/xd_likes
像這樣,一開始會將所有推文儲存到 all_tweets 中。

取得指定的最大值後

將取得 all_tweets 中所有推文的內容。

這些都會寫入到 fav.log 中,因此在需要時可以使用 grep 提取所有資訊。

API 限制

https://github.com/d60/twikit/blob/main/ratelimits.md

如您所見,各個 API 限制差異很大。

因此,需要透過重試設定進行多次嘗試。

# 重試設定  
RETRY_LIMIT = 10  
RETRY_DELAY = 300  
  
# 重試時執行的函數  
async def perform_request_with_retries(request_func, *args, **kwargs):  
    for attempt in range(RETRY_LIMIT):  
        try:  
            response = await request_func(*args, **kwargs)  # 等待非同步請求  
            if response:  
                return response  
        except ReadTimeout:  
            logger.warning(f"Attempt {attempt + 1} failed due to ReadTimeout.")  
        except Exception as e:  
            logger.error(f"Attempt {attempt + 1} failed: {e}")  
        await asyncio.sleep(RETRY_DELAY)  
    raise Exception("Failed to fetch more tweets after retries.")  

據說 API 限制會在 15 分鐘後重置,所以如果總共可以嘗試 50 分鐘,我想應該有足夠的時間緩衝了。不知不覺中,這部分卡住了我很久,如果我一直嘗試在極限邊緣,時間就會無限被消耗,所以我大幅提高了最大值。

圖片儲存

我將取得按讚內容的腳本與下載腳本分開了。

將在 xd.py 中儲存圖片。

如果保持預設設定,將無法以最高畫質儲存,因此需要為取得的 URL 添加 original 參數。

        while user_tweets:  
            for tweet in user_tweets:  
                for media in tweet.media:  
                    url = media['media_url_https']  
                    if url.endswith('.jpg'):  
                        url = url.replace('.jpg', '?format=jpg&name=orig')  
                    clean_url = get_clean_url(url)  
                    save_path = os.path.join(save_folder, f"{screen_name}_{clean_url.split('/')[-1]}.jpeg")  
                    await download_image(url, save_path)  

PNG 的畫質比較好,但可能只存在以 PNG 上傳的圖片?而且 PNG 檔案會佔用很多空間,所以我妥協使用了 JPG。

我會為每個取得的 ID 建立一個資料夾並儲存圖片,並且也會在圖片檔名中加入 ID,這是一個連日本人都會喜歡的細心設計。

目前我找不到其他類似的腳本,所以就公開了。話說回來,大家可能都是偷偷摸摸地做這種事,所以不太會公開吧...

順帶一提,fav.log 中有按讚的 URL,所以如果只想儲存按讚貼文的圖片,雖然需要另外操作,但還是可以做到的。這就是為什麼我將所有內容都放入 fav.log 的原因。

實際上,我曾想過將 fav.log 和抓取所有推文時的日誌分開,但已經累了,所以就到此為止吧。

那麼。

下次再見了。

Related Posts