一、回覆圖文消息
表MessageReceive新增一條數據
INSERT INTO "MessageReceive" VALUES (4, 2, '圖片', 'https://pic.cnblogs.com/avatar/668465/20210318093258.png');
IMessageService定義回覆圖文的接口
/// <summary>
/// 處理文字消息,包括回覆圖片
/// </summary>
/// <param name="requestMessage"></param>
/// <returns></returns>
Task<IResponseMessageBase> OnReceiveDbRequestAsync(RequestMessageText requestMessage);
實現接口,按理說圖片和圖文應該是分開來的,這裏我僅僅是演示就直接把他們歸爲一類,實際肯定是要分開的。
public async Task<IResponseMessageBase> OnReceiveDbRequestAsync(RequestMessageText requestMessage)
{
var receives = await DbContext.Db.Queryable<MessageReceive>().ToListAsync();//獲取列表
var receive = receives.Where(it => it.KeyWords == requestMessage.Content).FirstOrDefault();//查找關鍵字是否存在
if (receive != null)
{
switch (receive.ReceiveType)
{
case ReceiveType.文字:
var responseText = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
responseText.Content = receive.ReceiveString;
return responseText;
case ReceiveType.圖片:
var responseImage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageNews>(requestMessage);
responseImage.Articles.Add(new Article()
{
Title = "歡迎",
Description = "這是一張圖片消息",
PicUrl = receive.ReceiveString,
Url = "https://www.cnblogs.com/huguodong/"
});
return responseImage;
default:
var responseOther = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
responseOther.Content = receive.ReceiveString;
return responseOther;
}
}
else
{
var responseMessage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
//如果關鍵字搜不到,列出關鍵字
var result = new StringBuilder();
result.AppendFormat("聽不懂你再說什麼,可以試試下面的關鍵字\r\n");
for (int i = 0; i < receives.Count; i++)
{
result.AppendFormat($"{i + 1}:{receives[i].KeyWords}\r\n");
}
responseMessage.Content = result.ToString();
return responseMessage;
}
}
修改CustomMessageHandler的OnTextRequestAsync
var result = await _messageService.OnReceiveDbRequestAsync(requestMessage);
發佈到服務器,查看效果,沒毛病
二、圖片消息處理與回覆
IMessageService定義接口
/// <summary>
/// 處理圖片
/// </summary>
/// <param name="requestMessage"></param>
/// <returns></returns>
Task<IResponseMessageBase> OnReceiveImageRequestAsync(RequestMessageImage requestMessage);
實現接口,這裏傳什麼圖片我就返回什麼圖片
public async Task<IResponseMessageBase> OnReceiveImageRequestAsync(RequestMessageImage requestMessage)
{
var responseImage = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageImage>(requestMessage);
responseImage.Image.MediaId = requestMessage.MediaId;
return responseImage;
}
CustomMessageHandler重寫OnImageRequestAsync方法
/// <summary>
/// 處理圖片
/// </summary>
/// <param name="requestMessage"></param>
/// <returns></returns>
public override async Task<IResponseMessageBase> OnImageRequestAsync(RequestMessageImage requestMessage)
{
var result = await _messageService.OnReceiveImageRequestAsync(requestMessage);
return result;
}
發佈到雲服務器,看看效果,沒毛病
三、語音消息的處理與回覆
首先去公衆號官網設置接口權限開通語音識別
IMessageService定義接口
/// <summary>
/// 處理語音消息
/// </summary>
/// <param name="requestMessage"></param>
/// <returns></returns>
Task<IResponseMessageBase> OnReceiveVoiceRequestAsync(RequestMessageVoice requestMessage);
實現接口
public async Task<IResponseMessageBase> OnReceiveVoiceRequestAsync(RequestMessageVoice requestMessage)
{
var recognition = requestMessage.Recognition;//文字識別結果
Console.WriteLine($"文字識別結果:{recognition}");
if (string.IsNullOrEmpty(recognition))
{
var responseText = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageText>(requestMessage);
responseText.Content = "抱歉,聽不清你在說啥!";
return responseText;
}
else
{
var responseVoice = ResponseMessageBase.CreateFromRequestMessage<ResponseMessageVoice>(requestMessage);
responseVoice.Voice.MediaId = requestMessage.MediaId;
return responseVoice;
}
}
CustomMessageHandler重寫OnVoiceRequestAsync
/// <summary>
/// 處理音頻
/// </summary>
/// <param name="requestMessage"></param>
/// <returns></returns>
public override async Task<IResponseMessageBase> OnVoiceRequestAsync(RequestMessageVoice requestMessage)
{
var result = await _messageService.OnReceiveVoiceRequestAsync(requestMessage);
return result;
}
上傳服務器,測試,沒毛病