mj_api.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. # 提交任务
  20. def submit_job(cookie, prompt, user_id, mode='fast'):
  21. request_data = {
  22. "f": {
  23. "mode": mode,
  24. "private": False
  25. },
  26. "channelId": f"singleplayer_{user_id}",
  27. "roomId": None,
  28. "metadata": {
  29. "imagePrompts": 1,
  30. "imageReferences": 0,
  31. "characterReferences": 0
  32. },
  33. "t": "imagine",
  34. "prompt": prompt
  35. }
  36. url = "https://www.midjourney.com/api/app/submit-jobs"
  37. response = requests.post(url=url, headers=nec_headers(cookie), impersonate="chrome101", json=request_data)
  38. return response_catch(response)
  39. def response_catch(response):
  40. if response.ok:
  41. return response.json()
  42. elif response.status_code == 401:
  43. raise unauthorized_error("unauthorized access (401)")
  44. else:
  45. raise system_error(f"system_error ({response.status_code})")
  46. def nec_headers(cookie):
  47. headers = {
  48. 'accept': '*/*',
  49. 'accept-language': 'zh-CN,zh;q=0.9',
  50. 'cache-control': 'no-cache',
  51. 'cookie': cookie,
  52. 'pragma': 'no-cache',
  53. 'priority': 'u=1, i',
  54. 'referer': 'https://www.midjourney.com/explore',
  55. 'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
  56. 'sec-ch-ua-mobile': '?0',
  57. 'sec-ch-ua-platform': '"Windows"',
  58. 'sec-fetch-dest': 'empty',
  59. 'sec-fetch-mode': 'cors',
  60. 'sec-fetch-site': 'same-origin',
  61. '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',
  62. 'x-requested-with': 'XMLHttpRequest',
  63. 'x-csrf-protection': 1
  64. }
  65. return headers