mj_api.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. from curl_cffi import requests
  2. from api.error import unauthorized_error
  3. from api.error import system_error
  4. import oss2
  5. import random
  6. import string
  7. # 查询历史所有任务列表
  8. def thomas_jobs(cookie, user_id, page_size=50):
  9. url = f"https://www.midjourney.com/api/pg/thomas-jobs?user_id={user_id}&page_size={page_size}"
  10. response = requests.get(url, headers=nec_headers(cookie), impersonate="chrome101")
  11. return response_catch(response)
  12. # 查询指定任务状态
  13. def query_job_status(job_id, cookie):
  14. url = "https://www.midjourney.com/api/app/job-status"
  15. response = requests.post(url=url, headers=nec_headers(cookie), impersonate="chrome101", json={"jobIds": [job_id]})
  16. return response_catch(response)
  17. # 查询任务队列
  18. def query_job_queue(cookie, user_id):
  19. url = f"https://www.midjourney.com/api/app/users/queue?userId={user_id}"
  20. response = requests.get(url, headers=nec_headers(cookie), impersonate="chrome101")
  21. return response_catch(response)
  22. # 提交任务 mode: relaxed/fast
  23. def submit_job(cookie, prompt, user_id, mode):
  24. mode = mode or "fast"
  25. request_data = {
  26. "f": {
  27. "mode": mode,
  28. "private": False
  29. },
  30. "channelId": f"singleplayer_{user_id}",
  31. "roomId": None,
  32. "metadata": {
  33. "imagePrompts": 1,
  34. "imageReferences": 0,
  35. "characterReferences": 0
  36. },
  37. "t": "imagine",
  38. "prompt": prompt
  39. }
  40. url = "https://www.midjourney.com/api/app/submit-jobs"
  41. response = requests.post(url=url, headers=nec_headers(cookie), impersonate="chrome101", json=request_data)
  42. return response_catch(response)
  43. def generate_random_string(length=15):
  44. characters = string.ascii_letters + string.digits
  45. return ''.join(random.choice(characters) for _ in range(length))
  46. def upload_image_to_oss(job_id, image_num=4):
  47. OSS_ACCESS_KEY_ID = 'LTAI5tEYvefc4U3fyU5du225'
  48. OSS_ACCESS_KEY_SECRET = 'Z1gZtAGe8NwRtXgPzVgRMkRez4Ex4K'
  49. OSS_ENDPOINT = 'oss-ap-southeast-1-internal.aliyuncs.com'
  50. OSS_BUCKET_NAME = 'aigc-admin'
  51. results = []
  52. for i in range(image_num):
  53. object_name = 'saas/mjImage/' + generate_random_string(32) + ".png"
  54. # 下载网络图片
  55. response = requests.get(f"https://cdn.midjourney.com/{job_id}/0_{i}.png",
  56. headers=nec_headers(""),
  57. impersonate="chrome101")
  58. if response.ok:
  59. # 连接OSS
  60. auth = oss2.Auth(OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET)
  61. bucket = oss2.Bucket(auth, OSS_ENDPOINT, OSS_BUCKET_NAME)
  62. # 上传图片到OSS
  63. bucket.put_object(object_name, response.content)
  64. # 构造OSS文件URL
  65. oss_url = f"https://res.aiddit.com/{object_name}"
  66. results.append(oss_url)
  67. return results
  68. def response_catch(response):
  69. if response.ok:
  70. return response.json()
  71. elif response.status_code == 401:
  72. raise unauthorized_error("unauthorized access (401)")
  73. else:
  74. raise system_error(f"system_error ({response.status_code})")
  75. def nec_headers(cookie):
  76. headers = {
  77. 'accept': '*/*',
  78. 'accept-language': 'zh-CN,zh;q=0.9',
  79. 'cache-control': 'no-cache',
  80. 'cookie': cookie,
  81. 'pragma': 'no-cache',
  82. 'priority': 'u=1, i',
  83. 'referer': 'https://www.midjourney.com/explore',
  84. 'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
  85. 'sec-ch-ua-mobile': '?0',
  86. 'sec-ch-ua-platform': '"Windows"',
  87. 'sec-fetch-dest': 'empty',
  88. 'sec-fetch-mode': 'cors',
  89. 'sec-fetch-site': 'same-origin',
  90. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
  91. 'x-requested-with': 'XMLHttpRequest',
  92. 'x-csrf-protection': 1
  93. }
  94. return headers