Quiero cargar tweets desde el punto final de Twitter API 2.0 e intentar obtener los campos estándar (autor, texto, ...) y algún campo de expansión, esp. user.fields. La definición de punto final y parámetros funciona sin errores. En el json resultante, encuentro solo los campos estándar, pero no los campos de usuario requeridos (nombre de usuario, métricas).

Fragmento de código de ejemplo:

from datetime import datetime, timedelta
import requests
import json
import pandas as pd

# read bearer token for authentication
with open('bearer_token.txt') as fp:
    BEARER_TOKEN = fp.read()

query_string = '("TSLA") (lang:en)'
    
# setup the API request
endpoint = 'https://api.twitter.com/2/tweets/search/recent'
headers = {'authorization': f'Bearer {BEARER_TOKEN}'}
params = {
    'query': query_string,
    'max_results': '100',
    'tweet.fields': 'created_at,lang,text,author_id,public_metrics',
    # that doesn't work
    'user.fields': 'name,username,public_metrics'
    #'expansions': 'attachments.media_keys'
}

response = requests.get(endpoint,
                            params=params,
                            headers=headers)  # send the request

print(json.dumps(response.json(), indent=3, sort_keys=True))

El json resultante muestra esto (donde faltan los campos de usuario: nombre, nombre de usuario, public_metrics):

    {
   "data": [
      {
         "author_id": "33286321",
         "created_at": "2021-03-13T16:25:02.000Z",
         "id": "1370772902769999874",
         "lang": "en",
         "public_metrics": {
            "like_count": 0,
            "quote_count": 0,
            "reply_count": 0,
            "retweet_count": 0
         },
         "text": "Try our Option Swing Trading service built for individuals who want to trade around their full-time careers. Take a free 10-day trail No Credit Card  $AAPL $TSLA $FB $MSFT"
      },
      {
         "author_id": "1142453041364385794",
         "created_at": "2021-03-13T16:24:41.000Z",
         "id": "1370772813469130756",
         "lang": "en",
         "public_metrics": {
            "like_count": 0,
            "quote_count": 0,
            "reply_count": 0,
            "retweet_count": 28
         },
         "text": "RT @Stalingrad_Poor: With bitcoin trading at $60k, TSLA has now made more money on its bitcoin investment and selling regulatory credits th\u2026"
      },
      {
         "author_id": "1349496824650989568",
         "created_at": "2021-03-13T16:24:35.000Z",
         "id": "1370772791411245056",
         "lang": "en",
         "public_metrics": {
            "like_count": 0,
            "quote_count": 0,
            "reply_count": 0,
            "retweet_count": 3
         },
         "text": "RT @VolaarRide: $OZSC By teaming up with the GEMM Network, we can now provide our customers with additional services such as Project Financ\u2026"
      },

Pregunta : ¿Qué tengo que hacer para obtener esta información en mi respuesta?

1
Dirk Nötzel 13 mar. 2021 a las 19:34

2 respuestas

La mejor respuesta

Aquí el código ajustado debido a la respuesta de @Patriot.

from datetime import datetime, timedelta
import requests
import json
import pandas as pd

# read bearer token for authentication
with open('bearer_token.txt') as fp:
    BEARER_TOKEN = fp.read()

query_string = '("TSLA") (lang:en)'
    
# setup the API request
endpoint = 'https://api.twitter.com/2/tweets/search/recent'
headers = {'authorization': f'Bearer {BEARER_TOKEN}'}
params = {
    'query': query_string,
    'max_results': '100',
    'expansions': 'author_id',
    'tweet.fields': 'created_at,lang,text,author_id,public_metrics',
    'user.fields': 'name,username,public_metrics'
}

response = requests.get(endpoint,
                            params=params,
                            headers=headers)  # send the request

print(json.dumps(response.json(), indent=3, sort_keys=True))
0
Dirk Nötzel 14 mar. 2021 a las 11:06