再也不用花钱使用XX小客服了!

最近在做小程序,涉及到小程序引流到公众号的问题,

这一块微信做得极不友好,方法很多但都有局限性,

网上基本找不到相关的代码,感谢GPT,我这里给出一套确实可用的,希望可以帮助大家。

注意几点:

  1. 现在客服没法主动发消息,需要用户先主动发送,然后我们才能做出回复;

  2. 使用了自动回复后,人工客服将收不到消息;

  3. 发送图片没有实现,不过可以通过发送图片的链接卡片来引导用户

我的小程序客服回复逻辑如下:

  1. 用户发送任意内容 回复用户输入什么内容可以获得什么帮助

  2. 用户输入对应内容,返回对应消息,可以是文本消息或者链接卡片

  3. 可以一次回复多条消息。

下面我给出相应的完整python代码,你可以根据需要随意调整。

可以实现:

自动回复文字;

自动回复卡片链接;

自动回复多条消息

可以在用户发送任意消息时都回复;

使用方法见注释

如果实在不会 可以联系微信 WMeee-

from flask import Flask, request, abort  
import hashlib  
import json  
import requests  

"""
配置“消息推送”

进入小程序平台,选择左边栏“开发”->“开发设置”->“消息推送”->点击“启用”

填写配置,数据格式选择json,消息传输选择明文  token自定义


修改下面的配置,填写自己的小程序appid和appsecret  和  消息推送的token 消息加密密钥直接随机

"""

app = Flask(__name__)  
TOKEN = "JG8vcz"  # 填写自己的 token,与小程序后台填的一样即可
APPID = "wxedd72"  # 填写自己的 AppID
SECRET = "e2d39f8f9e9"  # 填写自己的 Secret


def get_access_token():
    """
    获取微信公众号的访问令牌
    """
    url = f'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={SECRET}'  
    result = requests.get(url).json()  
    if 'access_token' in result:
        return result['access_token']  # 返回访问令牌
    else:
        print(f"Error getting access token: {result}")
        return None



def request_api(json_data):
    """
    发送自定义消息给用户
    """
    access_token = get_access_token()  # 获取访问令牌
    # 构造发送消息的 URL
    url = f"https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={access_token}"
    response = requests.post(url, data=json.dumps(
        json_data, ensure_ascii=False).encode('utf-8'))  
    if response.json()['errcode'] == 0:
        return 'success'  
    else:
        return 'fail'  


@app.route('/api/wxxcx', methods=['GET', 'POST'])
def wechat():
    try:
        if request.method == 'GET':
            # 处理微信服务器验证请求
            data = request.args 
            signature = data.get('signature') 
            timestamp = data.get('timestamp')  
            nonce = data.get('nonce') 
            echostr = data.get('echostr')  
            token = TOKEN  
            list = [token, timestamp, nonce]  
            list.sort()  
            sha1 = hashlib.sha1()  
            [sha1.update(i.encode('utf-8')) for i in list]  # 转换为 bytes 后再更新
            hashcode = sha1.hexdigest()  
            if hashcode == signature:  
                return echostr  
            else:
                abort(403)  
        elif request.method == 'POST':
            # 处理用户发送的消息
            post_data = request.get_json()  # 获取请求数据
            if post_data['MsgType'] == 'text':  # 判断消息类型是否为文本消息
                if '交流群' in post_data['Content'] or '交流' in post_data['Content'] or '客服' in post_data['Content']:  # 判断消息内容
                    data1 = {
                            "touser": post_data['FromUserName'],
                            "msgtype": "link",
                            "link": {
                                "title": '加入群聊',
                                "description": '点我扫码加入交流群',
                                "url": 'https://fk.nnue.eu.org?code=YT02JmI9MTk%3D',
                                "thumb_url": 'https://fk.nnue.eu.org/favicon.ico',
                            }
                        }
                    data2 = {
                            "touser": post_data['FromUserName'],
                            "msgtype": "text",
                            "text": {
                                "content": '你好,点击链接卡片即可进入交流群,如需联系客服,咨询管理即可'
                            }
                        }

                    request_api(data1)  # 发送自定义消息1
                    request_api(data2)  # 发送自定义消息2
                    return 'success'  # 返回成功

                elif '兑换码' in post_data['Content'] or '兑换吗' in post_data['Content'] or '兑换' in post_data['Content']:

                    data1 = {
                            "touser": post_data['FromUserName'],
                            "msgtype": "link",
                            "link": {
                                "title": '获取兑换码',
                                "description": '点我获取小程序兑换码',
                                "url": 'https://fk.nnue.eu.org?code=YT02JmI9MTk%3D',
                                "thumb_url": 'https://fk.nnue.eu.org/favicon.ico',
                            }
                        }
                    data2 = {
                            "touser": post_data['FromUserName'],
                            "msgtype": "text",
                            "text": {
                                "content": '你好,点击链接卡片即可获取兑换码'
                            }
                        }

                    request_api(data1)  # 发送自定义消息1
                    request_api(data2)  # 发送自定义消息2
                    return 'success'  # 返回成功

                # elif post_data['Content'] == '3':  # 判断文本内容是否为 '3'
                #     data = {
                #         "touser": post_data['FromUserName'],
                #         "msgtype": "text",
                #         "text": {
                #             "content": '你发送了3'
                #         }
                #     }
                #     return request_api(data)  
                else:
                    data = {
                        "touser": post_data['FromUserName'],
                        "msgtype": "text",
                        "text": {
                            "content": '欢迎来到元AI艺术二维码小程序,回复【兑换码】获取小程序点数兑换码,回复【交流群】即可进入小程序交流群,如需联系客服,进群后联系管理员即可。'
                        }
                    }
                    return request_api(data)
            else:
                data = {
                    "touser": post_data['FromUserName'],
                    "msgtype": "text",
                    "text": {
                        "content": '欢迎来到元AI艺术二维码小程序,回复【兑换码】获取小程序点数兑换码,回复【交流群】即可进入小程序交流群,如需联系客服,进群后联系管理员即可。'
                    }
                }
                return request_api(data)  
        else:
            return 'Method not allowed', 405  # 返回错误信息和状态码
    except Exception as e:
        app.logger.error(f'An error occurred: {e}') # 记录错误日志
        return 'Internal server error', 500  


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5008, debug=True)