小程序
小游戏
企业微信
微信支付
扫描小程序码分享
机器人ID:fair7a905
2 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
已解决,统一回复下。
先贴一下目前自己调试的接口。
# -*- 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"}')])
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
一样的问题,请问你解决了吗?
已解决了,后来看到图解,发现请求的地址是http的,把https 修改为 http就可以了,这个是BUG吗?
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
已解决,统一回复下。
先贴一下目前自己调试的接口。
# -*- 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"}')])
一样的问题,请问你解决了吗?
已解决了,后来看到图解,发现请求的地址是http的,把https 修改为 http就可以了,这个是BUG吗?