Twitter API v2:当参数具有 start_time、end_time 时响应失败

Daf*_*der 6 twitter python-3.x twitterapi-python

一直在玩 Twitter API。事情进展顺利,直到我添加了开始和结束时间以及搜索的粒度。我相当有信心字符串值是正确的,按照 Twitter api 文档,并正确添加到参数中。但是我的参数做错了,有人可以帮助我吗?

有效的代码,IE 会产生 200 响应和推文:

keywords = 'telsa'
api, query = 'https://api.twitter.com/2', '/tweets/search/recent'
request = f'{api}{query}'
params = {'query': keywords,
          'tweet.fields': 'created_at,lang', # no space before lang
          'max_results': '10'}
header = {'authorization':f'Bearer {bearer_token}'}

response = requests.get(request, headers=header, params=params)
if response: # boolean True if response is 200,
    print(response.response.json())
else:
    print(response)
    print(params)
Run Code Online (Sandbox Code Playgroud)

不起作用的代码:400 响应:添加 start_time、end_time、粒度

<snip>
header = {'authorization':f'Bearer {bearer_token}'}

**************** NEW CODE **************************
# Get datetime for now and 7 days ago, correctly formatted for Twitter API
dtformat = '%Y-%m-%dT%H:%M:%SZ'
from datetime import datetime, timedelta
time = datetime.now()
start_time = time - timedelta(days=7)

# convert to strings
start_time, end_time = start_time.strftime(dtformat), time.strftime(dtformat)

# Add new parameters to params dict
params['start_time'] = start_time
params['end_time']  = end_time
params['granularity'] = 'HOUR'
****************************************************

response = requests.get(request, headers=header, params=params)
<snip>
Run Code Online (Sandbox Code Playgroud)

..以及最后打印的参数:

params: {'query': 'telsa', 'tweet.fields': 'created_at,lang', 'max_results': '10', 'start_time': '2021-03-14T14:14:44Z', 'end_time': '2021-03-21T14:14:44Z', 'granularity': 'HOUR'}
Run Code Online (Sandbox Code Playgroud)

Twitter API 文档显示了 start_time、end_time 示例值。它们的格式相同。
最近发布的使用 API v2 的教程以相同的方式附加新参数。
添加 3 个新时间变量的任意组合都会导致 400 响应。
Windows 10、64(如果有的话)

fda*_*bhi 6

我想你会收到这个错误。

Twitter API 使用 UTC 时间,该时间可能早于或晚于您的当地时间。

尝试从此改变

# Get datetime for now and 7 days ago, correctly formatted for Twitter API
dtformat = '%Y-%m-%dT%H:%M:%SZ'
from datetime import datetime, timedelta
time = datetime.now()
start_time = time - timedelta(days=7)

# convert to strings
start_time, end_time = start_time.strftime(dtformat), time.strftime(dtformat)
Run Code Online (Sandbox Code Playgroud)

对此

# Get datetime for now and 7 days ago, correctly formatted for Twitter API
dtformat = '%Y-%m-%dT%H:%M:%SZ'
from datetime import datetime, timedelta
# time = datetime.now() gives you the local time whereas time = datetime.utcnow() 
# gives the local time in UTC. Hence now() may be ahead or behind which gives the 
# error

time = datetime.utcnow()
start_time = time - timedelta(days=7)

# Subtracting 15 seconds because api needs end_time must be a minimum of 10 
# seconds prior to the request time
end_time = time - timedelta(seconds=15)

# convert to strings
start_time, end_time = start_time.strftime(dtformat), 
end_time.strftime(dtformat)
Run Code Online (Sandbox Code Playgroud)


Kla*_*iak 0

不确定这是否有帮助,但我收到了以下 URL 的良好响应(我也在使用不记名令牌)并传递了 start_time、end_time 和粒度:

url_link = "https://api.twitter.com/2/tweets/counts/recent?query=(%23ethereum OR %23eth)&granularity=day&start_time=2021-11-23T00:00:00Z&end_time=2021-11-23T23:59:59Z"

def connect_to_endpoint(url, params):
     response = requests.get(url, auth=bearer_oauth, params=params)
     print(response.status_code)
     if response.status_code != 200:
           raise Exception(response.status_code, response.text)
     return response.json(
def main():
     json_response = connect_to_endpoint(url_link, {})
     print(json.dumps(json_response, indent=4, sort_keys=True))
Run Code Online (Sandbox Code Playgroud)

收到回复:200