@zzp123/mcp-zentao 1.18.9 → 1.18.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,196 +1,196 @@
1
- #!/usr/bin/env python3
2
- """
3
- 从剪贴板获取图片并上传到禅道
4
-
5
- 依赖安装:
6
- pip install pillow requests
7
-
8
- 使用方法:
9
- python upload-clipboard-image.py
10
-
11
- 环境变量:
12
- ZENTAO_URL: 禅道系统URL
13
- ZENTAO_USERNAME: 用户名
14
- ZENTAO_PASSWORD: 密码
15
- ZENTAO_UID: 可选的UID参数
16
- """
17
-
18
- import os
19
- import sys
20
- import hashlib
21
- import requests
22
- import base64
23
- from io import BytesIO
24
- from pathlib import Path
25
- from datetime import datetime
26
-
27
- try:
28
- from PIL import ImageGrab, Image
29
- except ImportError:
30
- print("错误: 请先安装 Pillow 库")
31
- print("运行: pip install pillow")
32
- sys.exit(1)
33
-
34
-
35
- def get_clipboard_image():
36
- """从剪贴板获取图片"""
37
- print("正在读取剪贴板图片...")
38
-
39
- try:
40
- # 尝试获取剪贴板图片
41
- img = ImageGrab.grabclipboard()
42
-
43
- if img is None:
44
- print("错误: 剪贴板中没有图片")
45
- sys.exit(1)
46
-
47
- # 如果是文件路径列表,读取第一个图片文件
48
- if isinstance(img, list):
49
- img_path = img[0]
50
- if os.path.isfile(img_path):
51
- img = Image.open(img_path)
52
- else:
53
- print(f"错误: 无法打开文件 {img_path}")
54
- sys.exit(1)
55
-
56
- print(f"✓ 成功读取剪贴板图片 ({img.width}x{img.height})")
57
- return img
58
-
59
- except Exception as e:
60
- print(f"错误: 无法读取剪贴板图片 - {e}")
61
- sys.exit(1)
62
-
63
-
64
- def image_to_base64(img):
65
- """将图片转换为 base64"""
66
- buffer = BytesIO()
67
- img.save(buffer, format='PNG')
68
- img_bytes = buffer.getvalue()
69
- return base64.b64encode(img_bytes).decode('utf-8'), img_bytes
70
-
71
-
72
- def get_zentao_token(url, username, password):
73
- """获取禅道 Token"""
74
- print("正在连接禅道系统...")
75
-
76
- # MD5 加密密码
77
- password_md5 = hashlib.md5(password.encode()).hexdigest()
78
-
79
- token_url = f"{url}/zentao/api.php/v1/tokens"
80
- data = {
81
- "account": username,
82
- "password": password_md5
83
- }
84
-
85
- try:
86
- response = requests.post(token_url, json=data)
87
- response.raise_for_status()
88
- token = response.json().get('token')
89
-
90
- if not token:
91
- print("错误: 无法获取 Token")
92
- sys.exit(1)
93
-
94
- print("✓ 成功获取 Token")
95
- return token
96
-
97
- except requests.exceptions.RequestException as e:
98
- print(f"错误: 无法连接禅道系统 - {e}")
99
- sys.exit(1)
100
-
101
-
102
- def upload_to_zentao(url, token, img_bytes, filename, uid=None):
103
- """上传图片到禅道"""
104
- print("正在上传到禅道...")
105
-
106
- upload_url = f"{url}/zentao/api.php/v1/files"
107
- if uid:
108
- upload_url += f"?uid={uid}"
109
-
110
- headers = {
111
- "Token": token
112
- }
113
-
114
- files = {
115
- 'imgFile': (filename, img_bytes, 'image/png')
116
- }
117
-
118
- try:
119
- response = requests.post(upload_url, headers=headers, files=files)
120
- response.raise_for_status()
121
- result = response.json()
122
-
123
- print("")
124
- print("=" * 40)
125
- print("✓ 上传成功!")
126
- print("=" * 40)
127
- print(f"文件ID: {result.get('id')}")
128
- print(f"访问URL: {result.get('url')}")
129
- print("=" * 40)
130
-
131
- return result
132
-
133
- except requests.exceptions.RequestException as e:
134
- print("")
135
- print("=" * 40)
136
- print("✗ 上传失败")
137
- print("=" * 40)
138
- print(f"错误信息: {e}")
139
- print("=" * 40)
140
- sys.exit(1)
141
-
142
-
143
- def main():
144
- # 检查环境变量
145
- zentao_url = os.environ.get('ZENTAO_URL')
146
- username = os.environ.get('ZENTAO_USERNAME')
147
- password = os.environ.get('ZENTAO_PASSWORD')
148
- uid = os.environ.get('ZENTAO_UID')
149
-
150
- if not all([zentao_url, username, password]):
151
- print("错误: 请设置环境变量 ZENTAO_URL, ZENTAO_USERNAME, ZENTAO_PASSWORD")
152
- print("")
153
- print("Windows示例:")
154
- print(" set ZENTAO_URL=https://your-zentao-url")
155
- print(" set ZENTAO_USERNAME=your-username")
156
- print(" set ZENTAO_PASSWORD=your-password")
157
- print(" python upload-clipboard-image.py")
158
- print("")
159
- print("Mac/Linux示例:")
160
- print(" export ZENTAO_URL=https://your-zentao-url")
161
- print(" export ZENTAO_USERNAME=your-username")
162
- print(" export ZENTAO_PASSWORD=your-password")
163
- print(" python upload-clipboard-image.py")
164
- sys.exit(1)
165
-
166
- # 获取剪贴板图片
167
- img = get_clipboard_image()
168
-
169
- # 转换为 base64
170
- base64_str, img_bytes = image_to_base64(img)
171
- print("✓ 图片已转换为 base64")
172
-
173
- # 创建 img 文件夹
174
- img_dir = Path.cwd() / 'img'
175
- img_dir.mkdir(exist_ok=True)
176
-
177
- # 保存到本地
178
- timestamp = int(datetime.now().timestamp() * 1000)
179
- filename = f"clipboard_{timestamp}.png"
180
- local_path = img_dir / filename
181
-
182
- with open(local_path, 'wb') as f:
183
- f.write(img_bytes)
184
-
185
- print(f"✓ 图片已保存到: {local_path}")
186
-
187
- # 获取 Token
188
- token = get_zentao_token(zentao_url, username, password)
189
-
190
- # 上传到禅道
191
- result = upload_to_zentao(zentao_url, token, img_bytes, filename, uid)
192
- print(f"本地路径: {local_path}")
193
-
194
-
195
- if __name__ == '__main__':
196
- main()
1
+ #!/usr/bin/env python3
2
+ """
3
+ 从剪贴板获取图片并上传到禅道
4
+
5
+ 依赖安装:
6
+ pip install pillow requests
7
+
8
+ 使用方法:
9
+ python upload-clipboard-image.py
10
+
11
+ 环境变量:
12
+ ZENTAO_URL: 禅道系统URL
13
+ ZENTAO_USERNAME: 用户名
14
+ ZENTAO_PASSWORD: 密码
15
+ ZENTAO_UID: 可选的UID参数
16
+ """
17
+
18
+ import os
19
+ import sys
20
+ import hashlib
21
+ import requests
22
+ import base64
23
+ from io import BytesIO
24
+ from pathlib import Path
25
+ from datetime import datetime
26
+
27
+ try:
28
+ from PIL import ImageGrab, Image
29
+ except ImportError:
30
+ print("错误: 请先安装 Pillow 库")
31
+ print("运行: pip install pillow")
32
+ sys.exit(1)
33
+
34
+
35
+ def get_clipboard_image():
36
+ """从剪贴板获取图片"""
37
+ print("正在读取剪贴板图片...")
38
+
39
+ try:
40
+ # 尝试获取剪贴板图片
41
+ img = ImageGrab.grabclipboard()
42
+
43
+ if img is None:
44
+ print("错误: 剪贴板中没有图片")
45
+ sys.exit(1)
46
+
47
+ # 如果是文件路径列表,读取第一个图片文件
48
+ if isinstance(img, list):
49
+ img_path = img[0]
50
+ if os.path.isfile(img_path):
51
+ img = Image.open(img_path)
52
+ else:
53
+ print(f"错误: 无法打开文件 {img_path}")
54
+ sys.exit(1)
55
+
56
+ print(f"✓ 成功读取剪贴板图片 ({img.width}x{img.height})")
57
+ return img
58
+
59
+ except Exception as e:
60
+ print(f"错误: 无法读取剪贴板图片 - {e}")
61
+ sys.exit(1)
62
+
63
+
64
+ def image_to_base64(img):
65
+ """将图片转换为 base64"""
66
+ buffer = BytesIO()
67
+ img.save(buffer, format='PNG')
68
+ img_bytes = buffer.getvalue()
69
+ return base64.b64encode(img_bytes).decode('utf-8'), img_bytes
70
+
71
+
72
+ def get_zentao_token(url, username, password):
73
+ """获取禅道 Token"""
74
+ print("正在连接禅道系统...")
75
+
76
+ # MD5 加密密码
77
+ password_md5 = hashlib.md5(password.encode()).hexdigest()
78
+
79
+ token_url = f"{url}/zentao/api.php/v1/tokens"
80
+ data = {
81
+ "account": username,
82
+ "password": password_md5
83
+ }
84
+
85
+ try:
86
+ response = requests.post(token_url, json=data)
87
+ response.raise_for_status()
88
+ token = response.json().get('token')
89
+
90
+ if not token:
91
+ print("错误: 无法获取 Token")
92
+ sys.exit(1)
93
+
94
+ print("✓ 成功获取 Token")
95
+ return token
96
+
97
+ except requests.exceptions.RequestException as e:
98
+ print(f"错误: 无法连接禅道系统 - {e}")
99
+ sys.exit(1)
100
+
101
+
102
+ def upload_to_zentao(url, token, img_bytes, filename, uid=None):
103
+ """上传图片到禅道"""
104
+ print("正在上传到禅道...")
105
+
106
+ upload_url = f"{url}/zentao/api.php/v1/files"
107
+ if uid:
108
+ upload_url += f"?uid={uid}"
109
+
110
+ headers = {
111
+ "Token": token
112
+ }
113
+
114
+ files = {
115
+ 'imgFile': (filename, img_bytes, 'image/png')
116
+ }
117
+
118
+ try:
119
+ response = requests.post(upload_url, headers=headers, files=files)
120
+ response.raise_for_status()
121
+ result = response.json()
122
+
123
+ print("")
124
+ print("=" * 40)
125
+ print("✓ 上传成功!")
126
+ print("=" * 40)
127
+ print(f"文件ID: {result.get('id')}")
128
+ print(f"访问URL: {result.get('url')}")
129
+ print("=" * 40)
130
+
131
+ return result
132
+
133
+ except requests.exceptions.RequestException as e:
134
+ print("")
135
+ print("=" * 40)
136
+ print("✗ 上传失败")
137
+ print("=" * 40)
138
+ print(f"错误信息: {e}")
139
+ print("=" * 40)
140
+ sys.exit(1)
141
+
142
+
143
+ def main():
144
+ # 检查环境变量
145
+ zentao_url = os.environ.get('ZENTAO_URL')
146
+ username = os.environ.get('ZENTAO_USERNAME')
147
+ password = os.environ.get('ZENTAO_PASSWORD')
148
+ uid = os.environ.get('ZENTAO_UID')
149
+
150
+ if not all([zentao_url, username, password]):
151
+ print("错误: 请设置环境变量 ZENTAO_URL, ZENTAO_USERNAME, ZENTAO_PASSWORD")
152
+ print("")
153
+ print("Windows示例:")
154
+ print(" set ZENTAO_URL=https://your-zentao-url")
155
+ print(" set ZENTAO_USERNAME=your-username")
156
+ print(" set ZENTAO_PASSWORD=your-password")
157
+ print(" python upload-clipboard-image.py")
158
+ print("")
159
+ print("Mac/Linux示例:")
160
+ print(" export ZENTAO_URL=https://your-zentao-url")
161
+ print(" export ZENTAO_USERNAME=your-username")
162
+ print(" export ZENTAO_PASSWORD=your-password")
163
+ print(" python upload-clipboard-image.py")
164
+ sys.exit(1)
165
+
166
+ # 获取剪贴板图片
167
+ img = get_clipboard_image()
168
+
169
+ # 转换为 base64
170
+ base64_str, img_bytes = image_to_base64(img)
171
+ print("✓ 图片已转换为 base64")
172
+
173
+ # 创建 img 文件夹
174
+ img_dir = Path.cwd() / 'img'
175
+ img_dir.mkdir(exist_ok=True)
176
+
177
+ # 保存到本地
178
+ timestamp = int(datetime.now().timestamp() * 1000)
179
+ filename = f"clipboard_{timestamp}.png"
180
+ local_path = img_dir / filename
181
+
182
+ with open(local_path, 'wb') as f:
183
+ f.write(img_bytes)
184
+
185
+ print(f"✓ 图片已保存到: {local_path}")
186
+
187
+ # 获取 Token
188
+ token = get_zentao_token(zentao_url, username, password)
189
+
190
+ # 上传到禅道
191
+ result = upload_to_zentao(zentao_url, token, img_bytes, filename, uid)
192
+ print(f"本地路径: {local_path}")
193
+
194
+
195
+ if __name__ == '__main__':
196
+ main()
@@ -1,41 +1,41 @@
1
- @echo off
2
- REM ========================================
3
- REM 剪贴板图片上传到禅道 - 配置示例
4
- REM ========================================
5
- REM
6
- REM 使用方法:
7
- REM 1. 复制此文件为 upload.bat
8
- REM 2. 修改下面的配置信息
9
- REM 3. 双击运行或在命令行运行
10
- REM
11
-
12
- REM ========================================
13
- REM 配置区域 - 请修改为你的禅道信息
14
- REM ========================================
15
-
16
- set ZENTAO_URL=https://your-zentao-url
17
- set ZENTAO_USERNAME=your-username
18
- set ZENTAO_PASSWORD=your-password
19
- set ZENTAO_UID=
20
-
21
- REM ========================================
22
- REM 选择上传方式
23
- REM ========================================
24
-
25
- REM 方式1: 使用 Node.js (推荐)
26
- node "%~dp0upload-clipboard-image.js"
27
-
28
- REM 方式2: 使用 PowerShell (Windows)
29
- REM powershell -ExecutionPolicy Bypass -File "%~dp0upload-clipboard-image.ps1" ^
30
- REM -ZentaoUrl "%ZENTAO_URL%" ^
31
- REM -Username "%ZENTAO_USERNAME%" ^
32
- REM -Password "%ZENTAO_PASSWORD%" ^
33
- REM -Uid "%ZENTAO_UID%"
34
-
35
- REM 方式3: 使用 Python
36
- REM python "%~dp0upload-clipboard-image.py"
37
-
38
- REM ========================================
39
- REM 按任意键退出
40
- REM ========================================
41
- pause
1
+ @echo off
2
+ REM ========================================
3
+ REM 剪贴板图片上传到禅道 - 配置示例
4
+ REM ========================================
5
+ REM
6
+ REM 使用方法:
7
+ REM 1. 复制此文件为 upload.bat
8
+ REM 2. 修改下面的配置信息
9
+ REM 3. 双击运行或在命令行运行
10
+ REM
11
+
12
+ REM ========================================
13
+ REM 配置区域 - 请修改为你的禅道信息
14
+ REM ========================================
15
+
16
+ set ZENTAO_URL=https://your-zentao-url
17
+ set ZENTAO_USERNAME=your-username
18
+ set ZENTAO_PASSWORD=your-password
19
+ set ZENTAO_UID=
20
+
21
+ REM ========================================
22
+ REM 选择上传方式
23
+ REM ========================================
24
+
25
+ REM 方式1: 使用 Node.js (推荐)
26
+ node "%~dp0upload-clipboard-image.js"
27
+
28
+ REM 方式2: 使用 PowerShell (Windows)
29
+ REM powershell -ExecutionPolicy Bypass -File "%~dp0upload-clipboard-image.ps1" ^
30
+ REM -ZentaoUrl "%ZENTAO_URL%" ^
31
+ REM -Username "%ZENTAO_USERNAME%" ^
32
+ REM -Password "%ZENTAO_PASSWORD%" ^
33
+ REM -Uid "%ZENTAO_UID%"
34
+
35
+ REM 方式3: 使用 Python
36
+ REM python "%~dp0upload-clipboard-image.py"
37
+
38
+ REM ========================================
39
+ REM 按任意键退出
40
+ REM ========================================
41
+ pause