Python twitterapiv2如何获取所有tweet的列表而不是流式传输

Python twitterapiv2如何获取所有tweet的列表而不是流式传输,python,twitter,twitterapi-python,Python,Twitter,Twitterapi Python,我是Twitter API的新手,我只是在用python测试它。以下是我正在使用的代码(我从Twitter的Github获得): 导入请求 导入操作系统 导入json def创建_头(承载_令牌): headers={“Authorization”:“Bearer{}.format(Bearer_token)} 返回标题 def get_规则(标头、承载_令牌): response=requests.get( "https://api.twitter.com/2/tweets/search/st

我是Twitter API的新手,我只是在用python测试它。以下是我正在使用的代码(我从Twitter的Github获得):

导入请求
导入操作系统
导入json
def创建_头(承载_令牌):
headers={“Authorization”:“Bearer{}.format(Bearer_token)}
返回标题
def get_规则(标头、承载_令牌):
response=requests.get(
"https://api.twitter.com/2/tweets/search/stream/rules,headers=headers
)
if response.status_代码!=200:
引发异常(
“无法获取规则(HTTP{}):{}”。格式(response.status_代码,response.text)
)
打印(json.dumps(response.json()))
返回response.json()
def delete_all_规则(标头、承载令牌、规则):
如果规则为无或“数据”不在规则中:
一无所获
ids=列表(映射(lambda规则:规则[“id”]、规则[“数据”]))
有效负载={“删除”:{“ids”:ids}
response=requests.post(
"https://api.twitter.com/2/tweets/search/stream/rules",
标题=标题,
json=有效负载
)
if response.status_代码!=200:
引发异常(
无法删除规则(HTTP{}):{}。格式(
response.status_代码,response.text
)
)
打印(json.dumps(response.json()))
def set_规则(标头、删除、承载_令牌):
#如果需要,您可以调整规则
示例规则=[
{“value”:“dog has:images”,“tag”:“dog pictures”},
{“value”:“cat has:images-grumpy”,“tag”:“cat pictures”},
]
有效负载={“添加”:示例_规则}
response=requests.post(
"https://api.twitter.com/2/tweets/search/stream/rules",
标题=标题,
json=有效载荷,
)
if response.status_代码!=201:
引发异常(
无法添加规则(HTTP{}):{}。格式(response.status_代码,response.text)
)
打印(json.dumps(response.json()))
def get_流(标头、集合、承载令牌):
response=requests.get(
"https://api.twitter.com/2/tweets/search/stream,headers=headers,stream=True,
)
打印(响应状态\ U代码)
if response.status_代码!=200:
引发异常(
无法获取流(HTTP{}):{}。格式(
response.status_代码,response.text
)
)
对于响应中的响应行。iter\u行()
如果响应_行:
json\u response=json.loads(response\u行)
to_be_parsed=json.dumps(json_响应,缩进=4,排序键=True)
a=json.load(待解析)
打印(a[“数据”][“文本”])
def main():
持票人令牌=“”
头=创建头(承载令牌)
规则=获取规则(头、承载令牌)
delete=删除所有规则(头、承载令牌、规则)
set=set_规则(头、删除、承载_令牌)
获取\u流(标头、集合、承载\u令牌)
如果名称=“\uuuuu main\uuuuuuuu”:
main()

我想使用我在情绪分析项目中得到的tweet,那么有没有什么方法可以根据某个关键字和某个时间范围获得tweet列表,而不是使用此代码获得的恒定流(有点像getoldtweets3库)?提前感谢您的帮助。

访问Twitter API有两种主要格式:

  • 实时(流媒体):这是你建立连接的地方,并持续监听之后发生的一切
  • 历史(RESTful):您可以在这里查询当前或过去发生的内容,然后停止查询
你对流式连接所做的是说,请向我提供从现在起发生的关于此模式/主题/查询的所有推文。它不允许你回顾过去

你所要求的是“从某个时间范围”向后看的能力。在twitterapiv1.1和twitterapiv2中,当前的选项是搜索与您的查询匹配的tweet。搜索API过去最多支持7天,因此您无法要求(比如)2019年1月至3月的所有推文。为此,您需要查看商业API,如full archive premium search。将来,v2可能会启用更大的历史范围

在今天的API v2中,您可以使用获取过去7天的推文。一些第三方Python API库现在也支持API v2


GetOldTweets库使用网络抓取来获取数据,这正式违反了Twitter的服务条款。最好使用官方API,这是一种受支持的访问方法。

不客气!如果您希望在特定的API问题上获得更多支持,Twitter API社区位于
import requests
import os
import json

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


def get_rules(headers, bearer_token):
    response = requests.get(
        "https://api.twitter.com/2/tweets/search/stream/rules", headers=headers
    )
    if response.status_code != 200:
        raise Exception(
            "Cannot get rules (HTTP {}): {}".format(response.status_code, response.text)
        )
    print(json.dumps(response.json()))
    return response.json()


def delete_all_rules(headers, bearer_token, rules):
    if rules is None or "data" not in rules:
        return None

    ids = list(map(lambda rule: rule["id"], rules["data"]))
    payload = {"delete": {"ids": ids}}
    response = requests.post(
        "https://api.twitter.com/2/tweets/search/stream/rules",
        headers=headers,
        json=payload
    )
    if response.status_code != 200:
        raise Exception(
            "Cannot delete rules (HTTP {}): {}".format(
                response.status_code, response.text
            )
        )
    print(json.dumps(response.json()))


def set_rules(headers, delete, bearer_token):
    # You can adjust the rules if needed
    sample_rules = [
        {"value": "dog has:images", "tag": "dog pictures"},
        {"value": "cat has:images -grumpy", "tag": "cat pictures"},
    ]
    payload = {"add": sample_rules}
    response = requests.post(
        "https://api.twitter.com/2/tweets/search/stream/rules",
        headers=headers,
        json=payload,
    )
    if response.status_code != 201:
        raise Exception(
            "Cannot add rules (HTTP {}): {}".format(response.status_code, response.text)
        )
    print(json.dumps(response.json()))


def get_stream(headers, set, bearer_token):
    response = requests.get(
        "https://api.twitter.com/2/tweets/search/stream", headers=headers, stream=True,
    )
    print(response.status_code)
    if response.status_code != 200:
        raise Exception(
            "Cannot get stream (HTTP {}): {}".format(
                response.status_code, response.text
            )
        )
    for response_line in response.iter_lines():
        if response_line:
            json_response = json.loads(response_line)
            to_be_parsed = json.dumps(json_response, indent=4, sort_keys=True)
            a = json.loads(to_be_parsed)
            print(a['data']['text'])


def main():
    bearer_token = '<BEARER_TOKEN>'
    headers = create_headers(bearer_token)
    rules = get_rules(headers, bearer_token)
    delete = delete_all_rules(headers, bearer_token, rules)
    set = set_rules(headers, delete, bearer_token)
    get_stream(headers, set, bearer_token)


if __name__ == "__main__":
    main()