获取所有在 Twitter(X) 上点赞内容的脚本
大家好,我是无能。虽然可以使用名为 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 和获取所有推文时的日志分开,但我已经累了,所以就到此为止吧。
那么。
下次再见。