Скрипт для получения всех понравившихся постов в Twitter (X)

5 min

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

Здравствуйте, я бездарь. Я могу парсить 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 и лог получения всех твитов, но я уже устал, поэтому на этом закончу.

На этом все.

Буду рад дальнейшему сотрудничеству.

Related Posts