save code

This commit is contained in:
Your Name
2026-03-19 23:51:21 +08:00
parent 71221ce1e3
commit 7e89edaa47
11 changed files with 1906 additions and 3 deletions
+411
View File
@@ -0,0 +1,411 @@
{
"1": {
"inputs": {
"samples": [
"22",
0
],
"vae": [
"13",
0
]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE解码"
}
},
"2": {
"inputs": {
"to_ref": true,
"ref_main_image": true,
"ref_longest_edge": [
"20",
0
],
"ref_crop": "center",
"ref_upscale": "lanczos",
"to_vl": true,
"vl_resize": true,
"vl_target_size": 384,
"vl_crop": "disabled",
"vl_upscale": "bicubic",
"image": [
"10",
0
],
"configs": [
"8",
0
]
},
"class_type": "QwenEditConfigPreparer",
"_meta": {
"title": "Qwen Edit Config Preparer"
}
},
"7": {
"inputs": {
"custom_output": [
"15",
2
]
},
"class_type": "QwenEditOutputExtractor",
"_meta": {
"title": "Qwen Edit Output Extractor"
}
},
"8": {
"inputs": {
"to_ref": true,
"ref_main_image": true,
"ref_longest_edge": [
"9",
0
],
"ref_crop": "center",
"ref_upscale": "lanczos",
"to_vl": true,
"vl_resize": true,
"vl_target_size": 384,
"vl_crop": "disabled",
"vl_upscale": "bicubic",
"image": [
"11",
0
]
},
"class_type": "QwenEditConfigPreparer",
"_meta": {
"title": "Qwen Edit Config Preparer"
}
},
"9": {
"inputs": {
"max_size": [
"25",
0
],
"image": [
"11",
0
]
},
"class_type": "QwenEditAdaptiveLongestEdge",
"_meta": {
"title": "Qwen Edit Adaptive Longest Edge"
}
},
"10": {
"inputs": {
"image": "cq5dam.web.hE7E3DA.1800.1800 - 2024-04-29T161212.795.jpg"
},
"class_type": "LoadImage",
"_meta": {
"title": "加载图像"
}
},
"11": {
"inputs": {
"image": "cq5dam.web.hE7E3DA.1800.1800 - 2024-04-29T161206.244.jpg"
},
"class_type": "LoadImage",
"_meta": {
"title": "加载图像"
}
},
"13": {
"inputs": {
"vae_name": "qwen_image_vae.safetensors"
},
"class_type": "VAELoader",
"_meta": {
"title": "加载VAE"
}
},
"14": {
"inputs": {
"prompt": "",
"return_full_refs_cond": true,
"instruction": "Describe the key features of the input image (color, shape, size, texture, objects, background), then explain how the user's text instruction should alter or modify the image. Generate a new image that meets the user's requirements while maintaining consistency with the original input where appropriate.",
"clip": [
"38",
0
],
"vae": [
"13",
0
],
"configs": [
"2",
0
]
},
"class_type": "TextEncodeQwenImageEditPlusCustom_lrzjason",
"_meta": {
"title": "TextEncodeQwenImageEditPlusCustom lrzjason"
}
},
"15": {
"inputs": {
"prompt": [
"31",
0
],
"return_full_refs_cond": true,
"instruction": "Describe the key features of the input image (color, shape, size, texture, objects, background), then explain how the user's text instruction should alter or modify the image. Generate a new image that meets the user's requirements while maintaining consistency with the original input where appropriate.",
"clip": [
"38",
0
],
"vae": [
"13",
0
],
"configs": [
"2",
0
]
},
"class_type": "TextEncodeQwenImageEditPlusCustom_lrzjason",
"_meta": {
"title": "TextEncodeQwenImageEditPlusCustom lrzjason"
}
},
"16": {
"inputs": {
"gguf_name": "FireRed-Image-Edit-1.1-Q4_0.gguf"
},
"class_type": "LoaderGGUF",
"_meta": {
"title": "GGUF Loader"
}
},
"17": {
"inputs": {
"lora_name": "FireRed-Image-Edit-1.0-Lightning-8steps-v1.0.safetensors",
"strength_model": 1,
"model": [
"16",
0
]
},
"class_type": "LoraLoaderModelOnly",
"_meta": {
"title": "LoRA加载器(仅模型)"
}
},
"19": {
"inputs": {
"image": [
"1",
0
],
"pad_info": [
"7",
0
]
},
"class_type": "CropWithPadInfo",
"_meta": {
"title": "Crop With Pad Info"
}
},
"20": {
"inputs": {
"max_size": [
"25",
0
],
"image": [
"10",
0
]
},
"class_type": "QwenEditAdaptiveLongestEdge",
"_meta": {
"title": "Qwen Edit Adaptive Longest Edge"
}
},
"21": {
"inputs": {
"samples1": [
"15",
1
],
"samples2": [
"14",
1
]
},
"class_type": "LatentAdd",
"_meta": {
"title": "Latent相加"
}
},
"22": {
"inputs": {
"seed": 1121572473225362,
"steps": 8,
"cfg": 1,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1,
"model": [
"17",
0
],
"positive": [
"15",
0
],
"negative": [
"14",
0
],
"latent_image": [
"28",
0
]
},
"class_type": "KSampler",
"_meta": {
"title": "K采样器"
}
},
"25": {
"inputs": {
"Number": "1300"
},
"class_type": "Int",
"_meta": {
"title": "Int"
}
},
"28": {
"inputs": {
"upscale_method": "nearest-exact",
"width": [
"29",
0
],
"height": [
"30",
0
],
"crop": "disabled",
"samples": [
"21",
0
]
},
"class_type": "LatentUpscale",
"_meta": {
"title": "缩放Latent"
}
},
"29": {
"inputs": {
"Number": "768"
},
"class_type": "Int",
"_meta": {
"title": "Int"
}
},
"30": {
"inputs": {
"Number": "1024"
},
"class_type": "Int",
"_meta": {
"title": "Int"
}
},
"31": {
"inputs": {
"value": "图1的背景改成深灰色。并穿上图2的上衣和短裤。保持图1人物的姿势,人脸,配饰不变,构图不变。"
},
"class_type": "PrimitiveStringMultiline",
"_meta": {
"title": "字符串(多行)"
}
},
"32": {
"inputs": {
"upscale_method": "nearest-exact",
"width": [
"29",
0
],
"height": [
"30",
0
],
"crop": "center",
"image": [
"19",
0
]
},
"class_type": "ImageScale",
"_meta": {
"title": "缩放图像"
}
},
"33": {
"inputs": {
"filename_prefix": "ComfyUI",
"images": [
"32",
0
]
},
"class_type": "SaveImage",
"_meta": {
"title": "保存图像"
}
},
"36": {
"inputs": {
"rgthree_comparer": {
"images": [
{
"name": "A",
"selected": true,
"url": "/api/view?filename=rgthree.compare._temp_olfct_00001_.png&type=temp&subfolder=&rand=0.5054960464066687"
},
{
"name": "B",
"selected": true,
"url": "/api/view?filename=rgthree.compare._temp_olfct_00002_.png&type=temp&subfolder=&rand=0.03696578228441516"
}
]
},
"image_a": [
"32",
0
],
"image_b": [
"11",
0
]
},
"class_type": "Image Comparer (rgthree)",
"_meta": {
"title": "Image Comparer (rgthree)"
}
},
"38": {
"inputs": {
"clip_name": "qwen_2.5_vl_7b_fp8_scaled.safetensors",
"type": "qwen_image",
"device": "default"
},
"class_type": "CLIPLoader",
"_meta": {
"title": "加载CLIP"
}
}
}
+3 -1
View File
@@ -28,7 +28,9 @@ import oss2
COMFYUI_URL = "http://127.0.0.1:8188"
# COMFYUI_URL = "http://117.50.80.187:47697"
WORKFLOW_PATH = Path(__file__).parent / "change2_1_ex.json"
# WORKFLOW_PATH = Path(__file__).parent / "change2_1_ex.json"
WORKFLOW_PATH = Path(__file__).parent / "change_fast2.json"
# 节点 ID 映射
NODE_MODEL = "11" # 模特
+465
View File
@@ -0,0 +1,465 @@
{
"1": {
"inputs": {
"samples": [
"22",
0
],
"vae": [
"13",
0
]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE解码"
}
},
"2": {
"inputs": {
"to_ref": true,
"ref_main_image": true,
"ref_longest_edge": [
"20",
0
],
"ref_crop": "center",
"ref_upscale": "lanczos",
"to_vl": true,
"vl_resize": true,
"vl_target_size": 384,
"vl_crop": "disabled",
"vl_upscale": "bicubic",
"image": [
"10",
0
],
"configs": [
"8",
0
]
},
"class_type": "QwenEditConfigPreparer",
"_meta": {
"title": "Qwen Edit Config Preparer"
}
},
"3": {
"inputs": {
"max_size": [
"25",
0
],
"image": [
"4",
0
]
},
"class_type": "QwenEditAdaptiveLongestEdge",
"_meta": {
"title": "Qwen Edit Adaptive Longest Edge"
}
},
"4": {
"inputs": {
"image": "70474cfbc4f51e083610b18f441396db.jpg"
},
"class_type": "LoadImage",
"_meta": {
"title": "加载图像"
}
},
"5": {
"inputs": {
"to_ref": true,
"ref_main_image": true,
"ref_longest_edge": [
"3",
0
],
"ref_crop": "center",
"ref_upscale": "lanczos",
"to_vl": true,
"vl_resize": true,
"vl_target_size": 384,
"vl_crop": "disabled",
"vl_upscale": "bicubic",
"image": [
"4",
0
],
"configs": [
"2",
0
]
},
"class_type": "QwenEditConfigPreparer",
"_meta": {
"title": "Qwen Edit Config Preparer"
}
},
"7": {
"inputs": {
"custom_output": [
"15",
2
]
},
"class_type": "QwenEditOutputExtractor",
"_meta": {
"title": "Qwen Edit Output Extractor"
}
},
"8": {
"inputs": {
"to_ref": true,
"ref_main_image": true,
"ref_longest_edge": [
"9",
0
],
"ref_crop": "center",
"ref_upscale": "lanczos",
"to_vl": true,
"vl_resize": true,
"vl_target_size": 384,
"vl_crop": "disabled",
"vl_upscale": "bicubic",
"image": [
"11",
0
]
},
"class_type": "QwenEditConfigPreparer",
"_meta": {
"title": "Qwen Edit Config Preparer"
}
},
"9": {
"inputs": {
"max_size": [
"25",
0
],
"image": [
"11",
0
]
},
"class_type": "QwenEditAdaptiveLongestEdge",
"_meta": {
"title": "Qwen Edit Adaptive Longest Edge"
}
},
"10": {
"inputs": {
"image": "cq5dam.web.hE7E3DA.1800.1800 - 2024-04-29T161212.795.jpg"
},
"class_type": "LoadImage",
"_meta": {
"title": "加载图像"
}
},
"11": {
"inputs": {
"image": "cq5dam.web.hE7E3DA.1800.1800 - 2024-04-29T161206.244.jpg"
},
"class_type": "LoadImage",
"_meta": {
"title": "加载图像"
}
},
"13": {
"inputs": {
"vae_name": "qwen_image_vae.safetensors"
},
"class_type": "VAELoader",
"_meta": {
"title": "加载VAE"
}
},
"14": {
"inputs": {
"prompt": "",
"return_full_refs_cond": true,
"instruction": "Describe the key features of the input image (color, shape, size, texture, objects, background), then explain how the user's text instruction should alter or modify the image. Generate a new image that meets the user's requirements while maintaining consistency with the original input where appropriate.",
"clip": [
"38",
0
],
"vae": [
"13",
0
],
"configs": [
"5",
0
]
},
"class_type": "TextEncodeQwenImageEditPlusCustom_lrzjason",
"_meta": {
"title": "TextEncodeQwenImageEditPlusCustom lrzjason"
}
},
"15": {
"inputs": {
"prompt": [
"31",
0
],
"return_full_refs_cond": true,
"instruction": "Describe the key features of the input image (color, shape, size, texture, objects, background), then explain how the user's text instruction should alter or modify the image. Generate a new image that meets the user's requirements while maintaining consistency with the original input where appropriate.",
"clip": [
"38",
0
],
"vae": [
"13",
0
],
"configs": [
"5",
0
]
},
"class_type": "TextEncodeQwenImageEditPlusCustom_lrzjason",
"_meta": {
"title": "TextEncodeQwenImageEditPlusCustom lrzjason"
}
},
"16": {
"inputs": {
"gguf_name": "FireRed-Image-Edit-1.1-Q4_0.gguf"
},
"class_type": "LoaderGGUF",
"_meta": {
"title": "GGUF Loader"
}
},
"17": {
"inputs": {
"lora_name": "FireRed-Image-Edit-1.0-Lightning-8steps-v1.0.safetensors",
"strength_model": 1,
"model": [
"16",
0
]
},
"class_type": "LoraLoaderModelOnly",
"_meta": {
"title": "LoRA加载器(仅模型)"
}
},
"19": {
"inputs": {
"image": [
"1",
0
],
"pad_info": [
"7",
0
]
},
"class_type": "CropWithPadInfo",
"_meta": {
"title": "Crop With Pad Info"
}
},
"20": {
"inputs": {
"max_size": [
"25",
0
],
"image": [
"10",
0
]
},
"class_type": "QwenEditAdaptiveLongestEdge",
"_meta": {
"title": "Qwen Edit Adaptive Longest Edge"
}
},
"21": {
"inputs": {
"samples1": [
"15",
1
],
"samples2": [
"14",
1
]
},
"class_type": "LatentAdd",
"_meta": {
"title": "Latent相加"
}
},
"22": {
"inputs": {
"seed": 1121572473225362,
"steps": 8,
"cfg": 1,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1,
"model": [
"17",
0
],
"positive": [
"15",
0
],
"negative": [
"14",
0
],
"latent_image": [
"28",
0
]
},
"class_type": "KSampler",
"_meta": {
"title": "K采样器"
}
},
"25": {
"inputs": {
"Number": "1300"
},
"class_type": "Int",
"_meta": {
"title": "Int"
}
},
"28": {
"inputs": {
"upscale_method": "nearest-exact",
"width": [
"29",
0
],
"height": [
"30",
0
],
"crop": "disabled",
"samples": [
"21",
0
]
},
"class_type": "LatentUpscale",
"_meta": {
"title": "缩放Latent"
}
},
"29": {
"inputs": {
"Number": "768"
},
"class_type": "Int",
"_meta": {
"title": "Int"
}
},
"30": {
"inputs": {
"Number": "1024"
},
"class_type": "Int",
"_meta": {
"title": "Int"
}
},
"31": {
"inputs": {
"value": "图1的背景改成纯色深灰色,生成人物全身站立图,穿图2的衣服,穿图3的衣服。维持衣服材质。"
},
"class_type": "PrimitiveStringMultiline",
"_meta": {
"title": "字符串(多行)"
}
},
"32": {
"inputs": {
"upscale_method": "nearest-exact",
"width": [
"29",
0
],
"height": [
"30",
0
],
"crop": "center",
"image": [
"19",
0
]
},
"class_type": "ImageScale",
"_meta": {
"title": "缩放图像"
}
},
"33": {
"inputs": {
"filename_prefix": "ComfyUI",
"images": [
"32",
0
]
},
"class_type": "SaveImage",
"_meta": {
"title": "保存图像"
}
},
"36": {
"inputs": {
"rgthree_comparer": {
"images": [
{
"name": "A",
"selected": true,
"url": "/api/view?filename=rgthree.compare._temp_olfct_00001_.png&type=temp&subfolder=&rand=0.5054960464066687"
},
{
"name": "B",
"selected": true,
"url": "/api/view?filename=rgthree.compare._temp_olfct_00002_.png&type=temp&subfolder=&rand=0.03696578228441516"
}
]
},
"image_a": [
"32",
0
],
"image_b": [
"11",
0
]
},
"class_type": "Image Comparer (rgthree)",
"_meta": {
"title": "Image Comparer (rgthree)"
}
},
"38": {
"inputs": {
"clip_name": "qwen_2.5_vl_7b_fp8_scaled.safetensors",
"type": "qwen_image",
"device": "default"
},
"class_type": "CLIPLoader",
"_meta": {
"title": "加载CLIP"
}
}
}
+3 -1
View File
@@ -27,7 +27,9 @@ from pydantic import BaseModel
COMFYUI_URL = "http://127.0.0.1:8188"
# COMFYUI_URL = "http://117.50.80.187:47697"
WORKFLOW_PATH = Path(__file__).parent / "change2_2_0308.json"
#WORKFLOW_PATH = Path(__file__).parent / "change2_2_0308.json"
WORKFLOW_PATH = Path(__file__).parent / "change_fast3.json"
# 节点 ID 映射
NODE_MODEL = "11" # 模特
+1 -1
View File
@@ -68,4 +68,4 @@ def change_cloth_base64():
if __name__ == '__main__':
app.run(host="0.0.0.0", port=28888, debug=True)
app.run(host="0.0.0.0", port=28889, debug=True)
+497
View File
@@ -0,0 +1,497 @@
[startup] worker-0 started → http://117.50.89.68:28889
[startup] worker-1 started → http://117.50.226.22:28889
[startup] proxy listening on 0.0.0.0:28888
[startup] queue-0 → http://117.50.89.68:28889
[startup] queue-1 → http://117.50.226.22:28889
* Serving Flask app 'proxy'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:28888
* Running on http://10.60.190.115:28888
Press CTRL+C to quit
221.218.70.61 - - [19/Mar/2026 22:33:30] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:33:32] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:35:17] "GET / HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:35:17] "GET /favicon.ico HTTP/1.1" 404 -
221.218.70.61 - - [19/Mar/2026 22:40:31] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:41:01] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:41:26] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:41:49] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:42:14] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:42:37] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:42:58] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:43:23] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:43:50] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:44:14] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:44:49] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:45:10] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:45:36] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:45:55] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:46:26] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:46:47] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:47:14] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:47:31] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:47:50] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 22:48:15] "POST /change_cloth_base64 HTTP/1.1" 200 -
[startup] worker-0 started → http://117.50.89.68:28889
[startup] worker-1 started → http://117.50.226.22:28889
[startup] proxy listening on 0.0.0.0:28888
[startup] queue-0 → http://117.50.89.68:28889
[startup] queue-1 → http://117.50.226.22:28889
* Serving Flask app 'proxy'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:28888
* Running on http://10.60.190.115:28888
Press CTRL+C to quit
[startup] worker-0 started → http://117.50.89.68:28889
[startup] worker-1 started → http://117.50.226.22:28889
[startup] proxy listening on 0.0.0.0:28888
[startup] queue-0 → http://117.50.89.68:28889
[startup] queue-1 → http://117.50.226.22:28889
* Serving Flask app 'proxy'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:28888
* Running on http://10.60.190.115:28888
Press CTRL+C to quit
221.218.70.61 - - [19/Mar/2026 23:00:07] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:00:15] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:00:18] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:00:33] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:00:42] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:00:57] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:01:01] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:01:17] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:01:25] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:01:38] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:01:45] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:01:59] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:02:06] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:02:20] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:02:22] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:02:43] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:02:50] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:03:03] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:03:16] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:05:19] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:05:36] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:06:01] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:06:15] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:06:31] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:06:34] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:06:57] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:07:00] "POST /change_cloth_base64 HTTP/1.1" 200 -
[proxy] 2026-03-19 22:59:53 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[proxy] 2026-03-19 22:59:53 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 22:59:53 end=2026-03-19 23:00:07 | 14.45s | status=200
[proxy] 2026-03-19 23:00:07 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 22:59:53 end=2026-03-19 23:00:15 | 22.45s | status=200
[proxy] 2026-03-19 23:00:16 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:00:07 end=2026-03-19 23:00:18 | 10.49s | status=200
[proxy] 2026-03-19 23:00:18 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:00:18 end=2026-03-19 23:00:33 | 14.40s | status=200
[proxy] 2026-03-19 23:00:33 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:00:16 end=2026-03-19 23:00:42 | 26.47s | status=200
[proxy] 2026-03-19 23:00:42 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:00:42 end=2026-03-19 23:00:57 | 14.54s | status=200
[proxy] 2026-03-19 23:00:57 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:00:42 end=2026-03-19 23:01:01 | 18.41s | status=200
[proxy] 2026-03-19 23:01:01 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:01:01 end=2026-03-19 23:01:17 | 16.44s | status=200
[proxy] 2026-03-19 23:01:17 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:01:01 end=2026-03-19 23:01:25 | 24.45s | status=200
[proxy] 2026-03-19 23:01:26 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:01:17 end=2026-03-19 23:01:38 | 20.39s | status=200
[proxy] 2026-03-19 23:01:38 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:01:26 end=2026-03-19 23:01:45 | 18.63s | status=200
[proxy] 2026-03-19 23:01:45 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:01:38 end=2026-03-19 23:01:59 | 20.43s | status=200
[proxy] 2026-03-19 23:01:59 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:01:45 end=2026-03-19 23:02:06 | 20.54s | status=200
[proxy] 2026-03-19 23:02:06 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:01:59 end=2026-03-19 23:02:20 | 20.43s | status=200
[proxy] 2026-03-19 23:02:20 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:02:06 end=2026-03-19 23:02:22 | 16.47s | status=200
[proxy] 2026-03-19 23:02:23 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:02:20 end=2026-03-19 23:02:43 | 22.45s | status=200
[proxy] 2026-03-19 23:02:43 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:02:23 end=2026-03-19 23:02:50 | 26.49s | status=200
[proxy] 2026-03-19 23:02:51 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:02:43 end=2026-03-19 23:03:03 | 20.44s | status=200
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:02:51 end=2026-03-19 23:03:16 | 24.55s | status=200
[proxy] 2026-03-19 23:04:58 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:04:58 end=2026-03-19 23:05:19 | 20.39s | status=200
[proxy] 2026-03-19 23:05:19 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:05:19 end=2026-03-19 23:05:36 | 16.50s | status=200
[proxy] 2026-03-19 23:05:36 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[proxy] 2026-03-19 23:06:00 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:05:36 end=2026-03-19 23:06:01 | 24.47s | status=200
[proxy] 2026-03-19 23:06:01 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:06:00 end=2026-03-19 23:06:15 | 14.39s | status=200
[proxy] 2026-03-19 23:06:15 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:06:01 end=2026-03-19 23:06:31 | 30.47s | status=200
[proxy] 2026-03-19 23:06:32 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:06:15 end=2026-03-19 23:06:34 | 18.45s | status=200
[proxy] 2026-03-19 23:06:34 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:06:34 end=2026-03-19 23:06:57 | 22.47s | status=200
[proxy] 2026-03-19 23:06:57 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:06:32 end=2026-03-19 23:07:00 | 28.45s | status=200
[proxy] 2026-03-19 23:07:01 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
221.218.70.61 - - [19/Mar/2026 23:07:27] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:07:31] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:07:47] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:07:58] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:08:10] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:08:23] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:08:35] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:08:54] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:09:03] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:09:11] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:09:29] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:09:44] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:09:45] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:09:58] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:10:15] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:10:31] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:10:38] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:10:58] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:11:00] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:11:21] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:11:27] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:11:48] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:11:50] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:12:06] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:12:10] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:12:29] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:12:29] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:12:56] "POST /change_cloth_base64 HTTP/1.1" 200 -
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:07:00 end=2026-03-19 23:07:27 | 26.41s | status=200
[proxy] 2026-03-19 23:07:27 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:07:01 end=2026-03-19 23:07:31 | 30.41s | status=200
[proxy] 2026-03-19 23:07:31 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:07:27 end=2026-03-19 23:07:47 | 20.43s | status=200
[proxy] 2026-03-19 23:07:48 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:07:31 end=2026-03-19 23:07:58 | 26.42s | status=200
[proxy] 2026-03-19 23:07:59 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:07:48 end=2026-03-19 23:08:10 | 22.47s | status=200
[proxy] 2026-03-19 23:08:10 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:07:59 end=2026-03-19 23:08:23 | 24.58s | status=200
[proxy] 2026-03-19 23:08:24 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:08:10 end=2026-03-19 23:08:35 | 24.40s | status=200
[proxy] 2026-03-19 23:08:35 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:08:24 end=2026-03-19 23:08:54 | 30.44s | status=200
[proxy] 2026-03-19 23:08:55 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:08:35 end=2026-03-19 23:09:03 | 28.44s | status=200
[proxy] 2026-03-19 23:09:04 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:08:55 end=2026-03-19 23:09:11 | 16.36s | status=200
[proxy] 2026-03-19 23:09:12 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:09:04 end=2026-03-19 23:09:29 | 24.67s | status=200
[proxy] 2026-03-19 23:09:29 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:09:12 end=2026-03-19 23:09:44 | 32.45s | status=200
[proxy] 2026-03-19 23:09:44 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:09:29 end=2026-03-19 23:09:45 | 16.42s | status=200
[proxy] 2026-03-19 23:09:46 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:09:46 end=2026-03-19 23:09:58 | 12.41s | status=200
[proxy] 2026-03-19 23:09:58 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:09:44 end=2026-03-19 23:10:15 | 30.57s | status=200
[proxy] 2026-03-19 23:10:15 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:10:15 end=2026-03-19 23:10:31 | 16.40s | status=200
[proxy] 2026-03-19 23:10:32 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:10:15 end=2026-03-19 23:10:38 | 22.48s | status=200
[proxy] 2026-03-19 23:10:38 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:10:38 end=2026-03-19 23:10:58 | 20.40s | status=200
[proxy] 2026-03-19 23:10:59 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:10:32 end=2026-03-19 23:11:00 | 28.41s | status=200
[proxy] 2026-03-19 23:11:01 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:11:00 end=2026-03-19 23:11:21 | 20.44s | status=200
[proxy] 2026-03-19 23:11:21 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:11:01 end=2026-03-19 23:11:27 | 26.47s | status=200
[proxy] 2026-03-19 23:11:28 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:11:28 end=2026-03-19 23:11:48 | 20.41s | status=200
[proxy] 2026-03-19 23:11:48 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:11:21 end=2026-03-19 23:11:50 | 28.45s | status=200
[proxy] 2026-03-19 23:11:50 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:11:50 end=2026-03-19 23:12:06 | 16.41s | status=200
[proxy] 2026-03-19 23:12:06 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:11:50 end=2026-03-19 23:12:10 | 20.44s | status=200
[proxy] 2026-03-19 23:12:11 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:12:06 end=2026-03-19 23:12:29 | 22.45s | status=200
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:12:11 end=2026-03-19 23:12:29 | 18.38s | status=200
[proxy] 2026-03-19 23:12:29 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[proxy] 2026-03-19 23:12:30 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:12:29 end=2026-03-19 23:12:56 | 26.45s | status=200
221.218.70.61 - - [19/Mar/2026 23:13:03] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:13:17] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:13:34] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:13:48] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:13:52] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:14:03] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:14:11] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:14:22] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:14:32] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:14:45] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:15:03] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:15:07] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:15:22] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:15:26] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:15:40] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:15:47] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:16:02] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:16:09] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:16:38] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:17:07] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:17:36] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:26:15] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:26:36] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:26:59] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:27:30] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:27:53] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:28:12] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:28:31] "POST /change_cloth_base64 HTTP/1.1" 200 -
[proxy] 2026-03-19 23:12:57 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:12:30 end=2026-03-19 23:13:03 | 32.68s | status=200
[proxy] 2026-03-19 23:13:03 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:12:57 end=2026-03-19 23:13:17 | 20.43s | status=200
[proxy] 2026-03-19 23:13:18 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:13:03 end=2026-03-19 23:13:34 | 30.68s | status=200
[proxy] 2026-03-19 23:13:34 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:13:18 end=2026-03-19 23:13:48 | 30.51s | status=200
[proxy] 2026-03-19 23:13:49 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:13:34 end=2026-03-19 23:13:52 | 18.38s | status=200
[proxy] 2026-03-19 23:13:53 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:13:49 end=2026-03-19 23:14:03 | 14.38s | status=200
[proxy] 2026-03-19 23:14:03 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:13:53 end=2026-03-19 23:14:11 | 18.41s | status=200
[proxy] 2026-03-19 23:14:11 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:14:03 end=2026-03-19 23:14:22 | 18.49s | status=200
[proxy] 2026-03-19 23:14:22 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:14:11 end=2026-03-19 23:14:32 | 20.40s | status=200
[proxy] 2026-03-19 23:14:32 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:14:22 end=2026-03-19 23:14:45 | 22.42s | status=200
[proxy] 2026-03-19 23:14:45 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:14:32 end=2026-03-19 23:15:03 | 30.46s | status=200
[proxy] 2026-03-19 23:15:03 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:14:45 end=2026-03-19 23:15:07 | 22.46s | status=200
[proxy] 2026-03-19 23:15:08 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:15:03 end=2026-03-19 23:15:21 | 18.42s | status=200
[proxy] 2026-03-19 23:15:22 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:15:08 end=2026-03-19 23:15:26 | 18.39s | status=200
[proxy] 2026-03-19 23:15:27 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:15:22 end=2026-03-19 23:15:40 | 18.40s | status=200
[proxy] 2026-03-19 23:15:41 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:15:27 end=2026-03-19 23:15:47 | 20.57s | status=200
[proxy] 2026-03-19 23:15:48 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:15:48 end=2026-03-19 23:16:02 | 14.36s | status=200
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:15:41 end=2026-03-19 23:16:09 | 28.43s | status=200
[proxy] 2026-03-19 23:16:10 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:16:10 end=2026-03-19 23:16:38 | 28.43s | status=200
[proxy] 2026-03-19 23:16:38 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:16:38 end=2026-03-19 23:17:07 | 28.48s | status=200
[proxy] 2026-03-19 23:17:07 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:17:07 end=2026-03-19 23:17:36 | 28.45s | status=200
[proxy] 2026-03-19 23:25:53 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:25:53 end=2026-03-19 23:26:15 | 22.48s | status=200
[proxy] 2026-03-19 23:26:16 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:26:16 end=2026-03-19 23:26:36 | 20.49s | status=200
[proxy] 2026-03-19 23:26:37 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:26:37 end=2026-03-19 23:26:59 | 22.46s | status=200
[proxy] 2026-03-19 23:27:00 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:27:00 end=2026-03-19 23:27:30 | 30.47s | status=200
[proxy] 2026-03-19 23:27:30 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:27:30 end=2026-03-19 23:27:53 | 22.42s | status=200
[proxy] 2026-03-19 23:27:53 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:27:53 end=2026-03-19 23:28:12 | 18.50s | status=200
[proxy] 2026-03-19 23:28:12 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:28:12 end=2026-03-19 23:28:31 | 18.41s | status=200
221.218.70.61 - - [19/Mar/2026 23:28:52] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:29:12] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:29:29] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:30:00] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:30:17] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:30:40] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:31:09] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:31:30] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:31:51] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:32:18] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:32:40] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:33:11] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:33:38] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:33:40] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:34:01] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:34:09] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:34:22] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:34:38] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:34:43] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:35:04] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:35:05] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:35:26] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:35:36] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:35:47] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:35:51] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:36:07] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:36:12] "POST /change_cloth_base64 HTTP/1.1" 200 -
[proxy] 2026-03-19 23:28:31 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:28:31 end=2026-03-19 23:28:52 | 20.46s | status=200
[proxy] 2026-03-19 23:28:52 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:28:52 end=2026-03-19 23:29:12 | 20.42s | status=200
[proxy] 2026-03-19 23:29:13 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:29:13 end=2026-03-19 23:29:29 | 16.64s | status=200
[proxy] 2026-03-19 23:29:30 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:29:30 end=2026-03-19 23:30:00 | 30.65s | status=200
[proxy] 2026-03-19 23:30:01 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:30:01 end=2026-03-19 23:30:17 | 16.60s | status=200
[proxy] 2026-03-19 23:30:18 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:30:18 end=2026-03-19 23:30:40 | 22.70s | status=200
[proxy] 2026-03-19 23:30:41 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:30:41 end=2026-03-19 23:31:09 | 28.41s | status=200
[proxy] 2026-03-19 23:31:10 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:31:10 end=2026-03-19 23:31:30 | 20.44s | status=200
[proxy] 2026-03-19 23:31:31 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:31:31 end=2026-03-19 23:31:51 | 20.47s | status=200
[proxy] 2026-03-19 23:31:51 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:31:51 end=2026-03-19 23:32:18 | 26.45s | status=200
[proxy] 2026-03-19 23:32:18 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:32:18 end=2026-03-19 23:32:40 | 22.43s | status=200
[proxy] 2026-03-19 23:32:41 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:32:41 end=2026-03-19 23:33:11 | 30.61s | status=200
[proxy] 2026-03-19 23:33:12 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[proxy] 2026-03-19 23:33:17 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:33:17 end=2026-03-19 23:33:38 | 20.47s | status=200
[proxy] 2026-03-19 23:33:38 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:33:12 end=2026-03-19 23:33:40 | 28.47s | status=200
[proxy] 2026-03-19 23:33:41 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:33:40 end=2026-03-19 23:34:01 | 20.43s | status=200
[proxy] 2026-03-19 23:34:01 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:33:41 end=2026-03-19 23:34:09 | 28.40s | status=200
[proxy] 2026-03-19 23:34:10 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:34:01 end=2026-03-19 23:34:22 | 20.46s | status=200
[proxy] 2026-03-19 23:34:22 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:34:10 end=2026-03-19 23:34:38 | 28.51s | status=200
[proxy] 2026-03-19 23:34:39 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:34:22 end=2026-03-19 23:34:43 | 20.45s | status=200
[proxy] 2026-03-19 23:34:43 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:34:43 end=2026-03-19 23:35:04 | 20.44s | status=200
[proxy] 2026-03-19 23:35:04 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:34:39 end=2026-03-19 23:35:05 | 26.44s | status=200
[proxy] 2026-03-19 23:35:06 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:35:05 end=2026-03-19 23:35:26 | 20.49s | status=200
[proxy] 2026-03-19 23:35:26 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:35:06 end=2026-03-19 23:35:36 | 30.70s | status=200
[proxy] 2026-03-19 23:35:37 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:35:26 end=2026-03-19 23:35:47 | 20.41s | status=200
[proxy] 2026-03-19 23:35:47 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:35:37 end=2026-03-19 23:35:51 | 14.38s | status=200
[proxy] 2026-03-19 23:35:51 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:35:47 end=2026-03-19 23:36:07 | 20.44s | status=200
[proxy] 2026-03-19 23:36:08 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:35:51 end=2026-03-19 23:36:12 | 20.41s | status=200
[proxy] 2026-03-19 23:36:12 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
221.218.70.61 - - [19/Mar/2026 23:36:28] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:36:41] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:36:49] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:36:57] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:37:10] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:37:18] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:37:31] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:37:47] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:37:52] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:38:13] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:38:35] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:38:56] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:39:17] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:39:38] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:39:59] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:40:20] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:40:41] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:41:02] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:41:23] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:41:44] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:42:05] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:42:26] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:42:47] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:43:08] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:43:28] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:43:49] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:44:10] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:44:31] "POST /change_cloth_base64 HTTP/1.1" 200 -
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:36:08 end=2026-03-19 23:36:28 | 20.43s | status=200
[proxy] 2026-03-19 23:36:29 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:36:12 end=2026-03-19 23:36:41 | 28.43s | status=200
[proxy] 2026-03-19 23:36:41 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:36:29 end=2026-03-19 23:36:49 | 20.43s | status=200
[proxy] 2026-03-19 23:36:50 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:36:41 end=2026-03-19 23:36:57 | 16.42s | status=200
[proxy] 2026-03-19 23:36:58 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:36:50 end=2026-03-19 23:37:10 | 20.55s | status=200
[proxy] 2026-03-19 23:37:11 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:36:58 end=2026-03-19 23:37:18 | 20.44s | status=200
[proxy] 2026-03-19 23:37:19 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:37:11 end=2026-03-19 23:37:31 | 20.45s | status=200
[proxy] 2026-03-19 23:37:31 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:37:19 end=2026-03-19 23:37:47 | 28.46s | status=200
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:37:31 end=2026-03-19 23:37:52 | 20.45s | status=200
[proxy] 2026-03-19 23:37:52 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:37:52 end=2026-03-19 23:38:13 | 20.68s | status=200
[proxy] 2026-03-19 23:38:14 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:38:14 end=2026-03-19 23:38:35 | 20.49s | status=200
[proxy] 2026-03-19 23:38:35 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:38:35 end=2026-03-19 23:38:56 | 20.50s | status=200
[proxy] 2026-03-19 23:38:56 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:38:56 end=2026-03-19 23:39:17 | 20.68s | status=200
[proxy] 2026-03-19 23:39:18 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:39:18 end=2026-03-19 23:39:38 | 20.60s | status=200
[proxy] 2026-03-19 23:39:39 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:39:39 end=2026-03-19 23:39:59 | 20.47s | status=200
[proxy] 2026-03-19 23:40:00 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:40:00 end=2026-03-19 23:40:20 | 20.49s | status=200
[proxy] 2026-03-19 23:40:20 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:40:20 end=2026-03-19 23:40:41 | 20.44s | status=200
[proxy] 2026-03-19 23:40:41 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:40:41 end=2026-03-19 23:41:02 | 20.47s | status=200
[proxy] 2026-03-19 23:41:02 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:41:02 end=2026-03-19 23:41:23 | 20.47s | status=200
[proxy] 2026-03-19 23:41:23 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:41:23 end=2026-03-19 23:41:44 | 20.57s | status=200
[proxy] 2026-03-19 23:41:44 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:41:44 end=2026-03-19 23:42:05 | 20.44s | status=200
[proxy] 2026-03-19 23:42:05 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:42:05 end=2026-03-19 23:42:26 | 20.44s | status=200
[proxy] 2026-03-19 23:42:26 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:42:26 end=2026-03-19 23:42:47 | 20.45s | status=200
[proxy] 2026-03-19 23:42:47 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:42:47 end=2026-03-19 23:43:08 | 20.45s | status=200
[proxy] 2026-03-19 23:43:08 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:43:08 end=2026-03-19 23:43:28 | 20.46s | status=200
[proxy] 2026-03-19 23:43:29 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:43:29 end=2026-03-19 23:43:49 | 20.43s | status=200
[proxy] 2026-03-19 23:43:50 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.89.68:28889/change_cloth_base64 | backend=http://117.50.89.68:28889 | start=2026-03-19 23:43:50 end=2026-03-19 23:44:10 | 20.56s | status=200
[proxy] 2026-03-19 23:44:11 | 221.218.70.61 | queued → queue-1 (http://117.50.226.22:28889) | POST /change_cloth_base64?
[proxy] 2026-03-19 23:44:15 | 221.218.70.61 | queued → queue-0 (http://117.50.89.68:28889) | POST /change_cloth_base64?
[worker] POST http://117.50.226.22:28889/change_cloth_base64 | backend=http://117.50.226.22:28889 | start=2026-03-19 23:44:11 end=2026-03-19 23:44:31 | 20.47s | status=200
221.218.70.61 - - [19/Mar/2026 23:44:34] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:44:52] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:45:04] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:45:13] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:45:25] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:45:34] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:45:48] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:45:55] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:46:13] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:46:16] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:46:37] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:46:41] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:46:56] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:47:02] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:47:20] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:47:23] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:47:43] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:47:44] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:48:05] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:48:10] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:48:30] "POST /change_cloth_base64 HTTP/1.1" 200 -
221.218.70.61 - - [19/Mar/2026 23:48:39] "POST /change_cloth_base64 HTTP/1.1" 200 -
+1
View File
@@ -0,0 +1 @@
10266
+118
View File
@@ -0,0 +1,118 @@
from flask import Flask, request, Response, send_from_directory
import itertools
import threading
import queue
import requests
import time
import os
app = Flask(__name__, static_folder=None)
BACKENDS = [
"http://117.50.89.68:28889",
"http://117.50.226.22:28889",
]
# One queue per backend, auto-sized from BACKENDS
queues = [queue.Queue() for _ in BACKENDS]
_rr = itertools.count()
EXCLUDED_REQ_HEADERS = {"host", "content-length", "transfer-encoding", "connection"}
EXCLUDED_RESP_HEADERS = {"content-encoding", "content-length", "transfer-encoding", "connection"}
STATIC_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "static")
def _now():
return time.strftime("%Y-%m-%d %H:%M:%S")
def worker(q: queue.Queue, backend_url: str):
"""Single worker thread per queue — processes requests one at a time."""
while True:
task = q.get()
if task is None:
break
method, url, headers, data, result_event, result_holder = task
t_start = time.time()
start_ts = _now()
try:
resp = requests.request(
method=method,
url=url,
headers=headers,
data=data,
allow_redirects=False,
timeout=60,
stream=True,
)
result_holder["response"] = resp
result_holder["error"] = None
except Exception as e:
result_holder["response"] = None
result_holder["error"] = str(e)
finally:
elapsed = time.time() - t_start
end_ts = _now()
status = resp.status_code if result_holder.get("response") else "ERR"
print(
f"[worker] {method} {url} | backend={backend_url} | "
f"start={start_ts} end={end_ts} | "
f"{elapsed:.2f}s | status={status}"
)
result_event.set()
q.task_done()
# Start one worker thread per queue
for i, backend in enumerate(BACKENDS):
t = threading.Thread(target=worker, args=(queues[i], backend), daemon=True, name=f"worker-{i}")
t.start()
print(f"[startup] worker-{i} started → {backend}")
@app.route("/", methods=["GET"])
def index():
return send_from_directory(STATIC_DIR, "index.html")
@app.route("/<path:path>", methods=["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"])
def proxy(path):
idx = next(_rr) % len(queues)
# Build the full target URL (preserves query string)
target_url = BACKENDS[idx] + request.full_path.rstrip("?")
# Filter hop-by-hop and host headers before forwarding
headers = {k: v for k, v in request.headers.items() if k.lower() not in EXCLUDED_REQ_HEADERS}
result_event = threading.Event()
result_holder: dict = {}
task = (request.method, target_url, headers, request.get_data(), result_event, result_holder)
queues[idx].put(task)
client_ip = request.remote_addr
print(f"[proxy] {_now()} | {client_ip} | queued → queue-{idx} ({BACKENDS[idx]}) | {request.method} {request.full_path}")
# Block until the worker finishes (or timeout)
if not result_event.wait(timeout=65):
print(f"[proxy] {_now()} | {client_ip} | TIMEOUT → queue-{idx} ({BACKENDS[idx]}) | {request.method} {request.full_path}")
return Response("Gateway Timeout", status=504)
if result_holder.get("error"):
print(f"[proxy] {_now()} | {client_ip} | ERROR → {result_holder['error']}")
return Response(f"Bad Gateway: {result_holder['error']}", status=502)
resp = result_holder["response"]
resp_headers = {k: v for k, v in resp.headers.items() if k.lower() not in EXCLUDED_RESP_HEADERS}
return Response(resp.content, status=resp.status_code, headers=resp_headers)
if __name__ == "__main__":
print(f"[startup] proxy listening on 0.0.0.0:28888")
for i, b in enumerate(BACKENDS):
print(f"[startup] queue-{i}{b}")
app.run(host="0.0.0.0", port=28888, threaded=True)
Executable
+14
View File
@@ -0,0 +1,14 @@
#!/usr/bin/env bash
cd "$(dirname "$0")"
PID_FILE=proxy.pid
LOG_FILE=proxy.log
if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
echo "already running (pid $(cat "$PID_FILE"))"
exit 1
fi
nohup python3 proxy.py >> "$LOG_FILE" 2>&1 &
echo $! > "$PID_FILE"
echo "started (pid $!) → log: $LOG_FILE"
+374
View File
@@ -0,0 +1,374 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>AI 换装测试</title>
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
background: #0f0f13;
color: #e0e0e0;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
padding: 32px 16px 64px;
}
h1 {
font-size: 2rem;
font-weight: 700;
background: linear-gradient(135deg, #a78bfa, #60a5fa, #34d399);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
margin-bottom: 8px;
text-align: center;
}
.subtitle {
font-size: 0.9rem;
color: #888;
margin-bottom: 40px;
text-align: center;
}
.upload-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
width: 100%;
max-width: 960px;
margin-bottom: 32px;
}
.upload-card {
background: #1a1a24;
border: 2px dashed #333;
border-radius: 16px;
padding: 20px;
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
cursor: pointer;
transition: border-color 0.2s, background 0.2s;
position: relative;
min-height: 280px;
}
.upload-card:hover { border-color: #7c3aed; background: #1e1e2e; }
.upload-card.has-image { border-style: solid; border-color: #6d28d9; }
.upload-card.optional { border-color: #2a2a3a; }
.upload-card.optional .upload-label { color: #8b80b0; }
.upload-card input[type="file"] {
position: absolute;
inset: 0;
opacity: 0;
cursor: pointer;
width: 100%;
height: 100%;
}
.upload-icon { font-size: 2.5rem; line-height: 1; }
.upload-label { font-size: 1rem; font-weight: 600; color: #c4b5fd; }
.upload-hint { font-size: 0.78rem; color: #666; text-align: center; }
.badge-optional {
font-size: 0.68rem;
background: #2a2a3a;
color: #777;
border-radius: 6px;
padding: 2px 8px;
letter-spacing: 0.5px;
}
.preview-img {
width: 100%;
max-height: 200px;
object-fit: contain;
border-radius: 10px;
display: none;
}
.preview-img.visible { display: block; }
.btn-clear {
position: absolute;
top: 10px;
right: 10px;
background: #3a1a1a;
border: none;
color: #f87171;
border-radius: 50%;
width: 24px;
height: 24px;
font-size: 0.8rem;
cursor: pointer;
display: none;
align-items: center;
justify-content: center;
z-index: 1;
}
.btn-clear.visible { display: flex; }
.btn-run {
padding: 14px 56px;
font-size: 1.05rem;
font-weight: 700;
border: none;
border-radius: 50px;
background: linear-gradient(135deg, #7c3aed, #2563eb);
color: #fff;
cursor: pointer;
transition: opacity 0.2s, transform 0.1s;
}
.btn-run:hover:not(:disabled) { opacity: 0.9; transform: translateY(-1px); }
.btn-run:disabled { opacity: 0.45; cursor: not-allowed; }
.status-bar {
margin-top: 20px;
font-size: 0.9rem;
color: #888;
min-height: 24px;
text-align: center;
}
.status-bar.running { color: #60a5fa; }
.status-bar.success { color: #34d399; }
.status-bar.error { color: #f87171; }
.spinner {
display: inline-block;
width: 14px; height: 14px;
border: 2px solid #60a5fa44;
border-top-color: #60a5fa;
border-radius: 50%;
animation: spin 0.8s linear infinite;
vertical-align: middle;
margin-right: 6px;
}
@keyframes spin { to { transform: rotate(360deg); } }
.result-section {
margin-top: 40px;
width: 100%;
max-width: 500px;
display: none;
flex-direction: column;
align-items: center;
gap: 16px;
}
.result-section.visible { display: flex; }
.result-title { font-size: 1.1rem; font-weight: 600; color: #a78bfa; }
.result-img {
width: 100%;
border-radius: 16px;
box-shadow: 0 0 40px #7c3aed44;
}
.btn-download {
padding: 10px 36px;
border: 2px solid #7c3aed;
border-radius: 50px;
background: transparent;
color: #a78bfa;
font-size: 0.9rem;
font-weight: 600;
cursor: pointer;
transition: background 0.2s;
}
.btn-download:hover { background: #7c3aed22; }
.raw-resp {
width: 100%;
max-width: 960px;
margin-top: 32px;
background: #1a1a24;
border-radius: 12px;
padding: 16px;
font-size: 0.78rem;
color: #888;
word-break: break-all;
display: none;
}
.raw-resp.visible { display: block; }
.raw-resp pre { white-space: pre-wrap; }
@media (max-width: 640px) {
.upload-grid { grid-template-columns: 1fr; }
h1 { font-size: 1.5rem; }
}
</style>
</head>
<body>
<h1>AI 换装测试</h1>
<p class="subtitle">上传模特和衣服图片,调用 /change_cloth_base64 接口测试</p>
<div class="upload-grid">
<!-- 模特 -->
<div class="upload-card" id="card-human">
<button class="btn-clear" id="clear-human" title="清除"></button>
<input type="file" accept="image/*" id="input-human" />
<div class="upload-icon">🧍</div>
<div class="upload-label">模特图片</div>
<div class="upload-hint">human_img · 必填</div>
<img class="preview-img" id="preview-human" alt="模特预览" />
</div>
<!-- 上衣 -->
<div class="upload-card" id="card-cloth">
<button class="btn-clear" id="clear-cloth" title="清除"></button>
<input type="file" accept="image/*" id="input-cloth" />
<div class="upload-icon">👕</div>
<div class="upload-label">上衣图片</div>
<div class="upload-hint">cloth_img · 必填</div>
<img class="preview-img" id="preview-cloth" alt="上衣预览" />
</div>
<!-- 裤子(可选) -->
<div class="upload-card optional" id="card-kuzi">
<button class="btn-clear" id="clear-kuzi" title="清除"></button>
<input type="file" accept="image/*" id="input-kuzi" />
<div class="upload-icon">👖</div>
<div class="upload-label">裤子图片</div>
<div class="upload-hint">kuzi_img · 可选</div>
<span class="badge-optional">有则走 8888 服务,无则走 8889</span>
<img class="preview-img" id="preview-kuzi" alt="裤子预览" />
</div>
</div>
<button class="btn-run" id="btn-run" disabled>开始换装</button>
<div class="status-bar" id="status-bar"></div>
<div class="result-section" id="result-section">
<div class="result-title">换装结果</div>
<img class="result-img" id="result-img" alt="换装结果" />
<button class="btn-download" id="btn-download">下载图片</button>
</div>
<div class="raw-resp" id="raw-resp">
<div style="color:#555;margin-bottom:8px;font-size:0.72rem;">接口原始响应(data 字段已截断)</div>
<pre id="raw-text"></pre>
</div>
<script>
const images = { human: null, cloth: null, kuzi: null };
function setupUpload(inputId, previewId, cardId, clearId, key) {
const input = document.getElementById(inputId);
const preview = document.getElementById(previewId);
const card = document.getElementById(cardId);
const clearBtn= document.getElementById(clearId);
input.addEventListener('change', (e) => {
const file = e.target.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = (ev) => {
images[key] = ev.target.result;
preview.src = ev.target.result;
preview.classList.add('visible');
card.classList.add('has-image');
clearBtn.classList.add('visible');
updateRunButton();
};
reader.readAsDataURL(file);
});
clearBtn.addEventListener('click', (e) => {
e.stopPropagation();
images[key] = null;
input.value = '';
preview.src = '';
preview.classList.remove('visible');
card.classList.remove('has-image');
clearBtn.classList.remove('visible');
updateRunButton();
});
}
setupUpload('input-human', 'preview-human', 'card-human', 'clear-human', 'human');
setupUpload('input-cloth', 'preview-cloth', 'card-cloth', 'clear-cloth', 'cloth');
setupUpload('input-kuzi', 'preview-kuzi', 'card-kuzi', 'clear-kuzi', 'kuzi');
function updateRunButton() {
document.getElementById('btn-run').disabled = !(images.human && images.cloth);
}
function setStatus(msg, cls = '') {
const el = document.getElementById('status-bar');
el.className = 'status-bar ' + cls;
el.innerHTML = msg;
}
function elapsed(start) {
return Math.round((Date.now() - start) / 1000) + '秒';
}
document.getElementById('btn-run').addEventListener('click', async () => {
const btn = document.getElementById('btn-run');
const resultSection = document.getElementById('result-section');
const resultImg = document.getElementById('result-img');
const rawResp = document.getElementById('raw-resp');
const rawText = document.getElementById('raw-text');
btn.disabled = true;
resultSection.classList.remove('visible');
rawResp.classList.remove('visible');
const start = Date.now();
let timer = setInterval(() => {
setStatus(`<span class="spinner"></span>正在换装中,请稍候… 已等待 ${elapsed(start)}`, 'running');
}, 1000);
setStatus('<span class="spinner"></span>正在提交请求…', 'running');
const body = {
human_img: images.human,
cloth_img: images.cloth,
};
if (images.kuzi) body.kuzi_img = images.kuzi;
try {
const resp = await fetch('/change_cloth_base64', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body),
});
clearInterval(timer);
const data = await resp.json();
// 显示原始响应
rawText.textContent = JSON.stringify(data, null, 2);
rawResp.classList.add('visible');
if (data.ret !== 0 || !data.data) {
throw new Error(data.msg || '接口返回失败');
}
resultImg.src = data.data;
resultSection.classList.add('visible');
setStatus(`✅ 换装完成!耗时 ${elapsed(start)}`, 'success');
document.getElementById('btn-download').onclick = () => {
const a = document.createElement('a');
a.href = data.data;
a.download = `tryon_${Date.now()}.png`;
a.target = '_blank';
a.click();
};
} catch (err) {
clearInterval(timer);
setStatus(`❌ 错误:${err.message}`, 'error');
} finally {
updateRunButton();
}
});
</script>
</body>
</html>
Executable
+19
View File
@@ -0,0 +1,19 @@
#!/usr/bin/env bash
cd "$(dirname "$0")"
PID_FILE=proxy.pid
if [ ! -f "$PID_FILE" ]; then
echo "not running (no pid file)"
exit 1
fi
PID=$(cat "$PID_FILE")
if kill -0 "$PID" 2>/dev/null; then
kill "$PID"
rm -f "$PID_FILE"
echo "stopped (pid $PID)"
else
rm -f "$PID_FILE"
echo "stale pid file removed (process $PID not found)"
fi