如何在不使用 Google App Engine 的情况下在新的环聊聊天中以机器人(异步)的形式发布消息。我已经浏览了这些示例,但它们都使用 App Engine 进行身份验证,但我需要在不使用相同的情况下对其进行身份验证。
4 回答
下面是一个代码示例,它使用 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()
`
如果您的机器人实现是使用 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),
});
}
您需要执行以下一些步骤。
- 在console.developers.google.com中创建一个服务帐户并下载 JSON 格式的私钥
如果您在 python 中编码,请使用以下模块。
from oauth2client.service_account import ServiceAccountCredentials from googleapiclient.discovery import build, build_from_document from httplib2 import Http
下面的代码段将通过 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()
您需要一个可以发布代码的空间名称。您将从环聊聊天响应中得到相同的信息。
使用 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 的特定机器人更有用。但是,如果您可以向我们提供更多信息,我可以更好地修复我的答案来回答您的问题。