使用 Twitter API 时,出于多种原因,你可能希望将响应有效负载传输到 Google 表格。Google 表格非常适合用于基础数据分析和快速分享结果。当你与来自不同背景的利益相关者一起工作时,这对于临时分析特别有用。在先前的博客帖子中,我们向你展示了如何使用推文公式来帮助你在 Google 表格工作簿中更动态地使用推文。这篇博客帖子将演示如何使用 Python 向 Twitter API v2 发出请求,并将响应发送到 Google 表格的电子表格。

设置

在使用 Twitter API v2之前,需要一个已批准的开发者账号。拥有已批准的开发者账号后,需要创建一个项目,并在该项目内部创建一个应用。要详细了解如何开始使用 Twitter API,请查看此博客帖子和文档的入门指南部分。 

 

在此代码示例中,你将使用 Python 3。还需要连接到 Google 云端硬盘 API。如果在设置过程中需要任何帮助,请务必查看此有用资源。

导入包

若要进行设置,请安装 pandasgspreadrequestsoauth2client。你将使用 pandas 将 JSON 有效负载响应从 Twitter API 转换为表格格式,使用 gspread 连接到 Google 表格,使用 requests 连接以向 Twitter API 发出 HTTP 请求,并使用 oauth2client 帮助通过服务账号身份验证身份。你还将导入 os,但无需先安装它,因为标准中已包含

      import pandas as pd
import gspread
import os
import requests

from oauth2client.service_account import ServiceAccountCredentials
    

为不记名令牌设置环境变量

为了连接到 Twitter API,必须首先向该 API 验证身份。可以使用应用的不记名令牌来执行此操作。在开发者门户内的“应用的密钥和令牌”部分中可以获取不记名令牌。为确保不会意外共享不记名令牌,可以设置环境变量。为此,请在终端内部运行以下命令,并确保使用你自己的令牌替换其中的 your-bearer-token。

      export BEARER_TOKEN='your-bearer-token'
    

在代码编辑器内部,创建一个名为 connect_to_twitter 的函数,你可以在其中获取不记名令牌并将传递到 HTTP 请求的标头返回到 Twitter API。

      def connect_to_twitter():
    bearer_token = os.environ.get('BEARER_TOKEN')
    return {"Authorization": "Bearer {}".format(bearer_token)}
    

向 Twitter API 发出请求

你将向推文查找端点发出请求,以获取与给定 ID 匹配的推文。默认情况下,此端点将仅返回包含推文 ID的 id 字段和包含推文文本的 text 字段。还可以将其他字段添加到返回的对象中。在下面的示例中,你需要指定要在 params 变量中包含 author_id、created_at 和 lang 字段。

接下来,创建一个名为 make_request 的函数,该函数传入刚创建的身份验证标头。现在,URL 将发出请求,以包含想要返回的字段以及希望获取其详细信息的推文的推文 ID。使用请求库,对 URL 变量发出 GET 请求,传入身份验证标头,并指定希望该请求返回 JSON 有效负载。

      def make_request(headers):
    url = "https://api.twitter.com/2/tweets"
    params = {
        "tweet.fields": "author_id,created_at,lang",
        "ids": "21,1293593516040269825,1334542969530183683",
    }
    return requests.request("GET", url, headers=headers, params=params).json()
    

解析 JSON 有效负载

返回的响应将在 JSON 有效负载内,如下所示。

      {"data":[{"created_at":"2006-03-21T20:51:43.000Z","author_id":"13","text":"just setting up my twttr","id":"21","lang":"en"},{"created_at":"2020-08-12T17:01:42.000Z","author_id":"2244994945","text":"It’s finally here! \uD83E\uDD41 Say hello to the new #TwitterAPI.\n\nWe’re rebuilding the Twitter API v2 from the ground up to better serve our developer community. And today’s launch is only the beginning.\n\nhttps://t.co/32VrwpGaJw https://t.co/KaFSbjWUA8","id":"1293593516040269825","lang":"en"},{"created_at":"2020-12-03T17:00:13.000Z","author_id":"783214","text":"2020 in one word","id":"1334542969530183683","lang":"en"}]}

    

你请求的推文的信息在名为 data 的对象中,但其格式并不完全适合电子表格。为了使其适合行和列,请创建一个名为 make_df 的函数,该函数会将 JSON 有效负载转换为 pandas 数据帧,其结构类似于电子表格,因为它们本质上都是表格。如果你正在使用扩展或端点(例如具有多个对象的近期搜索),则在准备转换对象之前,可能需要规范化 JSON。 

      def make_df(response):
    return pd.DataFrame(response["data"])
    

向 Google 表格 API 验证身份

你将使用服务账号连接到 Google 表格 API。服务账号是属于应用程序的账号,它们之间的从属关系在某种程度上类似于用户账号与产品进行交互的方式。若要向 Google 表格 API 验证身份,首先需要设置要使用的范围,并传入服务账号凭据信息。

      def authenticate_to_google():
    scope = [
        "https://spreadsheets.google.com/feeds"
    ]
    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        "/path/to/your/file.json", scope
    )
    return credentials
    

服务账号也有一个邮件地址。你需要更新要修改的电子表格的共享设置以包含服务账号,方式类似于通过在 Google 表格电子表格的共享设置中显示“添加人员或群组”的位置添加该邮件地址来更新同事或朋友。

联系起来

现在,创建一个 main 函数来调用我们到目前为止编写的所有函数。你需要创建一个名为 headers 的变量,在其中调用 connect_to_twitter 函数来设置身份验证标头。在变量响应中调用 make_request 函数并传入响应变量。在 df 变量中,为从 Twitter API 返回的 JSON 响应对象创建数据帧。接下来,保存一个名为 credentials 的变量,然后调用 authenticate_to_google 函数来设置服务账号凭据。下一步是创建一个名为 gc 的变量,用于授权你的凭据。 

 

通过使用电子表格密钥打开变量工作簿,可以在其中设置正在使用的电子表格的值。假设你有一个包含以下 URL 的 Google 表格电子表格。 

 

https://docs.google.com/spreadsheets/d/skosdo;gaetgiwoesofgkd45/edit

 

此示例的电子表格密钥为 skosdo;gaetgiwoesofgkd45。在下面的代码段中,你想要将 spreadsheet_id 替换为 skosdo;gaetgiwoesofgkd45


你还想要设置正在使用的工作表,例如本例中的工作表 Sheet1,也可以是电子表格中的任何工作表。你还需要指定要更新的单元格值或范围,在本示例中,你将从第一个单元格 A1 开始。最后,添加数据帧的值以使用 Twitter API 中的数据更新电子表格。 

      def main():
    headers = connect_to_twitter()
    response = make_request(headers)
    df = make_df(response)
    credentials = authenticate_to_google()
    gc = gspread.authorize(credentials)
    workbook = gc.open_by_key("spreadsheet_id")
    sheet = workbook.worksheet("Sheet1")
    sheet.update("A1", [df.columns.values.tolist()] + df.values.tolist())


if __name__ == "__main__":
    main()
    

 

你可以在我们的 GitHub 上查看完整版本的代码。将 Twitter API 中的数据发送到 Google 表格后,就可以使用 Google Script 扩展此代码示例。希望这篇博客帖子可以作为使用 Twitter 数据和 Google 表格 API 的起点。如果在此过程中遇到任何问题,请务必在论坛上告诉我们;如果本教程激发了你的创作灵感,请通过 @TwitterDev 与我们分享。