1
resposta

ERRO 400 invalid paramenters

Estou obtendo o seguinte problema quando envio a requisição para a API:

400
Traceback (most recent call last):
  File "recent_search.py", line 63, in <module>
    main()
  File "recent_search.py", line 58, in main
    for json_response in paginate(url, headers):
  File "recent_search.py", line 49, in paginate
    data = connect_to_endpoint(full_url, headers)
  File "recent_search.py", line 40, in connect_to_endpoint
    raise Exception(response.status_code, response.text)
Exception: (400, '{"errors":[{"parameters":{"start_time":["2021-02-15T00:00Z"]},"message":"Invalid \'start_time\':\'2021-02-15T00:00Z\'. \'start_time\' must be on or after 2021-08-06T17:14Z"},{"parameters":{"end_time":["2021-02-19T00:00Z"]},"message":"Invalid \'end_time\':\'2021-02-19T00:00Z\'. \'end_time\' must be on or after 2021-08-06T17:14Z"}],"title":"Invalid Request","detail":"One or more parameters to your request was invalid.","type":"https://api.twitter.com/2/problems/invalid-request"}')

Código do recent_search.py

import requests
import os
import json

# To set your enviornment variables in your terminal run the following line:
# export 'BEARER_TOKEN'='<your_bearer_token>'


def auth():
    return os.environ.get("BEARER_TOKEN")


def create_url():
    query = "AluraOnline"
    # Tweet fields are adjustable.
    # Options include:
    # attachments, author_id, context_annotations,
    # conversation_id, created_at, entities, geo, id,
    # in_reply_to_user_id, lang, non_public_metrics, organic_metrics,
    # possibly_sensitive, promoted_metrics, public_metrics, referenced_tweets,
    # source, text, and withheld
    tweet_fields = "tweet.fields=author_id,conversation_id,created_at,id,in_reply_to_user_id,public_metrics,text"
    user_fields = "expansions=author_id&user.fields=id,name,username,created_at"
    filters = "start_time=2021-02-15T00:00:00Z&end_time=2021-02-19T00:00:00Z"
    url = "https://api.twitter.com/2/tweets/search/recent?query={}&{}&{}&{}".format(
        query, tweet_fields, user_fields, filters
    )
    return url


def create_headers(bearer_token):
    headers = {"Authorization": "Bearer {}".format(bearer_token)}
    return headers


def connect_to_endpoint(url, headers):
    response = requests.request("GET", url, headers=headers)
    print(response.status_code)
    if response.status_code != 200:
        raise Exception(response.status_code, response.text)
    return response.json()


def paginate(url, headers, next_token=""):
    if next_token:
        full_url = f"{url}&next_token={next_token}"
    else:
        full_url = url
    data = connect_to_endpoint(full_url, headers)
    yield data
    if "next_token" in data.get("meta", {}):
        yield from paginate(url, headers, data['meta']['next_token'])

def main():
    bearer_token = auth()
    url = create_url()
    headers = create_headers(bearer_token)
    for json_response in paginate(url, headers):
        print(json.dumps(json_response, indent=4, sort_keys=True))


if __name__ == "__main__":
    main()
1 resposta

Olá, Bruno! Tudo bem com você?

Primeiramente gostaria de pedir desculpas pela demora em dar um retorno.

Conforme o professor comenta nessa aula em 04:53, nos é permitido pedir os tweets de até 7 dias atrás relativo ao dia atual. Por exemplo, se eu estivesse fazendo o código hoje (2021/12/02) minha requisição teria que ser:

filters = "start_time=2021-11-26T00:00:00.00Z&end_time=2021-12-02T00:00:00.00Z"

Tente fazer essa alteração no seu código alterando para 7 dias atrás do seu respectivo dia. Caso ainda não solucione seu problema, peço que entre novamente em contato por aqui para sermos mais assertivos na resposta.

Espero ter ajudado, mas se ainda persistir alguma dúvida estou sempre à disposição.

:)

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