chatgpt 网页版不稳定,必须配合梯子使用,用起来体验很不好。我在想能不能做个微信版chatgpt来打造一个私人AI助理,考虑到有封号的风险这个方案放弃了。最终使用公众号来实现。
因为公众号本身就提供了开放接口,即便是个人号也支持一些简单的对话功能,用来做基于聊天的场景非常适合。
开发前的准备
- openai账号
- 微信公众号
- 域名
- 服务器
申请 OpenAI KEY
首先你要有个chatgpt(OpenAI)的账号,才能接入chatgpt,还不知道怎么注册的请参考文章ChatGPT保姆级注册教程。注册成功后,申请一个API KEY,地址:https://platform.openai.com/account/api-keys。
注册微信公众号
打开网址 https://mp.weixin.qq.com/cgi-bin/registermidpage?action=index&lang=zh_CN&token=, 直接选订阅号,如果你是企业,可以考虑注册服务号,服务号开放的接口更丰富。
成为开发者
在公众号后台的【设置与开发】基本配置,申请成为开发者,申请成功后,会分配一个AppID和AppSecret。这两个配置项在项目中会用到,所以要记下来。 IP白名单就是你的服务器IP。
填写服务器配置
在公众号后台的【设置与开发】基本配置中填上接口配置信息。URL必须是一个域名地址,所以你需要先把项目部署后这一步才能提交成功,所以这一步也可以放在后面
微信服务器配置校验
项目是基于Flask开发的,我只贴核心代码,下面接口是提供给微信平台调用的,用来给微信校验消息的真实性
@wechat_bp.get('/wechat')
@siwa.doc(query=SignatureDto, resp=ResponseSuccessDto, group="wechat")
def signature_validate(query: SignatureDto):
"""
微信服务器校验
"""
try:
token = current_app.config.get("WECHAT_TOKEN") # 这里的TOKEN就是在微信后台自己配置的Token
return check_signature(token, query.signature, query.timestamp, query.nonce)
except InvalidSignatureException:
raise WechatError(msg="invalid signature")
处理用户的问题的核心代码
@wechat_bp.post("/wechat")
def handler_wx_msg():
"""
处理微信事件
"""
msg = parse_message(request.data)
openid = request.args.get("openid")
current_app.logger.info("openid:%s", openid)
if isinstance(msg, (SubscribeScanEvent, ScanEvent)):
# 关注或扫二维码
result = TextReply(content="欢迎使用志军的私人AI助理,请直接输入问题,技术支持:lzjun567", message=msg).render()
elif isinstance(msg, TextMessage):
question = msg.content
if question != "继续":
current_app.logger.info(f"问题:{question}")
s = threading.Thread(target=set_answer, args=(openid, question))
s.start()
time.sleep(2)
answer = cache.pop(openid)
if not answer:
answer = "我正在思考中,请稍后回复【继续】获取回答"
else:
answer = cache.pop(openid)
if not answer:
answer = "请稍后,还没准备好参考答案"
result = TextReply(content=answer, message=msg).render()
else:
result = TextReply(content="欢迎使用志军的私人AI助理", message=msg).render()
return result
核心代码非常简单,注意我这里使用了一个线程去异步处理用户的消息,因为openai处理问题有时候需要3秒甚至更长时间,而公众号的会话必须在3秒内进行响应,所以我这里会把没有及时返回的答案放到redis中,等用户回复【继续】的时候给它返回结果。
因为项目是一个基于Flask的web项目,我直接部署在centos服务器上。用supervisor来管理进程,web server 使用gunicorn。都是Web开发中常规的技术。
部署之后,可以来体验一下了。
完整代码可在公众号【Python之禅】回复 “chatgpt" 获取。任何技术问题可添加我的微信 lzjun567 咨询。
关注公众号「Python之禅」,回复「1024」免费获取Python资源