Script para obter todas as curtidas no Twitter (X)
Olá, sou o Incompetente. Consigo fazer scraping do Twitter usando uma API não oficial chamada Twikit, mas há algum tempo os exemplos de código começaram a recomendar assincronicidade. Depois de uma atualização, percebi que estava sendo 'repreendido' por não usar assincronicidade, então corrigi tudo.
haturatu/xd_likes
Dessa forma, os dados são armazenados inicialmente em all_tweets.
Depois de obter o valor máximo especificado,
todos os conteúdos dos tweets em all_tweets são recuperados.
Como tudo isso é gravado em fav.log, você pode extrair todas as informações com grep, se necessário.
Limites da API
https://github.com/d60/twikit/blob/main/ratelimits.md
Como pode ser visto, os limites da API variam bastante.
Por isso, foi necessário tentar várias vezes com as configurações de nova tentativa.
# Configurações de nova tentativa
RETRY_LIMIT = 10
RETRY_DELAY = 300
# Função a ser executada em caso de nova tentativa
async def perform_request_with_retries(request_func, *args, **kwargs):
for attempt in range(RETRY_LIMIT):
try:
response = await request_func(*args, **kwargs) # Aguarda a requisição assíncrona
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.")
Os limites da API parecem ser redefinidos a cada 15 minutos, então, se pudermos tentar por um total de 50 minutos, acho que teremos tempo de sobra. Esta parte foi um grande obstáculo; tentar otimizar ao máximo consumiu uma quantidade infinita de tempo, então aumentei o valor máximo drasticamente.
Salvamento de Imagens
Separei o script que obtém os 'curtidas' do script que faz o download.
O salvamento de imagens é feito em xd.py.
Se mantiver o padrão, não será possível salvar na mais alta qualidade, então adiciono o parâmetro 'original' ao URL obtido.
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)
A qualidade do PNG é melhor, mas provavelmente só existem imagens enviadas como PNG? Além disso, PNGs consomem bastante espaço, então optei por JPG.
Crio pastas separadas para cada ID a ser obtido e salvo as imagens lá, e também atribuo um ID às imagens, uma especificação detalhada que até os japoneses apreciariam.
Atualmente, não encontrei nenhum outro script semelhante, então decidi publicá-lo. Ou talvez seja porque a maioria das pessoas faz isso discretamente e não tende a publicar...
A propósito, como fav.log contém os URLs das curtidas, se você quiser salvar apenas as imagens das postagens que curtiu, precisará fazer isso separadamente, mas é possível. É por isso que estou colocando tudo em fav.log.
Na verdade, pensei que seria melhor separar os logs de fav.log dos logs de quando todos os tweets são buscados, mas estou cansado, então vou parar por aqui.
Até mais.
Espero vê-lo novamente.