【问题标题】:How to send a message to google hangouts with python?如何使用 python 向 Google Hangouts 发送消息?
【发布时间】:2021-11-04 17:04:30
【问题描述】:

我正在尝试为谷歌环聊创建一个简单的“聊天机器人”,在聊天中发送常规消息。我找到了this documentation,但我发现它非常复杂。

它包含一个“完整示例”,但我不确定如何找到现有 google 环聊聊天的“空间”ID。这无处解释。如何找到现有 Google 聊天的“空间”ID?

此外:是否有简单 (!!!) 文档在某处如何简单地将消息发布到现有聊天?

【问题讨论】:

  • 以编程方式,还是根本没有?
  • 以编程方式,即使用 python 脚本。它应该定期运行(cronjob)以向聊天发送信息
  • 为什么需要空间ID?机器人应该能够直接在发送消息/ping 的房间中进行响应,而无需指定空间 ID
  • 我引用的页面示例中需要空间ID。
  • 另外,机器人不应该“响应”。 “机器人”只应该发送消息。只发消息,不接收,不响应

标签: google-api hangouts-chat


【解决方案1】:

答案:

您可以使用 spaces.list 获取机器人所属的空间列表,然后使用 spaces.get 获取有关空间的更多信息,或者设置特定于房间的 Webhook。

附加信息:

  • 要在没有响应触发器的情况下向房间发送消息,您必须使用 service account
  • 可以在here 找到机器人启动的消息文档。

重要提示: 如果您有 Google Workspace 帐户,则只能使用 Google Hangouts Chat API - 它不能单独与 Gmail 一起使用。第二种解决方案使用 Webhook,需要访问 https://chat.google.com,这仅适用于 Google Workspace 域。不幸的是,这根本不可能使用消费者@gmail.com 帐户。

使用环聊聊天 API:

设置服务帐户as per Step 1 on this page 后,您可以从 Google Cloud Project UI 下载服务帐户的凭据,方法是点击服务帐户名称右侧的 按钮,然后按照Create key 按钮并选择 JSON 作为密钥类型。 请务必妥善保存此文件,因为此密钥只有一份副本。

下载此 JSON 文件后,您可以在 python 代码中使用它作为设置服务对象时的凭据:

from httplib2 import Http
from oauth2client.service_account import ServiceAccountCredentials
from apiclient.discovery import build

scopes = 'https://www.googleapis.com/auth/chat.bot'
credentials = ServiceAccountCredentials.from_json_keyfile_name(
    'credentials.json', scopes)

chat_service = build('chat', 'v1', http=credentials.authorize(Http()))

要发出spaces.list 请求,您可以使用这个新建的chat_service,并从响应中提取空格列表:

def extract(n):
    return n['name']

spaces_list = chat_service.spaces().list().execute()
all_spaces = map(extract, spaces_list['spaces'])

然后您可以使用这些空格之一从 python 程序发送消息:

response = chat_service.spaces().messages().create(
    parent=all_spaces[0],
    body={'text': 'Test message'}).execute()
print(response)

要记住的事情:

  • 确保在https://console.cloud.google.com 为您的项目启用了 Hangouts Chat API
  • 启用后,请确保为机器人配置了名称、徽标和说明。
  • 还必须设置机器人的连接设置;方法不是那么重要;例如,您可以选择 Apps Script project 并输入空部署项目的部署 ID。

使用网络钩子:

您可以代替直接使用 API,而是为特定聊天设置 webhook,并使用硬编码的 URL,从外部脚本向房间发送消息。

完整的步骤已在this page 上列出,但我也会在这里完成。

通过https://chat.google.com转到您要向其发送消息的房间,然后从房间名称旁边的下拉菜单中选择Manage Webhooks

输入机器人的名称和可选头像,然后按SAVE。这将为您提供一个 webhook URL 以在您的 python 脚本中使用。

在本地,确保您的环境中安装了httplib2,并将以下脚本复制到新的.py 文件中:

from json import dumps
from httplib2 import Http

def main():
    """Hangouts Chat incoming webhook quickstart."""
    url = 'webhook-url'
    bot_message = {
        'text' : 'Hello from a Python script!'}

    message_headers = {'Content-Type': 'application/json; charset=UTF-8'}

    http_obj = Http()

    response = http_obj.request(
        uri=url,
        method='POST',
        headers=message_headers,
        body=dumps(bot_message),
    )

    print(response)

if __name__ == '__main__':
    main()

确保将webhook-url 字符串替换为上一步中聊天 UI 中提供的 webhook。

现在您可以保存文件并运行它 - 这会自动向上述聊天空间发送一条消息:

参考资料:

【讨论】:

  • 如何拨打spaces.list?我只使用requests 吗?或者是其他东西?不幸的是,没有给出如何以编程方式进行操作的示例,而且我不是谷歌 API 专家......
  • 此外,当我在执行pip install apiclient 之后尝试创建其中一个示例时,我收到错误ModuleNotFoundError: No module named 'apiclient.discovery'。也许我确实安装了错误的apiclient?谷歌文档页面上没有任何内容。
  • @Alex 通过向https://chat.googleapis.com/v1/spaces 发出 HTTP GET 请求来进行 spaces.list 调用。您不需要只提供您的身份验证凭据的请求正文。另请查看传入 webhook 指南here,因为这可能更适合您的需求。
  • 我的身份验证凭据是什么?我在哪里可以找到它们?你能提供这样一个 GET 调用的完整示例吗?
  • @SwapnilPandit 我建议提出一个新问题来解决这个问题:)
【解决方案2】:

看到这个API,很有趣: https://pypi.org/project/hangups/

有一些项目使用了 Hangups,其中就是 HangupsBot: https://github.com/xmikos/hangupsbot

【讨论】:

  • 感谢这个包,但它似乎不起作用。我无法登录Login failed (Failed to find form '#gaia_loginform' in page)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多