python 接收到 json 参数时, sys.argv会把双引号去掉

博客提及一个问题的解决方法是加转义,结合标签推测是Python相关问题。

解决方法:加转义

是分析我发给你的脚本xinzaixian.py,分析脚本后,写一个命令行的使用示例给我,我需要的是输入接口地址和请求方式还有参数的使用示例。 #!/usr/bin/python3 # coding=utf-8 import time import json import sys import requests from zaixian_cas_login import cas_login, HttpResponseProcessor # 假设两个文件在同一目录下 # 定义标准返回结构 SUCCESS_RES = { 'resCode': 200, 'resTime': 0, 'keyword': 'SUCCESS', 'message': '', 'data': None # 用于存放业务数据 } FAILURE_RES = { 'resCode': 500, 'resTime': 0, 'keyword': 'FAILED', 'message': '', 'error': None # 存放错误信息 } def make_business_request(url, method=None, params=None, data=None, json_data=None, token=None, session_cookies=None): """ 使用已登录的会话和token进行业务请求 :param url: 业务接口URL :param method: 请求方法(可选),自动判断未指定 :param params: URL查询参数 :param data: 表单数据(用于POST/PUT等) :param json_data: JSON数据(用于POST/PUT等) :param token: 登录成功后获取的token :param session_cookies: 登录成功后获取的session cookies :return: 标准化结果字典 """ start_time = time.time() result_template = SUCCESS_RES.copy() # 使用成功模板 try: # 创建会话并设置cookies session = requests.Session() if session_cookies: session.cookies.update(session_cookies) # 设置请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Accept': 'application/json,text/plain,text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'Accept-Encoding': 'gzip, deflate, br, zstd', 'Connection': 'keep-alive', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache' } if token: headers['Cookie'] = f'prod-token={token}' # 将token添加到Cookie # 自动判断请求方法(如果未指定) if method is None: method = 'POST' if (data is not None or json_data is not None) else 'GET' else: method = method.upper() # 统一转换为大写 # 准备请求参数 request_kwargs = { 'url': url, 'params': params, 'headers': headers, 'verify': False } # 根据方法类型添加相应参数 if method in ['POST', 'PUT', 'PATCH', 'DELETE']: if json_data is not None: request_kwargs['json'] = json_data headers['Content-Type'] = 'application/json' elif data is not None: request_kwargs['data'] = data # 发送请求 response = session.request(method, **request_kwargs) # 使用HttpResponseProcessor处理响应 processor = HttpResponseProcessor(url, headers=headers) processor.response = response # 手动设置响应对象 processor.raw_content = response.content processor.status_code = response.status_code text_content = processor.decode_content() # 记录响应间 result_template['resTime'] = int((time.time() - start_time) * 1000) # 检查HTTP状态码 if response.status_code != 200: result_template.update(FAILURE_RES) # 转换为失败结构 result_template['resCode'] = response.status_code result_template['message'] = f"业务接口请求失败,状态码: {response.status_code}" result_template['error'] = text_content[:500] # 截取部分错误信息 return result_template # 尝试解析JSON响应 try: json_data = json.loads(text_content) result_template['data'] = json_data except json.JSONDecodeError: result_template['data'] = text_content # 如果不是JSON,则保存文本 result_template['message'] = "业务请求成功" return result_template except Exception as e: result_template.update(FAILURE_RES) # 转换为失败结构 result_template['resTime'] = int((time.time() - start_time) * 1000) result_template['message'] = "业务请求过程中发生异常" result_template['error'] = str(e) return result_template def main(): # 第一步:登录获取token和session username = "jffwbc1" password = "R2pjcHgxMjMhQCM=" # base64编码的密码 token, session_cookies = cas_login(username, password) if not token or not session_cookies: print("登录失败,无法进行业务请求") sys.exit(1) print("登录成功!") print(f"Token: {token}") print(f"Session Cookies: {session_cookies}") # 第二步:使用命令行参数获取请求配置 if len(sys.argv) < 2: print("请提供请求URL作为参数") sys.exit(1) url = sys.argv[1] method = sys.argv[2] if len(sys.argv) > 2 else None params = json.loads(sys.argv[3]) if len(sys.argv) > 3 and sys.argv[3] != 'null' else None data = json.loads(sys.argv[4]) if len(sys.argv) > 4 and sys.argv[4] != 'null' else None json_data = json.loads(sys.argv[5]) if len(sys.argv) > 5 and sys.argv[5] != 'null' else None # 执行请求 result = make_business_request( url=url, method=method, params=params, data=data, json_data=json_data, token=token, session_cookies=session_cookies ) # 打印结果 print("\n业务请求结果:") print(json.dumps(result, indent=2, ensure_ascii=False)) if __name__ == '__main__': main()
08-09
我现在要直接把参数填到脚本里面调试,在什么位置填写url和参数,请在脚本中给我标明一下,并输出完整的标注后的脚本给我 #!/usr/bin/python3 # coding=utf-8 import time import json import sys import requests from zaixian_cas_login import cas_login, HttpResponseProcessor # 假设两个文件在同一目录下 # 定义标准返回结构 SUCCESS_RES = { 'resCode': 200, 'resTime': 0, 'keyword': 'SUCCESS', 'message': '', 'data': None # 用于存放业务数据 } FAILURE_RES = { 'resCode': 500, 'resTime': 0, 'keyword': 'FAILED', 'message': '', 'error': None # 存放错误信息 } def make_business_request(url, method=None, params=None, data=None, json_data=None, token=None, session_cookies=None): """ 使用已登录的会话和token进行业务请求 :param url: 业务接口URL :param method: 请求方法(可选),自动判断未指定 :param params: URL查询参数 :param data: 表单数据(用于POST/PUT等) :param json_data: JSON数据(用于POST/PUT等) :param token: 登录成功后获取的token :param session_cookies: 登录成功后获取的session cookies :return: 标准化结果字典 """ start_time = time.time() result_template = SUCCESS_RES.copy() # 使用成功模板 try: # 创建会话并设置cookies session = requests.Session() if session_cookies: session.cookies.update(session_cookies) # 设置请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Accept': 'application/json,text/plain,text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'Accept-Encoding': 'gzip, deflate, br, zstd', 'Connection': 'keep-alive', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache' } if token: headers['Cookie'] = f'prod-token={token}' # 将token添加到Cookie # 自动判断请求方法(如果未指定) if method is None: method = 'POST' if (data is not None or json_data is not None) else 'GET' else: method = method.upper() # 统一转换为大写 # 准备请求参数 request_kwargs = { 'url': url, 'params': params, 'headers': headers, 'verify': False } # 根据方法类型添加相应参数 if method in ['POST', 'PUT', 'PATCH', 'DELETE']: if json_data is not None: request_kwargs['json'] = json_data headers['Content-Type'] = 'application/json' elif data is not None: request_kwargs['data'] = data # 发送请求 response = session.request(method, **request_kwargs) # 使用HttpResponseProcessor处理响应 processor = HttpResponseProcessor(url, headers=headers) processor.response = response # 手动设置响应对象 processor.raw_content = response.content processor.status_code = response.status_code text_content = processor.decode_content() # 记录响应间 result_template['resTime'] = int((time.time() - start_time) * 1000) # 检查HTTP状态码 if response.status_code != 200: result_template.update(FAILURE_RES) # 转换为失败结构 result_template['resCode'] = response.status_code result_template['message'] = f"业务接口请求失败,状态码: {response.status_code}" result_template['error'] = text_content[:500] # 截取部分错误信息 return result_template # 尝试解析JSON响应 try: json_data = json.loads(text_content) result_template['data'] = json_data except json.JSONDecodeError: result_template['data'] = text_content # 如果不是JSON,则保存文本 result_template['message'] = "业务请求成功" return result_template except Exception as e: result_template.update(FAILURE_RES) # 转换为失败结构 result_template['resTime'] = int((time.time() - start_time) * 1000) result_template['message'] = "业务请求过程中发生异常" result_template['error'] = str(e) return result_template def main(): # 第一步:登录获取token和session username = "jffwbc1" password = "R2pjcHgxMjMhQCM=" # base64编码的密码 token, session_cookies = cas_login(username, password) if not token or not session_cookies: print("登录失败,无法进行业务请求") sys.exit(1) # print("登录成功!") # print(f"Token: {token}") # print(f"Session Cookies: {session_cookies}") # 第二步:使用命令行参数获取请求配置 if len(sys.argv) < 2: print("请提供请求URL作为参数") sys.exit(1) url = sys.argv[1] method = sys.argv[2] if len(sys.argv) > 2 else None params = json.loads(sys.argv[3]) if len(sys.argv) > 3 and sys.argv[3] != 'null' else None data = json.loads(sys.argv[4]) if len(sys.argv) > 4 and sys.argv[4] != 'null' else None json_data = json.loads(sys.argv[5]) if len(sys.argv) > 5 and sys.argv[5] != 'null' else None # 执行请求 result = make_business_request( url=url, method=method, params=params, data=data, json_data=json_data, token=token, session_cookies=session_cookies ) # 打印结果 # print("\n业务请求结果:") print(json.dumps(result, indent=2, ensure_ascii=False)) if __name__ == '__main__': main() # 命令行使用示例:python xinzaixian.py < url > [method][params][data][json_data] # 其中: # < url >:接口地址(字符串) # [method]:请求方法(如’GET’, 'POST’等),可选,如果不指定,则根据是否有数据自动判断(有数据则用POST,否则用GET) # [params]:查询参数(URL参数),以JSON格式的字符串表示,例如:‘{“key1”:“value1”, “key2”:“value2”}’ # [data]:表单数据,以JSON格式的字符串表示,例如:‘{“form_field1”:“value1”, “form_field2”:“value2”}’ # [json_data]:JSON格式的请求体,以JSON格式的字符串表示,例如:‘{“json_field1”:“value1”, “json_field2”:“value2”}’ # 注意:在命令行中传递JSON字符串,需要确保正确使用引号(在Unix - like系统中使用单引号包裹JSON字符串,在Windows中可能需要双引号,并且内部双引号需要转义)。 # 示例: # GET请求,带查询参数: # python xinzaixian.py "http://example.com/api" "GET" '{"page":1,"size":10}' # POST请求,发送表单数据: # python xinzaixian.py "http://example.com/api" "POST" null '{"username":"test","password":"123456"}' # 注意:如果不需要params,但需要传递data,则params位置用null(字符串)表示跳过。 # POST请求,发送JSON数据: # python xinzaixian.py "http://example.com/api" "POST" null null '{"name":"John","age":30}' # PUT请求,发送JSON数据: # python xinzaixian.py "http://example.com/api" "PUT" null null '{"id":1,"name":"New Name"}' # DELETE请求,带查询参数: # python xinzaixian.py "http://example.com/api" "DELETE" '{"id":1}' # 注意:在命令行中,如果某个参数不需要,但后面的参数需要,则必须用null(字符串)占位。例如,在示例2中,我们跳过了params(用null)而传递了data。 # 另外,由于脚本中使用了json.loads来解析这些参数字符串,所以必须确保传入的JSON字符串是有效的。 # 如果参数中包含特殊字符(如引号),在命令行中需要正确转义。例如,在Unix - like系统中,可以使用单引号包裹整个JSON字符串,内部的双引号不需要转义。在Windows中,可能需要使用双引号包裹,并且内部的双引号使用反斜杠转义。 # 例如,在Windows中发送JSON数据: # python xinzaixian.py "http://example.com/api" "POST" null null "{\"name\":\"John\"}" # 在Linux / macOS中则可以使用: # python xinzaixian.py "http://example.com/api" "POST" null null '{"name":"John"}' # 总结命令行格式: # python xinzaixian.py < url > [method][params][data][json_data] # 其中: # < url >:字符串,不可省略 # [method]:字符串,可省略(省略根据是否有数据自动判断) # [params]:JSON字符串,可省略(或写为’null’) # [data]:JSON字符串,可省略(或写为’null’) # [json_data]:JSON字符串,可省略(或写为’null’) # 注意:脚本中已经内置了登录功能(使用固定的用户名和密码),因此不需要在命令行中传递登录信息。 # 如果登录失败,脚本会退出,不会执行后续请求。 # 最后,执行结果会以JSON格式打印到控制台。
最新发布
12-18
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值