Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Bug] Projeto Pessoal - AutoPost Twitter/X

Estou tendo um problema para tratar o código de erro 400. Alguém pode me ajudar com isso? a ideia eh que quando encontre esse erro ele pule o post enao que fique tentando novamente varias vezes

import tweepy
import time
import random
from datetime import datetime
import chavesDeAcesso
from criadores.criadores import obter_lista_tweets

api = chavesDeAcesso.antigo
idTwitter = 'Antigo'

# --Crie uma cópia da lista de tweets para não modificar a original
tweets_disponiveis = obter_lista_tweets()

tErro = 60

while True:
    # --Verifique se todos os tweets foram publicados
    if not tweets_disponiveis:
        # --Se todos foram publicados, faça uma nova cópia da lista original
        tweets_disponiveis = obter_lista_tweets()

    # --Escolha o próximo tweet da lista
    # --Remove e retorna o primeiro tweet da lista
    tweet = tweets_disponiveis.pop(0)

    try:
        # --Obter a hora atual do sistema
        hora_atual = datetime.now().time()
        # --Obter intervalo para postagem
        intervalo = 60 * random.randint(20, 40)
        print(f".........................Tentando publicar.......................\n\n.................................twitter {idTwitter}.................................\n", tweet)
        # --Faz o tweet
        api.create_tweet(text=tweet)
        print(f"\n.........................Tweet Publicado as {hora_atual}.....................\n")

        # --Faz a troca da chave de acesso do twitter
        if api == chavesDeAcesso.novo:
            api = chavesDeAcesso.antigo
            idTwitter = 'Antigo'
        else:
            api = chavesDeAcesso.novo
            idTwitter = 'Novo'

        print(f"Intervalo até próxima postagem é de {int(intervalo / 60)} min")
        time.sleep(intervalo)

    except tweepy.TooManyRequests as e:
        if api == chavesDeAcesso.novo:
            api = chavesDeAcesso.antigo
            idTwitter = 'Antigo'
        else:
            api = chavesDeAcesso.novo
            idTwitter = 'Novo'
        error_code = e.response.status_code
        error_message = e.response.text
        print(f"\nCódigo de erro HTTP: {error_code}")
        print(f"Mensagem de erro: {error_message}")
        print('----------------------------------------------------------------------------------------------\n')
        if error_code == 400:
            print("Erro 400: Solicitação inválida.")
            print(tweet)
            time.sleep(tErro)
        else:       
            time.sleep(tErro)
            tweets_disponiveis.insert(0, tweet)  # Volta o tweet para a lista

    except tweepy.errors.TweepyException as e:
        if "Connection aborted" in str(e):
            print("Conexão abortada. Tentando reconectar...")
            print('----------------------------------------------------------------------------------------------\n')
            time.sleep(tErro)
            continue  # Reinicia o loop após a reconexão
        elif e.response is not None:
            error_code = e.response.status_code
            error_message = e.response.text
            print(f"\nCódigo de erro HTTP: {error_code}")
            print(f"Mensagem de erro: {error_message}")
            print('----------------------------------------------------------------------------------------------\n')
        else:
            print("\nErro desconhecido")
        time.sleep(tErro)
        tweets_disponiveis.insert(0, tweet)  # Volta o tweet para a lista

    except ConnectionError as ce:
        print(f"\nErro de conexão: {str(ce)}")
        print('----------------------------------------------------------------------------------------------\n')
        time.sleep(tErro)
        tweets_disponiveis.insert(0, tweet)  # Volta o tweet para a lista

    except (ConnectionError, tweepy.TweepyException) as ce:
        print(f"\nErro de conexão: {str(ce)}")
        print('----------------------------------------------------------------------------------------------\n')
        time.sleep(tErro)
        tweets_disponiveis.insert(0, tweet)  # Volta o tweet para a lista

    except Exception as e:
        print(f"\nOcorreu um erro inesperado: {str(e)}\n")
        print('----------------------------------------------------------------------------------------------\n')
        time.sleep(tErro)
        tweets_disponiveis.insert(0, tweet)  # Volta o tweet para a lista
4 respostas

Olá João! Como vai?

No trecho do seu código que trata os erros, você já tem uma verificação para o erro 400 dentro do bloco except tweepy.TooManyRequests as e, mas parece que o código está configurado para pausar por um tempo e depois tentar novamente.

Para resolver isso, você pode simplesmente remover a linha que reinsere o tweet na lista quando o erro 400 é capturado. Isso fará com que o tweet que causou o erro 400 seja descartado e não, seja tentado novamente. Aqui está como você pode ajustar seu código:

except tweepy.TooManyRequests as e:
    if api == chavesDeAcesso.novo:
        api = chavesDeAcesso.antigo
        idTwitter = 'Antigo'
    else:
        api = chavesDeAcesso.novo
        idTwitter = 'Novo'
    error_code = e.response.status_code
    error_message = e.response.text
    print(f"\nCódigo de erro HTTP: {error_code}")
    print(f"Mensagem de erro: {error_message}")
    print('----------------------------------------------------------------------------------------------\n')
    if error_code == 400:
        print("Erro 400: Solicitação inválida.")
        print(tweet)
        time.sleep(tErro)
        # Não reinsira o tweet na lista
    else:       
        time.sleep(tErro)
        tweets_disponiveis.insert(0, tweet)  # Volta o tweet para a lista se o erro não for 400

Com essa mudança, quando o erro 400 ocorrer, o tweet não será reinserido na lista e o programa continuará com o próximo tweet disponível após o intervalo de tempo definido.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

obrigado retirei do meu código o trecho indicado irei implementar ele e volto para dizer se resolveu

 else:       
            time.sleep(tErro)
            tweets_disponiveis.insert(0, tweet)  # Volta o tweet para a lista

Ao remover a linha de código, agora ate mesmo quando há o erro 429 ele remove o post da lista. Queria que ele só removesse os posts quando o erro fosse 400. Aparentemente ele não esta nem entrando no "if" referente ao erro 400 já que ele retorna "Código de erro HTTP: 400 (O texto aqui era pra ser, "Erro 400: Solicitação inválida.") Mensagem de erro: {"errors":[{"parameters":{"text":[" ... "]},"message":"Your Tweet textwitter/twitter-text."}],"title":"Invalid Request","detail":"One or more parameters "

solução!

Encontrei o problema

except tweepy.TooManyRequests as e:
        error_code = e.response.status_code
        error_message = e.response.text
        if troca == False:  # Bloco para verificar se ja houve tentativa de postagem em ambos twitters.
            if api == chavesDeAcesso.novo:
                api = chavesDeAcesso.antigo
                idTwitter = 'Antigo'
                print('Trocando para twitter Antigo')
                time.sleep(tErro/2)
            else:
                api = chavesDeAcesso.novo
                idTwitter = 'Novo'
                print('Trocando para Twitter Novo')
            troca = True 
        else:
            tweets_disponiveis.insert(0, tweet)  # Volta o tweet para a lista
            print(f"\nCódigo de erro HTTP: {error_code}")
            print(f"Mensagem de erro: {error_message}")
            print('\nTentando republicar em 3 horas\n----------------------------------------------------------------------------------------------\n')
            troca = False
            time.sleep(3*3600)

    `except tweepy.errors.TweepyException` as e:
        error_code = e.response.status_code
        error_message = e.response.text
        if "Connection aborted" in str(e):
            print("Conexão abortada. Tentando reconectar...")
            print('----------------------------------------------------------------------------------------------\n')
            time.sleep(tErro)
            continue  # Reinicia o loop após a reconexão
        elif error_code == 400:
            print("Erro 400: Solicitação inválida.")
            print(tweet)
            print('teste')
            time.sleep(tErro)
            continue  # Reinicia o loop após a reconexão
        elif e.response is not None:
            print(f"\nCódigo de erro HTTP: {error_code}")
            print(f"Mensagem de erro: {error_message}")
            print('----------------------------------------------------------------------------------------------\n')
        else:
            print("\nErro desconhecido")
        time.sleep(tErro)
        tweets_disponiveis.insert(0, tweet)  # Volta o tweet para a lista

O tratamento do erro 400 estava sendo feito no bloco errado, estava sendo feito em except tweepy.TooManyRequests enquanto deveria ter sido feito except tweepy.errors.TweepyException. Após alguns ajustes o código funciona perfeitamente