comfyUi使用API作图

文章提供了使用ComfyUI API作图的命令行方法,并给出了一个完整的bash脚本。脚本自动检查nc和curl依赖、读取配置文件、列出UNET模型供选择、替换提示词、生成随机种子,并循环发送多个API请求生成图像。

作者:zhuge···预计阅读 21 分钟·707 阅读·0 评论
comfyUi使用API作图

有此时候,我们不能打开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 "所有请求已完成。"

相关文章

评论

加载中...