8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

使用python调用comfyui-api,实现出图自由 学习教程

小鹿黑科技 11天前 4

打开comfyui,记录下对应的端口,设置开发者模式

打开一条workflow工作流,这里以comfyui自带的工作流为例,保存为api格式

 

再次打开api格式工作流

这里一定再次点击查看是否能运行正常,因为有的节点可能在api格式中无法运作

确定可以在comfyui中正常启动就可以下一步了

2、python设置

新建一个python脚本,将以下内容粘贴进去

 

新建一个python脚本,将以下内容粘贴进去

  1. import json

  2. import websocket # NOTE: websocket-client (https://github.com/websocket-client/websocket-client)

  3. import uuid

  4. import urllib.request

  5. import urllib.parse

  6. import random

  7. # 定义一个函数来显示GIF图片

  8. def show_gif(fname):

  9. import base64

  10. from IPython import display

  11. with open(fname, 'rb') as fd:

  12. b64 = base64.b64encode(fd.read()).decode('ascii')

  13. return display.HTML(f'<img src="data:image/gif;base64,{b64}" />')

  14. # 定义一个函数向服务器队列发送提示信息

  15. def queue_prompt(prompt):

  16. p = {"prompt": prompt, "client_id": client_id}

  17. data = json.dumps(p).encode('utf-8')

  18. req = urllib.request.Request("http://{}/prompt".format(server_address), data=data)

  19. return json.loads(urllib.request.urlopen(req).read())

  20. # 定义一个函数来获取图片

  21. def get_image(filename, subfolder, folder_type):

  22. data = {"filename": filename, "subfolder": subfolder, "type": folder_type}

  23. url_values = urllib.parse.urlencode(data)

  24. with urllib.request.urlopen("http://{}/view?{}".format(server_address, url_values)) as response:

  25. return response.read()

  26. # 定义一个函数来获取历史记录

  27. def get_history(prompt_id):

  28. with urllib.request.urlopen("http://{}/history/{}".format(server_address, prompt_id)) as response:

  29. return json.loads(response.read())

  30. # 定义一个函数来获取图片,这涉及到监听WebSocket消息

  31. def get_images(ws, prompt):

  32. prompt_id = queue_prompt(prompt)['prompt_id']

  33. print('prompt')

  34. print(prompt)

  35. print('prompt_id:{}'.format(prompt_id))

  36. output_images = {}

  37. while True:

  38. out = ws.recv()

  39. if isinstance(out, str):

  40. message = json.loads(out)

  41. if message['type'] == 'executing':

  42. data = message['data']

  43. if data['node'] is None and data['prompt_id'] == prompt_id:

  44. print('执行完成')

  45. break # 执行完成

  46. else:

  47. continue # 预览为二进制数据

  48. history = get_history(prompt_id)[prompt_id]

  49. print(history)

  50. for o in history['outputs']:

  51. for node_id in history['outputs']:

  52. node_output = history['outputs'][node_id]

  53. # 图片分支

  54. if 'images' in node_output:

  55. images_output = []

  56. for image in node_output['images']:

  57. image_data = get_image(image['filename'], image['subfolder'], image['type'])

  58. images_output.append(image_data)

  59. output_images[node_id] = images_output

  60. # 视频分支

  61. if 'videos' in node_output:

  62. videos_output = []

  63. for video in node_output['videos']:

  64. video_data = get_image(video['filename'], video['subfolder'], video['type'])

  65. videos_output.append(video_data)

  66. output_images[node_id] = videos_output

  67. print('获取图片完成')

  68. print(output_images)

  69. return output_images

  70. # 解析工作流并获取图片

  71. def parse_worflow(ws, prompt, seed, workflowfile):

  72. workflowfile = workflowfile

  73. print('workflowfile:'+workflowfile)

  74. with open(workflowfile, 'r', encoding="utf-8") as workflow_api_txt2gif_file:

  75. prompt_data = json.load(workflow_api_txt2gif_file)

  76. # 设置文本提示

  77. prompt_data["6"]["inputs"]["text"] = prompt

  78. return get_images(ws, prompt_data)

  79. # 生成图像并显示

  80. def generate_clip(prompt, seed, workflowfile, idx):

  81. print('seed:'+str(seed))

  82. ws = websocket.WebSocket()

  83. ws.connect("ws://{}/ws?clientId={}".format(server_address, client_id))

  84. images = parse_worflow(ws, prompt, seed, workflowfile)

  85. for node_id in images:

  86. for image_data in images[node_id]:

  87. from datetime import datetime

  88. # 获取当前时间,并格式化为 YYYYMMDDHHMMSS 的格式

  89. timestamp = datetime.now().strftime("%Y%m%d%H%M%S")

  90. # 使用格式化的时间戳在文件名中

  91. GIF_LOCATION = "{}/{}_{}_{}.png".format(SageMaker_ComfyUI, idx, seed, timestamp)

  92. print('GIF_LOCATION:'+GIF_LOCATION)

  93. with open(GIF_LOCATION, "wb") as binary_file:

  94. # 写入二进制文件

  95. binary_file.write(image_data)

  96. show_gif(GIF_LOCATION)

  97. print("{} DONE!!!".format(GIF_LOCATION))

  98. import pandas as pd

  99. # Example of reading from a CSV file

  100. def read_prompts_from_csv(csv_file_path):

  101. df = pd.read_excel(csv_file_path)

  102. return df['prompt'].tolist()

  103. # Execute the main function

  104. if __name__ == "__main__":

  105. # 设置工作目录和项目相关的路径

  106. WORKING_DIR = 'output'

  107. SageMaker_ComfyUI = WORKING_DIR

  108. workflowfile = 'workflow_api.json'

  109. COMFYUI_ENDPOINT = '127.0.0.1:8188'

  110. server_address = COMFYUI_ENDPOINT

  111. client_id = str(uuid.uuid4()) # 生成一个唯一的客户端ID

  112. seed = 15465856

  113. csv_file_path = 'prompt.xlsx'

  114. prompts = read_prompts_from_csv(csv_file_path)

  115. idx = 1

  116. for prompt in prompts:

  117. generate_clip(prompt, seed, workflowfile, idx)

  118. idx += 1

替换相应的参数,比如workflowfile文件名、COMFYUI_ENDPOINT地址,

WORKING_DIR输出文件的目录是对应脚本文件的

接着打开存储工作流api信息的josn文件

找到我们要修改的参数,比如我要修改正向提示词参数

可以看到其对应的键值位置是["6"]["inputs"]["text"]

就可以设置对应的参数,在函数中解析替换这个键值

我在最后还设置了一个文件'prompt.xlsx',方便写入大量的prompt进行替换

这样就可以解放双手,996的压榨显卡啦(不是)

 

最新回复 (0)
    • 小白资源网
      2
        立即登录 立即注册 
返回
发新帖