Compare commits

1 Commits
Author SHA1 Message Date
Your Name 8309e6a657 save 2026-03-13 03:21:38 +00:00
6 changed files with 201 additions and 12 deletions
+4
View File
@@ -4,3 +4,7 @@ INFO: Started server process [9669]
INFO: Waiting for application startup. INFO: Waiting for application startup.
INFO: Application startup complete. INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:12222 (Press CTRL+C to quit) INFO: Uvicorn running on http://0.0.0.0:12222 (Press CTRL+C to quit)
静态文件目录: /root/change_cloth_server/change2/static
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Fed977afcf238470ca7418061517bcd14.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730545&Signature=CAO%2B7BQg22JrmiSJ%2B%2FqiZPPaJV8%3D
INFO: 127.0.0.1:34020 - "POST /try-on HTTP/1.1" 200 OK
+34 -6
View File
@@ -11,12 +11,18 @@ import base64
import io import io
import json import json
import os import os
import sys
import tempfile import tempfile
import time import time
import uuid import uuid
from pathlib import Path from pathlib import Path
# 添加父目录到路径以导入config
sys.path.insert(0, str(Path(__file__).parent.parent))
import config
import httpx import httpx
from PIL import Image
from fastapi import FastAPI, HTTPException from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import FileResponse from fastapi.responses import FileResponse
@@ -208,12 +214,34 @@ async def try_on(req: TryOnRequest):
async with httpx.AsyncClient(timeout=30.0) as dl_client: async with httpx.AsyncClient(timeout=30.0) as dl_client:
result_bytes = await fetch_image_bytes(dl_client, filename, subfolder, type_) result_bytes = await fetch_image_bytes(dl_client, filename, subfolder, type_)
# 将图片保存到临时文件,上传到 OSS # 根据配置转换图片格式并上传到 OSS
suffix = Path(filename).suffix or ".png" output_format = config.OUTPUT_FORMAT.lower()
object_name = f"tryon/{uuid.uuid4().hex}{suffix}" file_ext = '.jpg' if output_format == 'jpg' else '.png'
with tempfile.NamedTemporaryFile(suffix=suffix, delete=False) as tmp: object_name = f"tryon/{uuid.uuid4().hex}{file_ext}"
tmp.write(result_bytes)
tmp_path = tmp.name # 使用PIL处理图片
img = Image.open(io.BytesIO(result_bytes))
if output_format == 'jpg':
# JPG格式:转换为RGB模式
if img.mode in ('RGBA', 'LA', 'P'):
rgb_img = Image.new('RGB', img.size, (255, 255, 255))
if img.mode == 'P':
img = img.convert('RGBA')
rgb_img.paste(img, mask=img.split()[-1] if img.mode in ('RGBA', 'LA') else None)
img = rgb_img
elif img.mode != 'RGB':
img = img.convert('RGB')
# 保存为JPG
with tempfile.NamedTemporaryFile(suffix='.jpg', delete=False) as tmp:
img.save(tmp, format='JPEG', quality=config.JPG_QUALITY)
tmp_path = tmp.name
else:
# PNG格式:保持原样
with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmp:
img.save(tmp, format='PNG')
tmp_path = tmp.name
try: try:
result_url = upload_to_oss(tmp_path, object_name) result_url = upload_to_oss(tmp_path, object_name)
+87
View File
@@ -8,3 +8,90 @@ INFO: Uvicorn running on http://0.0.0.0:12223 (Press CTRL+C to quit)
接收到换装请求,正在处理... 接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F627bcee434384a7b847faf2dbbce90ae.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730306&Signature=aATPXbjJCE3ArJnYfRyvSVSI8EE%3D 文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F627bcee434384a7b847faf2dbbce90ae.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730306&Signature=aATPXbjJCE3ArJnYfRyvSVSI8EE%3D
INFO: 127.0.0.1:39178 - "POST /try-on HTTP/1.1" 200 OK INFO: 127.0.0.1:39178 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F6b801985147c47e48a6ad89b4c0cd38d.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730384&Signature=PL28YpFYPBBTSkctaxdvQu%2F%2FefQ%3D
INFO: 127.0.0.1:44510 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Fba82fba2546a4db494b57afe11b7a94e.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730474&Signature=6nEr1IdPNILxYlOq5A0HhwThgB4%3D
INFO: 127.0.0.1:58438 - "POST /try-on HTTP/1.1" 200 OK
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Fdef87868715448de972942060caeb7ff.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730502&Signature=lSklN83c3u5nFYmvUIrWkho0JmA%3D
INFO: 127.0.0.1:40984 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F48012034e9ec4fbcbc301bde9ea2833c.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730617&Signature=fcu%2BZDgr033DQojMCQj6h4gnds4%3D
INFO: 127.0.0.1:60844 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F081b8dfef8354b1c99e4e4ee11331292.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730641&Signature=gfdUA13vEyxRLdS%2BuxL%2FIKIntbU%3D
INFO: 127.0.0.1:45998 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Ff60f41ea7cf6433ca231ff20f5b30e23.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730672&Signature=GU0ILZWnxUaNDJQ3iWdlqTdQJfk%3D
INFO: 127.0.0.1:41238 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F9f09e890bc2e4575aca8d393c9abba7a.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730696&Signature=PXS1wcx709%2FTZ%2Bxivv665u3UqFs%3D
INFO: 127.0.0.1:55808 - "POST /try-on HTTP/1.1" 200 OK
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F9df0b0ad8722441fa935ff7fe8fb1e75.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730727&Signature=E%2BFspFCXNNWPC4bJ7AwG99sQCVA%3D
INFO: 127.0.0.1:55810 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Fec3e4af4c75945109f42047f87951c89.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730758&Signature=XaCCU2X2RlBHl9PYqcJ2rXEIZpI%3D
INFO: 127.0.0.1:55908 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F56324fe2dd0a40a3bf54150c147c3aea.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730789&Signature=e2VXdJK9m6cDqW18RkLTVEfOtV8%3D
INFO: 127.0.0.1:40940 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F099d57b365444a4e8ac36052d99d387d.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730819&Signature=FgIniNm8joNa0TK1WsEa7D2u%2BNU%3D
INFO: 127.0.0.1:49448 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F7c8cfa4ac1214d84843589e8ea255bcf.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730850&Signature=2goSdjNp7haPHXS%2BJ%2BAlLaFCR4Y%3D
INFO: 127.0.0.1:51658 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F64264e7412c0456b845ae8b7d6be49c7.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730881&Signature=JEjE%2FqkQgQkdjy4yU%2BUG%2F6TLHAM%3D
INFO: 127.0.0.1:52690 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Fbffee82977644843af3f8934a4dfc6f6.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730912&Signature=M8yFTC4HzUdialZSniwqJhxVDX8%3D
INFO: 127.0.0.1:52570 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F175eceeea0294f23883ced29955d8c24.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730943&Signature=G8KPeNFe0cc02jW5LUsainkwY4s%3D
INFO: 127.0.0.1:32838 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Fceb407de7f7c48ccb35bf220aa3b974d.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088730973&Signature=%2FQZVQVZ%2BJcvYkIf3ikTOIL6jmNY%3D
INFO: 127.0.0.1:59962 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F26ea45ae412842a6ab681d836625c4da.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731004&Signature=rvipO3wVQ3202yRWOeiOJNY28Dg%3D
INFO: 127.0.0.1:40790 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F8fb321a9a86b49c3a2386f04b6874e6f.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731030&Signature=1TS3LGwQa3vZ8YHQBMl7wu62vTc%3D
INFO: 127.0.0.1:35550 - "POST /try-on HTTP/1.1" 200 OK
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F61e5865a46d649409ca6e34111aeb644.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731059&Signature=lbstfeJxP8zjiSiMY6gQBz4zajw%3D
INFO: 127.0.0.1:39236 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F5fda63d3db4b4d368cdf749ff6f53f09.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731090&Signature=6fFxh9tL2ks8jaDVgeT3rlZzbBQ%3D
INFO: 127.0.0.1:40194 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Ff4ab353137fc40f5874674df347a1c49.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731120&Signature=W8RQMPZgm8c4R4es8MPKkAulgxM%3D
INFO: 127.0.0.1:38234 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F2ec4c18d401245fc980645fd4847080b.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731151&Signature=OlnjmSM4nIKux7tApMTKkK%2FSbFY%3D
INFO: 127.0.0.1:43854 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F21c7139693994b3f83233dccb138dd6d.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731184&Signature=KQgU2K1IcmInb7XVnYO335q9IVk%3D
INFO: 127.0.0.1:56958 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F01b2301697624f1189aa86faca8a77f7.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731217&Signature=zuwm%2Bp2NGTJc4jC0k4qZyT583S0%3D
INFO: 127.0.0.1:45370 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Ffe17b4da3615421a90e4221e8eea46b4.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731248&Signature=9coHZI%2F3IEJCoERdMOq5CVTatNw%3D
INFO: 127.0.0.1:43270 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2Fbd9cc49fb54d4c51a910b63eedea1502.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731279&Signature=aACepaPGN0zeXDigrzRUN%2BCItlQ%3D
INFO: 127.0.0.1:33848 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F4814bf67eeac46dbbfc2b4b79c0f2adb.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731369&Signature=XksUlhVY7ii8jevDLvg9n8qNXhg%3D
INFO: 127.0.0.1:42736 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F0ea64d04225941e583493149e2e662ad.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731580&Signature=xTTQsyRZXx5kddb1C4j%2FEDAVyko%3D
INFO: 127.0.0.1:60680 - "POST /try-on HTTP/1.1" 200 OK
接收到换装请求,正在处理...
文件上传成功,URL: http://xiangsilian.oss-cn-beijing.aliyuncs.com/tryon%2F08deeffce6c74498952b8202d2763340.png?OSSAccessKeyId=LTAI5tGp1sLzedqxihcNC1eb&Expires=2088731705&Signature=EYVRhvk4zecJIwxqTybdATVpKLI%3D
INFO: 127.0.0.1:46922 - "POST /try-on HTTP/1.1" 200 OK
+34 -6
View File
@@ -11,13 +11,19 @@ import base64
import io import io
import json import json
import os import os
import sys
import tempfile import tempfile
import time import time
import uuid import uuid
from pathlib import Path from pathlib import Path
# 添加父目录到路径以导入config
sys.path.insert(0, str(Path(__file__).parent.parent))
import config
import httpx import httpx
import oss2 import oss2
from PIL import Image
from fastapi import FastAPI, HTTPException from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import FileResponse from fastapi.responses import FileResponse
@@ -201,12 +207,34 @@ async def try_on(req: TryOnRequest):
async with httpx.AsyncClient(timeout=30.0) as dl_client: async with httpx.AsyncClient(timeout=30.0) as dl_client:
result_bytes = await fetch_image_bytes(dl_client, filename, subfolder, type_) result_bytes = await fetch_image_bytes(dl_client, filename, subfolder, type_)
# 将图片保存到临时文件,上传到 OSS # 根据配置转换图片格式并上传到 OSS
suffix = Path(filename).suffix or ".png" output_format = config.OUTPUT_FORMAT.lower()
object_name = f"tryon/{uuid.uuid4().hex}{suffix}" file_ext = '.jpg' if output_format == 'jpg' else '.png'
with tempfile.NamedTemporaryFile(suffix=suffix, delete=False) as tmp: object_name = f"tryon/{uuid.uuid4().hex}{file_ext}"
tmp.write(result_bytes)
tmp_path = tmp.name # 使用PIL处理图片
img = Image.open(io.BytesIO(result_bytes))
if output_format == 'jpg':
# JPG格式:转换为RGB模式
if img.mode in ('RGBA', 'LA', 'P'):
rgb_img = Image.new('RGB', img.size, (255, 255, 255))
if img.mode == 'P':
img = img.convert('RGBA')
rgb_img.paste(img, mask=img.split()[-1] if img.mode in ('RGBA', 'LA') else None)
img = rgb_img
elif img.mode != 'RGB':
img = img.convert('RGB')
# 保存为JPG
with tempfile.NamedTemporaryFile(suffix='.jpg', delete=False) as tmp:
img.save(tmp, format='JPEG', quality=config.JPG_QUALITY)
tmp_path = tmp.name
else:
# PNG格式:保持原样
with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmp:
img.save(tmp, format='PNG')
tmp_path = tmp.name
try: try:
result_url = upload_to_oss(tmp_path, object_name) result_url = upload_to_oss(tmp_path, object_name)
+9
View File
@@ -0,0 +1,9 @@
"""
换装服务配置文件
"""
# 输出图片格式:'jpg' 或 'png'
OUTPUT_FORMAT = 'jpg'
# JPG压缩质量 (1-100),仅在OUTPUT_FORMAT='jpg'时生效
JPG_QUALITY = 85
+33
View File
@@ -8,3 +8,36 @@
* Running on http://10.60.190.115:28888 * Running on http://10.60.190.115:28888
Press CTRL+C to quit Press CTRL+C to quit
1.202.76.38 - - [13/Mar/2026 02:51:46] "POST /change_cloth_base64 HTTP/1.1" 200 - 1.202.76.38 - - [13/Mar/2026 02:51:46] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:53:04] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:53:59] "GET /static/index.html HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:53:59] "GET /favicon.ico HTTP/1.1" 404 -
113.65.31.176 - - [13/Mar/2026 02:54:34] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:55:02] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:55:45] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:56:57] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:57:21] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:57:52] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:58:16] "POST /change_cloth_base64 HTTP/1.1" 200 -
180.163.30.27 - - [13/Mar/2026 02:58:21] "GET / HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:58:47] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:59:18] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 02:59:49] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:00:19] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:00:50] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:01:21] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:01:52] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:02:23] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:02:53] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:03:24] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:03:50] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:04:19] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:04:50] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:05:20] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:05:51] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:06:24] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:06:57] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:07:28] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:07:59] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:09:29] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:13:00] "POST /change_cloth_base64 HTTP/1.1" 200 -
113.65.31.176 - - [13/Mar/2026 03:15:05] "POST /change_cloth_base64 HTTP/1.1" 200 -