mj_api.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from curl_cffi import requests
  2. from api.error import unauthorized_error
  3. from api.error import system_error
  4. # 查询历史所有任务列表
  5. def thomas_jobs(cookie, user_id, page_size=50):
  6. url = f"https://www.midjourney.com/api/pg/thomas-jobs?user_id={user_id}&page_size={page_size}"
  7. response = requests.get(url, headers=nec_headers(cookie), impersonate="chrome101")
  8. return response_catch(response)
  9. # 查询指定任务状态
  10. def query_job_status(job_id, cookie):
  11. url = "https://www.midjourney.com/api/app/job-status"
  12. response = requests.post(url=url, headers=nec_headers(cookie), impersonate="chrome101", json={"jobIds": [job_id]})
  13. return response_catch(response)
  14. # 查询任务队列
  15. def query_job_queue(cookie, user_id):
  16. url = f"https://www.midjourney.com/api/app/users/queue?userId={user_id}"
  17. response = requests.get(url, headers=nec_headers(cookie), impersonate="chrome101")
  18. return response_catch(response)
  19. # 提交任务 mode: relaxed/fast
  20. def submit_job(cookie, prompt, user_id, mode):
  21. mode = mode or "fast"
  22. request_data = {
  23. "f": {
  24. "mode": mode,
  25. "private": False
  26. },
  27. "channelId": f"singleplayer_{user_id}",
  28. "roomId": None,
  29. "metadata": {
  30. "imagePrompts": 1,
  31. "imageReferences": 0,
  32. "characterReferences": 0
  33. },
  34. "t": "imagine",
  35. "prompt": prompt
  36. }
  37. url = "https://www.midjourney.com/api/app/submit-jobs"
  38. response = requests.post(url=url, headers=nec_headers(cookie), impersonate="chrome101", json=request_data)
  39. return response_catch(response)
  40. def response_catch(response):
  41. if response.ok:
  42. return response.json()
  43. elif response.status_code == 401:
  44. raise unauthorized_error("unauthorized access (401)")
  45. else:
  46. raise system_error(f"system_error ({response.status_code})")
  47. def nec_headers(cookie):
  48. headers = {
  49. 'accept': '*/*',
  50. 'accept-language': 'zh-CN,zh;q=0.9',
  51. 'cache-control': 'no-cache',
  52. 'cookie': cookie,
  53. 'pragma': 'no-cache',
  54. 'priority': 'u=1, i',
  55. 'referer': 'https://www.midjourney.com/explore',
  56. 'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
  57. 'sec-ch-ua-mobile': '?0',
  58. 'sec-ch-ua-platform': '"Windows"',
  59. 'sec-fetch-dest': 'empty',
  60. 'sec-fetch-mode': 'cors',
  61. 'sec-fetch-site': 'same-origin',
  62. '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',
  63. 'x-requested-with': 'XMLHttpRequest',
  64. 'x-csrf-protection': 1
  65. }
  66. return headers