我这里有一个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()
时间: 2025-08-08 18:10:48 浏览: 7
<think>我们有一个Python脚本xinzaixian.py,需要通过命令行传递三个参数:接口地址、请求方法和参数。
根据引用[3]和引用[4]中提到的命令行参数传递方式,我们可以使用argparse模块来解析命令行参数。
假设用户希望传递的参数如下:
1. 接口地址(例如:http://example.com/api)
2. 请求方法(例如:GET或POST)
3. 参数(例如:key1=value1&key2=value2 或 JSON字符串)
我们需要在xinzaixian.py脚本中设置argparse来接收这些参数。
首先,我们假设脚本中已经使用argparse定义了三个参数,例如:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--url', required=True, help='接口地址')
parser.add_argument('--method', required=True, help='请求方法,如GET或POST')
parser.add_argument('--params', help='请求参数,可以是查询字符串或JSON字符串')
然后,在命令行中运行脚本的方式如下:
python xinzaixian.py --url http://example.com/api --method GET --params "key1=value1&key2=value2"
如果参数中包含特殊字符,可能需要使用引号将参数括起来。
另外,引用[2]提供了两种在终端运行Python脚本的方法:
法一:直接使用python命令运行
python 脚本路径 [参数]
法二:在Python交互解释器中运行(但这种方法不太适合带参数的情况)
因此,我们推荐使用法一。
如果用户没有在脚本中设置argparse,那么我们需要先修改脚本以支持命令行参数解析。
步骤:
1. 确保脚本中已经使用argparse模块解析命令行参数(如果没有,需要修改脚本)。
2. 打开终端(命令行)。
3. 使用cd命令切换到脚本所在目录(或者使用绝对路径指定脚本)。
4. 执行命令:python xinzaixian.py 加上所需的参数。
示例命令:
python xinzaixian.py --url "http://api.example.com/data" --method "POST" --params '{"name":"John", "age":30}'
注意:如果参数是JSON格式,需要确保JSON字符串被正确引用(单引号或双引号,但要注意在命令行中引号的转义)。
另外,引用[4]提到了一种通过python -m airtest run的方式,但这里我们不需要,因为我们的脚本是普通Python脚本。
如果用户希望将参数传递封装得更简洁,可以考虑使用shell脚本(如.sh文件)来保存命令(引用[2]提到过脚本*.sh),这样只需运行shell脚本即可。
例如,创建一个run.sh文件,内容为:
#!/bin/bash
python /path/to/xinzaixian.py --url "http://api.example.com/data" --method "POST" --params '{"name":"John", "age":30}'
然后给run.sh执行权限,并运行:
chmod +x run.sh
./run.sh
这样就不需要每次输入长命令。
总结:
使用命令行运行并传递参数的格式为:
python xinzaixian.py --url <接口地址> --method <请求方法> --params <参数字符串>
如果脚本中解析参数的方式不同(比如使用位置参数而非选项参数),那么命令格式需要相应调整。但根据常规实践,使用选项参数(如--url)更为清晰。
因此,我们假设脚本中已经按照上述argparse设置,那么按照上述方式传递即可。
如果用户还没有在脚本中设置命令行参数解析,下面提供一个简单的示例代码(xinzaixian.py中需要包含的解析代码):</think>要在命令行中运行 `xinzaixian.py` 脚本并传递接口地址、请求方法和参数,需遵循以下步骤:
### 1. **修改脚本以支持命令行参数**
在 `xinzaixian.py` 中使用 `argparse` 模块解析命令行参数:
```python
import argparse
parser = argparse.ArgumentParser(description='API请求脚本')
parser.add_argument('--url', required=True, help='接口地址') # 必需参数
parser.add_argument('--method', required=True, help='请求方法(GET/POST)')
parser.add_argument('--params', help='请求参数(格式: key1=value1&key2=value2)')
args = parser.parse_args()
# 后续使用 args.url, args.method, args.params 处理请求
```
### 2. **命令行执行脚本**
在终端中定位到脚本目录后执行:
```bash
python xinzaixian.py \
--url "http://api.example.com/data" \
--method "POST" \
--params "name=John&age=30"
```
#### 参数说明:
- `--url`:接口地址(需用引号包裹含特殊字符的URL)
- `--method`:请求方法(如 GET/POST)
- `--params`:参数字符串(格式:`key1=value1&key2=value2`)
### 3. **参数传递示例**
- **GET请求**:
```bash
python xinzaixian.py --url "http://api.example.com/search" --method "GET" --params "keyword=python&page=1"
```
- **POST请求**:
```bash
python xinzaixian.py --url "http://api.example.com/submit" --method "POST" --params "username=test&password=123456"
```
### 4. **特殊场景处理
- **JSON参数**:直接在脚本中将参数字符串转换为JSON
```python
import json
params_dict = {k: v for k, v in [pair.split("=") for pair in args.params.split("&")]}
json_data = json.dumps(params_dict)
```
- **空格/特殊字符**:使用引号包裹参数值
```bash
--params "query=linux command%20line"
```
### 5. **简化执行(可选)**
创建Shell脚本 `run.sh` 避免重复输入:
```bash
#!/bin/bash
python /path/to/xinzaixian.py \
--url "$1" \
--method "$2" \
--params "$3"
```
执行方式:
```bash
chmod +x run.sh # 添加执行权限
./run.sh "http://api.example.com" "GET" "id=100"
```
> **关键点**:
> 1. 脚本必须通过 `argparse` 解析参数
> 2. 参数值含空格/特殊字符时需用引号包裹
> 3. 通过 `&` 分隔多个参数键值对
> 4. POST请求需在脚本内部处理请求体封装[^3][^4]
阅读全文
相关推荐






