开发基于微信公众号的聊天机器人
分类: Azure机器人 ◆ 标签: #Azure Bot Framework SDK #Azure Bot Service #机器人 ◆ 发布于: 2023-08-07 23:16:24
要开发基于微信公众号的聊天机器人有特定的要求:你的公众号必须是非个人用户的公众号,否则大多数功能都是不可用的。
另外SDK本身没有实现基于微信的Adapter, 但是由官方在github上实现了这部分功能:https://github.com/microsoft/BotFramework-WeChat, 可惜的是由于同样的原因,微软官方也没有再维护这部分代码了,同样为了缓解这个问题,我将这部分代码fork到了我的库里,并且提升了代码,使得现在的代码完全可以适用于新的基于.Net 6以上版本的代码,我的代码库在这里:
https://github.com/hylinux/BotFramework-WeChat, 除了提升了原有的代码库之外,我还额外的弄了一个符合.Net 6的Sample:
https://github.com/hylinux/BotFramework-WeChat/tree/master/samples/csharp_dotnetcore/WeChatTestBot
要学习微信的开发以及在微信的Adapter上支持哪些功能,可以详细的参考这个Sample,另外新增了两个Adapter的实现:
WeChatAdapterWithErrorHandlerWeChatAdapterWithErrorAndTranscriptLoggerHandler
区别在于一个Adapter会存储Transcript到SQL Server, 另外一个不会,关于如何使用SQL Server作为外部的存储,可以参考文档:https://www.azuredeveloper.cn/article-save-status-into-database
另外通过类WeChatAdapterWithErrorHandlerExtensions提供了两个扩展方法:
AddWeChatAdapterWithErrorHandlerAddWeChatAdapterWithErrorAndTranscriptLoggerHandler
使得在项目中直接利用两个扩展方法就可以快速的将微信的Channel架设起来。例如:
builder.Services.AddSingleton<BotFrameworkAuthentication, ConfigurationBotFrameworkAuthentication>(); //builder.Services.AddSingleton<IStorage, MemoryStorage>(); var ConnectString = builder.Configuration["StoreConnectionString"]; var storage = new EntityFrameworkStorage(ConnectString); var TranscriptStorageLogger = new EntityFrameworkTranscriptStore(ConnectString); builder.Services.AddSingleton<IStorage>(storage); builder.Services.AddSingleton<UserState>(new UserState(storage)); builder.Services.AddSingleton<ConversationState>(new ConversationState(storage)); builder.Services.AddSingleton<ITranscriptStore>(TranscriptStorageLogger); builder.Services.AddWeChatAdapterWithErrorAndTranscriptLoggerHandler(builder.Configuration); builder.Services.AddSingleton<MainDialog>(); builder.Services.AddTransient<IBot, RichCardsBot>();
详情见项目WeChatTestBot\Program.cs文件的示例。
另外在开发微信项目时可以使用微信公开的测试账号:
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
用微信扫码后即可进入:

需要注意另外一个技术点,就是微信开发过程中,这个接口配置信息这里需要一个公共的url, 本地开发怎么样才能拥有一个公共的url?
解决方案就是下载一个ngrok.exe: https://ngrok.com/, 到这里下载注册,并根据文档设置好了后,打开命令行运行:
ngrok.exe http 5000
表示ngrok代理本地的http协议,装来自公网的外部请求到本地的5000端口,也就是你在本地启动的Asp.net Core的应用监听端口

这样你就有了一个公共的的URL了:
https://3a6b-180-162-73-9.jp.ngrok.io
启动你的bot, 配置接口信息然后提交就可以了。Token这里你可以随意定义一个字符串,只要你的应用配置和微信开发平台配置是一致就可以了。
那么你现在就可以开始根据Sample代码愉快的利用前面的知识开发自己的机器人了。