Скрипт для получения всех понравившихся постов в Twitter (X)
Здравствуйте, я бездарь. Я могу парсить Twitter с помощью неофициального API Twikit, но некоторое время назад в примерах кода стали рекомендовать асинхронность, и после обновления я обнаружил, что меня ругают за то, что я не использую асинхронность, поэтому я все исправил.
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.
Поскольку по умолчанию изображения не сохраняются в максимально возможном качестве, я добавляю параметр 'original' к полученному URL.
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 и лог получения всех твитов, но я уже устал, поэтому на этом закончу.
На этом все.
Буду рад дальнейшему сотрудничеству.