chatgpt的接口现在都可以正常用了,但是怎么把这个功能放在手机上随用随开呢?

  • 微信个人聊天版本
  • 小程序版本
  • 公众号版本
  • 企业微信版本
    • 逻辑
    • 实现方式

微信个人聊天版本

网上很多微信机器人版本的,但是原理是网页版微信,很多账号都不能登陆网页版微信,然后还随时面临着24小时封禁的风险,不是很靠谱。

小程序版本

小程序版本,使用uniapp做的小程序,然后上线了一阵,后来被封禁了,就是如下的感觉。

封禁原因是接口被封

想要强制使用的话,就是云服务开个云函数,然后做个接口请求转发,也可以正常用,小程序审核过程尽量避免chatgpt样式的文字,可以改成对话机器人什么的,要不然容易审核不通过。

公众号版本

小程序弄完了,感觉每次还要下滑找小程序,进小程序,跳转界面什么的,不是很方便,于是我又开始研究公众号版本。
公众号可以接收个人发送的消息,然后通过接口回复消息,这样就可以用chatGPT来就行回复了。
大概效果是这样:

我这个是挂载到阿里云的云函数里面,代码如下:

from flask import Flask,make_response
from flask import request
import xml.etree.ElementTree as ET
import hashlib
import requests
import json
import time
import reREQUEST_ID_HEADER = 'x-fc-request-id'app = Flask(__name__)
# openai的key
openaikey = 'sk-s5S5BoVMLTUyVtEVL'
# 微信公众号的appid
appid= "wx518c64",
# 微信公众号的secret
secret= "e68a9550"@app.route('/robot', methods=['GET','POST'])def wechat_tuling():if request.method == 'GET':print(request)my_signature = request.args.get('signature', '')  # 获取携带 signature微信加密签名的参数my_timestamp = request.args.get('timestamp', '')  # 获取携带随机数timestamp的参my_nonce = request.args.get('nonce', '')   # 获取携带时间戳nonce的参数my_echostr = request.args.get('echostr', '')  # 获取携带随机字符串echostr的参数token = 'xytx'# 这里输入你要在微信公众号里面填的token,保持一致data = [token, my_timestamp, my_nonce]data.sort()# 进行字典排序temp = ''.join(data)# 拼接成字符串mysignature = hashlib.sha1(temp.encode('utf-8')).hexdigest()# # 判断请求来源,将三个参数字符串拼接成一个字符串进行sha1加密,记得转换为utf-8格式if my_signature == mysignature:# 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信return make_response(my_echostr)else:return ''if request.method == 'POST':print(request)print(request.data)try:return ''finally:xml = ET.fromstring(request.data)print('XML',xml)# 获取用户发送的原始数据# fromstring()就是解析xml的函数,然后通过标签进行find(),即可得到标记内的内容。fromUser = xml.find('FromUserName').texttoUser = xml.find('ToUserName').textmsgType = xml.find("MsgType").text# 获取向服务器发送的消息createTime = xml.find("CreateTime")content = xml.find('Content').textprint(content)xml_sta = '<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>'# 定义返回的xml数据结构,这里指的是文本消息,更多请参考微信公众号开发者文档print(xml_sta)if msgType == 'text':# 判断消息类型,如果返回的字段是text,则是文字print('接收到的text')tuling_reply = reply(fromUser,content)print('openai begin')# 调用api回复赋值给xml里面的content,这里定义为tuling_replyres = make_response(xml_sta % (fromUser, toUser, str(int(time.time())), tuling_reply))# 微信公众号做出响应,自动回复的格式如上print(res)res.content_type = 'application/xml'# 定义回复的类型为xmlprint('res',res)return res# 输出自动回复else:# 如果输入非文字的则会提示下面这句话return '我还只会文字,请等我慢慢成长,谢谢!'def reply(user,info):print('进入接口')# 调用apiapi = 'https://api.openai.com/v1/completions'# 请求api接口的网址data = {"prompt": info, "max_tokens": 2048, "model": "text-davinci-003"}headers = {'content-type': 'application/json', 'Authorization': 'Bearer '+openaikey}# 请求的数据(这里只有对话的,可以添加url或者其他,有问题查看官方文档)print('合成数据',headers)jsondata = json.dumps(data)print('json化字典data',jsondata)# 根据官方文档,需要把利用json.dumps()方法把字典转化成json格式字符串try:response = requests.post(api, data=jsondata, headers=headers,timeout=None)print('开始请求')# 发起post请求robot_res = json.loads(response.content)print('返回结果',robot_res)# 把json格式的数据再转化成Python数据输出,注意编码为utf-8 格式robot_reply = robot_res['choices'][0]['text']print(robot_reply)postsend(user,robot_reply)return robot_replyexcept:return '服务接口缓慢请稍后重试'def get_token():"""获取微信的access_token:return:返回access_token"""url = "https://api.weixin.qq.com/cgi-bin/token"params = {"grant_type": "client_credential","appid":appid,"secret":secret}a =  requests.get(url=url, params=params).json().get("access_token")print('aaaaaaaaaaaaaa',a)return a def postsend(fromUser,cont):token=get_token()params = {"access_token": token}data = {"touser": fromUser,"msgtype": "text","text": {"content": cont}}print(data)kf = requests.post("https://api.weixin.qq.com/cgi-bin/message/custom/send", params=params,data=bytes(json.dumps(data, ensure_ascii=False), encoding='utf-8'),  headers = {"Content-type": "application/json", "charset": "UTF-8"})print(kf.text)return kfif __name__ == '__main__':app.run(host='0.0.0.0',port=9000)

函数代码部署后,在这里有公网访问地址:

拿到的地址,放在微信公众号的配置界面

然后启用就可以了
目前存在的问题就是,有的时候会推送多次,你问一个问题,但是微信公众号的后台会给你接口推送好几次,没空解决这个,举一反三也没啥事,有能力的自己维护改改bug吧。

但是这个微信公众号有的时候,会被订阅号折叠进去,找着使用的也很费劲,所以我又拿企业微信应用下手了

企业微信版本

大概的效果:

企业微信版本和公众号版本差不多,但是操作的东西需要的多一些

逻辑

逻辑就是企业微信接收到消息,然后解析成数据,然后发送给chatgpt,然后调用接口返回给企业微信

实现方式

首先阿里云函数部署接收企业微信推送消息的代码,然后再把chatGPT返回的消息发送到腾讯云云计算服务上,再通过腾讯云计算服务把结果返回到企业微信,企业微信推送到个人微信。

听着是不是就很乱,但是必须要这么乱才能白嫖,如果你有个人服务器,有域名,有固定IP,就不用这么乱了。

因为企业微信应用接口需要一个域名做数据回调,但是腾讯云提供的业务域名会被判定为第三方服务商,不能用,只能用阿里云的函数计算应用的域名。又因为给企业微信推送消息的时候,需要一个固定的公网IP,阿里云的出口IP是收费的,腾讯云的函数计算的出口IP是免费的,所以就两个一起用吧

阿里云上的代码如下,看看就好,估计没人会照着这个部署的

from WXBizJsonMsgCrypt import WXBizJsonMsgCrypt
from WXBizMsgCrypt import WXBizMsgCrypt
import sys
from flask import Flask, request,Response,jsonify
import jsonimport xml.etree.cElementTree as ETimport requests
from config import configREQUEST_ID_HEADER = 'x-fc-request-id'app = Flask(__name__)sToken = config.sToken
sEncodingAESKey = config.sEncodingAESKey
sCorpID = config.sCorpID
MsgIdglo=''@app.route('/wx', methods=['GET','POST'])
def wxpush():print(request)if request.method == 'GET':wxcpt = WXBizJsonMsgCrypt(sToken, sEncodingAESKey, sCorpID)sVerifyMsgSig = request.args.get('msg_signature')sVerifyTimeStamp = request.args.get('timestamp')sVerifyNonce = request.args.get('nonce')sVerifyEchoStr = request.args.get('echostr')# print(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr)ret, sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr)# print('===============')# print(ret,sEchoStr)aa = int(sEchoStr)# print('===============')if (ret != 0):print("ERR: VerifyURL ret: " + str(ret))else:print("done VerifyURL")return jsonify(aa)if request.method == 'POST':try:print('OKOK')# return Response(status=200)finally:# 微信服务器发来的三个get参数signature = request.args.get("signature")timestamp = request.args.get("timestamp")nonce = request.args.get("nonce")# 加进同一个列表里list1 = [sToken, timestamp, nonce]encrypted_bytes =   request.data# print(type(encrypted_bytes))if encrypted_bytes:            # 获取openid参数和msg_signature参数openid = request.args.get("openid")msg_signature = request.args.get("msg_signature")# 用微信官方提供的SDK解密,附带一个错误码和生成明文keys = WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID)# print('-----')# print(encrypted_bytes, msg_signature, timestamp, nonce)# encrypted_bytes.encode()ierror, decrypted_bytes = keys.DecryptMsg(encrypted_bytes, msg_signature, timestamp, nonce)# 若错误码为0则表示解密成功print(decrypted_bytes)if ierror == 0:# 对XML进行解析# print('00000')# dom_data = parseString(decrypted_bytes).documentElementxml_tree = ET.fromstring(decrypted_bytes)print(xml_tree)content = xml_tree.find("Content").textuser = xml_tree.find("FromUserName").textagentid = xml_tree.find("AgentID").texttouse = xml_tree.find("ToUserName").textMsgId = xml_tree.find("MsgId").textcreat = xml_tree.find("CreateTime").textsend(user,agentid,content,MsgId)def send(touser,agen,content,MsgId):print("开始请求",content)openaikey = config.openaikeyprint(openaikey)MsgIdglo = MsgIdprint(MsgIdglo,MsgId,'开始')req = requests.post('https://api.openai.com/v1/completions', json={"prompt": content, "max_tokens": 2048, "model": "text-davinci-003"}, headers={'content-type': 'application/json', 'Authorization': 'Bearer '+openaikey})print(req)reqdic = json.loads(req.text)aa = reqdic['choices'][0]['text']print("aaaaaa",aa)data = {'touser':touser,'agen':agen,'mess':aa}String_textMsg=json.dumps(data)HEADERS = {"Content-Type": "application/json ;charset=utf-8"}wechaturl = config.wechaturlres = requests.post(wechaturl, data=String_textMsg, headers=HEADERS)return Response(res) if __name__ == '__main__':app.run(host='0.0.0.0', port=9000)

配套的还有一个config.py文件:

里面放着相关的秘钥等信息
class config():
#openaikeyopenaikey = 'sk-s5S5BoVMLTU3btLsD'
# 企业微信的接口回调tokensToken = "7YWMt8FvunaE2oPJ7c0"
# 企业微信的接口回调AESKEYsEncodingAESKey = "b72tmVWnptXYwuDI1"
# 企业微信的企业IDsCorpID = "wweab244f"
#  腾讯云的函数公网访问域名wechaturl = f'https://servicetencentcs.com/release/'

之后开始部署腾讯云的转发服务


import os
from flask import Flask, jsonify, render_template, request, url_for, send_from_directory
import requests
import jsonIS_SERVERLESS = bool(os.environ.get('SERVERLESS'))
print(IS_SERVERLESS)app = Flask(__name__)@app.route("/", methods=['GET', 'POST'])
def index():if request.method == 'POST':print(request)touser = request.json.get('touser')agen = request.json.get('agen')mess = request.json.get('mess')corpid = 'wweb244f'# 应用secretcorpsecret = 'k6b1TZ6I1woUI'HEADERS = {"Content-Type": "application/json ;charset=utf-8"}# 获取tokenr = requests.get(f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={corpsecret}').textjs = json.loads(r)token = js['access_token']# data 中agentid 按应用实际id更换data = {"touser": touser,"msgtype": "text","agentid": agen,"text": {"content": mess},"safe": 0,"enable_id_trans": 0,"enable_duplicate_check": 0,"duplicate_check_interval": 1800}String_textMsg = json.dumps(data)# 企业微信应用地址wechaturl = f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={token}'res = requests.post(wechaturl, data=String_textMsg, headers=HEADERS)print(res.text)return res.text# 启动服务,监听 9000 端口,监听地址为 0.0.0.0
app.run(debug=IS_SERVERLESS != True, port=9000, host='0.0.0.0')

代码中的这两个换成你的企业微信的id和ser秘钥

然后就可以了

能教的就这么多了,有基础的经常开发企业应用的大神们可以优化优化

想在微信上使用chatGPT?小程序?公众号?企业微信,最终还是选择了企业微信版本的chatgpt相关推荐

  1. 微信小程序+公众号的流量主收入图在线制作微信小程序源码

    微信小程序+公众号的流量主收入图在线制作微信小程序源码,这是一款流量主制作生成小工具,支持小程序流量主图制作生成,也支持公众号的流量主制作生成. 每一种制作都包含了所有的 流量主 模式,用户自己填写选 ...

  2. 小程序公众号平台添加服务器,微擎绑定对接微信公众号小程序图文教程

    服务器文档网,在为客户服务的过程中,发现新入行的童鞋不会对接绑定公众号,今天有点闲暇,做了一份教程,供童靴们参考. 第一步:登录 第二步:点击[新建公众号]. 第三步:点击[手动添加公众号] 第四步: ...

  3. 微信小程序公众号开发

    微信小程序&公众号开发 一.什么是微信开发 二.微信开放平台 三.微信公众平台 四.小程序与公众号的区别 1. 用途不同 2. 运营方式不同 3. 操作方法不同 4. 用户体验不同(公众号操作 ...

  4. 微信html5测试工具,FAutoTest- 微信小程序 / 公众号 H5 自动化利器

    X5 内核 H5 自动化背景 近来有很多童靴咨询如何做微信小程序/公众号等 H5 页面来做自动化,之前写了一篇文章微信小程序自动化测试实践 https://www.cnblogs.com/yyoba/ ...

  5. 微信小程序/公众号/开放平台账号被冻结后原始ID找回方法

    1. 问题: 微信小程序/公众号/开放平台账号长时间不用被冻结,想再次使用找回时需要原始ID,原始ID已忘记.(适用于所有原始ID忘记找回). 2. 解决办法 ##2. 1. 打开用于开发小程序/公众 ...

  6. 开源全平台版知识付费系统源码 支持微信小程序+公众号+H5+PC端

    分享一个开源全平台版知识付费系统源码,系统支持微信小程序+公众号+H5+PC端,一套系统实现全端数据及用户体系全面打通,轻松实现店铺全网一站式运营.含完整代码包和详细搭建教程. 系统支持视频课程.音频 ...

  7. 微信小程序公众号开发者自动编译,热启动,自动保存

    微信小程序公众号开发者自动编译,热启动,自动保存 1.自动保存 选择左上角设置➡编辑器设置➡勾选需要的设置即可 2.热启动 选择右上角详情➡本地设置➡勾选启动代码自动热重载(建议搭配自动保存使用)

  8. fiddler使用教程+抓包实践+filder抓包APP+HTTPS,PC微信小程序公众号抓包笔记,fidder插件

    fiddler使用教程+抓包实践+filder抓包APP+HTTPS,PC微信小程序公众号抓包笔记,fidder插件 fiddler使用教程 界面 File->captur traffic 开启 ...

  9. 渗透测试-微信小程序-公众号测试经验总结

    微信小程序-公众号测试 微信公众号H5端 微信公众号H5端 限制手段及绕过方法: 1.未做限制 使用其他浏览器可直接打开页面进行浏览 2.通过 UserAgent 来限制 现象:使用其他浏览器打开后会 ...

  10. APP、PC客户端抓包、小程序\公众号

    APP.小程序.公众号抓包 一.APP抓包 (一)BurpSuite抓取手机HTTP数据包 1.配置代理IP与端口 2.测试 (二)BurpSuite抓取手机HTTPS数据包 1.安装证书 2.测试 ...

最新文章

  1. Ajax基础和Json基础
  2. 微软开发x86模拟器,让Windows for ARM能运行x86应用
  3. 我国科学家成功研制全球神经元规模最大的类脑计算机
  4. python实现阿里云域名绑定动态IP
  5. Oracle使用imp/exp导入/导出数据库
  6. oracle更改文件,Oracle修改数据文件名以及移动数据文件
  7. 计算 JS 数组中最大最小值
  8. 如何使用1Password,Authy和Privacy.com外包您的在线安全性
  9. 图算法--深度优先/广度优先/最小生成树/最短路径
  10. checkbox修改默认样式
  11. nginx 配置https_nginx 配置https
  12. 自定义训练中使用Tensorboard
  13. 90后华人教授夫妇斩获IEEE the best 论文和ACM Demo冠军,团队1年连发4篇Nature子刊
  14. java date 最小值_Java_Math/Date
  15. 傲腾内存 可以用ghost系统_英特尔傲腾是什么?让你秒懂英特尔傲腾技术
  16. crypto密码学知识大纲
  17. apple watch 微信连接不上手机
  18. android自动照相机2.0,Koda相机app下载-Koda相机v2.0.12 安卓版-腾牛安卓网
  19. 少儿美术课儿童画之水彩画第3集《高高的长颈鹿》
  20. C语言如何做手机游戏,C语言怎样实现一个简单的手机游戏小项目

热门文章

  1. 谷歌浏览器在线观看视频有声音但画面黑屏问题解决
  2. iOS获取苹果商店应用编号APPID
  3. (飞机绕圈问题)每个飞机只有一个油箱,飞机之间可以相互加油(注意是相互,没有加油机)一箱油可供一架飞机绕地球飞半圈
  4. 数据库建模工具Aquarius Orm Studio发布正式版本
  5. matlab激光操纵控制系统设计,某激光操作控制系统的滞后校正
  6. DEDE织梦常用的调用方法
  7. 高性能平台设计——美团旅行结算平台实践
  8. 8道2021年美团C++/Java最新面试真题,你能做对几道?(含答案)
  9. 笔记本电脑连接宽带的时候报错(调制解调器报告了一个错误)(1024程序节纪念一下自己的最坑)
  10. 笔记本的标压和低压的区别