@zzp123/mcp-zentao 1.2.2 → 1.3.1

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.
@@ -0,0 +1,128 @@
1
+ # 从剪贴板获取图片并上传到禅道
2
+ # 使用方法: .\upload-clipboard-image.ps1
3
+ #
4
+ # 参数:
5
+ # -ZentaoUrl: 禅道系统URL
6
+ # -Username: 用户名
7
+ # -Password: 密码
8
+ # -Uid: 可选的UID参数
9
+
10
+ param(
11
+ [Parameter(Mandatory=$true)]
12
+ [string]$ZentaoUrl,
13
+
14
+ [Parameter(Mandatory=$true)]
15
+ [string]$Username,
16
+
17
+ [Parameter(Mandatory=$true)]
18
+ [string]$Password,
19
+
20
+ [Parameter(Mandatory=$false)]
21
+ [string]$Uid = ""
22
+ )
23
+
24
+ # 添加必要的程序集
25
+ Add-Type -AssemblyName System.Windows.Forms
26
+ Add-Type -AssemblyName System.Drawing
27
+
28
+ Write-Host "正在读取剪贴板图片..." -ForegroundColor Cyan
29
+
30
+ # 从剪贴板获取图片
31
+ $img = [System.Windows.Forms.Clipboard]::GetImage()
32
+
33
+ if ($img -eq $null) {
34
+ Write-Host "错误: 剪贴板中没有图片" -ForegroundColor Red
35
+ exit 1
36
+ }
37
+
38
+ Write-Host "✓ 成功读取剪贴板图片 ($($img.Width)x$($img.Height))" -ForegroundColor Green
39
+
40
+ # 转换为 base64
41
+ $ms = New-Object System.IO.MemoryStream
42
+ $img.Save($ms, [System.Drawing.Imaging.ImageFormat]::Png)
43
+ $base64 = [Convert]::ToBase64String($ms.ToArray())
44
+ $ms.Close()
45
+
46
+ Write-Host "✓ 图片已转换为 base64" -ForegroundColor Green
47
+
48
+ # 创建 img 文件夹
49
+ $imgDir = Join-Path (Get-Location) "img"
50
+ if (-not (Test-Path $imgDir)) {
51
+ New-Item -ItemType Directory -Path $imgDir | Out-Null
52
+ Write-Host "✓ 创建 img 文件夹: $imgDir" -ForegroundColor Green
53
+ }
54
+
55
+ # 保存到本地
56
+ $filename = "clipboard_$([DateTimeOffset]::Now.ToUnixTimeMilliseconds()).png"
57
+ $localPath = Join-Path $imgDir $filename
58
+ $bytes = [Convert]::FromBase64String($base64)
59
+ [System.IO.File]::WriteAllBytes($localPath, $bytes)
60
+ Write-Host "✓ 图片已保存到: $localPath" -ForegroundColor Green
61
+
62
+ # 获取 Token
63
+ Write-Host "正在连接禅道系统..." -ForegroundColor Cyan
64
+ $passwordMd5 = [System.BitConverter]::ToString(
65
+ [System.Security.Cryptography.MD5]::Create().ComputeHash(
66
+ [System.Text.Encoding]::UTF8.GetBytes($Password)
67
+ )
68
+ ).Replace("-", "").ToLower()
69
+
70
+ $tokenUrl = "$ZentaoUrl/zentao/api.php/v1/tokens"
71
+ $tokenBody = @{
72
+ account = $Username
73
+ password = $passwordMd5
74
+ } | ConvertTo-Json
75
+
76
+ try {
77
+ $tokenResponse = Invoke-RestMethod -Uri $tokenUrl -Method Post -Body $tokenBody -ContentType "application/json"
78
+ $token = $tokenResponse.token
79
+ Write-Host "✓ 成功获取 Token" -ForegroundColor Green
80
+ } catch {
81
+ Write-Host "错误: 无法获取 Token - $($_.Exception.Message)" -ForegroundColor Red
82
+ exit 1
83
+ }
84
+
85
+ # 上传文件
86
+ Write-Host "正在上传到禅道..." -ForegroundColor Cyan
87
+
88
+ $uploadUrl = "$ZentaoUrl/zentao/api.php/v1/files"
89
+ if ($Uid) {
90
+ $uploadUrl += "?uid=$Uid"
91
+ }
92
+
93
+ # 创建 multipart/form-data
94
+ $boundary = [System.Guid]::NewGuid().ToString()
95
+ $LF = "`r`n"
96
+
97
+ $bodyLines = (
98
+ "--$boundary",
99
+ "Content-Disposition: form-data; name=`"imgFile`"; filename=`"$filename`"",
100
+ "Content-Type: image/png$LF",
101
+ [System.Text.Encoding]::GetEncoding("iso-8859-1").GetString($bytes),
102
+ "--$boundary--$LF"
103
+ ) -join $LF
104
+
105
+ try {
106
+ $response = Invoke-RestMethod -Uri $uploadUrl -Method Post `
107
+ -Headers @{ Token = $token } `
108
+ -ContentType "multipart/form-data; boundary=$boundary" `
109
+ -Body $bodyLines
110
+
111
+ Write-Host ""
112
+ Write-Host "========================================" -ForegroundColor Green
113
+ Write-Host "✓ 上传成功!" -ForegroundColor Green
114
+ Write-Host "========================================" -ForegroundColor Green
115
+ Write-Host "文件ID: $($response.id)"
116
+ Write-Host "访问URL: $($response.url)"
117
+ Write-Host "本地路径: $localPath"
118
+ Write-Host "========================================" -ForegroundColor Green
119
+
120
+ } catch {
121
+ Write-Host ""
122
+ Write-Host "========================================" -ForegroundColor Red
123
+ Write-Host "✗ 上传失败" -ForegroundColor Red
124
+ Write-Host "========================================" -ForegroundColor Red
125
+ Write-Host "错误信息: $($_.Exception.Message)" -ForegroundColor Red
126
+ Write-Host "========================================" -ForegroundColor Red
127
+ exit 1
128
+ }
@@ -0,0 +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()
@@ -0,0 +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