TanJingyu há 6 meses atrás
commit
e959435791
8 ficheiros alterados com 198 adições e 0 exclusões
  1. 1 0
      .gitignore
  2. 17 0
      Dockerfile
  3. BIN
      api/__pycache__/error.cpython-312.pyc
  4. BIN
      api/__pycache__/mj_api.cpython-312.pyc
  5. 6 0
      api/error.py
  6. 77 0
      api/mj_api.py
  7. 94 0
      app.py
  8. 3 0
      requirements.txt

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+.venv

+ 17 - 0
Dockerfile

@@ -0,0 +1,17 @@
+FROM python:3.9-slim
+
+WORKDIR /app
+
+COPY . .
+
+RUN pip install --no-cache-dir -r requirements.txt
+
+EXPOSE 8080
+
+#ENV FLASK_APP=app.py
+#ENV FLASK_RUN_HOST=0.0.0.0
+#ENV FLASK_RUN_PORT=8080
+
+#CMD ["flask", "run"]
+
+CMD ["gunicorn", "-b", "0.0.0.0:8080", "app:app"]

BIN
api/__pycache__/error.cpython-312.pyc


BIN
api/__pycache__/mj_api.cpython-312.pyc


+ 6 - 0
api/error.py

@@ -0,0 +1,6 @@
+class unauthorized_error(Exception):
+    pass
+
+
+class system_error(Exception):
+    pass

+ 77 - 0
api/mj_api.py

@@ -0,0 +1,77 @@
+from curl_cffi import requests
+from api.error import unauthorized_error
+from api.error import system_error
+
+
+# 查询历史所有任务列表
+def thomas_jobs(cookie, user_id, page_size=50):
+    url = f"https://www.midjourney.com/api/pg/thomas-jobs?user_id={user_id}&page_size={page_size}"
+    response = requests.get(url, headers=nec_headers(cookie), impersonate="chrome101")
+    return response_catch(response)
+
+
+# 查询指定任务状态
+def query_job_status(job_id, cookie):
+    url = "https://www.midjourney.com/api/app/job-status"
+    response = requests.post(url=url, headers=nec_headers(cookie), impersonate="chrome101", json={"jobIds": [job_id]})
+    return response_catch(response)
+
+
+# 查询任务队列
+def query_job_queue(cookie, user_id):
+    url = f"https://www.midjourney.com/api/app/users/queue?userId={user_id}"
+    response = requests.get(url, headers=nec_headers(cookie), impersonate="chrome101")
+    return response_catch(response)
+
+
+# 提交任务
+def submit_job(cookie, prompt, user_id, mode='fast'):
+    request_data = {
+        "f": {
+            "mode": mode,
+            "private": False
+        },
+        "channelId": f"singleplayer_{user_id}",
+        "roomId": None,
+        "metadata": {
+            "imagePrompts": 1,
+            "imageReferences": 0,
+            "characterReferences": 0
+        },
+        "t": "imagine",
+        "prompt": prompt
+    }
+    url = "https://www.midjourney.com/api/app/submit-jobs"
+    response = requests.post(url=url, headers=nec_headers(cookie), impersonate="chrome101", json=request_data)
+    return response_catch(response)
+
+
+def response_catch(response):
+    if response.ok:
+        return response.json()
+    elif response.status_code == 401:
+        raise unauthorized_error("unauthorized access (401)")
+    else:
+        raise system_error(f"system_error ({response.status_code})")
+
+
+def nec_headers(cookie):
+    headers = {
+        'accept': '*/*',
+        'accept-language': 'zh-CN,zh;q=0.9',
+        'cache-control': 'no-cache',
+        'cookie': cookie,
+        'pragma': 'no-cache',
+        'priority': 'u=1, i',
+        'referer': 'https://www.midjourney.com/explore',
+        'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
+        'sec-ch-ua-mobile': '?0',
+        'sec-ch-ua-platform': '"Windows"',
+        'sec-fetch-dest': 'empty',
+        'sec-fetch-mode': 'cors',
+        'sec-fetch-site': 'same-origin',
+        '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',
+        'x-requested-with': 'XMLHttpRequest',
+        'x-csrf-protection': 1
+    }
+    return headers

+ 94 - 0
app.py

@@ -0,0 +1,94 @@
+from flask import Flask, request, jsonify
+from api import mj_api
+from api.error import unauthorized_error
+from api.error import system_error
+
+app = Flask(__name__)
+
+
+@app.route('/')
+def hello():
+    return "Hello World"
+
+
+# 查询历史所有任务列表
+@app.route('/thomas_jobs', methods=['POST'])
+def thomas_jobs():
+    request_data = request.get_json()
+
+    if request_data.get('cookie') is None:
+        return jsonify({"error": "Cookie is missing!"}), 400
+
+    if request_data.get('user_id') is None:
+        return jsonify({"error": "page_size is required!"}), 400
+
+    response_json_str = mj_api.thomas_jobs(cookie=request_data.get('cookie'), user_id=request_data.get('user_id'),
+                                           page_size=request_data.get('page_size'))
+    return response_json_str
+
+
+# 查询指定任务状态
+@app.route('/query_job_status', methods=['POST'])
+def query_job_status():
+    request_data = request.get_json()
+
+    if request_data.get('cookie') is None:
+        return jsonify({"error": "Cookie is missing!"}), 400
+
+    if request_data.get('job_id') is None:
+        return jsonify({"error": "job_id is required!"}), 400
+
+    response_json_str = mj_api.query_job_status(cookie=request_data.get('cookie'), job_id=request_data.get('job_id'))
+    return response_json_str
+
+
+# 查询任务队列
+@app.route('/query_job_queue', methods=['POST'])
+def query_job_queue():
+    request_data = request.get_json()
+
+    if request_data.get('cookie') is None:
+        return jsonify({"error": "Cookie is missing!"}), 400
+
+    if request_data.get('user_id') is None:
+        return jsonify({"error": "user_id is required!"}), 400
+
+    response_json_str = mj_api.query_job_queue(cookie=request_data.get('cookie'), user_id=request_data.get('user_id'))
+    return response_json_str
+
+
+# 提交任务
+@app.route('/submit_job', methods=['POST'])
+def submit_job():
+    request_data = request.get_json()
+
+    if request_data.get('cookie') is None:
+        return jsonify({"error": "Cookie is missing!"}), 400
+
+    if request_data.get('prompt') is None:
+        return jsonify({"error": "prompt is required!"}), 400
+
+    if request_data.get('user_id') is None:
+        return jsonify({"error": "user_id is required!"}), 400
+
+    response_json_str = mj_api.submit_job(cookie=request_data.get('cookie'), prompt=request_data.get('prompt'),
+                                          user_id=request_data.get('user_id'))
+    return response_json_str
+
+
+@app.errorhandler(unauthorized_error)
+def handle_unauthorized_error(error):
+    response = jsonify({"error": str(error)})
+    response.status_code = 401
+    return response
+
+
+@app.errorhandler(system_error)
+def handle_system_error(error):
+    response = jsonify({"error": str(error)})
+    response.status_code = 500
+    return response
+
+
+if __name__ == '__main__':
+    app.run()

+ 3 - 0
requirements.txt

@@ -0,0 +1,3 @@
+curl_cffi~=0.7.3
+Flask~=3.0.3
+gunicorn~=20.1.0