0

如何在不使用 Google App Engine 的情况下在新的环聊聊天中以机器人(异步)的形式发布消息。我已经浏览了这些示例,但它们都使用 App Engine 进行身份验证,但我需要在不使用相同的情况下对其进行身份验证。

4

4 回答 4

1

下面是一个代码示例,它使用 http 请求和来自 Google Hangout Chat 的 webhook 与 Python 脚本连接到聊天。Webhook 是使用服务帐户的唯一替代方法。更多信息在这里:https ://developers.google.com/hangouts/chat/how-tos/webhooks

`from httplib2 import Http
from json import dumps

#
# Hangouts Chat incoming webhook quickstart
#
def main():
    url = '<webhook url here>'
    bot_message = {
        'text' : 'text go here'}

    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()
`
于 2018-05-25T15:21:09.817 回答
1

如果您的机器人实现是使用 google app 脚本,请尝试使用 google 服务帐户来执行此操作,并且如此处所示异步消息示例

// Example bot for Hangouts Chat that demonstrates bot-initiated messages
// by spamming the user every minute.
//
// This bot makes use of the Apps Script OAuth2 library at:
//     https://github.com/googlesamples/apps-script-oauth2
//
// Follow the instructions there to add the library to your script.

// When added to a space, we store the space's ID in ScriptProperties.
function onAddToSpace(e) {
  PropertiesService.getScriptProperties()
      .setProperty(e.space.name, '');
  return {
    'text': 'Hi! I\'ll post a message here every minute. ' +
            'Please remove me after testing or I\'ll keep spamming you!'
  };
}

// When removed from a space, we remove the space's ID from ScriptProperties.
function onRemoveFromSpace(e) {
  PropertiesService.getScriptProperties()
      .deleteProperty(e.space.name);
}

// Add a trigger that invokes this function every minute via the
// "Edit > Current Project's Triggers" menu. When it runs, it will
// post in each space the bot was added to.
function onTrigger() {
  var spaceIds = PropertiesService.getScriptProperties()
      .getKeys();
  var message = { 'text': 'Hi! It\'s now ' + (new Date()) };
  for (var i = 0; i < spaceIds.length; ++i) {
    postMessage(spaceIds[i], message);
  }
}
var SCOPE = 'https://www.googleapis.com/auth/chat.bot';
// The values below are copied from the JSON file downloaded upon
// service account creation.
var SERVICE_ACCOUNT_PRIVATE_KEY = '-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n';
var SERVICE_ACCOUNT_EMAIL = 'service-account@project-id.iam.gserviceaccount.com';

// Posts a message into the given space ID via the API, using
// service account authentication.
function postMessage(spaceId, message) {
  var service = OAuth2.createService('chat')
      .setTokenUrl('https://accounts.google.com/o/oauth2/token')
      .setPrivateKey(SERVICE_ACCOUNT_PRIVATE_KEY)
      .setClientId(SERVICE_ACCOUNT_EMAIL)
      .setPropertyStore(PropertiesService.getUserProperties())
      .setScope(SCOPE);
  if (!service.hasAccess()) {
    Logger.log('Authentication error: %s', service.getLastError());
    return;
  }
  var url = 'https://chat.googleapis.com/v1/' + spaceId + '/messages';
  UrlFetchApp.fetch(url, {
    method: 'post',
    headers: { 'Authorization': 'Bearer ' + service.getAccessToken() },
    contentType: 'application/json',
    payload: JSON.stringify(message),
  });
}
于 2018-07-27T09:51:54.527 回答
0

您需要执行以下一些步骤。

  1. 在console.developers.google.com中创建一个服务帐户并下载 JSON 格式的私钥
  2. 如果您在 python 中编码,请使用以下模块。

    from oauth2client.service_account import ServiceAccountCredentials from googleapiclient.discovery import build, build_from_document from httplib2 import Http

  3. 下面的代码段将通过 chat.google 将消息发布给用户。

    scopes = ['https://www.googleapis.com/auth/chat.bot'] credentials = ServiceAccountCredentials.from_json_keyfile_name('/path/to/json', scopes) http = Http() credentials.authorize(http) chat = build('chat', 'v1', http=http) resp = chat.spaces().messages().create( parent=space, body={'text': 'HELLO WORLD'}).execute()

  4. 您需要一个可以发布代码的空间名称。您将从环聊聊天响应中得到相同的信息。

于 2018-04-17T05:28:59.070 回答
0

使用 JavaScript、python(可能更多)可以做到这一点。您可以在此处查看示例:https ://github.com/gsuitedevs/hangouts-chat-samples/tree/master/node/basic-cloud-functions-bot

如果您使用卡片和 JavaScript,我建议您在这里查看我的库:https ://github.com/BaReinhard/hangouts-card-helper

我还在为 JavaScript 创建另一个更关注异步的示例,应该提供更容易推理代码的示例。PR推送时会链接。

编辑:

我意识到您提到了 REST api。上面的答案对于可以访问@mentions 的特定机器人更有用。但是,如果您可以向我们提供更多信息,我可以更好地修复我的答案来回答您的问题。

于 2018-04-28T02:08:03.933 回答