收藏
回答

第三方接口调用,调试通过,但是调试无法回复,提示未配置回复是怎么回事?

机器人ID:fair7a905

回答关注问题邀请回答
收藏

2 个回答

  • A.逍遥🌈
    A.逍遥🌈
    2023-07-19

    已解决,统一回复下。

    先贴一下目前自己调试的接口。

    # -*- coding: utf-8 -*-
    
    import re
    from flask import Flask, request, jsonify, make_response
    
    app = Flask(__name__)
    
    @app.route('/api/data', methods=['POST' , 'GET'])
    def get_data(**kwargs):
        # 根据请求内容类型获取数据
        if request.content_type == 'application/json':
            input_param = request.json.get('a')
            data = request.json
        else:
            data = request.form
            json_str = next(iter(data))
    
            # 去除额外的引号和转义字符
            json_str = json_str.replace("'", "").replace("\\", "")
    
            # 使用正则表达式匹配所有参数的键和值
            matches = re.findall(r'"([a-zA-Z]+)":\s*"([^"]+)"', json_str)
    
            # 将匹配结果转换成字典
            params_dict = dict(matches)
    
            # 提取'a'、'b'、'c'等参数的值
            a_value = params_dict.get('a', None)
            # b_value = params_dict.get('b', None)
            # c_value = params_dict.get('c', None)
    
    
            input_param = a_value
            # 构建响应
        # 如果input_param为空,返回错误码,否则返回输入参数
        if input_param:
            response = {"err_code": 0, "data_list": [{"b": input_param}]}
        else:
            response = {"err_code": -1, "data_list": [{"b": "输入参数为空"}]}
        headers = {"Content-Type": "application/json"}  # 设置响应头
        print(request.remote_addr)
        # 把原始请求的所有信息打印出来
        print(request.headers)
        # 输出请求的数据
        print(data)
        # print(matches)
        # print(params_dict)
        print(request.content_type)
        print(input_param)
        print(response)
        return jsonify(response), headers  # 返回响应并包含响应头
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=9000)
    

    1、调试的请求与机器人实际的请求是不一样的,希望官方可以解决一下。

    调试接口的请求,分别打印出来:请求头+请求数据+content_type类型+请求参数值+返回的json值

    # print(request.headers)
    Host: 82.156.156.216:9000
    Connection: close
    Content-Length: 14
    Accept: application/json
    Content-Type: application/json
    
    
    {'a': '你好'}
    application/json
    你好
    {'err_code': 0, 'data_list': [{'b': '你好'}]}
    82.156.156.216 - - [19/Jul/2023 17:10:55] "POST /api/data HTTP/1.0" 200 -
    

    实际的机器人请求为如下:包括请求头+请求参数(ImmutableMultiDict对象)+自己通过正则表达式提取出的请求参数+content_type类型+请求参数值+返回的json值

    Host: 82.156.156.216:9000
    Connection: close
    Content-Length: 282
    User-Agent: Mozilla/4.0
    Accept: */*
    Appid: 637616
    Bid: 637616
    Requestid: 1aea0b4c
    Uid: o9U-85vJFgD35SZqN349lzOwljDQ
    Content-Type: application/x-www-form-urlencoded
    Pragma: no-cache
    
    
    ImmutableMultiDict([('{"_3rdparth_proxy_http_header_":{"appid":"637616","bid":"637616","open_id":"o9U-85vJFgD35SZqN349lzOwljDQ","requestid":"1aea0b4c","uid":"o9U-85vJFgD35SZqN349lzOwljDQ"},"a":"123","encryptText":"rxRSYavLozf2S5W9FnHfkr1bFmhUO4V1n1sF7xkSYOJInd3mts9dDxdSzJTYoZRO7mQfatiLVA94uSYiiFjVNg', '="}')])
    [('appid', '637616'), ('bid', '637616'), ('requestid', '1aea0b4c'), ('uid', 'o9U-85vJFgD35SZqN349lzOwljDQ'), ('a', '123')]
    {'appid': '637616', 'bid': '637616', 'requestid': '1aea0b4c', 'uid': 'o9U-85vJFgD35SZqN349lzOwljDQ', 'a': '123'}
    application/x-www-form-urlencoded
    123
    {'err_code': 0, 'data_list': [{'b': '123'}]}
    

    2、官方文档有些滞后了,希望可以同步更新一下。

    最后复读机的效果:


    2023-07-20 又发现了一个问题。

    先贴修改后的代码吧

    # -*- coding: utf-8 -*-
    import json
    import re
    from urllib.parse import unquote
    
    from flask import Flask, request, jsonify, make_response
    
    app = Flask(__name__)
    
    @app.route('/api/data', methods=['POST' , 'GET'])
    def get_data(**kwargs):
        # 根据请求内容类型获取数据
        if request.content_type == 'application/json':
            input_param = request.json.get('a')
            data = request.json
        else:
            data = request.form
            # 将ImmutableMultiDict转换为字符串
            req_str = str(data)
            escaped_a = req_str.replace("',", "\\',")
            escaped_a = escaped_a.replace("'=", "\\'=")
            # 使用正则表达式匹配所有参数的键和值
            matches = re.findall(r'"([a-zA-Z]+)":\s*"([^"]+)"', escaped_a)
    
            # 将匹配结果转换成字典
            params_dict = dict(matches)
    
            # 提取'a'、'b'、'c'等参数的值
            a_value = params_dict.get('a', None)
            # b_value = params_dict.get('b', None)
            # c_value = params_dict.get('c', None)
    
    
            input_param = a_value
            # 构建响应
        # 如果input_param为空,返回错误码,否则返回输入参数
        if input_param:
            response = {"err_code": 0, "data_list": [{"b": input_param}]}
        else:
            response = {"err_code": -1, "data_list": [{"b": "输入参数为空"}]}
        headers = {"Content-Type": "application/json"}  # 设置响应头
        print(request.remote_addr)
        # 把原始请求的所有信息打印出来
        print(request.headers)
        # 输出请求的数据
        print(data)
        # print(matches)
        # print(params_dict)
        print(request.content_type)
        print(input_param)
        print(response)
        return jsonify(response), headers  # 返回响应并包含响应头
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=9000)
    

    以上是修改后的代码,如果机器人有多个参数请求的话,会发现chengshi与jidu、zhibiaomingcheng之间穿插了一个encrypttext,如果在用之前的处理方式就取不到后边的参数。需要先将ImmutableMultiDict转换为字符串,在使用正则表达式匹配所有参数的键和值,将匹配结果转换成字典,最后提取'a'、'b'、'c'等参数的值。如此可解决多参数入参的问题。

    ImmutableMultiDict([('{"_3rdparth_proxy_http_header_":{"appid":"z8N4QmokUby0eAjIXqZmaNA0AdnTMu","bid":"637616","open_id":"QiIptcHkwmX","requestid":"2b7e2c6a","uid":"QiIptcHkwmX"},"chengshi":"济南市","encryptText":"rxRSYavLozf2S5W9FnHfkksFptN1tItyRhS2QYEbPsOafxKGFgC47It3L3WPnwY6qZZKxkSv2HxTsIdC31Ojtw', '=","jidu":"2022年4季度","zhibiaomingcheng":"GDP"}')])
    


    2023-07-19
    有用 2
    回复
  • 浮云
    浮云
    2023-07-15

    一样的问题,请问你解决了吗?

    已解决了,后来看到图解,发现请求的地址是http的,把https 修改为 http就可以了,这个是BUG吗?

    2023-07-15
    有用
    回复 6
    • A.逍遥🌈
      A.逍遥🌈
      发表于移动端
      2023-07-15
      没有,哎,愁人啊
      2023-07-15
      回复
    • A.逍遥🌈
      A.逍遥🌈
      2023-07-17
      能正常请求通了吗?机器人可以回复了?
      2023-07-17
      回复
    • A.逍遥🌈
      A.逍遥🌈
      2023-07-17
      通不了一点  改成http也不行,能请教一下吗
      2023-07-17
      回复
    • 浮云
      浮云
      2023-07-18回复A.逍遥🌈
      我的已经可以正常使用了,或者你看看状态码有没有设置错误
      2023-07-18
      回复
    • A.逍遥🌈
      A.逍遥🌈
      2023-07-18回复浮云
      我看接口日志  能看到请求过来,但是请求里没带参数
      2023-07-18
      回复
    查看更多(1)
登录 后发表内容
问题标签