Mr-Help commited on
Commit
b6f476e
·
verified ·
1 Parent(s): 7e05d53

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +125 -82
main.py CHANGED
@@ -1,99 +1,142 @@
1
- import os
2
  import requests
 
3
  import sys
4
- from fastapi import FastAPI
5
- from fastapi.responses import JSONResponse
6
 
7
  app = FastAPI()
8
 
 
9
  BASE = "https://odoo.binrushd.care"
10
  AUTH_URL = f"{BASE}/api/auth/token"
11
  SESSION_AUTH_URL = f"{BASE}/web/session/authenticate"
12
 
13
- # ضع قيمك أو استخدم متغيرات بيئة
14
- CF_ID = os.getenv("CF_ACCESS_CLIENT_ID", "0491b36d7dcabce5b04f1a53f347bb4e.access")
15
- CF_SECRET = os.getenv("CF_ACCESS_CLIENT_SECRET", "22152cb41b62393e159daaff7dce433006c3744c5850e6adc15fa3544bb5eb09")
16
- LOGIN = os.getenv("ODOO_LOGIN", "binrushd.automation@gmail.com")
17
- PASSWORD = os.getenv("ODOO_PASSWORD", "BR2025")
18
- DB_NAME = os.getenv("ODOO_DB", "BR_EMR_16.0_202401")
19
-
20
- s = requests.Session()
21
- s.headers.update({
22
- "Accept": "*/*",
23
- "Content-Type": "application/json",
24
- # مهم: بدون br لتفادي brotli
25
- "Accept-Encoding": "gzip, deflate",
26
- "Connection": "keep-alive",
27
- "CF-Access-Client-Id": CF_ID,
28
- "CF-Access-Client-Secret": CF_SECRET,
29
- })
30
-
31
- def main():
32
- # 1) الحصول على access_token (القيم تُرسل كهيدر كما في إعدادك)
33
- auth_headers = {
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  "CF-Access-Client-Id": CF_ID,
35
  "CF-Access-Client-Secret": CF_SECRET,
36
- "login": LOGIN,
37
- "password": PASSWORD,
38
- "db": DB_NAME,
39
- }
40
- r = s.get(AUTH_URL, headers=auth_headers, timeout=(5, 30))
41
- r.raise_for_status()
42
- data = r.json()
43
- token = data.get("access_token") or (data.get("data") or {}).get("access_token")
44
- if not token:
45
- print(" No access_token in response:", data)
46
- sys.exit(1)
47
-
48
- # 2) محاولة التقاط session_id من Set-Cookie، وإن لم يوجد نعمل authenticate
49
- session_id = s.cookies.get("session_id") or r.cookies.get("session_id")
50
- if not session_id:
51
- payload = {
52
- "jsonrpc": "2.0",
53
- "params": {"db": DB_NAME, "login": LOGIN, "password": PASSWORD}
54
  }
55
- r2 = s.post(SESSION_AUTH_URL, json=payload, timeout=(5, 30))
56
- r2.raise_for_status()
57
- session_id = s.cookies.get("session_id") or r2.cookies.get("session_id")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  if not session_id:
59
- print("❌ Could not obtain session_id cookie.")
60
- sys.exit(1)
 
 
 
61
 
62
- # اطبعهم لاستخدامهم لاحقًا في GAS
63
- print("ACCESS_TOKEN:", token)
64
- print("SESSION_ID:", session_id)
 
 
 
 
 
 
65
 
66
- return {"ACCESS_TOKEN": token, "SESSION_ID": session_id}
 
 
 
67
 
 
68
 
69
- @app.get("/run")
70
- def run():
71
- try:
72
- result = main() # يطبع نفس رسائل اللوج بالضبط
73
- return {"ok": True, "data": result}
74
- except requests.HTTPError as e:
75
- resp = e.response
76
- # اطبع ملخص للّوج مع الحفاظ على طباعات main كما هي
77
- print(f"HTTPError {resp.status_code} on {resp.url}")
78
- print(resp.text[:500])
79
- return JSONResponse(
80
- status_code=resp.status_code,
81
- content={
82
- "ok": False,
83
- "error": "HTTPError",
84
- "status": resp.status_code,
85
- "url": resp.url,
86
- "body_preview": resp.text[:500],
87
- },
88
- )
89
- except Exception as e:
90
- print("Unhandled error:", str(e))
91
- return JSONResponse(
92
- status_code=500,
93
- content={"ok": False, "error": "UnhandledError", "detail": str(e)},
94
- )
95
-
96
- @app.get("/ping")
97
- def ping():
98
- """بسيطة لاختبار الاتصال"""
99
- return {"pong": True}
 
1
+ from fastapi import FastAPI, Response
2
  import requests
3
+ import json
4
  import sys
5
+ from http.cookiejar import Cookie
 
6
 
7
  app = FastAPI()
8
 
9
+ # ========= Config ثابتة للاختبار =========
10
  BASE = "https://odoo.binrushd.care"
11
  AUTH_URL = f"{BASE}/api/auth/token"
12
  SESSION_AUTH_URL = f"{BASE}/web/session/authenticate"
13
 
14
+ CF_ID = "0491b36d7dcabce5b04f1a53f347bb4e.access"
15
+ CF_SECRET = "22152cb41b62393e159daaff7dce433006c3744c5850e6adc15fa3544bb5eb09"
16
+ LOGIN = "binrushd.automation@gmail.com"
17
+ PASSWORD = "BR2025"
18
+ DB_NAME = "BR_EMR_16.0_202401"
19
+
20
+
21
+ def cookies_to_log_list(cookiejar):
22
+ """حوّل الكوكيز لقائمة سهلة القراءة في اللوج."""
23
+ out = []
24
+ for c in cookiejar: # type: Cookie
25
+ out.append({
26
+ "name": c.name,
27
+ "value": c.value,
28
+ "domain": c.domain,
29
+ "path": c.path,
30
+ "secure": c.secure,
31
+ "expires": c.expires,
32
+ })
33
+ return out
34
+
35
+
36
+ @app.get("/get-token-and-session")
37
+ def get_token_and_session():
38
+ s = requests.Session()
39
+ # مهم: نمنع brotli عشان ما يجيلك نص HTML مضغوط br
40
+ s.headers.update({
41
+ "Accept": "*/*",
42
+ "Content-Type": "application/json",
43
+ "Accept-Encoding": "gzip, deflate", # بدون br
44
+ "Connection": "keep-alive",
45
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
46
+ "AppleWebKit/537.36 (KHTML, like Gecko) "
47
+ "Chrome/120.0.0.0 Safari/537.36",
48
  "CF-Access-Client-Id": CF_ID,
49
  "CF-Access-Client-Secret": CF_SECRET,
50
+ })
51
+
52
+ try:
53
+ # ========== (1) طلب التوكن ==========
54
+ auth_headers = {
55
+ "CF-Access-Client-Id": CF_ID,
56
+ "CF-Access-Client-Secret": CF_SECRET,
57
+ # لو السيرفر بيقرأ دول من الهيدر:
58
+ "login": LOGIN,
59
+ "password": PASSWORD,
60
+ "db": DB_NAME,
 
 
 
 
 
 
 
61
  }
62
+
63
+ r = s.get(AUTH_URL, headers=auth_headers, timeout=(5, 30), allow_redirects=True)
64
+
65
+ # لوج مفصل للرد
66
+ r_log = {
67
+ "status_code": r.status_code,
68
+ "reason": r.reason,
69
+ "headers": dict(r.headers),
70
+ "set_cookie": r.headers.get("Set-Cookie", ""),
71
+ "cookies_now": cookies_to_log_list(s.cookies),
72
+ "body_preview": r.text[:1000],
73
+ }
74
+ print("[AUTH RESPONSE]", json.dumps(r_log, ensure_ascii=False), file=sys.stderr)
75
+
76
+ if r.status_code >= 400:
77
+ # رجّع الرد كما هو بنفس الحالة والمحتوى
78
+ return Response(content=r.text,
79
+ status_code=r.status_code,
80
+ media_type=r.headers.get("Content-Type", "text/plain"))
81
+
82
+ # استخرج التوكن
83
+ try:
84
+ data = r.json()
85
+ except ValueError:
86
+ data = {}
87
+ token = data.get("access_token") or (data.get("data") or {}).get("access_token")
88
+ if not token:
89
+ msg = {"error": "No access_token in response", "raw": data}
90
+ print("[NO TOKEN]", json.dumps(msg, ensure_ascii=False), file=sys.stderr)
91
+ return Response(content=json.dumps(msg, ensure_ascii=False),
92
+ status_code=502, media_type="application/json")
93
+
94
+ # ========== (2) التقاط/إنشاء session_id ==========
95
+ session_id = s.cookies.get("session_id") or r.cookies.get("session_id")
96
+
97
  if not session_id:
98
+ payload = {
99
+ "jsonrpc": "2.0",
100
+ "params": {"db": DB_NAME, "login": LOGIN, "password": PASSWORD}
101
+ }
102
+ r2 = s.post(SESSION_AUTH_URL, json=payload, timeout=(5, 30), allow_redirects=True)
103
 
104
+ r2_log = {
105
+ "status_code": r2.status_code,
106
+ "reason": r2.reason,
107
+ "headers": dict(r2.headers),
108
+ "set_cookie": r2.headers.get("Set-Cookie", ""),
109
+ "cookies_now": cookies_to_log_list(s.cookies),
110
+ "body_preview": r2.text[:1000],
111
+ }
112
+ print("[SESSION AUTH RESPONSE]", json.dumps(r2_log, ensure_ascii=False), file=sys.stderr)
113
 
114
+ if r2.status_code >= 400:
115
+ return Response(content=r2.text,
116
+ status_code=r2.status_code,
117
+ media_type=r2.headers.get("Content-Type", "text/plain"))
118
 
119
+ session_id = s.cookies.get("session_id") or r2.cookies.get("session_id")
120
 
121
+ if not session_id:
122
+ msg = {"error": "Could not obtain session_id cookie."}
123
+ print("[SESSION MISSING]", json.dumps(msg, ensure_ascii=False), file=sys.stderr)
124
+ return Response(content=json.dumps(msg, ensure_ascii=False),
125
+ status_code=502, media_type="application/json")
126
+
127
+ # ========== (3) النتيجة ==========
128
+ result = {
129
+ "access_token": token,
130
+ "session_id": session_id,
131
+ "cookies": cookies_to_log_list(s.cookies), # للمراجعة/الديبج
132
+ }
133
+ # اطبع الكوكيز بوضوح في اللوج
134
+ print("[FINAL COOKIES]", json.dumps(result["cookies"], ensure_ascii=False), file=sys.stderr)
135
+
136
+ return Response(content=json.dumps(result, ensure_ascii=False),
137
+ status_code=200, media_type="application/json")
138
+
139
+ except requests.RequestException as e:
140
+ err_txt = f"Network error: {type(e).__name__} - {str(e)}"
141
+ print("[NETWORK ERROR]", err_txt, file=sys.stderr)
142
+ return Response(content=err_txt, status_code=502, media_type="text/plain")