如何不使用Google App Engine通过REST API异步在新版Hangout Chat发消息
无需Google App Engine,异步发送Hangouts Chat机器人消息的实现方案
嘿,我完全懂你不想被App Engine绑定的想法——其实咱们完全可以用Google Cloud的服务账号直接搞定认证,实现Hangouts Chat机器人的异步消息发送,根本不需要依赖App Engine。下面是一步步的具体方案和代码示例:
一、前期准备工作
- 先去Google Cloud控制台创建一个服务账号,给它分配
chat.bot权限(或者更精细的chat.messages.create权限,按需选择) - 下载服务账号的JSON密钥文件,把它存到你自己的服务器或者本地开发环境里
- 确保你的Hangouts Chat机器人已经在Google Cloud控制台配置完成,并且拿到目标聊天空间的ID(可以从空间设置里找到,格式是
spaces/XXX)
二、核心:用服务账号完成认证
不用App Engine的核心就是跳过它的默认认证,直接用服务账号生成OAuth2访问令牌来调用Hangouts Chat API。这里推荐用官方的客户端库来简化操作,避免手动处理令牌生成的复杂逻辑。
Python代码示例
首先安装依赖包:
pip install google-auth google-auth-httplib2 google-api-python-client
然后编写发送消息的代码:
import google.auth from google.oauth2 import service_account from googleapiclient.discovery import build # 替换成你的实际参数 SERVICE_ACCOUNT_KEY_PATH = 'path/to/your/service-account-key.json' TARGET_CHAT_SPACE = 'spaces/your-space-id-here' API_SCOPES = ['https://www.googleapis.com/auth/chat.bot'] def get_chat_api_service(): # 加载服务账号密钥并生成认证凭据 credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_KEY_PATH, scopes=API_SCOPES) # 构建Hangouts Chat API的服务实例 return build('chat', 'v1', credentials=credentials) def send_chat_message(message_content): chat_service = get_chat_api_service() # 构造消息体 message_payload = { 'text': message_content } # 调用API发送消息 response = chat_service.spaces().messages().create( parent=TARGET_CHAT_SPACE, body=message_payload ).execute() print(f"消息发送成功!消息ID: {response['name']}") # 测试一下 if __name__ == '__main__': send_chat_message("这是一条完全不依赖App Engine的异步测试消息😎")
三、实现真正的“异步”发送
上面的代码调用API是同步的,但如果要实现异步触发(比如后台任务完成后自动发消息),你可以把发送逻辑放到异步任务队列里,比如用Celery,或者Google Cloud Tasks(这个也是独立于App Engine的服务)。这样就能实现真正的异步消息发送,不用等API调用完成再继续执行其他逻辑。
四、关键注意事项
- 权限配置:一定要确保服务账号的角色包含
Chat Bot或者Chat Message Creator,不然会返回403 Permission Denied错误,我当初踩过这个坑,别重蹈覆辙! - 空间ID格式:必须是
spaces/xxxxxx的完整格式,不能只填后面的ID部分 - 密钥安全:服务账号的JSON密钥是敏感信息,绝对不能泄露到公共仓库或者客户端代码里
五、其他语言的实现思路
如果用Node.js或者Java,核心逻辑是一样的:
- 用对应语言的Google Auth库加载服务账号密钥
- 生成认证凭据后调用Hangouts Chat的
spaces.messages.createAPI
比如Node.js的极简示例:
const { google } = require('googleapis'); const serviceAccountKey = require('./your-service-account-key.json'); // 初始化认证 const authClient = new google.auth.JWT( serviceAccountKey.client_email, null, serviceAccountKey.private_key, ['https://www.googleapis.com/auth/chat.bot'], ); // 构建Chat API服务 const chatApi = google.chat({ version: 'v1', auth: authClient }); // 发送消息函数 async function sendChatMessage(text) { const response = await chatApi.spaces.messages.create({ parent: 'spaces/your-space-id', requestBody: { text } }); console.log('消息发送成功,ID:', response.data.name); } // 调用测试 sendChatMessage("Node.js也能不依赖App Engine发消息!");
内容的提问来源于stack exchange,提问作者Samriddha Banik
相关产品推荐
相关产品推荐

