Thiết lập trò chuyện của Google
Kết nối Đại lý Hermes với Google Chat dưới dạng bot. Việc tích hợp sử dụng Cloud Pub/Sub kéo đăng ký cho các sự kiện gửi đến và API trò chuyện REST cho các tin nhắn gửi đi. Công thái học tương đương với Chế độ ổ cắm Slack hoặc bỏ phiếu dài trên Telegram: chiếc Hermes của bạn quá trình không cần URL công khai, đường hầm hoặc chứng chỉ TLS. Nó kết nối, xác thực và lắng nghe khi đăng ký - giống như cách bot Telegram lắng nghe trên một mã thông báo.
Google Chat là một phần của Google Workspace. Bạn có thể sử dụng sự tích hợp này với một
Không gian làm việc cá nhân (@yourdomain.com được đăng ký thông qua Google) hoặc một công việc
Không gian làm việc nơi bạn có quyền Quản trị viên để xuất bản ứng dụng. Tài khoản chỉ dành cho Gmail
không thể lưu trữ ứng dụng Trò chuyện.
Tổng quan
| Component | Value |
|---|---|
| Libraries | google-cloud-pubsub, google-api-python-client, google-auth |
| Inbound transport | Cloud Pub/Sub pull subscription (no public endpoint) |
| Outbound transport | Chat REST API (chat.googleapis.com) |
| Authentication | Service Account JSON with roles/pubsub.subscriber on the subscription |
| User identification | Chat resource names (users/{id}) + email |
Bước 1: Tạo hoặc chọn dự án GCP
Bạn cần có dự án Google Cloud để lưu trữ chủ đề Pub/Sub. Nếu bạn không có một cái, tạo nó tại console.cloud.google.com — tài khoản cá nhân nhận được cấp độ miễn phí dễ dàng đáp ứng lưu lượng truy cập bot.
Lưu ý ID dự án (ví dụ: my-chat-bot-123). Bạn sẽ sử dụng nó trong mọi lần tiếp theo
bước.
Bước 2: Kích hoạt hai API
Trong bảng điều khiển, đi tới APIs & Services → Library và bật:
- API trò chuyện của Google
- Cloud Pub/Sub API
Cả hai đều miễn phí đối với khối lượng mà bot cá nhân tạo ra.
Bước 3: Tạo tài khoản dịch vụ
IAM & Quản trị viên → Tài khoản dịch vụ → Tạo tài khoản dịch vụ.
- Tên:
hermes-chat-bot - Bỏ qua bước "Cấp quyền truy cập tài khoản dịch vụ này vào dự án". IAM trên cụ thể đăng ký là tất cả những gì bạn cần - KHÔNG cấp vai trò Pub/Sub cấp dự án.
Sau khi tạo, hãy mở SA, đi tới Keys → Add Key → Create new key → JSON và
tải xuống tập tin. Hãy lưu nó ở nơi mà chỉ Hermes mới có thể đọc được (ví dụ:
~/.hermes/google-chat-sa.json, chmod 600).
Một lỗi phổ biến là tìm kiếm vai trò IAM dành riêng cho Trò chuyện và cấp vai trò đó theo cấp dự án. Vai trò đó không tồn tại. Quyền của bot trò chuyện xuất phát từ việc được cài đặt trong không gian chứ không phải từ IAM. Tất cả nhu cầu SA của bạn là đăng ký Pub/Sub trên đăng ký bạn tạo ở bước tiếp theo.
Bước 4: Tạo chủ đề Pub/Sub và đăng ký
Pub/Sub → Chủ đề → Tạo chủ đề.
- ID chủ đề:
hermes-chat-event - Để mặc định cho mọi thứ khác.
Sau khi tạo, trang chi tiết của chủ đề có tab Đăng ký. Tạo một:
- ID đăng ký:
hermes-chat-events-sub - Kiểu giao hàng: Kéo
- Lưu giữ tin nhắn: 7 ngày (để tồn đọng vẫn tồn tại sau khi khởi động lại Hermes)
- Các phần còn lại để mặc định.
Bước 5: IAM ràng buộc về chủ đề (quan trọng)
Trên chủ đề (không phải đăng ký), hãy thêm tiền gốc IAM:
- Hiệu trưởng:
chat-api-push@system.gserviceaccount.com - Vai trò:
Nhà xuất bản Pub/Sub
Nếu không có điều này, Google Chat không thể xuất bản các sự kiện theo chủ đề của bạn và bot của bạn sẽ không bao giờ nhận được bất cứ điều gì.
Bước 6: IAM ràng buộc đăng ký
Trên đăng ký, thêm Tài khoản dịch vụ của riêng bạn làm tài khoản chính:
- Hiệu trưởng:
hermes-chat-bot@<your-project>.iam.gserviceaccount.com - Vai trò:
Người đăng ký Pub/Sub
Đồng thời cấp Pub/Sub Viewer trên cùng một đăng ký - Hermes gọi
subscription.get() khi khởi động để kiểm tra khả năng tiếp cận.
Bước 7: Cấu hình ứng dụng Chat
Đi tới API và dịch vụ → API Google Chat → Cấu hình.
- Tên ứng dụng: bất cứ điều gì bạn muốn người dùng nhìn thấy ("Hermes" là hợp lý).
- URL hình đại diện: mọi PNG công khai (Google có một số giá trị mặc định).
- Mô tả: một câu ngắn hiển thị trong thư mục ứng dụng.
- Chức năng: bật Nhận tin nhắn 1:1 và Tham gia không gian và nhóm cuộc trò chuyện.
- Cài đặt kết nối: chọn Cloud Pub/Sub, nhập tên chủ đề
dự án/<your-project>/topics/hermes-chat-events. - Chế độ hiển thị: giới hạn ở không gian làm việc của bạn (hoặc người dùng cụ thể) — không xuất bản cho mọi người trong khi bạn đang kiểm tra.
Cứu.
Bước 8: Cài đặt bot vào không gian thử nghiệm
Mở Google Trò chuyện trong trình duyệt. Bắt đầu DM với ứng dụng của bạn bằng cách tìm kiếm tên của nó
trong menu + Trò chuyện mới. Lần đầu tiên bạn nhắn tin, Google sẽ gửi một
Sự kiện ADDED_TO_SPACE mà Hermes sử dụng để lưu vào bộ nhớ đệm người dùng/{id} của bot cho
tự lọc tin nhắn.
Bước 9: Cấu hình Hermes
Thêm phần Google Chat vào ~/.hermes/.env:
# Required
GOOGLE_CHAT_PROJECT_ID=my-chat-bot-123
GOOGLE_CHAT_SUBSCRIPTION_NAME=projects/my-chat-bot-123/subscriptions/hermes-chat-events-sub
GOOGLE_CHAT_SERVICE_ACCOUNT_JSON=/home/you/.hermes/google-chat-sa.json
# Authorization — paste the emails of people allowed to talk to the bot
GOOGLE_CHAT_ALLOWED_USERS=you@yourdomain.com,coworker@yourdomain.com
# Tùy chọn
GOOGLE_CHAT_HOME_CHANNEL=dấu cách/AAAA... # đích phân phối mặc định cho công việc định kỳ
GOOGLE_CHAT_MAX_MESSAGES=1 # Pub/Sub FlowControl; 1 tuần tự hóa các lệnh mỗi phiên
GOOGLE_CHAT_MAX_BYTES=16777216 # 16 MiB — giới hạn byte tin nhắn trên chuyến bay
ID dự án cũng quay trở lại GOOGLE_CLOUD_PROJECT và đường dẫn SA rơi xuống
quay lại GOOGLE_APPLICATION_CREDENTIALS — sử dụng bất kỳ quy ước nào bạn thích.
Cài đặt các phần phụ thuộc mà bộ điều hợp Google Chat cần (hiện chưa có phần bổ sung nào của Hermes được xuất bản - cài đặt chúng trực tiếp):
pip install google-cloud-pubsub google-api-python-client google-auth google-auth-oauthlib
Bắt đầu cổng:
hermes gateway
Bạn sẽ thấy một dòng nhật ký như:
[GoogleChat] Connected; project=my-chat-bot-123, subscription=<redacted>,
bot_user_id=users/XXXX, flow_control(msgs=1, bytes=16777216)
Gửi "hola" trong DM thử nghiệm. Bot đăng một điểm đánh dấu "Hermes đang suy nghĩ...", sau đó chỉnh sửa tin nhắn tương tự bằng phản hồi thực sự — không có "tin nhắn đã bị xóa" bia mộ.
Định dạng và khả năng
Google Chat hiển thị một tập hợp con giảm giá có giới hạn:
| Supported | Not supported |
|---|---|
*bold*, _italic_, ~strike~, `code` | Headings, lists |
| Inline images via URL | Interactive Card v2 buttons (v1 of this gateway) |
Native file attachments (after /setup-files — see Step 10) | Native voice notes / circular video notes |
Lời nhắc hệ thống của tổng đài viên bao gồm gợi ý dành riêng cho Google Chat để họ biết những điều này giới hạn và tránh định dạng không hiển thị.
Giới hạn kích thước tin nhắn: 4000 ký tự mỗi tin nhắn. Phản hồi của tác nhân dài hơn là tự động chia thành nhiều tin nhắn.
Hỗ trợ chủ đề: khi người dùng trả lời bên trong một chủ đề, Hermes sẽ phát hiện
thread.name và đăng câu trả lời của nó trong cùng một chủ đề, vì vậy mỗi chủ đề sẽ có một
phiên Hermes riêng biệt.
Bước 10: Phân phối tệp đính kèm gốc (tùy chọn)
Ngay lập tức, bot có thể đăng văn bản, hình ảnh nội tuyến qua URL và thẻ tải xuống cho âm thanh/video/tài liệu. Để gửi tệp đính kèm trò chuyện gốc — giống nhau tiện ích tệp bạn nhận được khi con người kéo và thả tệp - mỗi người dùng ủy quyền bot một lần thông qua luồng OAuth cho mỗi người dùng.
Tại sao lại có một luồng riêng biệt
Xác thực tài khoản dịch vụ từ chối cứng điểm cuối media.upload của Google Chat:
Phương pháp này không hỗ trợ xác thực ứng dụng bằng tài khoản dịch vụ. Xác thực bằng tài khoản người dùng.
Không có vai trò hoặc phạm vi IAM nào khắc phục được vấn đề này. Điểm cuối chỉ chấp nhận người dùng thông tin xác thực. Vì vậy, bot phải hoạt động với tư cách là người dùng bất cứ khi nào nó tải tệp lên — cụ thể là người dùng đã yêu cầu tệp.
Thiết lập máy chủ một lần
- Đi tới API & Dịch vụ → Thông tin xác thực trong cùng một dự án GCP.
- Tạo thông tin đăng nhập → ID ứng dụng khách OAuth → Ứng dụng dành cho máy tính để bàn.
- Tải xuống JSON. Di chuyển nó vào máy chủ chạy Hermes.
- Trên máy chủ, đăng ký máy khách với Hermes:
python -m gateway.platforms.google_chat_user_oauth \
--client-secret /path/to/client_secret.json
Nó ghi ~/.hermes/google_chat_user_client_secret.json. Điều này được chia sẻ
cơ sở hạ tầng — nó xác định OAuth ứng dụng chứ không phải bất kỳ người dùng cá nhân nào. một
tập tin trên mỗi máy chủ là đủ cho dù sau này có bao nhiêu người dùng ủy quyền.
Ủy quyền cho mỗi người dùng (trong trò chuyện)
Mỗi người dùng chạy luồng một lần, trong DM của riêng họ bằng bot:
- Họ gửi
/setup-filestới bot. Nó trả lời với trạng thái và tiếp theo bước. - Họ gửi
/setup-files start. Bot trả lời bằng URL OAuth. - Họ mở URL, nhấp vào Cho phép và xem trình duyệt không tải được
http://localhost:1/?...&code=.... Thất bại đó được mong đợi — auth mã nằm trong thanh URL. - Họ sao chép URL bị lỗi (hoặc chỉ giá trị
code=...) và dán lại vào trò chuyện dưới dạng/setup-files <PASTED_URL>. Bot trao đổi nó lấy một làm mới mã thông báo.
Mã thông báo sẽ đến ~/.hermes/google_chat_user_tokens/<sanitized_email>.json.
Các yêu cầu tệp tiếp theo trong DM của người dùng đó sử dụng mã thông báo của họ, vì vậy bot
tải lên khi họ và tin nhắn sẽ đến không gian của họ.
Để thu hồi sau: /setup-files revoke chỉ xóa mã thông báo của người dùng đó. Khác
mã thông báo của người dùng không bị ảnh hưởng.
###Phạm vi
Luồng yêu cầu chính xác một phạm vi: chat.messages.create. Điều đó bao gồm cả
media.upload và messages.create tham chiếu đến nội dung đã tải lên
Tham chiếu dữ liệu tệp đính kèm. Không có Drive, không có phạm vi Trò chuyện rộng hơn — đây là đặc quyền tối thiểu
có mục đích.
Hành vi của nhiều người dùng
Khi người hỏi chưa có mã thông báo cho mỗi người dùng, bot sẽ quay trở lại trạng thái cũ
mã thông báo một người dùng tại ~/.hermes/google_chat_user_token.json (nếu có từ
cài đặt trước nhiều người dùng). Khi không có sẵn, bot sẽ đăng một thông báo rõ ràng
thông báo văn bản yêu cầu người hỏi chạy /setup-files.
Người dùng thu hồi chỉ xóa vị trí của riêng họ. 401/403 từ mã thông báo của một người dùng chỉ xóa bộ nhớ cache của người dùng đó. Người dùng không làm phiền lẫn nhau.
Khắc phục sự cố
Bot giữ im lặng sau khi gửi "hola."
- Kiểm tra đăng ký Pub/Sub có tin nhắn chưa được gửi trong bảng điều khiển hay không.
Nếu đúng như vậy thì Hermes chưa được xác thực — hãy xác minh
GOOGLE_CHAT_SERVICE_ACCOUNT_JSONvà SA được liệt kê làNgười đăng ký Pub/Subtrên đăng ký. - Nếu đăng ký không có tin nhắn thì Google Chat sẽ không xuất bản.
Kiểm tra kỹ liên kết IAM trên chủ đề:
chat-api-push@system.gserviceaccount.comphải cóNhà xuất bản Pub/Sub. - Kiểm tra nhật ký
hermes Gatewayđể tìm[GoogleChat] Đã kết nối. Nếu bạn thấy[GoogleChat] Xác thực cấu hình không thành công, thông báo lỗi sẽ cho bạn biết điều gì env var để khắc phục.
Bot trả lời nhưng thông báo lỗi xuất hiện thay vì câu trả lời của tổng đài viên.
Kiểm tra nhật ký để biết [GoogleChat] Luồng Pub/Sub đã chết — nếu những điều này lặp lại, SA của bạn
thông tin xác thực có thể đã được luân chuyển hoặc đăng ký đã bị xóa. Sau 10 lần thử
bộ chuyển đổi tự đánh dấu là gây tử vong.
"403 Bị cấm" trên mọi tin nhắn gửi đi.
Bot đã bị xóa khỏi không gian hoặc bạn đã thu hồi nó trong bảng điều khiển Chat API.
Cài đặt lại nó trong không gian (sự kiện ADDED_TO_SPACE tiếp theo sẽ kích hoạt lại
nhắn tin tự động).
Quá nhiều cảnh báo "Tỷ lệ đạt giới hạn".
Hạn ngạch mặc định của Chat API cho phép 60 tin nhắn trên mỗi không gian mỗi phút. Nếu bạn tác nhân tạo ra các phản hồi phát trực tuyến dài vượt quá mức đó, bộ điều hợp sẽ thử lại với độ trễ theo cấp số nhân — nhưng bạn vẫn sẽ thấy độ trễ mà người dùng có thể nhìn thấy. Hãy xem xét phản hồi ngắn gọn hoặc tăng hạn ngạch trong bảng điều khiển GCP.
Bot liên tục đăng thông báo "/setup-files" thay vì các tập tin.
Người hỏi không có mã thông báo OAuth cho mỗi người dùng và không có dự phòng cũ. Chạy
/setup-files trong DM của họ và làm theo Bước 10. Sau khi trao đổi hoàn tất
yêu cầu tệp tiếp theo được tải lên nguyên bản mà không cần khởi động lại cổng.
/setup-files start cho biết "Không có thông tin xác thực ứng dụng khách nào được lưu trữ trên máy chủ."
Việc thiết lập máy chủ một lần chưa được thực hiện. Từ một thiết bị đầu cuối trên máy chủ chạy Hermes:
python -m gateway.platforms.google_chat_user_oauth \
--client-secret /path/to/client_secret.json
Sau đó gửi lại /setup-files start.
/setup-files <PASTED_URL> cho biết "Trao đổi mã thông báo không thành công."
Mã xác thực chỉ sử dụng một lần và tồn tại trong thời gian ngắn (thường là vài phút). Gửi
/setup-files start để nhận URL mới và thử lại.
Ghi chú bảo mật
- Phạm vi tài khoản dịch vụ: bộ điều hợp yêu cầu phạm vi
chat.botvàpubsub. IAM phải là cơ quan thực thi thực tế — cấp SA của bạn ở mức tối thiểu (roles/pubsub.subscriber+roles/pubsub.viewertrên gói đăng ký), không phải Vai trò Pub/Sub cấp dự án hoặc cấp tổ chức. - Bảo vệ tải xuống tệp đính kèm: Hermes sẽ chỉ đính kèm người mang SA
mã thông báo tới các URL có máy chủ khớp với danh sách ngắn cho phép của các miền do Google sở hữu
(
googleapis.com,drive.google.com,lh[3-6].googleusercontent.comvà một số khác). Bất kỳ máy chủ nào khác đều bị từ chối trước yêu cầu HTTP, để bảo vệ chống lại các tình huống SSRF trong đó một sự kiện được tạo ra có thể chuyển hướng mã thông báo mang đến dịch vụ siêu dữ liệu GCE. - Xử lý: Email tài khoản dịch vụ, đường dẫn đăng ký và đường dẫn chủ đề
bị
agent/redact.pyloại bỏ khỏi đầu ra nhật ký. Kết xuất phong bì gỡ lỗi (GOOGLE_CHAT_DEBUG_RAW=1) định tuyến thông qua cùng một bộ lọc biên tập và nhật ký ở cấp độ DEBUG. - Tuân thủ: nếu bạn định kết nối bot này với không gian làm việc được quản lý (bất cứ điều gì có chính sách lưu trữ dữ liệu hoặc quản lý AI), hãy nhận được sự chấp thuận đó trước lần cài đặt đầu tiên.
- Phạm vi OAuth của người dùng: chỉ yêu cầu luồng tệp đính kèm cho mỗi người dùng
chat.messages.create— mức tối thiểu bao gồmmedia.uploadcộng với tiếp theomessages.create. Mã thông báo được duy trì dưới dạng JSON đơn giản tại~/.hermes/google_chat_user_tokens/<sanitized_email>.json(hệ thống tập tin quyền là sự bảo vệ - mô hình tương tự như tệp khóa SA). Mỗi mã thông báo được sở hữu bởi chính xác một người dùng; thu hồi nằm trong phạm vi của người dùng đó.