2

我正在用 C# 编写一个使用 pub/sub 的环聊聊天机器人,这样我就可以将机器人托管在我们的防火墙一侧。除了卡片中的交互式按钮外,一切似乎都运行良好。如果我创建一个具有特定操作方法名称的按钮,机器人会收到带有相应操作方法名称的 CARD_CLICKED 消息。但是,Hangouts Chat 应用程序中的卡片似乎并不知道已发送响应,因为在 Hangouts Chat 应用程序最终显示“无法联系 Bot。稍后再试”之前,bot 最终收到了三遍 CARD_CLICKED 消息。我一直在为机器人使用来自 NuGet 的 Google.Apis.HangoutsChat.v1 和 Google.Cloud.PubSub.V1 包。

这是推测,但似乎问题可能是交互式按钮无法通过 pub/sub 正常工作。任何帮助,将不胜感激。

这是我拥有的代码片段:

SubscriptionName subscriptionName = new SubscriptionName(PROJECT_ID, SUBSCRIPTION_ID);
SubscriberServiceApiClient client = SubscriberServiceApiClient.Create();

GoogleCredential credential = GoogleCredential.FromFile(CREDENTIALS_PATH_ENV_PROPERTY).CreateScoped(HANGOUTS_CHAT_API_SCOPE);
HangoutsChatService chatService = new HangoutsChatService(new BaseClientService.Initializer
{
    ApplicationName = "My Bot",
    HttpClientInitializer = credential
});

while (true)
{
    PullResponse response = client.Pull(subscriptionName, false, 3, CallSettings.FromCallTiming(CallTiming.FromExpiration(Expiration.FromTimeout(TimeSpan.FromSeconds(90)))));

    if ((response.ReceivedMessages == null) || (response.ReceivedMessages.Count == 0))
        Console.WriteLine("Pulled no messages.");
    else
    {
        foreach (ReceivedMessage message in response.ReceivedMessages)
        {
            try
            {
                byte[] jsonBytes = message.Message.Data.ToByteArray();
                JObject json = JObject.Parse(Encoding.UTF8.GetString(jsonBytes));

                string messageType = (string)json["type"];
                switch (messageType)
                {
                    case "MESSAGE":
                    {
                        // Get text
                        string messageText = (string)json["message"]["text"];
                        Console.WriteLine($"[{messageType}] {messageText}");

                        // Send response
                        string spaceName = (string)json["space"]["name"];
                        SpacesResource.MessagesResource.CreateRequest request = chatService.Spaces.Messages.Create(new Message
                        {
                            Cards = new[]
                            {
                                new Card
                                {
                                    Header = new CardHeader
                                    {
                                        Title = "Message Received!"
                                    },
                                    Sections = new[]
                                    {
                                        new Section
                                        {
                                            Widgets = new[]
                                            {
                                                new WidgetMarkup
                                                {
                                                    Buttons = new[]
                                                    {
                                                        new Button
                                                        {
                                                            TextButton = new TextButton
                                                            {
                                                                Text = "Click Me!",
                                                                OnClick = new OnClick
                                                                {
                                                                    Action = new FormAction
                                                                    {
                                                                        ActionMethodName = "ClickedAction"
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            },
                            Thread = new Thread
                            {
                                Name = (string)json["message"]["thread"]["name"]
                            }
                        }, spaceName);
                        Message responseMsg = request.Execute();

                        break;
                    }
                    case "CARD_CLICKED":
                    {
                        string actionMethodName = (string)json["action"]["actionMethodName"];
                        Console.WriteLine($"[{messageType}] {actionMethodName} at {((DateTime)json["message"]["createTime"]).ToString()}");

                        // Send response
                        string spaceName = (string)json["space"]["name"];
                        SpacesResource.MessagesResource.CreateRequest request = chatService.Spaces.Messages.Create(new Message
                        {
                            ActionResponse = new ActionResponse
                            {
                                Type = "UPDATE_MESSAGE"
                            },
                            Text = $"You clicked on '{actionMethodName}'.",
                            Thread = new Thread
                            {
                                Name = (string)json["message"]["thread"]["name"]
                            }
                        }, spaceName);
                        Message responseMsg = request.Execute();

                        break;
                    }
                    default:
                    {
                        Console.WriteLine($"[{messageType}]");
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error parsing message: {ex}");
            }
        }

        // Acknowledge the message so we don't see it again.
        string[] ackIds = new string[response.ReceivedMessages.Count];
        for (int i = 0; i < response.ReceivedMessages.Count; ++i)
            ackIds[i] = response.ReceivedMessages[i].AckId;
        client.Acknowledge(subscriptionName, ackIds);
    }
}
4

1 回答 1

0

使用带有 Hangouts Chat API 的按钮需要自定义答案,包括:

{
    'thread': {
        'name': thread_id
    },
    'actionResponse': {
        'type': 'UPDATE_MESSAGE'
    }
}

我建议使用带有机器人 URL 的 Hangouts Chat API。

于 2018-11-21T15:34:40.970 回答