有此时候,我们不能打开comfyUI的8188端口,那可以使用下面的命令来进行作图, comfyui的接口格式为
curl -X POST http://127.0.0.1:8188/prompt \
-H "Content-Type: application/json" \
-d '{"prompt": {……}}'
所以,我们创建一个脚本,比如命名成为get.sh 然后导出工作流文件(API),则可以进行作图 文件内容如下
#创建随机字符
#CLIENT_ID=$(openssl rand -hex 16)
#!/bin/bash
# 检查是否安装了 nc
check_nc_installed() {
if ! command -v nc &> /dev/null; then
echo "nc 未安装,正在安装..."
sudo apt update && sudo apt install -y netcat
if ! command -v nc &> /dev/null; then
echo "nc 安装失败,请手动检查。"
exit 1
else
echo "nc 安装成功。"
fi
fi
}
# 检查是否安装了 curl
check_curl_installed() {
if ! command -v curl &> /dev/null; then
echo "curl 未安装,正在安装..."
sudo apt update && sudo apt install -y curl
if ! command -v curl &> /dev/null; then
echo "curl 安装失败,请手动检查。"
exit 1
else
echo "curl 安装成功。"
fi
fi
}
# 配置文件路径
CONFIG_FILE="comfyui_config.txt"
# 检查配置文件是否存在
if [ -f "$CONFIG_FILE" ]; then
# 配置文件存在,读取 ComfyUIPath 和 unet_name
ComfyUIPath=$(grep "^ComfyUIPath=" "$CONFIG_FILE" | cut -d '=' -f2)
if [ -z "$ComfyUIPath" ]; then
# 如果配置文件中没有 ComfyUIPath,提示用户输入
read -p "请输入 ComfyUI 根目录路径(例如:/path/to/comfyui): " ComfyUIPath
# 保存路径到配置文件
echo "ComfyUIPath=$ComfyUIPath" >> "$CONFIG_FILE"
else
echo "已从配置文件中读取 ComfyUI 根目录:$ComfyUIPath"
fi
# 检查配置文件中是否有 unet_name
unet_name_from_config=$(grep "^unet_name=" "$CONFIG_FILE" | cut -d '=' -f2)
if [ -n "$unet_name_from_config" ]; then
echo "已从配置文件中读取 unet_name:$unet_name_from_config"
DEFAULT_UNET_NAME=$unet_name_from_config
fi
else
# 配置文件不存在,提示用户输入
read -p "请输入 ComfyUI 根目录路径(例如:/path/to/comfyui): " ComfyUIPath
# 创建配置文件并保存路径
echo "ComfyUIPath=$ComfyUIPath" > "$CONFIG_FILE"
fi
# 检查是否传入了 JSON 文件参数
if [ -z "$1" ]; then
echo "用法:$0 <json文件> [替换字符串]"
exit 1
fi
# 检查 8188 端口是否已经打开
check_port() {
if nc -z 127.0.0.1 8188 &> /dev/null; then
echo "端口 8188 已经打开。"
return 0 # 端口已打开
else
echo "端口 8188 未打开。"
return 1 # 端口未打开
fi
}
# 询问用户是否启动服务
ask_to_start() {
read -p "是否启动服务?(y/n): " choice
if [[ $choice == "y" || $choice == "Y" ]]; then
echo "正在启动服务..."
"$ComfyUIPath/venv/bin/python" "$ComfyUIPath/main.py" &
# 等待端口打开
while ! check_port; do
echo "等待端口 8188 打开..."
sleep 2
done
echo "服务已启动,端口 8188 已打开。"
else
echo "用户选择不启动服务。退出。"
exit 0
fi
}
# 主逻辑
check_nc_installed # 确保 nc 已安装
check_curl_installed # 确保 curl 已安装
# 主逻辑
if ! check_port; then
ask_to_start
fi
# 获取 JSON 文件路径
JSON_FILE=$1
# 检查 JSON 文件是否存在
if [ ! -f "$JSON_FILE" ]; then
echo "错误:未找到 JSON 文件 $JSON_FILE。"
exit 1
fi
# 读取 JSON 文件内容
WORKFLOW=$(cat "$JSON_FILE")
# 如果配置文件中没有 unet_name,则从 JSON 文件中提取默认的 unet_name 值
if [ -z "$DEFAULT_UNET_NAME" ]; then
DEFAULT_UNET_NAME=$(echo "$WORKFLOW" | grep -oP '"unet_name": "\K[^"]+')
if [ -z "$DEFAULT_UNET_NAME" ]; then
echo "错误:JSON 文件中未找到 'unet_name' 字段。"
exit 1
fi
echo "从 JSON 文件中读取到默认的 unet_name:$DEFAULT_UNET_NAME"
# 保存到配置文件
echo "unet_name=$DEFAULT_UNET_NAME" >> "$CONFIG_FILE"
fi
# 列出 ComfyUIPath/models/unet 目录中的所有文件
UNET_MODES_DIR="$ComfyUIPath/models/unet"
if [ -d "$UNET_MODES_DIR" ]; then
echo "可用的 unet 模型文件:"
# 获取文件列表并添加序号,处理文件名中的空格
mapfile -t files < <(ls -1 "$UNET_MODES_DIR")
for i in "${!files[@]}"; do
echo "$((i + 1)): ${files[$i]}"
done
else
echo "警告:目录 $UNET_MODES_DIR 不存在。"
fi
# 提示用户选择 unet_name
read -p "请选择一个 unet_name(输入序号,或直接回车使用默认值 '$DEFAULT_UNET_NAME'): " USER_INPUT
if [ -z "$USER_INPUT" ]; then
echo "正在使用默认的 'unet_name': $DEFAULT_UNET_NAME"
else
# 用户输入了序号,检查是否有效
if [[ "$USER_INPUT" =~ ^[0-9]+$ ]] && [ "$USER_INPUT" -ge 1 ] && [ "$USER_INPUT" -le "${#files[@]}" ]; then
selected_file=${files[$((USER_INPUT - 1))]}
echo "您选择了:$selected_file"
# 更新 WORKFLOW 中的 unet_name
WORKFLOW=$(echo "$WORKFLOW" | sed -E "s/(\"unet_name\": \")$DEFAULT_UNET_NAME\"/\1$selected_file\"/")
# 更新配置文件中的 unet_name
sed -i "/^unet_name=/c\unet_name=$selected_file" "$CONFIG_FILE"
else
echo "输入无效。正在使用默认的 'unet_name': $DEFAULT_UNET_NAME"
fi
fi
# 需要固定一个 client_id
CLIENT_ID='904cb55c2f2c441187ee4578a80005d9'
# 检查 WORKFLOW 中是否包含连续的 3 个或以上 # 号
if [[ "$WORKFLOW" =~ [^#]*###+[^#]* ]]; then
# 提示用户输入替换字符串
while true; do
read -p "请输入提示词: " USER_REPLACEMENT_STRING
if [ -n "$USER_REPLACEMENT_STRING" ]; then
# 检查用户输入是否以单引号开头和结尾
if [[ ! "$USER_REPLACEMENT_STRING" =~ ^'.*'$ ]]; then
USER_REPLACEMENT_STRING="'$USER_REPLACEMENT_STRING'"
fi
# echo "正在将连续的 '#' 符号替换为 '$USER_REPLACEMENT_STRING'..."
WORKFLOW=$(echo "$WORKFLOW" | sed "s/###\+#/$USER_REPLACEMENT_STRING/g")
break
else
echo "您必须输入一个非空的提示词。"
fi
done
fi
# 提示用户输入生图数量
read -p "请输入生图数量(直接回车默认为 1): " IMAGE_COUNT
if [ -z "$IMAGE_COUNT" ]; then
IMAGE_COUNT=1
elif ! [[ "$IMAGE_COUNT" =~ ^[0-9]+$ ]]; then
echo "输入无效,必须是数字。默认使用 1。"
IMAGE_COUNT=1
fi
# 使用 curl 发送请求到 ComfyUI 的 API 接口
for ((i = 1; i <= IMAGE_COUNT; i++)); do
# 生成至少 12 位且不超过 15 位的随机数字
RANDOM_LENGTH=$(( (RANDOM % 4) + 12 )) # 随机长度在 12 到 15 之间
RANDOM_NUMBER=$(openssl rand -hex $((RANDOM_LENGTH / 2)) | tr -d '[:alpha:]' | tr -d '[:punct:]' | tr -d '[:space:]')
RANDOM_NUMBER=${RANDOM_NUMBER:0:$RANDOM_LENGTH}
# 确保随机数至少有 12 位
while [ ${#RANDOM_NUMBER} -lt 12 ]; do
RANDOM_NUMBER="${RANDOM_NUMBER}$(openssl rand -hex 1 | tr -d '[:alpha:]' | tr -d '[:punct:]' | tr -d '[:space:]')"
RANDOM_NUMBER=${RANDOM_NUMBER:0:12}
done
# 替换 WORKFLOW 中的大于等于 10 位的数字为随机数字
WORKFLOW=$(echo "$WORKFLOW" | sed -E 's/[0-9]{10,}/'"$RANDOM_NUMBER"'/')
echo "正在发送第 $i 个请求,使用种子: $RANDOM_NUMBER..."
curl --noproxy "*" -X POST http://127.0.0.1:8188/prompt \
-H "Content-Type: application/json" \
-d "{\"prompt\": $WORKFLOW, \"client_id\": \"$CLIENT_ID\"}"
if [ $i -lt $IMAGE_COUNT ]; then
echo "等待 1 秒后发送下一个请求..."
sleep 1
fi
done
echo "所有请求已完成。"

评论