获取所有在 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