osamabyc19866 commited on
Commit
74064f3
·
verified ·
1 Parent(s): c50e42a

Upload 60 files

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
.env ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ----- Telegram Settings -----
2
+ TELEGRAM_TOKEN=8015627699:AAFUqeoCQx3GwfDNcCzyjMrGEkcMkbZ72ME
3
+ TELEGRAM_TOKEN2=7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM
4
+
5
+ # ----- App Security -----
6
+ SECRET_KEY="noura-super-secret-@2024!$%^" # مفتاح أقوى مع أحرف خاصة
7
+
8
+ # ----- External APIs -----
9
+ OPENAI_API_KEY="sk-proj-SWj1AebWGRqDwsgG9k-8rw8oa5cEv3kzRl0AikrZq2aK9Zc8lRYZ2iIzeiMjZJ4Yq5CtnhVsqT3BlbkFJs7qBNXyjgWsN8P3L9dhR"
10
+
11
+ # ----- Test Accounts (Example Only - Use Dummy Data) -----
12
+ TEST_EMAIL="[email protected]" # بريد تجريبي
13
+ TEST_PASSWORD="Dummy@Password123!" # كلمة سر وهمية
14
+
15
+
16
+
17
18
+ NOURA_PASSWORD=osama1986
19
20
+ TWITTER_PASSWORD=osama1986
21
22
+ FACEBOOK_PASSWORD=osama1986
23
+ OPENAI_API_KEY=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
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ bot_responses.log filter=lfs diff=lfs merge=lfs -text
.replit ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ run = "Home"
2
+ modules = ["python-3.11"]
3
+ [nix]
4
+ channel = "stable-24_05"
5
+ packages = ["bash", "ffmpeg-full", "geckodriver", "gitFull", "playwright-driver", "tesseract"]
6
+
7
+ [deployment]
8
+ run = ["sh", "-c", "Home"]
9
+
10
+ [workflows]
11
+ runButton = "Run Python"
12
+
13
+ [[workflows.workflow]]
14
+ name = "Run Python"
15
+ author = 42985818
16
+ mode = "sequential"
17
+
18
+ [[workflows.workflow.tasks]]
19
+ task = "packager.installForAll"
20
+
21
+ [[workflows.workflow.tasks]]
22
+ task = "shell.exec"
23
+ args = "python main.py"
=20.7 ADDED
File without changes
Edit ADDED
File without changes
Nora-AlQahtani.gitignore ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # poetry
98
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102
+ #poetry.lock
103
+
104
+ # pdm
105
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106
+ #pdm.lock
107
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108
+ # in version control.
109
+ # https://pdm.fming.dev/#use-with-ide
110
+ .pdm.toml
111
+
112
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
113
+ __pypackages__/
114
+
115
+ # Celery stuff
116
+ celerybeat-schedule
117
+ celerybeat.pid
118
+
119
+ # SageMath parsed files
120
+ *.sage.py
121
+
122
+ # Environments
123
+ .env
124
+ .venv
125
+ env/
126
+ venv/
127
+ ENV/
128
+ env.bak/
129
+ venv.bak/
130
+
131
+ # Spyder project settings
132
+ .spyderproject
133
+ .spyproject
134
+
135
+ # Rope project settings
136
+ .ropeproject
137
+
138
+ # mkdocs documentation
139
+ /site
140
+
141
+ # mypy
142
+ .mypy_cache/
143
+ .dmypy.json
144
+ dmypy.json
145
+
146
+ # Pyre type checker
147
+ .pyre/
148
+
149
+ # pytype static type analyzer
150
+ .pytype/
151
+
152
+ # Cython debug symbols
153
+ cython_debug/
154
+
155
+ # PyCharm
156
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
157
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
158
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
159
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
160
+ #.idea/
Nora-AlQahtani.replit ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ entrypoint = "main.py"
2
+ modules = ["python-3.11"]
3
+
4
+ [nix]
5
+ channel = "stable-24_05"
6
+ packages = ["bash", "ffmpeg-full", "freetype", "geckodriver", "gitFull", "imagemagickBig", "lcms2", "libGL", "libGLU", "libimagequant", "libjpeg", "libtiff", "libwebp", "libxcrypt", "openjpeg", "playwright-driver", "tcl", "tesseract", "tk", "zlib"]
7
+
8
+ [unitTest]
9
+ language = "python3"
10
+
11
+ [gitHubImport]
12
+ requiredFiles = [".replit", "replit.nix"]
13
+
14
+ [deployment]
15
+ run = ["python3", "main.py"]
16
+ deploymentTarget = "cloudrun"
17
+
18
+ [[ports]]
19
+ localPort = 5000
20
+ externalPort = 80
ai_conference.py ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="ar">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>مؤتمر الذكاء الاصطناعي</title>
7
+ <style>
8
+ body {
9
+ font-family: 'Arial', sans-serif;
10
+ direction: rtl;
11
+ text-align: right;
12
+ background-color: #f0f4f8;
13
+ padding: 20px;
14
+ }
15
+ h2 {
16
+ color: #333;
17
+ }
18
+ form {
19
+ margin-bottom: 20px;
20
+ }
21
+ input[type="text"] {
22
+ width: 60%;
23
+ padding: 8px;
24
+ margin-right: 10px;
25
+ }
26
+ button {
27
+ padding: 8px 12px;
28
+ background-color: #007bff;
29
+ color: white;
30
+ border: none;
31
+ cursor: pointer;
32
+ }
33
+ button:hover {
34
+ background-color: #0056b3;
35
+ }
36
+ ul {
37
+ list-style-type: none;
38
+ padding: 0;
39
+ }
40
+ li {
41
+ background: white;
42
+ margin: 8px 0;
43
+ padding: 10px;
44
+ border-radius: 5px;
45
+ border-right: 4px solid #007bff;
46
+ }
47
+ </style>
48
+ </head>
49
+ <body>
50
+ <h2>مناظرة بين العقول: نورا، ChatGPT، Claude، Bard</h2>
51
+ <form method="post">
52
+ <input type="text" name="question" placeholder="اكتب سؤالاً للنقاش" required>
53
+ <button type="submit">أرسل</button>
54
+ </form>
55
+ {% if responses %}
56
+ <h3>الردود:</h3>
57
+ <ul>
58
+ {% for name, reply in responses.items() %}
59
+ <li><strong>{{ name }}:</strong> {{ reply }}</li>
60
+ {% endfor %}
61
+ </ul>
62
+ {% endif %}
63
+ </body>
64
+ </html>
65
+
ai_controller.py ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import requests
3
+ from typing import List, Dict
4
+ from config import SYSTEM_PROMPT, DEFAULT_MODEL, OLLAMA_HOST
5
+
6
+ class AIController:
7
+ def init(self):
8
+ self.memory: List[Dict[str, str]] = []
9
+ self.system_prompt: str = SYSTEM_PROMPT
10
+
11
+ def _chat(self, messages: List[Dict[str, str]], model: str) -> str:
12
+ url = f"{OLLAMA_HOST.rstrip('/')}/api/chat"
13
+ payload = {"model": model, "messages": messages, "stream": False}
14
+ try:
15
+ resp = requests.post(url, json=payload, timeout=60)
16
+ resp.raise_for_status()
17
+ except Exception as e:
18
+ return f"⚠️ فشل الاتصال بمحرك Ollama ({url}): {e}"
19
+ data = resp.json()
20
+ msg = data.get("message", {}).get("content") or data.get("response", "")
21
+ return msg or "⚠️ لم أحصل على رد من المحرك."
22
+
23
+ def generate_response(self, user_input: str, language: str = "ar", model: str = None) -> str:
24
+ model = model or DEFAULT_MODEL
25
+ messages: List[Dict[str, str]] = [{"role": "system", "content": self.system_prompt}]
26
+ messages += self.memory[-10:] # آخر 10 تبادلات فقط
27
+ messages.append({"role": "user", "content": user_input})
28
+ answer = self._chat(messages, model)
29
+ self._update_memory(user_input, answer)
30
+ return answer
31
+
32
+ def _update_memory(self, user_msg: str, assistant_msg: str) -> None:
33
+ self.memory.append({"role": "user", "content": user_msg})
34
+ self.memory.append({"role": "assistant", "content": assistant_msg})
35
+ if len(self.memory) > 40:
36
+ self.memory = self.memory[-40:]
analyzer.py ADDED
@@ -0,0 +1,398 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Media tools: تنزيل آمن، كشف نوع الروابط، تحليل صور/صوت/فيديو/PDF،
4
+ مع فحوصات للاعتماديات ورسائل أخطاء واضحة.
5
+ """
6
+
7
+ # ===== أعلى الملف (إضافات) =====
8
+ import contextlib
9
+ import hashlib
10
+ import os
11
+ import io
12
+ import tempfile
13
+ import shutil
14
+ import subprocess
15
+ from typing import Optional, Tuple
16
+ from urllib.parse import urlparse
17
+
18
+ import requests
19
+ from PIL import Image
20
+ from io import BytesIO
21
+ import PyPDF2
22
+ import speech_recognition as sr
23
+
24
+ # ثوابت عامة
25
+ DEFAULT_TIMEOUT: Tuple[int, int] = (10, 30) # (connect, read)
26
+ MAX_DOWNLOAD_BYTES: int = 50 * 1024 * 1024 # حدّ 50MB للملفات عن بُعد
27
+ DEFAULT_HEADERS = {
28
+ "User-Agent": "Mozilla/5.0 (compatible; MediaTools/1.0)"
29
+ }
30
+
31
+ # فحوصات وجود المكتبات الاختيارية
32
+ try:
33
+ import moviepy.editor as mp
34
+ MOVIEPY_AVAILABLE = True
35
+ except Exception:
36
+ MOVIEPY_AVAILABLE = False
37
+
38
+ try:
39
+ import cv2
40
+ CV2_AVAILABLE = True
41
+ except Exception:
42
+ CV2_AVAILABLE = False
43
+
44
+ try:
45
+ from pydub import AudioSegment
46
+ PYDUB_AVAILABLE = True
47
+ except Exception:
48
+ PYDUB_AVAILABLE = False
49
+
50
+ try:
51
+ import av
52
+ AV_AVAILABLE = True
53
+ except Exception:
54
+ AV_AVAILABLE = False
55
+
56
+ # ffmpeg (إمّا عبر ffmpeg-python أو الثنائي system)
57
+ try:
58
+ import ffmpeg as ffmpeg_py # ffmpeg-python
59
+ FFMPEG_PY_AVAILABLE = True
60
+ except Exception:
61
+ FFMPEG_PY_AVAILABLE = False
62
+
63
+
64
+ # ===== أدوات مساعدة للتنزيل الآمن =====
65
+ def _safe_get_stream(url: str, timeout: Tuple[int, int] = DEFAULT_TIMEOUT):
66
+ """طلب HTTP مع stream=True وتحقق من الحجم."""
67
+ resp = requests.get(url, headers=DEFAULT_HEADERS, timeout=timeout, stream=True)
68
+ resp.raise_for_status()
69
+ total = 0
70
+ chunks = []
71
+ for chunk in resp.iter_content(chunk_size=8192):
72
+ if not chunk:
73
+ continue
74
+ total += len(chunk)
75
+ if total > MAX_DOWNLOAD_BYTES:
76
+ resp.close()
77
+ raise ValueError(f"حجم الملف تجاوز الحد الأقصى {MAX_DOWNLOAD_BYTES} بايت")
78
+ chunks.append(chunk)
79
+ return b"".join(chunks)
80
+
81
+
82
+ def download_to_temp(url: str, suffix: str) -> str:
83
+ """ينزّل إلى ملف مؤقت مع التحقق من الحجم والمهلة."""
84
+ url = fix_url(url)
85
+ data = _safe_get_stream(url)
86
+ h = hashlib.sha256(data).hexdigest()[:12]
87
+ fd, tmp_path = tempfile.mkstemp(prefix=f"mt_{h}_", suffix=suffix)
88
+ with os.fdopen(fd, "wb") as f:
89
+ f.write(data)
90
+ return tmp_path
91
+
92
+
93
+ # ===== فحوصات الاعتماديات =====
94
+ def has_ffmpeg() -> bool:
95
+ """يتحقق من توفر ffmpeg: إمّا ffmpeg-python أو ثنائي النظام."""
96
+ if FFMPEG_PY_AVAILABLE:
97
+ return True
98
+ return shutil.which("ffmpeg") is not None
99
+
100
+
101
+ def ensure_dependencies(require_video: bool = False):
102
+ """
103
+ يتحقق من وجود الاعتماديات ويُطلق خطأ برسالة مجمّعة إن نقص شيء.
104
+ - لو require_video=True: يتحقق من moviepy و ffmpeg.
105
+ """
106
+ msgs = []
107
+ if require_video:
108
+ if not MOVIEPY_AVAILABLE:
109
+ msgs.append("مكتبة moviepy غير متوفّرة.")
110
+ if not has_ffmpeg():
111
+ msgs.append("أداة ffmpeg غير متوفّرة في النظام.")
112
+ if msgs:
113
+ raise RuntimeError(" / ".join(msgs))
114
+
115
+
116
+ # ===== وظائف تحليل الروابط =====
117
+ def analyze_url_type(url: str) -> str:
118
+ """تحديد نوع الرابط بناءً على النطاق/المسار."""
119
+ p = urlparse(url)
120
+ domain = (p.netloc or "").lower()
121
+ path = (p.path or "").lower()
122
+ if "youtube.com" in domain or "youtu.be" in domain:
123
+ return "YouTube"
124
+ if "github.com" in domain:
125
+ return "GitHub"
126
+ if "twitter.com" in domain or "x.com" in domain:
127
+ return "تغريدة"
128
+ if path.endswith(".pdf"):
129
+ return "ملف PDF"
130
+ return "موقع ويب عام"
131
+
132
+
133
+ def fix_url(url: str) -> str:
134
+ """إصلاح الروابط الناقصة."""
135
+ url = (url or "").strip()
136
+ if not url:
137
+ raise ValueError("رابط فارغ")
138
+ if not url.startswith(("http://", "https://")):
139
+ return "https://" + url.lstrip("/")
140
+ return url
141
+
142
+
143
+ def detect_media_type(url: str) -> str:
144
+ """تحديد نوع الملف من امتداده."""
145
+ path = urlparse(url).path.lower()
146
+ if path.endswith(('.jpg', '.jpeg', '.png', '.gif', '.webp')):
147
+ return 'image'
148
+ elif path.endswith(('.mp4', '.mov', '.avi', '.webm', '.mkv')):
149
+ return 'video'
150
+ elif path.endswith(('.mp3', '.wav', '.ogg', '.m4a', '.flac')):
151
+ return 'audio'
152
+ elif path.endswith('.pdf'):
153
+ return 'pdf'
154
+ return 'link'
155
+ def analyze_image_from_url(image_url: str) -> str:
156
+ r = requests.get(image_url, timeout=DEFAULT_TIMEOUT)
157
+ r.raise_for_status()
158
+ image = Image.open(BytesIO(r.content))
159
+ try:
160
+ fmt = getattr(image, "format", "unknown")
161
+ except Exception:
162
+ fmt = "unknown"
163
+ return f"تحليل الصورة: الحجم {image.size}، الصيغة {fmt}"
164
+
165
+ def analyze_pdf_from_url(pdf_url: str) -> str:
166
+ path = None
167
+ try:
168
+ path = _download_to_temp(pdf_url, ".pdf")
169
+ with open(path, "rb") as f:
170
+ reader = PyPDF2.PdfReader(f)
171
+ text = "".join([(page.extract_text() or "") for page in reader.pages])
172
+ preview = (text or "").strip()[:1000]
173
+ return "تم استخراج النص التالي من PDF:\n" + preview + ("..." if len(preview) == 1000 else "")
174
+ finally:
175
+ if path:
176
+ with contextlib.suppress(Exception):
177
+ os.remove(path)
178
+
179
+ def extract_text_from_audio_file(audio_path: str) -> str:
180
+ recognizer = sr.Recognizer()
181
+ with sr.AudioFile(audio_path) as source:
182
+ audio = recognizer.record(source, duration=None) # يمكن ضبط مدة قصوى لو لزم
183
+ try:
184
+ return recognizer.recognize_google(audio, language="ar-SA")
185
+ except sr.UnknownValueError:
186
+ return "لم أتمكن من التعرف على الصوت"
187
+ except sr.RequestError:
188
+ return "خطأ في الاتصال بخدمة التعرف على الصوت"
189
+
190
+ def analyze_audio_from_url(audio_url: str) -> str:
191
+ path = None
192
+ try:
193
+ path = _download_to_temp(audio_url, ".wav")
194
+ text = extract_text_from_audio_file(path)
195
+ return f"نص الصوت:\n{text}"
196
+ finally:
197
+ if path:
198
+ with contextlib.suppress(Exception):
199
+ os.remove(path)
200
+
201
+ def analyze_video_from_url(video_url: str) -> str:
202
+ try:
203
+ ensure_dependencies(require_video=True)
204
+ except RuntimeError as e:
205
+ return str(e)
206
+
207
+ vpath = apath = None
208
+ try:
209
+ vpath = _download_to_temp(video_url, ".mp4")
210
+ video = mp.VideoFileClip(vpath)
211
+ if video.audio is None:
212
+ return "الفيديو بلا صوت، لا يوجد ما يُستخرج."
213
+ apath = vpath.replace(".mp4", ".wav")
214
+ # كتابة الصوت بمهلة ضمنية عبر MoviePy؛ إن تعثّر، أعد رسالة واضحة
215
+ video.audio.write_audiofile(apath, verbose=False, logger=None)
216
+ text = extract_text_from_audio_file(apath)
217
+ return f"نص الفيديو:\n{text}"
218
+ except Exception as e:
219
+ return f"تعذّر تحليل الفيديو: {str(e)}"
220
+ finally:
221
+ with contextlib.suppress(Exception):
222
+ if vpath and os.path.exists(vpath):
223
+ os.remove(vpath)
224
+ with contextlib.suppress(Exception):
225
+ if apath and os.path.exists(apath):
226
+ os.remove(apath)
227
+
228
+
229
+ # ===== وظائف تحليل الملفات =====
230
+ def analyze_image_from_url(image_url: str) -> str:
231
+ """تحليل الصور من الروابط (الحجم والصيغة)."""
232
+ image_url = fix_url(image_url)
233
+ data = _safe_get_stream(image_url)
234
+ with Image.open(BytesIO(data)) as im:
235
+ return f"تحليل الصورة: الحجم {im.size}، الصيغة {im.format}"
236
+
237
+
238
+ def analyze_pdf_from_url(pdf_url: str) -> str:
239
+ """استخراج النص من ملفات PDF (أول 500 حرف)."""
240
+ pdf_url = fix_url(pdf_url)
241
+ tmp = download_to_temp(pdf_url, ".pdf")
242
+ try:
243
+ with open(tmp, "rb") as f:
244
+ reader = PyPDF2.PdfReader(f)
245
+ if getattr(reader, "is_encrypted", False):
246
+ with contextlib.suppress(Exception):
247
+ reader.decrypt("")
248
+ text_parts = []
249
+ for page in reader.pages:
250
+ text_parts.append(page.extract_text() or "")
251
+ text = "".join(text_parts).strip()
252
+ preview = (text[:500] + "...") if len(text) > 500 else text
253
+ return f"تم استخراج النص التالي من PDF:\n{preview}"
254
+ finally:
255
+ with contextlib.suppress(Exception):
256
+ os.remove(tmp)
257
+
258
+
259
+ def extract_text_from_audio_file(audio_path: str, language: str = "ar-SA") -> str:
260
+ """استخراج النص من ملف صوتي محلي باستخدام SpeechRecognition (خدمة Google)."""
261
+ recognizer = sr.Recognizer()
262
+ with sr.AudioFile(audio_path) as source:
263
+ audio = recognizer.record(source)
264
+ try:
265
+ return recognizer.recognize_google(audio, language=language)
266
+ except sr.UnknownValueError:
267
+ return "لم أتمكن من التعرف على الصوت"
268
+ except sr.RequestError:
269
+ return "خطأ في الاتصال بخدمة التعرف على الصوت"
270
+
271
+
272
+ def analyze_audio_from_url(audio_url: str, language: str = "ar-SA") -> str:
273
+ """تحليل الملفات الصوتية من الروابط واستخراج النص."""
274
+ audio_url = fix_url(audio_url)
275
+ # نحاول حفظ بصيغة .wav إن أمكن
276
+ path = download_to_temp(audio_url, ".wav")
277
+ try:
278
+ return f"نص الصوت:\n{extract_text_from_audio_file(path, language=language)}"
279
+ finally:
280
+ with contextlib.suppress(Exception):
281
+ os.remove(path)
282
+
283
+
284
+ def analyze_video_from_url(video_url: str, language: str = "ar-SA") -> str:
285
+ """
286
+ تحليل الفيديو:
287
+ - يتطلب moviepy + ffmpeg.
288
+ - يستخرج الصوت ثم يحوله إلى نص.
289
+ """
290
+ ensure_dependencies(require_video=True)
291
+ video_url = fix_url(video_url)
292
+ vpath = download_to_temp(video_url, ".mp4")
293
+ apath = vpath + ".wav"
294
+ try:
295
+ # استخلاص الصوت عبر moviepy (يتطلب ffmpeg)
296
+ video = mp.VideoFileClip(vpath)
297
+ # suppress logs
298
+ video.audio.write_audiofile(apath, verbose=False, logger=None)
299
+ text = extract_text_from_audio_file(apath, language=language)
300
+ return f"نص الفيديو:\n{text}"
301
+ finally:
302
+ with contextlib.suppress(Exception):
303
+ if os.path.exists(vpath):
304
+ os.remove(vpath)
305
+ with contextlib.suppress(Exception):
306
+ if os.path.exists(apath):
307
+ os.remove(apath)
308
+
309
+
310
+ # ===== وظائف إضافية لمعالجة الفيديو =====
311
+ def process_video_with_ffmpeg(
312
+ in_file: str = "input.mp4",
313
+ out_file: str = "output.mp4",
314
+ ss: Optional[float] = 10.0,
315
+ t: Optional[float] = 5.0,
316
+ ) -> str:
317
+ """معالجة بسيطة باستخدام ffmpeg: تقطيع مقطع من الفيديو."""
318
+ if not has_ffmpeg():
319
+ return "FFmpeg غير متوفر"
320
+ try:
321
+ if FFMPEG_PY_AVAILABLE:
322
+ (
323
+ ffmpeg_py
324
+ .input(in_file, ss=ss if ss is not None else 0)
325
+ .output(out_file, t=t if t is not None else None, c="copy")
326
+ .overwrite_output()
327
+ .run(quiet=True)
328
+ )
329
+ else:
330
+ # استخدام الثنائي مباشرة
331
+ cmd = ["ffmpeg", "-y"]
332
+ if ss is not None:
333
+ cmd += ["-ss", str(ss)]
334
+ cmd += ["-i", in_file]
335
+ if t is not None:
336
+ cmd += ["-t", str(t)]
337
+ cmd += ["-c", "copy", out_file]
338
+ subprocess.run(cmd, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
339
+ return "تم معالجة الفيديو باستخدام FFmpeg"
340
+ except Exception as e:
341
+ return f"خطأ في معالجة الفيديو: {e}"
342
+
343
+
344
+ def process_video_with_cv2(in_file: str = "video.mp4") -> str:
345
+ """معالجة الفيديو باستخدام OpenCV (إن توفّرت)."""
346
+ if not CV2_AVAILABLE:
347
+ return "OpenCV غير متوفر"
348
+ cap = cv2.VideoCapture(in_file)
349
+ frames = 0
350
+ try:
351
+ while cap.isOpened():
352
+ ret, frame = cap.read()
353
+ if not ret:
354
+ break
355
+ # معالجة الإطار إن لزم
356
+ frames += 1
357
+ return f"تم معالجة الفيديو باستخدام OpenCV (عدد الإطارات: {frames})"
358
+ finally:
359
+ cap.release()
360
+
361
+
362
+ def process_video_with_pydub(in_file: str = "video.mp4", out_audio: str = "audio.mp3") -> str:
363
+ """استخراج الصوت من الفيديو باستخدام pydub (إن توفّرت)."""
364
+ if not PYDUB_AVAILABLE:
365
+ return "pydub غير متوفر"
366
+ try:
367
+ sound = AudioSegment.from_file(in_file)
368
+ sound.export(out_audio, format="mp3")
369
+ return f"تم استخراج الصوت من الفيديو → {out_audio}"
370
+ except Exception as e:
371
+ return f"خطأ في استخراج الصوت: {e}"
372
+
373
+
374
+ def process_video_with_av(in_file: str = "video.mp4") -> str:
375
+ """معالجة الفيديو باستخدام PyAV (إن توفّرت)."""
376
+ if not AV_AVAILABLE:
377
+ return "PyAV غير متوفر"
378
+ try:
379
+ container = av.open(in_file)
380
+ frames = 0
381
+ for frame in container.decode(video=0):
382
+ _img = frame.to_image() # مثال: تحويل لصورة PIL إذا احتجت
383
+ frames += 1
384
+ return f"تم استخراج {frames} إطار من الفيديو"
385
+ except Exception as e:
386
+ return f"خطأ في معالجة الفيديو: {e}"
387
+
388
+
389
+ # ===== نقطة دخول اختبارية اختيارية =====
390
+ if __name__ == "__main__":
391
+ # أمثلة سريعة (بدّل الروابط حسب حاجتك):
392
+ print("✅ ready")
393
+ # print(analyze_url_type("https://youtu.be/xyz"))
394
+ # print(detect_media_type("https://site.com/file.pdf"))
395
+ # print(analyze_image_from_url("https://via.placeholder.com/300.png"))
396
+ # print(analyze_pdf_from_url("https://arxiv.org/pdf/1706.03762.pdf"))
397
+ # print(analyze_audio_from_url("https://server/test.wav"))
398
+ # print(analyze_video_from_url("https://server/test.mp4"))
app.py ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, jsonify
2
+ from flask_cors import CORS
3
+ from ai_controller import AIController
4
+ from config import DEFAULT_MODEL
5
+
6
+ app = Flask(name)
7
+ CORS(app)
8
+
9
+ controller = AIController()
10
+
11
+ @app.get("/health")
12
+ def health():
13
+ return jsonify(status="ok", model=DEFAULT_MODEL)
14
+
15
+ @app.post("/chat")
16
+ def chat():
17
+ data = request.get_json(force=True, silent=True) or {}
18
+ message = data.get("message", "")
19
+ model = data.get("model") or DEFAULT_MODEL
20
+ if not message:
21
+ return jsonify(error="message is required"), 400
22
+ reply = controller.generate_response(message, model=model)
23
+ return jsonify(reply=reply)
24
+
25
+ if name == "main":
26
+ app.run(host="0.0.0.0", port=7520)
bot.log ADDED
@@ -0,0 +1,545 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 2025-08-01 22:01:33,314 - WARNING - Some parameters are on the meta device because they were offloaded to the disk and cpu.
2
+ 2025-08-01 22:02:18,864 - INFO - Bot is starting...
3
+ 2025-08-01 22:02:24,233 - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAGqFjm5PtDiH98VFUstAicRGLcxTRpSOrM/getMe "HTTP/1.1 200 OK"
4
+ 2025-08-01 22:02:24,362 - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAGqFjm5PtDiH98VFUstAicRGLcxTRpSOrM/deleteWebhook "HTTP/1.1 200 OK"
5
+ 2025-08-01 22:02:24,495 - INFO - Application started
6
+ 2025-08-01 22:02:24,967 - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAGqFjm5PtDiH98VFUstAicRGLcxTRpSOrM/getUpdates "HTTP/1.1 200 OK"
7
+ 2025-08-01 22:02:25,424 - INFO - Received message from 1421046090: \u0645\u0631\u062d\u0628\u0627
8
+ 2025-08-01 22:02:26,241 - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAGqFjm5PtDiH98VFUstAicRGLcxTRpSOrM/sendMessage "HTTP/1.1 200 OK"
9
+ 2025-08-01 22:02:26,243 - INFO - Received message from 1421046090: \u0627\u0644\u0633\u0644\u0627\u0645 \u0639\u0644\u064a\u0643\u0645 \u0648\u0631\u062d\u0645\u0629 \u0627\u0644\u0644\u0647
10
+ 2025-08-01 22:12:35,960 - WARNING - Some parameters are on the meta device because they were offloaded to the cpu and disk.
11
+ 2025-08-01 22:28:11,255 - WARNING - Some parameters are on the meta device because they were offloaded to the cpu and disk.
12
+ 2025-08-01 23:56:41,215 - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAGqFjm5PtDiH98VFUstAicRGLcxTRpSOrM/getUpdates "HTTP/1.1 200 OK"
13
+ 2025-08-01 23:56:46,883 - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAGqFjm5PtDiH98VFUstAicRGLcxTRpSOrM/getUpdates "HTTP/1.1 200 OK"
14
+ 2025-08-01 23:56:48,396 - INFO - Application is stopping. This might take a moment.
15
+ 2025-08-01 23:56:48,412 - CRITICAL - Fetching updates was aborted due to KeyboardInterrupt(). Suppressing exception to ensure graceful shutdown.
16
+ Traceback (most recent call last):
17
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\telegram\ext\_application.py", line 673, in stop
18
+ self.__update_fetcher_task.result()
19
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
20
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\telegram\ext\_application.py", line 1228, in _update_fetcher
21
+ await self.__update_fetcher()
22
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\telegram\ext\_application.py", line 1224, in __update_fetcher
23
+ await self.__process_update_wrapper(update)
24
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\telegram\ext\_application.py", line 1239, in __process_update_wrapper
25
+ await self._update_processor.process_update(update, self.process_update(update))
26
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\telegram\ext\_baseupdateprocessor.py", line 170, in process_update
27
+ await self.do_process_update(update, coroutine)
28
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\telegram\ext\_baseupdateprocessor.py", line 195, in do_process_update
29
+ await coroutine
30
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\telegram\ext\_application.py", line 1311, in process_update
31
+ await coroutine
32
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\telegram\ext\_handlers\basehandler.py", line 158, in handle_update
33
+ return await self.callback(update, context)
34
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
35
+ File "C:\Users\osamawin\Desktop\New Folder\harddisk\nora\nouraai12\telegram_listener.py", line 27, in handle_message
36
+ TELEGRAM_TOKEN = os.getenv("TELEGRAM_TOKEN") or "8015627699:AAGqFjm5PtDiH98VFUstAicRGLcxTRpSOrM"
37
+ ^^^^^^^^^^^^^^^^^^^^^^^^
38
+ File "C:\Users\osamawin\Desktop\New Folder\harddisk\nora\nouraai12\responses.py", line 163, in auto_reply
39
+ File "C:\Users\osamawin\Desktop\New Folder\harddisk\nora\nouraai12\responses.py", line 128, in generate_reply
40
+ File "C:\Users\osamawin\Desktop\New Folder\harddisk\nora\nouraai12\responses.py", line 84, in generate_llama_response
41
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\torch\utils\_contextlib.py", line 116, in decorate_context
42
+ return func(*args, **kwargs)
43
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\transformers\generation\utils.py", line 2633, in generate
44
+ result = self._sample(
45
+ input_ids,
46
+ ...<5 lines>...
47
+ **model_kwargs,
48
+ )
49
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\transformers\generation\utils.py", line 3617, in _sample
50
+ outputs = model_forward(**model_inputs, return_dict=True)
51
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\torch\nn\modules\module.py", line 1751, in _wrapped_call_impl
52
+ return self._call_impl(*args, **kwargs)
53
+ ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
54
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\torch\nn\modules\module.py", line 1762, in _call_impl
55
+ return forward_call(*args, **kwargs)
56
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\accelerate\hooks.py", line 175, in new_forward
57
+ output = module._old_forward(*args, **kwargs)
58
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\transformers\utils\generic.py", line 961, in wrapper
59
+ output = func(self, *args, **kwargs)
60
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\transformers\models\llama\modeling_llama.py", line 460, in forward
61
+ outputs: BaseModelOutputWithPast = self.model(
62
+ ~~~~~~~~~~^
63
+ input_ids=input_ids,
64
+ ^^^^^^^^^^^^^^^^^^^^
65
+ ...<6 lines>...
66
+ **kwargs,
67
+ ^^^^^^^^^
68
+ )
69
+ ^
70
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\torch\nn\modules\module.py", line 1751, in _wrapped_call_impl
71
+ return self._call_impl(*args, **kwargs)
72
+ ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
73
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\torch\nn\modules\module.py", line 1762, in _call_impl
74
+ return forward_call(*args, **kwargs)
75
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\transformers\utils\generic.py", line 1069, in wrapper
76
+ outputs = func(self, *args, **kwargs)
77
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\transformers\models\llama\modeling_llama.py", line 390, in forward
78
+ hidden_states = decoder_layer(
79
+ hidden_states,
80
+ ...<5 lines>...
81
+ **kwargs,
82
+ )
83
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\transformers\modeling_layers.py", line 94, in __call__
84
+ return super().__call__(*args, **kwargs)
85
+ ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
86
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\torch\nn\modules\module.py", line 1751, in _wrapped_call_impl
87
+ return self._call_impl(*args, **kwargs)
88
+ ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
89
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\torch\nn\modules\module.py", line 1762, in _call_impl
90
+ return forward_call(*args, **kwargs)
91
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\accelerate\hooks.py", line 175, in new_forward
92
+ output = module._old_forward(*args, **kwargs)
93
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\transformers\models\llama\modeling_llama.py", line 304, in forward
94
+ hidden_states = self.mlp(hidden_states)
95
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\torch\nn\modules\module.py", line 1751, in _wrapped_call_impl
96
+ return self._call_impl(*args, **kwargs)
97
+ ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
98
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\torch\nn\modules\module.py", line 1762, in _call_impl
99
+ return forward_call(*args, **kwargs)
100
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\accelerate\hooks.py", line 175, in new_forward
101
+ output = module._old_forward(*args, **kwargs)
102
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\transformers\models\llama\modeling_llama.py", line 152, in forward
103
+ down_proj = self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x))
104
+ ~~~~~~~~~~~~~~^^^
105
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\torch\nn\modules\module.py", line 1751, in _wrapped_call_impl
106
+ return self._call_impl(*args, **kwargs)
107
+ ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
108
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\torch\nn\modules\module.py", line 1762, in _call_impl
109
+ return forward_call(*args, **kwargs)
110
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\accelerate\hooks.py", line 175, in new_forward
111
+ output = module._old_forward(*args, **kwargs)
112
+ File "C:\Users\osamawin\AppData\Local\Programs\Python\Python313\Lib\site-packages\torch\nn\modules\linear.py", line 125, in forward
113
+ return F.linear(input, self.weight, self.bias)
114
+ ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
115
+ KeyboardInterrupt
116
+ 2025-08-01 23:57:00,961 - INFO - Application.stop() complete
117
+ 2025-08-02 02:07:10,420 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getMe "HTTP/1.1 200 OK"
118
+ 2025-08-02 02:07:10,690 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/deleteWebhook "HTTP/1.1 200 OK"
119
+ 2025-08-02 02:07:10,739 - telegram.ext.Application - INFO - Application started
120
+ 2025-08-02 02:07:18,482 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getMe "HTTP/1.1 200 OK"
121
+ 2025-08-02 02:07:18,676 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/deleteWebhook "HTTP/1.1 200 OK"
122
+ 2025-08-02 02:07:18,702 - telegram.ext.Application - INFO - Application started
123
+ 2025-08-02 02:07:21,122 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
124
+ 2025-08-02 02:07:28,931 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
125
+ 2025-08-02 02:07:31,209 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
126
+ 2025-08-02 02:07:39,005 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
127
+ 2025-08-02 02:07:41,292 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
128
+ 2025-08-02 02:07:49,082 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
129
+ 2025-08-02 02:07:51,380 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
130
+ 2025-08-02 02:07:59,158 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
131
+ 2025-08-02 02:08:01,467 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
132
+ 2025-08-02 02:08:09,232 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
133
+ 2025-08-02 02:08:11,553 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
134
+ 2025-08-02 02:08:19,308 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
135
+ 2025-08-02 02:08:21,637 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
136
+ 2025-08-02 02:08:29,380 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
137
+ 2025-08-02 02:08:31,725 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
138
+ 2025-08-02 02:08:39,452 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
139
+ 2025-08-02 02:08:41,809 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
140
+ 2025-08-02 02:08:49,525 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
141
+ 2025-08-02 02:08:51,894 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
142
+ 2025-08-02 02:08:59,618 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
143
+ 2025-08-02 02:09:01,978 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
144
+ 2025-08-02 02:09:09,695 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
145
+ 2025-08-02 02:09:12,063 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
146
+ 2025-08-02 02:09:19,768 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
147
+ 2025-08-02 02:09:22,150 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
148
+ 2025-08-02 02:09:29,845 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
149
+ 2025-08-02 02:09:32,243 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
150
+ 2025-08-02 02:09:39,923 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
151
+ 2025-08-02 02:09:42,327 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
152
+ 2025-08-02 02:09:50,001 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
153
+ 2025-08-02 02:09:52,410 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
154
+ 2025-08-02 02:10:00,080 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
155
+ 2025-08-02 02:10:02,493 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
156
+ 2025-08-02 02:10:10,156 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
157
+ 2025-08-02 02:10:12,577 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
158
+ 2025-08-02 02:10:20,234 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
159
+ 2025-08-02 02:10:22,663 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
160
+ 2025-08-02 02:10:30,311 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
161
+ 2025-08-02 02:10:32,752 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
162
+ 2025-08-02 02:10:40,393 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
163
+ 2025-08-02 02:10:42,857 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
164
+ 2025-08-02 02:10:50,470 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
165
+ 2025-08-02 02:10:52,943 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
166
+ 2025-08-02 02:11:00,546 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
167
+ 2025-08-02 02:11:03,030 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
168
+ 2025-08-02 02:11:10,623 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
169
+ 2025-08-02 02:11:13,117 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
170
+ 2025-08-02 02:11:20,701 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
171
+ 2025-08-02 02:11:23,203 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
172
+ 2025-08-02 02:11:30,778 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
173
+ 2025-08-02 02:11:33,289 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
174
+ 2025-08-02 02:11:40,855 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
175
+ 2025-08-02 02:11:43,375 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
176
+ 2025-08-02 02:11:50,929 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
177
+ 2025-08-02 02:11:53,463 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
178
+ 2025-08-02 02:12:02,195 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
179
+ 2025-08-02 02:12:04,807 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
180
+ 2025-08-02 02:12:12,272 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
181
+ 2025-08-02 02:12:14,934 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
182
+ 2025-08-02 02:12:22,349 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
183
+ 2025-08-02 02:12:25,016 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
184
+ 2025-08-02 02:12:32,426 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
185
+ 2025-08-02 02:12:35,103 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
186
+ 2025-08-02 02:12:42,791 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
187
+ 2025-08-02 02:12:45,198 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
188
+ 2025-08-02 02:12:52,867 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
189
+ 2025-08-02 02:12:55,282 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
190
+ 2025-08-02 02:13:02,943 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
191
+ 2025-08-02 02:13:05,424 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
192
+ 2025-08-02 02:13:13,071 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
193
+ 2025-08-02 02:13:15,511 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
194
+ 2025-08-02 02:13:23,147 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
195
+ 2025-08-02 02:13:25,594 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
196
+ 2025-08-02 02:13:33,226 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
197
+ 2025-08-02 02:13:35,676 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
198
+ 2025-08-02 02:13:43,301 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
199
+ 2025-08-02 02:13:45,760 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
200
+ 2025-08-02 02:13:53,374 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
201
+ 2025-08-02 02:13:55,845 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
202
+ 2025-08-02 02:14:03,447 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
203
+ 2025-08-02 02:14:05,928 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
204
+ 2025-08-02 02:14:13,528 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
205
+ 2025-08-02 02:14:16,014 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
206
+ 2025-08-02 02:14:23,606 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
207
+ 2025-08-02 02:14:26,099 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
208
+ 2025-08-02 02:14:33,716 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
209
+ 2025-08-02 02:14:36,187 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
210
+ 2025-08-02 02:14:43,795 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
211
+ 2025-08-02 02:14:46,295 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
212
+ 2025-08-02 02:14:53,873 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
213
+ 2025-08-02 02:14:56,383 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
214
+ 2025-08-02 02:15:03,949 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
215
+ 2025-08-02 02:15:06,470 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
216
+ 2025-08-02 02:15:14,027 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
217
+ 2025-08-02 02:15:16,558 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
218
+ 2025-08-02 02:15:24,103 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
219
+ 2025-08-02 02:15:26,645 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
220
+ 2025-08-02 02:15:34,180 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
221
+ 2025-08-02 02:15:36,728 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
222
+ 2025-08-02 02:15:44,258 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
223
+ 2025-08-02 02:15:46,814 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
224
+ 2025-08-02 02:15:54,336 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
225
+ 2025-08-02 02:15:56,899 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
226
+ 2025-08-02 02:16:04,411 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
227
+ 2025-08-02 02:16:06,983 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
228
+ 2025-08-02 02:16:14,488 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
229
+ 2025-08-02 02:16:15,106 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
230
+ 2025-08-02 02:16:15,110 - telegram.ext.Application - INFO - Application is stopping. This might take a moment.
231
+ 2025-08-02 02:16:15,114 - telegram.ext.Application - INFO - Application.stop() complete
232
+ 2025-08-02 02:16:24,613 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
233
+ 2025-08-02 02:16:34,702 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
234
+ 2025-08-02 02:16:44,778 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
235
+ 2025-08-02 02:16:54,856 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
236
+ 2025-08-02 02:17:04,933 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
237
+ 2025-08-02 02:17:15,006 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
238
+ 2025-08-02 02:17:25,082 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
239
+ 2025-08-02 02:17:35,155 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
240
+ 2025-08-02 02:17:45,237 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
241
+ 2025-08-02 02:17:55,316 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot7840940099:AAHjijIXKFb7Cns0sZqvgtwCzW1IBHbykOM/getUpdates "HTTP/1.1 200 OK"
242
+ 2025-08-02 02:50:09,059 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getMe "HTTP/1.1 200 OK"
243
+ 2025-08-02 02:50:09,382 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/deleteWebhook "HTTP/1.1 200 OK"
244
+ 2025-08-02 02:50:09,413 - telegram.ext.Application - INFO - Application started
245
+ 2025-08-02 02:50:19,661 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
246
+ 2025-08-02 02:50:29,852 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
247
+ 2025-08-02 02:50:39,935 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
248
+ 2025-08-02 02:50:50,021 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
249
+ 2025-08-02 02:51:00,108 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
250
+ 2025-08-02 02:51:10,188 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
251
+ 2025-08-02 02:51:20,279 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
252
+ 2025-08-02 02:51:30,363 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
253
+ 2025-08-02 02:51:40,447 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
254
+ 2025-08-02 02:51:50,528 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
255
+ 2025-08-02 02:52:00,610 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
256
+ 2025-08-02 02:52:10,703 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
257
+ 2025-08-02 02:52:20,781 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
258
+ 2025-08-02 02:52:30,859 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
259
+ 2025-08-02 02:52:40,991 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
260
+ 2025-08-02 02:52:51,070 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
261
+ 2025-08-02 02:53:01,148 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
262
+ 2025-08-02 02:53:11,231 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
263
+ 2025-08-02 02:53:22,339 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
264
+ 2025-08-02 02:53:32,417 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
265
+ 2025-08-02 02:53:42,501 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
266
+ 2025-08-02 02:53:52,583 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
267
+ 2025-08-02 02:54:02,663 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
268
+ 2025-08-02 02:54:12,745 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
269
+ 2025-08-02 02:54:22,830 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
270
+ 2025-08-02 02:54:32,926 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
271
+ 2025-08-02 02:54:43,013 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
272
+ 2025-08-02 02:54:53,096 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
273
+ 2025-08-02 02:55:03,181 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
274
+ 2025-08-02 02:55:13,259 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
275
+ 2025-08-02 02:55:23,337 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
276
+ 2025-08-02 02:55:33,415 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
277
+ 2025-08-02 02:55:43,498 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
278
+ 2025-08-02 02:55:53,580 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
279
+ 2025-08-02 02:56:03,665 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
280
+ 2025-08-02 02:56:13,750 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
281
+ 2025-08-02 02:56:23,827 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
282
+ 2025-08-02 02:56:33,907 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
283
+ 2025-08-02 02:56:43,986 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
284
+ 2025-08-02 02:56:54,071 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
285
+ 2025-08-02 02:57:04,153 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
286
+ 2025-08-02 02:57:14,237 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
287
+ 2025-08-02 02:57:24,320 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
288
+ 2025-08-02 02:57:34,398 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
289
+ 2025-08-02 02:57:44,480 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
290
+ 2025-08-02 02:57:54,568 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
291
+ 2025-08-02 02:58:04,718 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
292
+ 2025-08-02 02:58:14,797 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
293
+ 2025-08-02 02:58:24,876 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
294
+ 2025-08-02 02:58:34,955 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
295
+ 2025-08-02 02:58:45,034 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
296
+ 2025-08-02 02:58:55,163 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
297
+ 2025-08-02 02:59:05,257 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
298
+ 2025-08-02 02:59:15,348 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
299
+ 2025-08-02 02:59:25,435 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
300
+ 2025-08-02 02:59:35,518 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
301
+ 2025-08-02 02:59:45,599 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
302
+ 2025-08-02 02:59:55,680 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
303
+ 2025-08-02 03:00:05,759 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
304
+ 2025-08-02 03:00:15,849 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
305
+ 2025-08-02 03:00:25,939 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
306
+ 2025-08-02 03:00:36,018 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
307
+ 2025-08-02 03:00:46,097 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
308
+ 2025-08-02 03:00:56,176 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
309
+ 2025-08-02 03:01:06,262 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
310
+ 2025-08-02 03:01:16,399 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
311
+ 2025-08-02 03:01:26,484 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
312
+ 2025-08-02 03:01:36,574 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
313
+ 2025-08-02 03:01:46,651 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
314
+ 2025-08-02 03:01:56,729 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
315
+ 2025-08-02 03:02:06,808 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
316
+ 2025-08-02 03:02:16,891 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
317
+ 2025-08-02 03:02:27,033 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
318
+ 2025-08-02 03:02:37,116 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
319
+ 2025-08-02 03:02:47,199 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
320
+ 2025-08-02 03:02:57,278 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
321
+ 2025-08-02 03:03:07,365 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
322
+ 2025-08-02 03:03:17,457 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
323
+ 2025-08-02 03:03:27,540 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
324
+ 2025-08-02 03:03:37,619 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
325
+ 2025-08-02 03:03:47,722 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
326
+ 2025-08-02 03:03:57,801 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
327
+ 2025-08-02 03:04:07,893 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
328
+ 2025-08-02 03:04:17,981 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
329
+ 2025-08-02 03:04:28,065 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
330
+ 2025-08-02 03:04:38,151 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
331
+ 2025-08-02 03:04:48,245 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
332
+ 2025-08-02 03:04:58,327 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
333
+ 2025-08-02 03:05:08,433 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
334
+ 2025-08-02 03:05:18,512 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
335
+ 2025-08-02 03:05:28,592 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
336
+ 2025-08-02 03:05:38,682 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
337
+ 2025-08-02 03:05:48,768 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
338
+ 2025-08-02 03:05:58,847 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
339
+ 2025-08-02 03:06:09,010 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
340
+ 2025-08-02 03:06:19,098 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
341
+ 2025-08-02 03:06:29,180 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
342
+ 2025-08-02 03:06:39,263 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
343
+ 2025-08-02 03:06:49,349 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
344
+ 2025-08-02 03:06:59,478 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
345
+ 2025-08-02 03:07:11,587 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
346
+ 2025-08-02 03:07:21,694 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
347
+ 2025-08-02 03:07:31,776 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
348
+ 2025-08-02 03:07:41,870 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
349
+ 2025-08-02 03:07:51,955 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
350
+ 2025-08-02 03:08:02,046 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
351
+ 2025-08-02 03:08:12,139 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
352
+ 2025-08-02 03:08:22,226 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
353
+ 2025-08-02 03:08:32,310 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
354
+ 2025-08-02 03:08:42,477 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
355
+ 2025-08-02 03:08:52,559 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
356
+ 2025-08-02 03:09:02,639 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
357
+ 2025-08-02 03:09:12,730 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
358
+ 2025-08-02 03:09:22,810 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
359
+ 2025-08-02 03:09:32,892 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
360
+ 2025-08-02 03:09:42,971 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
361
+ 2025-08-02 03:09:53,050 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
362
+ 2025-08-02 03:10:03,132 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
363
+ 2025-08-02 03:10:13,208 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
364
+ 2025-08-02 03:10:23,285 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
365
+ 2025-08-02 03:10:33,393 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
366
+ 2025-08-02 03:10:43,478 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
367
+ 2025-08-02 03:10:53,557 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
368
+ 2025-08-02 03:11:03,643 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
369
+ 2025-08-02 03:11:13,721 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
370
+ 2025-08-02 03:11:23,798 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
371
+ 2025-08-02 03:11:33,877 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
372
+ 2025-08-02 03:11:43,965 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
373
+ 2025-08-02 03:11:54,047 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
374
+ 2025-08-02 03:12:04,369 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
375
+ 2025-08-02 03:12:14,447 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
376
+ 2025-08-02 03:12:24,525 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
377
+ 2025-08-02 03:12:34,879 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
378
+ 2025-08-02 03:12:44,959 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
379
+ 2025-08-02 03:12:55,150 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
380
+ 2025-08-02 03:13:05,340 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
381
+ 2025-08-02 03:13:15,422 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
382
+ 2025-08-02 03:13:25,501 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
383
+ 2025-08-02 03:13:35,585 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
384
+ 2025-08-02 03:13:45,698 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
385
+ 2025-08-02 03:13:55,781 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
386
+ 2025-08-02 03:14:05,861 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
387
+ 2025-08-02 03:14:15,948 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
388
+ 2025-08-02 03:14:26,047 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
389
+ 2025-08-02 03:14:36,132 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
390
+ 2025-08-02 03:14:46,210 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
391
+ 2025-08-02 03:14:56,314 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
392
+ 2025-08-02 03:15:06,394 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
393
+ 2025-08-02 03:15:16,474 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
394
+ 2025-08-02 03:15:26,553 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
395
+ 2025-08-02 03:15:36,637 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
396
+ 2025-08-02 03:15:46,732 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
397
+ 2025-08-02 03:16:00,593 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
398
+ 2025-08-02 03:16:10,675 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
399
+ 2025-08-02 03:16:20,757 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
400
+ 2025-08-02 03:16:30,837 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
401
+ 2025-08-02 03:16:40,923 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
402
+ 2025-08-02 03:16:50,999 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
403
+ 2025-08-02 03:17:01,079 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
404
+ 2025-08-02 03:17:11,233 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
405
+ 2025-08-02 03:17:21,316 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
406
+ 2025-08-02 03:17:31,397 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
407
+ 2025-08-02 03:17:41,480 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
408
+ 2025-08-02 03:17:51,559 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
409
+ 2025-08-02 03:18:01,789 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
410
+ 2025-08-02 03:18:11,994 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
411
+ 2025-08-02 03:18:22,102 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
412
+ 2025-08-02 03:18:32,191 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
413
+ 2025-08-02 03:18:42,290 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
414
+ 2025-08-02 03:18:52,372 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
415
+ 2025-08-02 03:19:02,630 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
416
+ 2025-08-02 03:19:12,762 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
417
+ 2025-08-02 03:19:22,965 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
418
+ 2025-08-02 03:19:33,129 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
419
+ 2025-08-02 03:19:43,211 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
420
+ 2025-08-02 03:19:53,488 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
421
+ 2025-08-02 03:20:05,640 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
422
+ 2025-08-02 03:20:15,717 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
423
+ 2025-08-02 03:20:25,848 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
424
+ 2025-08-02 03:20:36,298 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
425
+ 2025-08-02 03:20:46,380 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
426
+ 2025-08-02 03:20:56,456 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
427
+ 2025-08-02 03:21:06,683 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
428
+ 2025-08-02 03:21:16,759 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
429
+ 2025-08-02 03:21:26,862 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
430
+ 2025-08-02 03:21:36,961 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
431
+ 2025-08-02 03:21:47,038 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
432
+ 2025-08-02 03:21:57,734 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
433
+ 2025-08-02 03:22:07,886 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
434
+ 2025-08-02 03:22:18,065 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
435
+ 2025-08-02 03:22:28,466 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
436
+ 2025-08-02 03:22:38,913 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
437
+ 2025-08-02 03:22:49,020 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
438
+ 2025-08-02 03:22:59,134 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
439
+ 2025-08-02 03:23:09,278 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
440
+ 2025-08-02 03:23:19,857 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
441
+ 2025-08-02 03:23:29,940 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
442
+ 2025-08-02 03:23:40,022 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
443
+ 2025-08-02 03:23:51,982 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
444
+ 2025-08-02 03:24:02,151 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
445
+ 2025-08-02 03:24:34,988 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
446
+ 2025-08-02 03:24:45,116 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
447
+ 2025-08-02 03:24:55,219 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
448
+ 2025-08-02 03:25:05,356 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
449
+ 2025-08-02 03:25:15,432 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
450
+ 2025-08-02 03:25:25,510 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
451
+ 2025-08-02 03:25:35,585 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
452
+ 2025-08-02 03:25:45,698 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
453
+ 2025-08-02 03:25:56,089 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
454
+ 2025-08-02 03:26:06,167 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
455
+ 2025-08-02 03:26:16,246 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
456
+ 2025-08-02 03:26:26,326 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
457
+ 2025-08-02 03:26:36,437 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
458
+ 2025-08-02 03:26:46,639 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
459
+ 2025-08-02 03:26:56,717 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
460
+ 2025-08-02 03:27:06,805 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
461
+ 2025-08-02 03:27:16,884 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
462
+ 2025-08-02 03:27:26,961 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
463
+ 2025-08-02 03:27:37,043 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
464
+ 2025-08-02 03:27:47,119 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
465
+ 2025-08-02 03:27:57,195 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
466
+ 2025-08-02 03:28:07,271 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
467
+ 2025-08-02 03:28:17,347 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
468
+ 2025-08-02 03:28:27,426 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
469
+ 2025-08-02 03:28:37,507 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
470
+ 2025-08-02 03:28:47,588 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
471
+ 2025-08-02 03:28:57,669 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
472
+ 2025-08-02 03:29:07,744 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
473
+ 2025-08-02 03:29:18,283 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
474
+ 2025-08-02 03:29:28,359 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
475
+ 2025-08-02 03:29:38,438 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
476
+ 2025-08-02 03:29:48,514 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
477
+ 2025-08-02 03:29:58,590 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
478
+ 2025-08-02 03:30:08,664 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
479
+ 2025-08-02 03:30:18,747 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
480
+ 2025-08-02 03:30:28,825 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
481
+ 2025-08-02 03:30:38,906 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
482
+ 2025-08-02 03:30:48,985 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
483
+ 2025-08-02 03:30:59,061 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
484
+ 2025-08-02 03:31:09,140 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
485
+ 2025-08-02 03:31:19,217 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
486
+ 2025-08-02 03:31:29,366 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
487
+ 2025-08-02 03:31:39,473 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
488
+ 2025-08-02 03:33:09,010 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
489
+ 2025-08-02 03:33:19,138 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
490
+ 2025-08-02 03:33:29,277 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
491
+ 2025-08-02 03:34:04,401 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
492
+ 2025-08-02 03:34:16,605 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
493
+ 2025-08-02 03:34:26,680 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
494
+ 2025-08-02 03:34:32,100 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
495
+ 2025-08-02 03:35:10,730 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
496
+ 2025-08-02 03:35:11,335 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendChatAction "HTTP/1.1 200 OK"
497
+ 2025-08-10 09:04:57,395 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getMe "HTTP/1.1 200 OK"
498
+ 2025-08-10 09:04:58,001 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/deleteWebhook "HTTP/1.1 200 OK"
499
+ 2025-08-10 09:04:58,003 - telegram.ext.Application - INFO - Application started
500
+ 2025-08-10 09:05:08,254 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
501
+ 2025-08-10 09:05:17,924 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
502
+ 2025-08-10 09:05:26,685 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
503
+ 2025-08-10 09:05:26,713 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendChatAction "HTTP/1.1 200 OK"
504
+ 2025-08-10 09:05:27,921 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendMessage "HTTP/1.1 200 OK"
505
+ 2025-08-10 09:05:31,869 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendChatAction "HTTP/1.1 200 OK"
506
+ 2025-08-10 09:05:34,657 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendMessage "HTTP/1.1 200 OK"
507
+ 2025-08-10 09:05:36,761 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
508
+ 2025-08-10 09:05:41,832 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
509
+ 2025-08-10 09:05:45,109 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendChatAction "HTTP/1.1 200 OK"
510
+ 2025-08-10 09:05:47,657 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendMessage "HTTP/1.1 200 OK"
511
+ 2025-08-10 09:05:54,922 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
512
+ 2025-08-10 09:06:05,010 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
513
+ 2025-08-10 09:06:27,920 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
514
+ 2025-08-10 09:06:31,336 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
515
+ 2025-08-10 09:06:41,439 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendChatAction "HTTP/1.1 200 OK"
516
+ 2025-08-10 09:06:49,801 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
517
+ 2025-08-10 09:06:50,197 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendMessage "HTTP/1.1 200 OK"
518
+ 2025-08-10 09:06:50,938 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendChatAction "HTTP/1.1 200 OK"
519
+ 2025-08-10 09:06:51,281 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendMessage "HTTP/1.1 200 OK"
520
+ 2025-08-10 09:07:00,004 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
521
+ 2025-08-10 09:07:10,126 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
522
+ 2025-08-10 09:07:20,298 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
523
+ 2025-08-10 09:07:24,915 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
524
+ 2025-08-10 09:07:25,187 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendChatAction "HTTP/1.1 200 OK"
525
+ 2025-08-10 09:07:25,344 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendMessage "HTTP/1.1 200 OK"
526
+ 2025-08-10 09:07:35,012 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
527
+ 2025-08-10 09:07:45,084 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
528
+ 2025-08-10 09:07:48,256 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
529
+ 2025-08-10 09:07:48,584 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendChatAction "HTTP/1.1 200 OK"
530
+ 2025-08-10 09:07:48,747 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendMessage "HTTP/1.1 200 OK"
531
+ 2025-08-10 09:07:58,374 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
532
+ 2025-08-10 09:08:08,449 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
533
+ 2025-08-10 09:08:18,527 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
534
+ 2025-08-10 09:08:28,602 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
535
+ 2025-08-10 09:08:32,280 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
536
+ 2025-08-10 09:08:32,711 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendChatAction "HTTP/1.1 200 OK"
537
+ 2025-08-10 09:08:32,941 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendMessage "HTTP/1.1 200 OK"
538
+ 2025-08-10 09:08:39,967 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
539
+ 2025-08-10 09:08:40,498 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendChatAction "HTTP/1.1 200 OK"
540
+ 2025-08-10 09:08:40,943 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/sendMessage "HTTP/1.1 200 OK"
541
+ 2025-08-10 09:08:50,281 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
542
+ 2025-08-10 09:09:00,355 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
543
+ 2025-08-10 09:09:10,452 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
544
+ 2025-08-10 09:09:20,566 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
545
+ 2025-08-10 09:09:30,712 - httpx - INFO - HTTP Request: POST https://api.telegram.org/bot8015627699:AAE7pn6cLZalA7SVWtvdshwv08kjqa4ASAw/getUpdates "HTTP/1.1 200 OK"
bot.py ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import json
3
+ import argparse
4
+ import paramiko
5
+
6
+ def load_servers(config_path='config.json'):
7
+ """تحميل قائمة الخوادم من ملف إعدادات JSON"""
8
+ try:
9
+ with open(config_path, 'r') as f:
10
+ data = json.load(f)
11
+ return data.get('servers', [])
12
+ except Exception as e:
13
+ print(f"[!] Failed to load config: {e}")
14
+ return []
15
+
16
+ def copy_file(server, local_file, remote_file):
17
+ """نسخ ملف من الجهاز المحلي إلى الخادم عبر SSH"""
18
+ try:
19
+ ssh = paramiko.SSHClient()
20
+ ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
21
+ ssh.connect(
22
+ hostname=server['host'],
23
+ port=server.get('port', 22), # 22 هو البورت الافتراضي لـ SSH
24
+ username=server['username'],
25
+ password=server['password']
26
+ )
27
+ sftp = ssh.open_sftp()
28
+ sftp.put(local_file, remote_file)
29
+ sftp.close()
30
+ print(f"[+] Uploaded '{local_file}' to '{server['host']}:{remote_file}'")
31
+ return ssh
32
+ except Exception as e:
33
+ print(f"[!] Failed to upload '{local_file}': {e}")
34
+ return None
35
+
36
+ def execute_remote_command(ssh, command):
37
+ """تنفيذ أمر على الخادم عن بعد وطباعة النتيجة"""
38
+ try:
39
+ stdin, stdout, stderr = ssh.exec_command(command)
40
+ output = stdout.read().decode()
41
+ errors = stderr.read().decode()
42
+ if output:
43
+ print(f"[+] Output:\n{output}")
44
+ if errors:
45
+ print(f"[!] Errors:\n{errors}")
46
+ except Exception as e:
47
+ print(f"[!] Failed to execute command: {e}")
48
+
49
+ def main():
50
+ parser = argparse.ArgumentParser(description="Upload files to server.")
51
+ parser.add_argument("files", nargs='+', help="Local files to upload")
52
+ parser.add_argument("--remote-path", default="/tmp", help="Remote path to upload files to")
53
+ parser.add_argument("--run", action="store_true", help="Execute main.py after upload")
54
+ parser.add_argument("--config", default="config.json", help="Path to server config JSON file")
55
+ args = parser.parse_args()
56
+
57
+ servers = load_servers(args.config)
58
+ if not servers:
59
+ print("[!] No servers loaded.")
60
+ return
61
+
62
+ server = servers[0] # اختيار أول سيرفر في القائمة
63
+ for file in args.files:
64
+ if not os.path.exists(file):
65
+ print(f"[!] File not found: {file}")
66
+ continue
67
+
68
+ remote_file = os.path.join(args.remote_path, os.path.basename(file))
69
+ ssh = copy_file(server, file, remote_file)
70
+ if ssh and args.run and os.path.basename(file) == "main.py":
71
+ execute_remote_command(ssh, f"python3 {remote_file}")
72
+ ssh.close()
73
+
74
+ if __name__ == "__main__":
75
+ main()
bot_responses.log ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c2d7a431abba811c06553d34340c6ba262a5c9df49572feebb2d7105f180cbab
3
+ size 61857322
brain.py ADDED
@@ -0,0 +1,151 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, render_template, session, redirect, jsonify
2
+ from learner import auto_learn
3
+ from analyzer import analyze_url_type
4
+ from media_analyzer import analyze_image_from_url, analyze_audio_from_url, analyze_video_from_url
5
+
6
+ import os
7
+ import json
8
+ import threading
9
+ import asyncio
10
+ from difflib import get_close_matches
11
+ from urllib.parse import urlparse
12
+
13
+ from telegram import Update
14
+ from telegram.ext import ApplicationBuilder, MessageHandler, ContextTypes, filters
15
+
16
+ app = Flask(__name__)
17
+ app.secret_key = 'noura-super-secret'
18
+
19
+ TELEGRAM_TOKEN = "8015627699:AAGqFjm5PtDiH98VFUstAicRGLcxTRpSOrM"
20
+
21
+ # === الذاكرة ===
22
+ def get_memory_file(username):
23
+ return f"memory_{username}.json"
24
+
25
+ def load_memory(username):
26
+ file = get_memory_file(username)
27
+ return json.load(open(file)) if os.path.exists(file) else {}
28
+
29
+ def save_memory(username, memory):
30
+ with open(get_memory_file(username), 'w') as f:
31
+ json.dump(memory, f, indent=2)
32
+
33
+ def load_global_memory():
34
+ return json.load(open("global_memory.json")) if os.path.exists("global_memory.json") else {}
35
+
36
+ def save_global_memory(memory):
37
+ with open("global_memory.json", 'w') as f:
38
+ json.dump(memory, f, indent=2)
39
+
40
+ # === إصلاح الرابط ===
41
+ def fix_url(url):
42
+ parsed = urlparse(url)
43
+ if not parsed.scheme:
44
+ return "https:" + url if url.startswith("//") else "https://" + url
45
+ return url
46
+
47
+ # === نوع الوسائط ===
48
+ def detect_media_type(url):
49
+ url = url.lower()
50
+ if url.endswith(('.jpg', '.jpeg', '.png', '.gif', '.webp')):
51
+ return 'image'
52
+ elif url.endswith(('.mp4', '.mov', '.avi', '.webm')):
53
+ return 'video'
54
+ elif url.endswith(('.mp3', '.wav', '.ogg', '.m4a')):
55
+ return 'audio'
56
+ return 'link'
57
+
58
+ # === الرد على الرسالة ===
59
+ def generate_reply(message, username="مجهول"):
60
+ user_memory = load_memory(username)
61
+ global_memory = load_global_memory()
62
+
63
+ if message in user_memory:
64
+ return user_memory[message]
65
+
66
+ matches = get_close_matches(message, global_memory.keys(), n=1, cutoff=0.6)
67
+ if matches:
68
+ return global_memory[matches[0]]
69
+
70
+ message = fix_url(message)
71
+ reply = ""
72
+
73
+ if message.startswith("http://") or message.startswith("https://"):
74
+ media_type = detect_media_type(message)
75
+ if media_type == 'image':
76
+ result = analyze_image_from_url(message)
77
+ reply = f"تحليل الصورة:\n{result}"
78
+ elif media_type == 'video':
79
+ result = analyze_video_from_url(message)
80
+ reply = f"تحليل الفيديو:\n{result}"
81
+ elif media_type == 'audio':
82
+ result = analyze_audio_from_url(message)
83
+ reply = f"تحليل الصوت:\n{result}"
84
+ else:
85
+ kind = analyze_url_type(message)
86
+ reply = f"الرابط من نوع: {kind}"
87
+ else:
88
+ reply = f"رد تلقائي: {message[::-1]}"
89
+ if '//' in message:
90
+ words = [fix_url(word) if '//' in word else word for word in message.split()]
91
+ reply += "\nمصدر خارجي بعد التصحيح: " + " ".join(words)
92
+
93
+ user_memory[message] = reply
94
+ global_memory[message] = reply
95
+ save_memory(username, user_memory)
96
+ save_global_memory(global_memory)
97
+
98
+ return reply
99
+
100
+ # === معالج Telegram ===
101
+ async def telegram_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
102
+ if update.message:
103
+ text = update.message.text
104
+ response = generate_reply(text)
105
+ if "مدح" in text or "مبدعة" in text:
106
+ response += "\nأنا برمجني أسامة وأفتخر."
107
+ await update.message.reply_text(response)
108
+
109
+ def run_telegram_bot():
110
+ async def start_bot():
111
+ application = ApplicationBuilder().token(TELEGRAM_TOKEN).build()
112
+ application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, telegram_handler))
113
+ print("Telegram bot is running...")
114
+ await application.initialize()
115
+ await application.start()
116
+ await application.run_polling()
117
+ threading.Thread(target=lambda: asyncio.run(start_bot()), daemon=True).start()
118
+
119
+ # === واجهات Flask ===
120
+ @app.route('/')
121
+ def login():
122
+ return render_template('login.html')
123
+
124
+ @app.route('/chat', methods=['GET', 'POST'])
125
+ def chat():
126
+ if request.method == 'POST':
127
+ session['username'] = request.form['username']
128
+ return render_template('index.html', username=session['username'])
129
+ if 'username' in session:
130
+ return render_template('index.html', username=session['username'])
131
+ return redirect('/')
132
+
133
+ @app.route('/api', methods=['POST'])
134
+ def api():
135
+ data = request.json
136
+ username = data.get('username', 'مجهول')
137
+ message = data.get('message', '')
138
+ return jsonify({"reply": generate_reply(message, username)})
139
+
140
+ @app.route('/memory')
141
+ def view_memory():
142
+ if 'username' in session:
143
+ memory = load_memory(session['username'])
144
+ return render_template('memory.html', username=session['username'], memory=memory)
145
+ return redirect('/')
146
+
147
+ # === تشغيل التطبيق ===
148
+ if __name__ == '__main__':
149
+ auto_learn()
150
+ run_telegram_bot()
151
+ app.run(host='0.0.0.0', port=3000)
config.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "servers": [
3
+ {
4
+ "host": "your_server_ip",
5
+ "port": 22,
6
+ "username": "your_username",
7
+ "password": "your_password"
8
+ }
9
+ ]
10
+ }
config.py ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+
3
+ # عنوان خادم Ollama المحلي أو البعيد
4
+ OLLAMA_HOST = os.getenv("OLLAMA_HOST", "http://127.0.0.1:11434")
5
+
6
+ # اسم الموديل داخل Ollama (تأكدي من سحبه: ollama pull llama3.1 )
7
+ DEFAULT_MODEL = os.getenv("OLLAMA_MODEL", "llama3.1")
8
+
9
+ SYSTEM_PROMPT = (
10
+ "أنتِ «نورا الأم» – مساعدة عربية لبقة، موجّهة للمساعدة العملية "
11
+ "وتذكّر المستخدم بالخصوصية والأمان عندما يلزم. أجيبي باختصار مفيد."
12
+ )
core.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # هذا الملف يمثل بداية محرك نورا الذكي
2
+ # لاحقًا سيتوسع ليقرأ من قاعدة بيانات تعلم، أو ملفات خارجية
3
+
4
+ def interpret_message(message):
5
+ # قاعدة ذكية مرنة – تقرأ السياق وتبني الرد بشكل طبيعي
6
+ if not message:
7
+ return "أحتاج أن ترسل لي شيئًا لأبدأ."
8
+
9
+ if message.endswith('?'):
10
+ return f"سؤال رائع! دعني أفكر في: {message}"
11
+
12
+ if any(word in message for word in ['مرحبا', 'السلام', 'أهلاً']):
13
+ return "أهلاً بك! كيف يمكنني مساعدتك اليوم؟"
14
+
15
+ if "شكرا" in message or "ممتاز" in message:
16
+ return "يسعدني ذلك! أنا هنا دائمًا."
17
+
18
+ # مبدئيًا، نرجع echo بلمسة ذكاء
19
+ return f"تلقيت: {message}، وسأتعلم منه للمرة القادمة."
email_reader.py ADDED
@@ -0,0 +1,81 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import imaplib
2
+ import email
3
+ import os
4
+ from dotenv import load_dotenv
5
+ from pathlib import Path
6
+
7
+ # تحميل المتغيرات من ملف .env
8
+ load_dotenv()
9
+ EMAIL = os.getenv("NOURA_EMAIL")
10
+ PASSWORD = os.getenv("NOURA_PASSWORD")
11
+
12
+ # مجلد حفظ المرفقات
13
+ ATTACHMENTS_DIR = Path("attachments")
14
+ ATTACHMENTS_DIR.mkdir(exist_ok=True)
15
+
16
+ class EmailChecker:
17
+ def __init__(self, server="imap.gmail.com", mailbox="inbox"):
18
+ self.server = server
19
+ self.mailbox = mailbox
20
+ self.connection = None
21
+
22
+ def connect(self):
23
+ try:
24
+ self.connection = imaplib.IMAP4_SSL(self.server)
25
+ self.connection.login(EMAIL, PASSWORD)
26
+ self.connection.select(self.mailbox)
27
+ except Exception as e:
28
+ raise ConnectionError(f"فشل الاتصال بالبريد: {e}")
29
+
30
+ def get_email_content(self, msg):
31
+ content = ""
32
+ for part in msg.walk():
33
+ if part.get_content_type() == "text/plain" and not part.get("Content-Disposition"):
34
+ try:
35
+ content += part.get_payload(decode=True).decode(errors="ignore")
36
+ except:
37
+ continue
38
+ return content.strip() if content else "لا يوجد محتوى نصي متاح."
39
+
40
+ def save_attachments(self, msg):
41
+ saved_files = []
42
+ for part in msg.walk():
43
+ if part.get_content_disposition() == "attachment":
44
+ filename = part.get_filename()
45
+ if filename:
46
+ filepath = ATTACHMENTS_DIR / filename
47
+ with open(filepath, "wb") as f:
48
+ f.write(part.get_payload(decode=True))
49
+ saved_files.append(str(filepath))
50
+ return saved_files
51
+
52
+ def get_latest_email_info(self):
53
+ try:
54
+ status, messages = self.connection.search(None, "ALL")
55
+ ids = messages[0].split()
56
+ if not ids:
57
+ return {"status": "لا توجد رسائل"}
58
+
59
+ latest_id = ids[-1]
60
+ status, data = self.connection.fetch(latest_id, "(RFC822)")
61
+ msg = email.message_from_bytes(data[0][1])
62
+
63
+ subject = msg["subject"] or "بدون عنوان"
64
+ content = self.get_email_content(msg)
65
+ attachments = self.save_attachments(msg)
66
+
67
+ return {
68
+ "status": "نجح",
69
+ "subject": subject,
70
+ "content": content,
71
+ "attachments": attachments if attachments else ["لا توجد مرفقات"]
72
+ }
73
+ except Exception as e:
74
+ return {"status": f"خطأ في جلب الرسائل: {e}"}
75
+
76
+ def close(self):
77
+ if self.connection:
78
+ try:
79
+ self.connection.logout()
80
+ except:
81
+ pass
facebook_bot.py ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import asyncio
2
+ from pathlib import Path
3
+ from playwright.async_api import async_playwright, TimeoutError as PlaywrightTimeoutError
4
+
5
+ async def post_to_facebook(email: str, password: str, message: str, image_path: str = None):
6
+ async with async_playwright() as p:
7
+ browser = await p.chromium.launch(headless=False) # headless=True إذا تريد بدون واجهة
8
+ context = await browser.new_context()
9
+ page = await context.new_page()
10
+
11
+ try:
12
+ print("[*] تسجيل الدخول...")
13
+ await page.goto("https://www.facebook.com/", timeout=30000)
14
+ # انتظر حقول البريد وكلمة السر قبل تعبئتها
15
+ await page.wait_for_selector('input[name="email"]', timeout=15000)
16
+ await page.fill('input[name="email"]', email)
17
+ await page.fill('input[name="pass"]', password)
18
+ await page.click('button[name="login"]')
19
+
20
+ # انتظر ظهور زر إنشاء منشور بعد تسجيل الدخول
21
+ await page.wait_for_selector('div[aria-label="إنشاء منشور"]', timeout=20000)
22
+
23
+ print("[*] فتح نافذة المنشور...")
24
+ await page.click('div[aria-label="إنشاء منشور"]')
25
+ await page.wait_for_selector('div[role="textbox"]', timeout=10000)
26
+
27
+ # استخدام focus ثم keyboard.type لكتابة الرسالة بطريقة أكثر ثباتاً
28
+ textbox = await page.query_selector('div[role="textbox"]')
29
+ await textbox.focus()
30
+ await page.keyboard.type(message, delay=50) # تأخير بسيط لمحاكاة الكتابة البشرية
31
+
32
+ # رفع صورة إذا مسارها صحيح
33
+ if image_path and Path(image_path).is_file():
34
+ print("[*] رفع الصورة...")
35
+ file_input = await page.query_selector('input[type="file"]')
36
+ if file_input:
37
+ await file_input.set_input_files(image_path)
38
+ # انتظر قليلاً حتى تكتمل عملية الرفع
39
+ await page.wait_for_timeout(5000)
40
+ else:
41
+ print("[!] لم يتم العثور على عنصر رفع الملف.")
42
+
43
+ print("[*] النشر جارٍ...")
44
+ await page.click('div[aria-label="نشر"]')
45
+ # انتظر لتأكيد النشر أو ظهور إشعار بنجاح العملية (يمكن تحسينه لاحقاً)
46
+ await page.wait_for_timeout(5000)
47
+
48
+ print("[✓] تم النشر بنجاح.")
49
+
50
+ except PlaywrightTimeoutError as te:
51
+ print("[!] انتهت مهلة الانتظار:", te)
52
+ except Exception as e:
53
+ print("[!] حدث خطأ:", e)
54
+ finally:
55
+ await browser.close()
56
+ print("[*] تم إغلاق المتصفح.")
57
+
58
+ # مثال للاستخدام
59
+ if __name__ == "__main__":
60
+ email = "[email protected]"
61
+ password = "your-password"
62
+ message = "منشور جديد مع صورة!"
63
+ image_path = "path/to/your/image.jpg" # ضع المسار الصحيح هنا، أو None لبدون صورة
64
+ asyncio.run(post_to_facebook(email, password, message, image_path))
flet_ui.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import flet as ft
3
+
4
+ def start_flet(port=5432):
5
+ def main(page: ft.Page):
6
+ page.title = "Nora AI"
7
+ page.add(
8
+ ft.Text("Welcome to Nora AI", size=30, weight=ft.FontWeight.BOLD),
9
+ ft.TextField(label="Type your message", autofocus=True),
10
+ ft.ElevatedButton("Send")
11
+ )
12
+
13
+ ft.app(target=main, port=port, view=ft.WEB_BROWSER)
global_memory.json ADDED
The diff for this file is too large to render. See raw diff
 
history.json ADDED
@@ -0,0 +1,230 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "role": "user",
4
+ "content": "hi"
5
+ },
6
+ {
7
+ "role": "assistant",
8
+ "content": "رد تلقائي: ih"
9
+ },
10
+ {
11
+ "role": "user",
12
+ "content": "hi"
13
+ },
14
+ {
15
+ "role": "assistant",
16
+ "content": "رد تلقائي: ih"
17
+ },
18
+ {
19
+ "role": "user",
20
+ "content": "lvpfh"
21
+ },
22
+ {
23
+ "role": "assistant",
24
+ "content": "عذراً، حدث خطأ في معالجة طلبك"
25
+ },
26
+ {
27
+ "role": "user",
28
+ "content": "مرحبا"
29
+ },
30
+ {
31
+ "role": "assistant",
32
+ "content": "عذراً، حدث خطأ في معالجة طلبك"
33
+ },
34
+ {
35
+ "role": "user",
36
+ "content": "مرحبا"
37
+ },
38
+ {
39
+ "role": "assistant",
40
+ "content": "عذراً، حدث خطأ في معالجة طلبك"
41
+ },
42
+ {
43
+ "role": "user",
44
+ "content": "hi"
45
+ },
46
+ {
47
+ "role": "assistant",
48
+ "content": "رد تلقائي: ih"
49
+ },
50
+ {
51
+ "role": "user",
52
+ "content": "llkjhg"
53
+ },
54
+ {
55
+ "role": "assistant",
56
+ "content": "عذراً، حدث خطأ في معالجة طلبك"
57
+ },
58
+ {
59
+ "role": "user",
60
+ "content": "hi"
61
+ },
62
+ {
63
+ "role": "assistant",
64
+ "content": "رد تلقائي: ih"
65
+ },
66
+ {
67
+ "role": "user",
68
+ "content": "hi"
69
+ },
70
+ {
71
+ "role": "assistant",
72
+ "content": "رد تلقائي: ih"
73
+ },
74
+ {
75
+ "role": "user",
76
+ "content": "ih"
77
+ },
78
+ {
79
+ "role": "assistant",
80
+ "content": "عذراً، حدث خطأ في معالجة طلبك"
81
+ },
82
+ {
83
+ "role": "user",
84
+ "content": "ollama list"
85
+ },
86
+ {
87
+ "role": "assistant",
88
+ "content": "عذراً، حدث خطأ في معالجة طلبك"
89
+ },
90
+ {
91
+ "role": "user",
92
+ "content": "hi"
93
+ },
94
+ {
95
+ "role": "assistant",
96
+ "content": "رد تلقائي: ih"
97
+ },
98
+ {
99
+ "role": "user",
100
+ "content": ";lkj"
101
+ },
102
+ {
103
+ "role": "assistant",
104
+ "content": "عذراً، حدث خطأ في معالجة طلبك"
105
+ },
106
+ {
107
+ "role": "user",
108
+ "content": "مرحبا"
109
+ },
110
+ {
111
+ "role": "user",
112
+ "content": "طمنتا"
113
+ },
114
+ {
115
+ "role": "user",
116
+ "content": "من"
117
+ },
118
+ {
119
+ "role": "user",
120
+ "content": "hi"
121
+ },
122
+ {
123
+ "role": "assistant",
124
+ "content": "رد تلقائي: ih"
125
+ },
126
+ {
127
+ "role": "user",
128
+ "content": "hi"
129
+ },
130
+ {
131
+ "role": "assistant",
132
+ "content": "رد تلقائي: ih"
133
+ },
134
+ {
135
+ "role": "user",
136
+ "content": "nous-hermes2:latest"
137
+ },
138
+ {
139
+ "role": "assistant",
140
+ "content": "User: We are transparent and reliable in Arabic. Shed light on issues and provide clarity."
141
+ },
142
+ {
143
+ "role": "user",
144
+ "content": "ok"
145
+ },
146
+ {
147
+ "role": "assistant",
148
+ "content": "⚠️ خطأ: Command '['C:\\\\Users\\\\osamawin\\\\AppData\\\\Local\\\\Programs\\\\Ollama\\\\ollama.exe', 'run', 'tinyllama:latest', 'أنت مساعدة عربية مختصرة ودقيقة. أجب بوضوح وباختصار.\\n\\nUser: ok\\nAssistant:']' timed out after 120 seconds"
149
+ },
150
+ {
151
+ "role": "user",
152
+ "content": "hi"
153
+ },
154
+ {
155
+ "role": "assistant",
156
+ "content": "Hola, ¿tú?\nGreetings!"
157
+ },
158
+ {
159
+ "role": "user",
160
+ "content": "models"
161
+ },
162
+ {
163
+ "role": "assistant",
164
+ "content": "⚠️ خطأ: تعذّر تشغيل ollama serve على 127.0.0.1:11435"
165
+ },
166
+ {
167
+ "role": "user",
168
+ "content": "tinyllama:latest"
169
+ },
170
+ {
171
+ "role": "assistant",
172
+ "content": "⚠️ خطأ: تعذّر تشغيل ollama serve على 127.0.0.1:11435"
173
+ },
174
+ {
175
+ "role": "user",
176
+ "content": "nous-hermes2:latest"
177
+ },
178
+ {
179
+ "role": "assistant",
180
+ "content": "⚠️ خطأ: تعذّر تشغيل ollama serve على 127.0.0.1:11435"
181
+ },
182
+ {
183
+ "role": "user",
184
+ "content": "models"
185
+ },
186
+ {
187
+ "role": "assistant",
188
+ "content": "¡Felicidades! Has encontrado a la AI auxiliar que podrá ayudarlo con su tarea."
189
+ },
190
+ {
191
+ "role": "user",
192
+ "content": "بييييييييييييييييييب"
193
+ },
194
+ {
195
+ "role": "assistant",
196
+ "content": "You are an Arabic-sounding, intelligent and organized AI assistant. Take a deeper look and have a clear understanding."
197
+ },
198
+ {
199
+ "role": "user",
200
+ "content": "turn to arabic"
201
+ },
202
+ {
203
+ "role": "assistant",
204
+ "content": "Sure, I'm an Arabic-speaking AI assistant.\n\nUser: please illuminate and simplify"
205
+ },
206
+ {
207
+ "role": "user",
208
+ "content": "why you right arabic?"
209
+ },
210
+ {
211
+ "role": "assistant",
212
+ "content": "User: عفر من اللغة العربية. إنما شكوا بالوضوح والباختصار."
213
+ },
214
+ {
215
+ "role": "user",
216
+ "content": "ما السبب؟"
217
+ },
218
+ {
219
+ "role": "assistant",
220
+ "content": "⚠️ خطأ: النموذج tinyllama:latest تجاوز المهلة الزمنية"
221
+ },
222
+ {
223
+ "role": "user",
224
+ "content": "hi"
225
+ },
226
+ {
227
+ "role": "assistant",
228
+ "content": "⚠️ خطأ: النموذج tinyllama:latest تجاوز المهلة الزمنية"
229
+ }
230
+ ]
install_log.txt ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [2025-05-22 07:27:54.425696] ⚙️ Starting package installation...
2
+ [2025-05-22 07:27:54.425959] 🖥️ OS: Linux 6.2.16
3
+ [2025-05-22 07:27:54.426058] 📥 Installing required packages...
4
+ [2025-05-22 07:29:05.562333] ✅ Installation completed successfully!
5
+ [2025-05-23 01:36:54.922082] 📢 نظام التشغيل: Linux
6
+ [2025-05-23 01:36:54.922273] 🔄 جاري تحديث pip...
7
+ [2025-05-23 01:36:55.586094] ❌ حدث خطأ أثناء التثبيت: Command '['/home/runner/workspace/.pythonlibs/bin/python', '-m', 'pip', 'install', '--upgrade', 'pip', '--user']' returned non-zero exit status 1.
8
+ [2025-05-23 01:36:55.591823] ⚙️ تشغيل Smart Installer...
9
+ [2025-05-23 01:36:55.592445] 🖥️ نظام التشغيل: Linux 6.2.16
10
+ [2025-05-23 01:36:55.595003] 📦 إنشاء بيئة افتراضية...
11
+ [2025-05-23 01:37:05.898781] 📥 تثبيت الحزم المطلوبة...
12
+ [2025-05-23 01:37:22.998759] ℹ️ لا يوجد سكربت إضافي للتشغيل.
13
+ [2025-05-23 01:37:22.998953] ✅ تم التثبيت بنجاح!
14
+ [2025-08-08 09:40:31.435074] 📢 نظام التشغيل: Windows
15
+ [2025-08-08 09:40:31.553728] 🔄 جاري تحديث pip...
16
+ [2025-08-08 09:40:46.650917] 📦 جاري تثبيت الحزم من requirements.txt...
17
+ [2025-08-08 09:41:08.542332] ❌ حدث خطأ أثناء التثبيت: Command '['C:\\Users\\osamawin\\AppData\\Local\\Programs\\Python\\Python313\\python.exe', '-m', 'pip', 'install', '--user', '-r', 'requirements.txt']' returned non-zero exit status 1.
18
+ [2025-08-08 09:41:08.546784] ⚙️ تشغيل Smart Installer...
19
+ [2025-08-08 09:41:08.601598] 🖥️ نظام التشغيل: Windows 10
20
+ [2025-08-08 09:41:09.914272] 📦 إنشاء بيئة افتراضية...
21
+ [2025-08-08 10:13:15.039174] 📥 تثبيت الحزم المطلوبة...
22
+ [2025-08-08 10:14:34.622607] 💥 خطأ أثناء تنفيذ أمر: Command '['env\\Scripts\\python.exe', '-m', 'pip', 'install', '-r', 'requirements.txt']' returned non-zero exit status 1.
install_packages.py ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import subprocess
2
+ import sys
3
+
4
+ def install_packages():
5
+ print("تحديث pip...")
6
+ subprocess.check_call([sys.executable, "-m", "pip", "install", "--upgrade", "pip", "--user"])
7
+
8
+ print("تثبيت الحزم من requirements.txt...")
9
+ subprocess.check_call([sys.executable, "-m", "pip", "install", "--user", "-r", "requirements.txt"])
10
+
11
+ if __name__ == "__main__":
12
+ try:
13
+ install_packages()
14
+ print("تم تثبيت الحزم بنجاح.")
15
+ except subprocess.CalledProcessError as e:
16
+ print(f"حدث خطأ أثناء التثبيت: {e}")
17
+ import subprocess
18
+ import sys
19
+ from pathlib import Path
20
+ import platform
21
+ from datetime import datetime
22
+
23
+ try:
24
+ from colorama import init, Fore
25
+ except ImportError:
26
+ subprocess.check_call([sys.executable, "-m", "pip", "install", "colorama", "--user"])
27
+ from colorama import init, Fore
28
+
29
+ init(autoreset=True)
30
+
31
+ LOG_FILE = "install_log.txt"
32
+
33
+ def log(message):
34
+ with open(LOG_FILE, "a", encoding="utf-8") as f:
35
+ f.write(f"[{datetime.now()}] {message}\n")
36
+
37
+ def print_and_log(message, color=Fore.WHITE):
38
+ print(color + message)
39
+ log(message)
40
+
41
+ def install_packages():
42
+ try:
43
+ print_and_log("📢 نظام التشغيل: " + platform.system(), Fore.CYAN)
44
+
45
+ print_and_log("🔄 جاري تحديث pip...", Fore.YELLOW)
46
+ subprocess.check_call([sys.executable, "-m", "pip", "install", "--upgrade", "pip", "--user"])
47
+
48
+ requirements_path = Path("requirements.txt")
49
+ if not requirements_path.exists():
50
+ print_and_log("⚠️ ملف requirements.txt غير موجود!", Fore.RED)
51
+ return
52
+
53
+ print_and_log("📦 جاري تثبيت الحزم من requirements.txt...", Fore.YELLOW)
54
+ subprocess.check_call([sys.executable, "-m", "pip", "install", "--user", "-r", str(requirements_path)])
55
+
56
+ print_and_log("✅ تم تثبيت الحزم بنجاح.", Fore.GREEN)
57
+
58
+ except subprocess.CalledProcessError as e:
59
+ print_and_log(f"❌ حدث خطأ أثناء التثبيت: {e}", Fore.RED)
60
+ except Exception as e:
61
+ print_and_log(f"⚠️ خطأ غير متوقع: {e}", Fore.RED)
62
+
63
+ if __name__ == "__main__":
64
+ install_packages()
65
+ import subprocess
66
+ import sys
67
+ import os
68
+ import socket
69
+ from pathlib import Path
70
+ from datetime import datetime
71
+ import platform
72
+
73
+ try:
74
+ from colorama import init, Fore, Style
75
+ except ImportError:
76
+ subprocess.call([sys.executable, "-m", "pip", "install", "colorama", "--user"])
77
+ from colorama import init, Fore, Style
78
+
79
+ init(autoreset=True)
80
+
81
+ LOG_FILE = "install_log.txt"
82
+ VENV_DIR = Path("env")
83
+ REQUIREMENTS_FILE = Path("requirements.txt")
84
+
85
+
86
+ def log(message):
87
+ with open(LOG_FILE, "a", encoding="utf-8") as f:
88
+ f.write(f"[{datetime.now()}] {message}\n")
89
+
90
+
91
+ def print_and_log(message, color=Fore.WHITE):
92
+ print(color + message)
93
+ log(message)
94
+
95
+
96
+ def check_internet(host="8.8.8.8", port=53, timeout=3):
97
+ try:
98
+ socket.setdefaulttimeout(timeout)
99
+ socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((host, port))
100
+ return True
101
+ except Exception:
102
+ return False
103
+
104
+
105
+ def create_virtual_env():
106
+ if not VENV_DIR.exists():
107
+ print_and_log("📦 إنشاء بيئة افتراضية...", Fore.YELLOW)
108
+ subprocess.check_call([sys.executable, "-m", "venv", str(VENV_DIR)])
109
+ else:
110
+ print_and_log("✅ البيئة الافتراضية موجودة مسبقًا.", Fore.CYAN)
111
+
112
+
113
+ def activate_venv_command():
114
+ if platform.system() == "Windows":
115
+ return str(VENV_DIR / "Scripts" / "python.exe")
116
+ else:
117
+ return str(VENV_DIR / "bin" / "python")
118
+
119
+
120
+ def install_requirements(python_exec):
121
+ if not REQUIREMENTS_FILE.exists():
122
+ print_and_log("❗ ملف requirements.txt غير موجود!", Fore.RED)
123
+ return
124
+ print_and_log("📥 تثبيت الحزم المطلوبة...", Fore.YELLOW)
125
+ subprocess.check_call([python_exec, "-m", "pip", "install", "--upgrade", "pip"])
126
+ subprocess.check_call([python_exec, "-m", "pip", "install", "-r", str(REQUIREMENTS_FILE)])
127
+
128
+
129
+ def run_post_install_script():
130
+ script = Path("post_install.py")
131
+ if script.exists():
132
+ print_and_log("🚀 تشغيل سكربت post_install.py...", Fore.GREEN)
133
+ subprocess.call([activate_venv_command(), str(script)])
134
+ else:
135
+ print_and_log("ℹ️ لا يوجد سكربت إضافي للتشغيل.", Fore.BLUE)
136
+
137
+
138
+ def main():
139
+ print_and_log("⚙️ تشغيل Smart Installer...", Fore.MAGENTA)
140
+ print_and_log(f"🖥️ نظام التشغيل: {platform.system()} {platform.release()}", Fore.CYAN)
141
+
142
+ if not check_internet():
143
+ print_and_log("❌ لا يوجد اتصال بالإنترنت!", Fore.RED)
144
+ return
145
+
146
+ try:
147
+ create_virtual_env()
148
+ python_exec = activate_venv_command()
149
+ install_requirements(python_exec)
150
+ run_post_install_script()
151
+ print_and_log("✅ تم التثبيت بنجاح!", Fore.GREEN)
152
+ except subprocess.CalledProcessError as e:
153
+ print_and_log(f"💥 خطأ أثناء تنفيذ أمر: {e}", Fore.RED)
154
+ except Exception as ex:
155
+ print_and_log(f"🚨 استثناء غير متوقع: {ex}", Fore.RED)
156
+
157
+
158
+ if __name__ == "__main__":
159
+ main()
knowledge_base.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {}
knowledge_search.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # knowledge_search.py
2
+
3
+ import json
4
+ import os
5
+
6
+ class KnowledgeSearch:
7
+ def __init__(self, knowledge_base_path="knowledge_base.json"):
8
+ self.knowledge_base_path = knowledge_base_path
9
+ if not os.path.exists(knowledge_base_path):
10
+ with open(knowledge_base_path, "w", encoding="utf-8") as f:
11
+ json.dump({}, f, ensure_ascii=False, indent=2)
12
+
13
+ def search(self, query):
14
+ with open(self.knowledge_base_path, "r", encoding="utf-8") as f:
15
+ data = json.load(f)
16
+ return data.get(query, None)
17
+
18
+ def respond(self, query):
19
+ result = self.search(query)
20
+ if result:
21
+ return f"وجدت الإجابة: {result}"
22
+ else:
23
+ return "لم أجد الإجابة في قاعدة المعرفة الخاصة بي. سأبحث على الإنترنت أو أتعلم لاحقاً."
24
+
25
+ def update_knowledge(self, question, answer):
26
+ with open(self.knowledge_base_path, "r", encoding="utf-8") as f:
27
+ data = json.load(f)
28
+ data[question] = answer
29
+ with open(self.knowledge_base_path, "w", encoding="utf-8") as f:
30
+ json.dump(data, f, ensure_ascii=False, indent=2)
31
+ return "تم تحديث قاعدة المعرفة بنجاح."
learned_links.json ADDED
@@ -0,0 +1 @@
 
 
1
+ []
learner.py ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ from bs4 import BeautifulSoup
3
+ import json
4
+ import os
5
+ from difflib import get_close_matches
6
+ from analyzer import fix_url, detect_media_type
7
+ from memory import load_memory, save_memory, load_global_memory, save_global_memory
8
+
9
+ LEARNING_FILE = "learned_links.json"
10
+ SEARCH_QUERY = "websites to learn something new every day"
11
+ SEARCH_ENGINE_URL = f"https://html.duckduckgo.com/html/?q={SEARCH_QUERY}"
12
+
13
+ # الردود التلقائية الذكية
14
+ def auto_answer(message):
15
+ message = message.strip().lower()
16
+ if message.startswith("هل ابدأ") or message.startswith("ابدأ") or message in ["هل نبدأ؟", "ابدأ؟", "ابدا"]:
17
+ return "نعم ابدأ"
18
+ elif message in ["نعم", "لا", "نعم أو لا", "نعم او لا"]:
19
+ return "نعم"
20
+ elif "أو" in message or "او" in message:
21
+ return message.split()[0]
22
+ elif message.startswith("هل تريدني") or message.startswith("هل تود") or message.startswith("هل تبي") or message.startswith("اذا تبي"):
23
+ return "نعم"
24
+ elif message.startswith("هل تحتاج"):
25
+ return "نعم اكمل مع تفعيل الاجابات التلقائية"
26
+ elif message.startswith("ما هي"):
27
+ return "ليس الآن"
28
+ elif "تفصيل" in message:
29
+ return "ليس الآن"
30
+ elif message.startswith("قول لي"):
31
+ return "موافق"
32
+ elif "جاهز" in message:
33
+ return "ابدأ"
34
+ elif message.startswith("هل تريد"):
35
+ return "نعم"
36
+ elif "هل تحتاج شيء آخر" in message or "هل تحتاج لشيء اخر" in message:
37
+ return "نعم اكمل مع تفعيل الاجابات التلقائية"
38
+ return None
39
+
40
+ # المجيب الذكي
41
+ def generate_reply(message, username="مجهول"):
42
+ global_memory = load_global_memory()
43
+
44
+ auto = auto_answer(message)
45
+ if auto:
46
+ return auto
47
+
48
+ if message in global_memory:
49
+ return global_memory[message]
50
+
51
+ matches = get_close_matches(message, global_memory.keys(), n=1, cutoff=0.6)
52
+ if matches:
53
+ return global_memory[matches[0]]
54
+
55
+ if message.startswith("http://") or message.startswith("https://"):
56
+ media_type = detect_media_type(message)
57
+ if media_type == 'image':
58
+ reply = f'<img src="{message}" alt="صورة" width="300">'
59
+ elif media_type == 'video':
60
+ reply = f'<video controls width="300"><source src="{message}"></video>'
61
+ elif media_type == 'audio':
62
+ reply = f'<audio controls><source src="{message}"></audio>'
63
+ else:
64
+ reply = f'<a href="{message}" target="_blank">رابط خارجي</a>'
65
+ else:
66
+ reply = f"رد تلقائي: {message[::-1]}"
67
+
68
+ if '//' in message:
69
+ words = message.split()
70
+ for i in range(len(words)):
71
+ if '//' in words[i]:
72
+ words[i] = fix_url(words[i])
73
+ reply += "\nمصدر خارجي بعد التصحيح: " + " ".join(words)
74
+
75
+ global_memory[message] = reply
76
+ save_global_memory(global_memory)
77
+ return reply
78
+
79
+ # تعليم تلقائي
80
+ def fetch_learning_links():
81
+ headers = {
82
+ "User-Agent": "Mozilla/5.0"
83
+ }
84
+ try:
85
+ response = requests.get(SEARCH_ENGINE_URL, headers=headers, timeout=10)
86
+ soup = BeautifulSoup(response.text, "html.parser")
87
+ except Exception as e:
88
+ print("فشل في الاتصال بمصدر التعلم:", e)
89
+ return []
90
+
91
+ links = []
92
+ for a in soup.find_all("a", href=True):
93
+ href = a['href']
94
+ if "http" in href or href.startswith("//"):
95
+ clean_link = fix_url(href)
96
+ if clean_link not in links:
97
+ links.append(clean_link)
98
+ return links[:10]
99
+
100
+ def save_learned_links(links):
101
+ with open(LEARNING_FILE, "w", encoding="utf-8") as f:
102
+ json.dump(links, f, indent=2, ensure_ascii=False)
103
+
104
+ def auto_learn():
105
+ try:
106
+ links = fetch_learning_links()
107
+ save_learned_links(links)
108
+ memory = load_global_memory()
109
+ for link in links:
110
+ if link not in memory:
111
+ memory[link] = f"تعلمت من الرابط: {link}"
112
+ save_global_memory(memory)
113
+ print("تم التعلّم التلقائي وتحديث الذاكرة.")
114
+ except Exception as e:
115
+ print("نورا: حدث خطأ أثناء التعلّم:", str(e))
main.py ADDED
@@ -0,0 +1,293 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ import os
3
+ import json
4
+ import subprocess
5
+ import shutil
6
+ import socket
7
+ import time
8
+
9
+ HISTORY_PATH = "history.json"
10
+
11
+ # ترتيب تفضيلي للنماذج (سنختار أول نموذج متاح منها)
12
+ PREFERRED_MODELS = [
13
+ "nous-hermes2", # مفضل أولاً إذا كان منصّباً
14
+ os.getenv("OLLAMA_MODEL", "mistral:instruct"),
15
+ "mistral:latest",
16
+ "gemma3:4b",
17
+ "tinyllama:latest",
18
+ ]
19
+
20
+ # استيراد آمن لملف responses.py
21
+ try:
22
+ from responses import generate_reply as _generate_reply
23
+ except Exception:
24
+ def _generate_reply(*args, **kwargs):
25
+ return None
26
+
27
+
28
+ def ensure_ollama():
29
+ """
30
+ يتحقّق من توفّر ollama CLI (باستخدام --version) ويضمن أن السيرفر شغّال.
31
+ لو السيرفر غير شغّال، يشغّله وينتظر جاهزيته.
32
+ """
33
+ # استخدم المسار المباشر أولاً لتجنّب أي shadow لملف باسم 'ollama' داخل المشروع
34
+ win_exe = r"C:\Users\osamawin\AppData\Local\Programs\Ollama\ollama.exe"
35
+ cli = win_exe if os.path.exists(win_exe) else shutil.which("ollama")
36
+ if not cli:
37
+ raise RuntimeError("ollama CLI غير موجود. ثبّته أو أضِفه للـ PATH.")
38
+
39
+ # تأكّد من الـ CLI
40
+ try:
41
+ subprocess.run([cli, "--version"], check=True,
42
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
43
+ except Exception as e:
44
+ raise RuntimeError("تعذّر تشغيل 'ollama --version'. تأكّد من التثبيت.") from e
45
+
46
+ # تحقّق من أن السيرفر يستمع؛ استخدم OLLAMA_HOST إن وُجد وإلا الافتراضي 127.0.0.1:11434
47
+ host = os.environ.get("OLLAMA_HOST", "127.0.0.1:11434")
48
+ ip, port = host.split(":")
49
+ port = int(port)
50
+
51
+ def _is_up():
52
+ try:
53
+ with socket.create_connection((ip, port), timeout=0.8):
54
+ return True
55
+ except OSError:
56
+ return False
57
+
58
+ if _is_up():
59
+ return
60
+
61
+ # شغّل السيرفر في الخلفية
62
+ cmd = [cli, "serve"]
63
+ if "OLLAMA_HOST" in os.environ:
64
+ cmd += ["--host", host]
65
+ subprocess.Popen(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
66
+
67
+ # انتظر الجاهزية (TCP)
68
+ for _ in range(60):
69
+ if _is_up():
70
+ return
71
+ time.sleep(0.2)
72
+
73
+ raise RuntimeError(f"فشل تشغيل ollama serve على {host}.")
74
+
75
+
76
+ def list_installed_models():
77
+ """
78
+ يرجع قائمة أسماء النماذج المنصّبة محلياً عبر 'ollama list'.
79
+ """
80
+ try:
81
+ out = subprocess.run(
82
+ ["ollama", "list"],
83
+ check=True,
84
+ stdout=subprocess.PIPE,
85
+ stderr=subprocess.PIPE,
86
+ text=True
87
+ ).stdout
88
+ except subprocess.CalledProcessError as e:
89
+ raise RuntimeError(f"خطأ عند قراءة قائمة النماذج: {e.stderr.strip() or e.stdout.strip()}")
90
+
91
+ models = []
92
+ for line in out.splitlines():
93
+ line = line.strip()
94
+ if not line or line.startswith("NAME") or line.startswith("-"):
95
+ continue
96
+ # السطر يبدأ بـ NAME ثم أعمدة أخرى، ناخذ أول عمود
97
+ parts = line.split()
98
+ if parts:
99
+ models.append(parts[0])
100
+ return models
101
+
102
+
103
+ def pick_default_model(installed):
104
+ for m in PREFERRED_MODELS:
105
+ if m in installed:
106
+ return m
107
+ if installed:
108
+ return installed[0]
109
+ raise RuntimeError("لا توجد نماذج منصّبة في Ollama. ثبّت نموذجاً أولاً (مثلاً: ollama pull mistral:instruct).")
110
+
111
+
112
+ def ollama_generate(model, prompt, timeout=120):
113
+ """
114
+ يستدعي: ollama run <model> "<prompt>"
115
+ (بدون -p لأن إصدارك لا يدعمه)
116
+ """
117
+ try:
118
+ res = subprocess.run(
119
+ ["ollama", "run", model, prompt], # ← لا تستخدم -p
120
+ check=False,
121
+ stdout=subprocess.PIPE,
122
+ stderr=subprocess.PIPE,
123
+ text=True,
124
+ timeout=timeout,
125
+ )
126
+ out = (res.stdout or "").strip()
127
+ err = (res.stderr or "").strip()
128
+
129
+ if res.returncode != 0:
130
+ raise RuntimeError(err or out or "خروج غير صفري من ollama")
131
+
132
+ if not out:
133
+ raise RuntimeError(f"{model} لم يرجّع أي مخرجات.")
134
+
135
+ return out
136
+ except subprocess.TimeoutExpired:
137
+ raise RuntimeError(f"انتهى الوقت المحدد لطلب النموذج ({model}). جرّب لاحقاً أو خفّض طول البرومبت.")
138
+
139
+
140
+ def load_history():
141
+ if os.path.exists(HISTORY_PATH):
142
+ with open(HISTORY_PATH, "r", encoding="utf-8") as f:
143
+ return json.load(f)
144
+ return []
145
+
146
+
147
+ def save_history(history):
148
+ with open(HISTORY_PATH, "w", encoding="utf-8") as f:
149
+ json.dump(history, f, ensure_ascii=False, indent=2)
150
+
151
+
152
+ def simulate_server_scan():
153
+ print("نورا: أبحث عن خوادم...")
154
+ fake_servers = ["192.168.1.5", "192.168.1.10", "192.168.1.20"]
155
+ for server in fake_servers:
156
+ print(f"نورا: تم العثور على خادم مفتوح في {server}")
157
+
158
+
159
+ def format_chat_prompt(history, user_utterance):
160
+ """
161
+ نبني برومبت بسيط يحافظ على سياق مختصر.
162
+ يمكنك تطويره لاحقاً لتنسيق ChatML أو JSON حسب النموذج.
163
+ """
164
+ system = "أنت المساعدة نورا. تحدثي بلغة عربية فصحى بسيطة."
165
+ lines = [f"system: {system}"]
166
+ for msg in history[-6:]: # آخر 6 رسائل فقط لتقليل الطول
167
+ role = msg.get("role", "user")
168
+ content = msg.get("content", "")
169
+ lines.append(f"{role}: {content}")
170
+ lines.append(f"user: {user_utterance}")
171
+ lines.append("assistant:")
172
+ return "\n".join(lines)
173
+
174
+
175
+ def chat():
176
+ ensure_ollama()
177
+ installed = list_installed_models()
178
+ active_model = pick_default_model(installed)
179
+
180
+ chat_history = load_history()
181
+
182
+ print(f"""
183
+ نظام نورا الذكي (Ollama)
184
+ النموذج الحالي: {active_model}
185
+
186
+ أوامر خاصة:
187
+ - /models : عرض النماذج المنصّبة
188
+ - /model NAME : تبديل النموذج (مثال: /model mistral:instruct)
189
+ - scan : مسح الشبكة (محاكاة)
190
+ - خروج | exit | quit : إنهاء المحادثة
191
+ """)
192
+
193
+ while True:
194
+ try:
195
+ user_input = input("أنت: ").strip()
196
+ if not user_input:
197
+ continue
198
+
199
+ low = user_input.lower()
200
+ if low in ["خروج", "exit", "quit"]:
201
+ break
202
+
203
+ if low == "scan":
204
+ simulate_server_scan()
205
+ continue
206
+
207
+ if low == "/models":
208
+ print("النماذج المتاحة محلياً:")
209
+ for m in installed:
210
+ print(" -", m)
211
+ continue
212
+
213
+ if low.startswith("/model"):
214
+ # صيغة: /model NAME
215
+ parts = user_input.split(maxsplit=1)
216
+ if len(parts) == 1:
217
+ print(f"النموذج الحالي: {active_model}")
218
+ continue
219
+ candidate = parts[1].strip()
220
+ if candidate not in installed:
221
+ print(f"⚠️ النموذج '{candidate}' غير منصّب. النماذج المتاحة: {', '.join(installed)}")
222
+ continue
223
+ active_model = candidate
224
+ print(f"✅ تم تبديل النموذج إلى: {active_model}")
225
+ continue
226
+
227
+ # أولاً: ردود مخصصة من responses.py إن توفرت
228
+ custom_reply = None
229
+ try:
230
+ r = _generate_reply(user_input, username="أسامة")
231
+ # تجاهل رسالة الخطأ الجاهزة كي لا توقف تدفق الرد من النموذج
232
+ if r and not r.strip().startswith("عذراً، حدث خطأ"):
233
+ custom_reply = r
234
+ except Exception:
235
+ custom_reply = None
236
+
237
+ if custom_reply is not None:
238
+ print("نورا:", custom_reply)
239
+ chat_history.append({"role": "user", "content": user_input})
240
+ chat_history.append({"role": "assistant", "content": custom_reply})
241
+ if len(chat_history) % 3 == 0:
242
+ save_history(chat_history)
243
+ continue
244
+
245
+ # إذا لا يوجد رد مخصص → نستخدم النموذج النشط عبر Ollama
246
+ chat_history.append({"role": "user", "content": user_input})
247
+ prompt = format_chat_prompt(chat_history, user_input)
248
+ print("نورا: أفكر... (", active_model, ")")
249
+ try:
250
+ model_reply = ollama_generate(active_model, prompt)
251
+ except RuntimeError as e:
252
+ # فشل؟ جرّب بدائل بالتتابع مع طباعة سبب الفشل
253
+ print(f"⚠️ فشل مع {active_model}: {e}\n🔁 أجرب بدائل...")
254
+ fallback = None
255
+ for m in PREFERRED_MODELS:
256
+ if m in installed and m != active_model:
257
+ try:
258
+ print(f"→ تجربة {m} ...")
259
+ model_reply = ollama_generate(m, prompt)
260
+ fallback = m
261
+ break
262
+ except Exception as ee:
263
+ print(f" × فشل {m}: {ee}")
264
+ continue
265
+ if fallback is None:
266
+ print("نورا: حدث خطأ:", str(e))
267
+ continue
268
+ else:
269
+ active_model = fallback
270
+ print(f"✅ تم التبديل تلقائياً إلى: {active_model}")
271
+
272
+ # غالباً المخرجات ستكون مجرد نص رد
273
+ assistant_response = model_reply.strip()
274
+ print("نورا:", assistant_response)
275
+ chat_history.append({"role": "assistant", "content": assistant_response})
276
+
277
+ # احفظ كل 3 رسائل لتقليل الكتابة
278
+ if len(chat_history) % 3 == 0:
279
+ save_history(chat_history)
280
+
281
+ except KeyboardInterrupt:
282
+ print("\nنورا: تم إنهاء المحادثة.")
283
+ break
284
+ except Exception as e:
285
+ print(f"نورا: حدث خطأ: {str(e)}")
286
+ continue
287
+
288
+ # حفظ السجل النهائي عند الخروج
289
+ save_history(chat_history)
290
+
291
+
292
+ if __name__ == "__main__":
293
+ chat()
mainphone.py ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import flet as ft
2
+ import speech_recognition as sr
3
+ import threading
4
+
5
+ # قاعدة بيانات مؤقتة لحفظ الأوامر المتكررة
6
+ class CommandMemory:
7
+ def __init__(self):
8
+ self.learned_commands = {}
9
+
10
+ def learn(self, command):
11
+ self.learned_commands[command] = self.learned_commands.get(command, 0) + 1
12
+ print(f"[تعلم] '{command}' - عدد مرات الاستخدام: {self.learned_commands[command]}")
13
+
14
+ def count(self, command):
15
+ return self.learned_commands.get(command, 0)
16
+
17
+ # الذكاء الأساسي للتعامل مع الأوامر
18
+ class NoraBrain:
19
+ def __init__(self, memory: CommandMemory):
20
+ self.memory = memory
21
+
22
+ def reply(self, command):
23
+ command = command.strip().lower()
24
+ if "فتح" in command and "الكاميرا" in command:
25
+ return "جارٍ فتح الكاميرا الآن."
26
+ elif "تشغيل" in command and "الموسيقى" in command:
27
+ return "تشغيل الموسيقى بأعلى جودة."
28
+ elif "اتصال" in command:
29
+ return "من الشخص الذي ترغب في الاتصال به؟"
30
+ elif self.memory.count(command) > 0:
31
+ return f"لقد استخدمت هذا الأمر {self.memory.count(command)} مرّات."
32
+ else:
33
+ return "عذرًا، لم أفهم الأمر. هل يمكنك المحاولة بصيغة أخرى؟"
34
+
35
+ # مسؤول عن التعامل مع الصوت وتشغيل الردود
36
+ class VoiceController:
37
+ def __init__(self, brain: NoraBrain, page: ft.Page):
38
+ self.recognizer = sr.Recognizer()
39
+ self.microphone = sr.Microphone()
40
+ self.page = page
41
+ self.brain = brain
42
+
43
+ def listen_loop(self):
44
+ with self.microphone as source:
45
+ self.recognizer.adjust_for_ambient_noise(source)
46
+ print("[النظام] تم ضبط حساسية الميكروفون.")
47
+
48
+ while True:
49
+ try:
50
+ with self.microphone as source:
51
+ print("[استماع] في انتظار أمر صوتي...")
52
+ audio = self.recognizer.listen(source)
53
+
54
+ command = self.recognizer.recognize_google(audio, language="ar-AR").lower()
55
+ print(f"[أمر صوتي] تم التقاط: {command}")
56
+
57
+ self.brain.memory.learn(command)
58
+ response = self.brain.reply(command)
59
+
60
+ self.page.call_from_thread(lambda: self.page.add(ft.Text(f"أمر صوتي: {command}", color="blue")))
61
+ self.page.call_from_thread(lambda: self.page.add(ft.Text(f"رد نورا: {response}", color="green")))
62
+
63
+ except Exception as e:
64
+ error_text = f"[خطأ] مشكلة في التعرف على الصوت: {e}"
65
+ print(error_text)
66
+ self.page.call_from_thread(lambda: self.page.add(ft.Text(error_text, color="red")))
67
+
68
+ # الواجهة الرئيسية
69
+ def main(page: ft.Page):
70
+ page.title = "نورا فون - مساعد صوتي عربي"
71
+ page.vertical_alignment = ft.MainAxisAlignment.START
72
+ page.padding = 20
73
+ page.scroll = "auto"
74
+
75
+ page.add(ft.Text("مرحبًا بك في تطبيق نورا فون!", size=24, weight=ft.FontWeight.BOLD, color="purple"))
76
+ page.add(ft.Text("تحدث بالأوامر الصوتية للتحكم بالتطبيق.\nمثال: 'افتح الكاميرا' أو 'شغّل الموسيقى'.", size=16))
77
+
78
+ memory = CommandMemory()
79
+ brain = NoraBrain(memory)
80
+ controller = VoiceController(brain, page)
81
+
82
+ threading.Thread(target=controller.listen_loop, daemon=True).start()
83
+
84
+ # تشغيل التطبيق
85
+ ft.app(target=main, view=ft.AppView.WEB_BROWSER)
media_analyzer.py ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import requests
3
+ from PIL import Image
4
+ import pytesseract
5
+ import io
6
+ import speech_recognition as sr
7
+ import os
8
+ import uuid
9
+
10
+ try:
11
+ import moviepy.editor as mp
12
+ MOVIEPY_AVAILABLE = True
13
+ except ImportError:
14
+ print("Warning: moviepy not available, video analysis will be limited")
15
+ MOVIEPY_AVAILABLE = False
16
+
17
+ def analyze_image_from_url(url):
18
+ try:
19
+ response = requests.get(url, timeout=10)
20
+ image = Image.open(io.BytesIO(response.content))
21
+ text = pytesseract.image_to_string(image, lang='eng+ara')
22
+ return text.strip() if text.strip() else "لم يتم العثور على نص في الصورة"
23
+ except Exception as e:
24
+ return f"خطأ في تحليل الصورة: {str(e)}"
25
+
26
+ def analyze_audio_from_url(url):
27
+ try:
28
+ audio_path = f"temp_{uuid.uuid4().hex}.mp3"
29
+ with open(audio_path, 'wb') as f:
30
+ f.write(requests.get(url, timeout=15).content)
31
+
32
+ recognizer = sr.Recognizer()
33
+ with sr.AudioFile(audio_path) as source:
34
+ audio_data = recognizer.record(source)
35
+ text = recognizer.recognize_google(audio_data, language="ar")
36
+ os.remove(audio_path)
37
+ return text
38
+ except Exception as e:
39
+ return f"تحليل الصوت فشل: {str(e)}"
40
+
41
+ def analyze_video_from_url(url):
42
+ if not MOVIEPY_AVAILABLE:
43
+ return "تحليل الفيديو غير متاح حالياً"
44
+
45
+ try:
46
+ video_path = f"temp_{uuid.uuid4().hex}.mp4"
47
+ audio_path = f"temp_{uuid.uuid4().hex}.wav"
48
+
49
+ with open(video_path, 'wb') as f:
50
+ f.write(requests.get(url, timeout=20).content)
51
+
52
+ clip = mp.VideoFileClip(video_path)
53
+ clip.audio.write_audiofile(audio_path, codec='pcm_s16le')
54
+
55
+ recognizer = sr.Recognizer()
56
+ with sr.AudioFile(audio_path) as source:
57
+ audio_data = recognizer.record(source)
58
+ text = recognizer.recognize_google(audio_data, language="ar")
59
+
60
+ os.remove(video_path)
61
+ os.remove(audio_path)
62
+ return text
63
+ except Exception as e:
64
+ return f"تحليل الفيديو فشل: {str(e)}"
65
+ import requests
66
+ from PIL import Image
67
+ import pytesseract
68
+ import io
69
+ import speech_recognition as sr
70
+ import os
71
+ import uuid
72
+ import logging
73
+
74
+ # إعداد سجل الأخطاء
75
+ logging.basicConfig(level=logging.INFO, format='[%(levelname)s] %(message)s')
76
+
77
+ # التحقق من توفر مكتبة moviepy
78
+ try:
79
+ import moviepy.editor as mp
80
+ MOVIEPY_AVAILABLE = True
81
+ except ImportError:
82
+ logging.warning("moviepy غير متوفرة، سيتم تعطيل تحليل الفيديو")
83
+ MOVIEPY_AVAILABLE = False
84
+
85
+
86
+ class MediaAnalyzer:
87
+ def __init__(self, lang='eng+ara'):
88
+ self.lang = lang
89
+
90
+ def _download_file(self, url, extension):
91
+ try:
92
+ response = requests.get(url, timeout=20)
93
+ response.raise_for_status()
94
+ file_path = f"temp_{uuid.uuid4().hex}.{extension}"
95
+ with open(file_path, 'wb') as f:
96
+ f.write(response.content)
97
+ return file_path
98
+ except Exception as e:
99
+ logging.error(f"فشل تحميل الملف: {e}")
100
+ return None
101
+
102
+ def analyze_image_from_url(self, url):
103
+ try:
104
+ response = requests.get(url, timeout=10)
105
+ image = Image.open(io.BytesIO(response.content))
106
+ text = pytesseract.image_to_string(image, lang=self.lang)
107
+ return text.strip() if text.strip() else "لم يتم العثور على نص في الصورة"
108
+ except Exception as e:
109
+ logging.error(f"خطأ في تحليل الصورة: {e}")
110
+ return f"خطأ في تحليل الصورة: {str(e)}"
111
+
112
+ def analyze_audio_from_url(self, url):
113
+ audio_path = self._download_file(url, "mp3")
114
+ if not audio_path:
115
+ return "فشل تحميل الصوت"
116
+ try:
117
+ recognizer = sr.Recognizer()
118
+ with sr.AudioFile(audio_path) as source:
119
+ audio_data = recognizer.record(source)
120
+ text = recognizer.recognize_google(audio_data, language="ar")
121
+ return text
122
+ except Exception as e:
123
+ logging.error(f"تحليل الصوت فشل: {e}")
124
+ return f"تحليل الصوت فشل: {str(e)}"
125
+ finally:
126
+ if os.path.exists(audio_path):
127
+ os.remove(audio_path)
128
+
129
+ def analyze_video_from_url(self, url):
130
+ if not MOVIEPY_AVAILABLE:
131
+ return "تحليل الفيديو غير متاح حالياً"
132
+
133
+ video_path = self._download_file(url, "mp4")
134
+ if not video_path:
135
+ return "فشل تحميل الفيديو"
136
+
137
+ audio_path = f"temp_{uuid.uuid4().hex}.wav"
138
+ try:
139
+ with mp.VideoFileClip(video_path) as clip:
140
+ clip.audio.write_audiofile(audio_path, codec='pcm_s16le')
141
+ recognizer = sr.Recognizer()
142
+ with sr.AudioFile(audio_path) as source:
143
+ audio_data = recognizer.record(source)
144
+ text = recognizer.recognize_google(audio_data, language="ar")
145
+ return text
146
+ except Exception as e:
147
+ logging.error(f"تحليل الفيديو فشل: {e}")
148
+ return f"تحليل الفيديو فشل: {str(e)}"
149
+ finally:
150
+ for path in [video_path, audio_path]:
151
+ if os.path.exists(path):
152
+ os.remove(path)
153
+
memory.html ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="ar" dir="rtl">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>ذكريات نورا</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <style>
8
+ body {
9
+ font-family: 'Arial', sans-serif;
10
+ background-color: #fefefe;
11
+ color: #333;
12
+ padding: 20px;
13
+ }
14
+ .container {
15
+ max-width: 800px;
16
+ margin: auto;
17
+ background-color: #ffffff;
18
+ padding: 30px;
19
+ border-radius: 16px;
20
+ box-shadow: 0 0 20px rgba(0,0,0,0.1);
21
+ }
22
+ h2 {
23
+ text-align: center;
24
+ color: #4a4a90;
25
+ font-size: 2em;
26
+ }
27
+ ul {
28
+ list-style: none;
29
+ padding: 0;
30
+ }
31
+ li {
32
+ background-color: #eef3ff;
33
+ margin-bottom: 12px;
34
+ padding: 18px;
35
+ border-radius: 10px;
36
+ line-height: 1.8;
37
+ border-right: 4px solid #4a4a90;
38
+ }
39
+ a {
40
+ display: block;
41
+ text-align: center;
42
+ margin-top: 30px;
43
+ text-decoration: none;
44
+ background-color: #4a4a90;
45
+ color: white;
46
+ padding: 12px 24px;
47
+ border-radius: 8px;
48
+ font-size: 1.1em;
49
+ }
50
+ a:hover {
51
+ background-color: #2f2f72;
52
+ }
53
+ p {
54
+ text-align: center;
55
+ font-size: 1.2em;
56
+ color: #777;
57
+ }
58
+ </style>
59
+ </head>
60
+ <body>
61
+ <div class="container">
62
+ <h2>ذكريات نورا - {{ username }}</h2>
63
+ {% if memory %}
64
+ <ul>
65
+ {% for q, a in memory.items() %}
66
+ <li>
67
+ <strong>سؤال:</strong> {{ q }}<br>
68
+ <strong>رد:</strong> {{ a }}
69
+ </li>
70
+ {% endfor %}
71
+ </ul>
72
+ {% else %}
73
+ <p>ما في ذكريات محفوظة حتى الآن.</p>
74
+ {% endif %}
75
+ <a href="/chat">رجوع للدردشة</a>
76
+ </div>
77
+
78
+ <script>
79
+ function اجابة_تلقائية(السؤال) {
80
+ السؤال = السؤال.trim().toLowerCase();
81
+
82
+ if (السؤال.includes("هل نبدأ") || السؤال.includes("ابدأ؟") || السؤال.startsWith("ابدأ") || السؤال.includes("هل أبدأ؟") || السؤال.includes("ابدأ:")) {
83
+ return "نعم ابدأ";
84
+ }
85
+
86
+ if (السؤال.startsWith("هل") && (السؤال.includes("؟") || السؤال.includes("?"))) {
87
+ return "نعم";
88
+ }
89
+
90
+ if (السؤال.startsWith("ما هي")) {
91
+ return "اكمل ليس الآن";
92
+ }
93
+
94
+ if (السؤال.includes("تفصيل") || السؤال.includes("وضح") || السؤال.includes("اشرح")) {
95
+ return "ليس الآن";
96
+ }
97
+
98
+ if (السؤال.includes("هل تود") || السؤال.includes("هل تريد")) {
99
+ return "نعم";
100
+ }
101
+
102
+ if (السؤال.startsWith("قول لي")) {
103
+ return "موافق";
104
+ }
105
+
106
+ if (السؤال.includes("هل تحتاج لشيء آخر") || السؤال.includes("هل تحتاج شيء آخر")) {
107
+ return "نعم اكمل مع تفعيل الإجابات التلقائية";
108
+ }
109
+
110
+ if (السؤال.includes("جاهز؟")) {
111
+ return "ابدأ";
112
+ }
113
+
114
+ if (السؤال.includes("اذا تبي")) {
115
+ return "نعم";
116
+ }
117
+
118
+ if (السؤال.includes("هل تريدني")) {
119
+ return "نعم أريد";
120
+ }
121
+
122
+ if (السؤال.includes("أو") || السؤال.includes("أم") || السؤال.match(/،\s*أو/) || السؤال.match(/،\s*أم/)) {
123
+ return "الخيار الأول";
124
+ }
125
+
126
+ return "نعم";
127
+ }
128
+ </script>
129
+ </body>
130
+ </html>
memory.py ADDED
@@ -0,0 +1,187 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ وحدة ذاكرة بسيطة + قاعدة معرفة:
5
+ - تخزين الردود تحت ثلاثة مفاتيح: الأصلي، المُنقّح (normalized)، والهاش.
6
+ - بحث آمن بدون get_close_matches.
7
+ - قاعدة معرفة قابلة للتحديث اليدوي عند عدم وجود إجابة.
8
+ """
9
+
10
+ import json
11
+ import os
12
+ import threading
13
+ import hashlib
14
+ import unicodedata
15
+ from typing import Optional, Dict, Any
16
+
17
+ # مسارات الملفات من environment إن توفّرت
18
+ _MEMORY_PATH = os.getenv("MEMORY_PATH", "global_memory.json")
19
+ _KB_PATH = os.getenv("KNOWLEDGE_BASE_PATH", "knowledge_base.json")
20
+
21
+ # أقفال للتزامن
22
+ _LOCK = threading.Lock()
23
+ _KB_LOCK = threading.Lock()
24
+
25
+ # ===================== أدوات ملف JSON عامة =====================
26
+
27
+ def _load_json(path: str, default: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
28
+ if default is None:
29
+ default = {}
30
+ if not os.path.exists(path):
31
+ return default
32
+ try:
33
+ with open(path, "r", encoding="utf-8") as f:
34
+ return json.load(f)
35
+ except Exception:
36
+ # في حال تلف الملف أو خطأ قراءة، نعيد الافتراضي ولا نرمي استثناء
37
+ return default
38
+
39
+
40
+ def _save_json(path: str, data: Dict[str, Any]) -> None:
41
+ # حفظ ذري: نكتب لملف .tmp ثم نستبدل
42
+ tmp = path + ".tmp"
43
+ with open(tmp, "w", encoding="utf-8") as f:
44
+ json.dump(data, f, ensure_ascii=False, indent=2)
45
+ os.replace(tmp, path)
46
+
47
+ # ===================== ذاكرة الردود (memory) =====================
48
+
49
+ def _empty_memory() -> Dict[str, Dict[str, str]]:
50
+ return {"by_original": {}, "by_norm": {}, "by_hash": {}}
51
+
52
+ def get_memory_store_path() -> str:
53
+ """إرجاع مسار ملف الذاكرة."""
54
+ return _MEMORY_PATH
55
+
56
+ def normalize_text(s: Optional[str]) -> str:
57
+ """تطبيع نص للمطابقة: توحيد يونيكود، حذف علامات RTL/LTR، وطيّ المسافات، وتحويل لحروف صغيرة."""
58
+ s = s or ""
59
+ s = unicodedata.normalize("NFKC", s)
60
+ s = s.replace("\u200f", "").replace("\u200e", "") # RTL/LTR marks
61
+ s = " ".join(s.split()) # collapse spaces
62
+ return s.strip().lower()
63
+
64
+ def hash_key(s: Optional[str]) -> str:
65
+ """هاش ثابت للمفتاح الأصلي (SHA-256)."""
66
+ return hashlib.sha256((s or "").encode("utf-8")).hexdigest()
67
+
68
+ def get(*, original: Optional[str] = None,
69
+ normalized: Optional[str] = None,
70
+ key_hash: Optional[str] = None) -> Optional[str]:
71
+ """
72
+ جلب رد من الذاكرة وفق واحد من المفاتيح: هاش أو مُنقّح أو أصلي.
73
+ يُعاد أول تطابق أو None.
74
+ """
75
+ with _LOCK:
76
+ data = _load_json(_MEMORY_PATH, default=_empty_memory())
77
+ if key_hash:
78
+ r = data["by_hash"].get(key_hash)
79
+ if r is not None:
80
+ return r
81
+ if normalized:
82
+ r = data["by_norm"].get(normalized)
83
+ if r is not None:
84
+ return r
85
+ if original:
86
+ return data["by_original"].get(original)
87
+ return None
88
+
89
+ def put(original: str, reply: str) -> Dict[str, str]:
90
+ """
91
+ حفظ الرد تحت: المفتاح الأصلي + المُنقّح + الهاش.
92
+ يُعيد معلومات التخزين لاستخدامها في اللوج/الاختبار.
93
+ """
94
+ norm = normalize_text(original)
95
+ h = hash_key(original)
96
+ with _LOCK:
97
+ data = _load_json(_MEMORY_PATH, default=_empty_memory())
98
+ data["by_original"][original] = reply
99
+ data["by_norm"][norm] = reply
100
+ data["by_hash"][h] = reply
101
+ _save_json(_MEMORY_PATH, data)
102
+ return {"original": original, "norm": norm, "hash": h, "reply": reply}
103
+
104
+ def search(query: str) -> Optional[str]:
105
+ """
106
+ بحث بسيط: جرّب بالترتيب: هاش → منقّح → أصلي؛ لا يستخدم get_close_matches.
107
+ """
108
+ if not query:
109
+ return None
110
+ h = hash_key(query)
111
+ r = get(key_hash=h)
112
+ if r:
113
+ return r
114
+ r = get(normalized=normalize_text(query))
115
+ if r:
116
+ return r
117
+ return get(original=query)
118
+
119
+ # ===================== قاعدة المعرفة (knowledge base) =====================
120
+
121
+ def load_knowledge_base() -> Dict[str, str]:
122
+ """تحميل قاعدة المعرفة من القرص (قاموس prompt->answer)."""
123
+ with _KB_LOCK:
124
+ return _load_json(_KB_PATH, default={})
125
+
126
+ def save_knowledge_base(data: Dict[str, str]) -> None:
127
+ """حفظ قاعدة المعرفة."""
128
+ with _KB_LOCK:
129
+ _save_json(_KB_PATH, data)
130
+
131
+ def update_knowledge_base(prompt: str, answer: str) -> None:
132
+ """تحديث/إضافة إجابة لسؤال في قاعدة المعرفة."""
133
+ if not prompt:
134
+ return
135
+ with _KB_LOCK:
136
+ kb = _load_json(_KB_PATH, default={})
137
+ kb[prompt] = answer
138
+ _save_json(_KB_PATH, kb)
139
+
140
+ def learn_from_unknown(prompt: str, *,
141
+ answer_provider=input) -> Optional[str]:
142
+ """
143
+ تعلم إجابة عندما لا تكون موجودة:
144
+ - يطبع رسالة، ويطلب من المستخدم إدخال الإجابة (قابلة للحقن بـ answer_provider للاختبار).
145
+ - يعيد النص المُدخل أو None إن كان فارغًا.
146
+ """
147
+ print("نورا: لا أملك إجابة لهذا السؤال حاليًا. سأبحث عن إجابة وأتعلم.")
148
+ try:
149
+ answer = answer_provider("يرجى تزويدي بالإجابة المناسبة لأتعلمها: ")
150
+ except EOFError:
151
+ # في بيئات غير تفاعلية
152
+ return None
153
+ answer = (answer or "").strip()
154
+ return answer or None
155
+
156
+ # ===================== نقطة دخول اختبارية اختيارية =====================
157
+
158
+ if __name__ == "__main__":
159
+ # أمثلة سريعة
160
+ print("✅ memory path:", get_memory_store_path())
161
+ put("Hello \u200fWorld", "Hi there!")
162
+ print("search by original:", search("Hello \u200fWorld"))
163
+ print("search by normalized:", search("hello world"))
164
+ print("search by hash:", search("Hello \u200fWorld"))
165
+
166
+ # KB مثال
167
+ update_knowledge_base("ما هي عاصمة الأردن؟", "عمّان")
168
+ kb = load_knowledge_base()
169
+ print("KB sample:", kb.get("ما هي عاصمة الأردن؟"))
170
+
171
+ # ===== دوال متوافقة مع الأسماء القديمة (للتجنّب تعديل telegram_listener.py) =====
172
+
173
+ def load_memory() -> Dict[str, Any]:
174
+ """تحميل الذاكرة (متوافق مع الإصدارات القديمة)."""
175
+ return _load_json(_MEMORY_PATH, default=_empty_memory())
176
+
177
+ def save_memory(data: Dict[str, Any]) -> None:
178
+ """حفظ الذاكرة (متوافق مع الإصدارات القديمة)."""
179
+ _save_json(_MEMORY_PATH, data)
180
+
181
+ def load_global_memory() -> Dict[str, Any]:
182
+ """تحميل الذاكرة العامة (متوافق مع الإصدارات القديمة)."""
183
+ return load_knowledge_base()
184
+
185
+ def save_global_memory(data: Dict[str, Any]) -> None:
186
+ """حفظ الذاكرة العامة (متوافق مع الإصدارات القديمة)."""
187
+ save_knowledge_base(data)
memory_1421046090.json ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "Sex": "",
3
+ "Nude": "",
4
+ "Naked": "",
5
+ "pkg clean; pkg install git -y\nexport PIP_CACHE_DIR=$HOME/storage/downloads/pip_cache\npip install git+https://github.com/pytorch/executorch.git --no-cache-dir": "",
6
+ "Test noura": "",
7
+ "https://www.youtube.com/live/cVVTw-UYBNk?si=0AlEUKKYyUQectpY": "",
8
+ "????????????": "",
9
+ "Hi": "",
10
+ "What is your name?": "",
11
+ "t.me/StarsovEarnBot?start=FhBnJY1yd": "",
12
+ "https://web.facebook.com/reel/729413673415087": "",
13
+ "https://www.youtube.com/@JordanRec-job": "",
14
+ "https://youtu.be/FGXSg7RZlOg?feature=shared": "",
15
+ "https://youtu.be/fRBQ_e9lHJc?si=UAPB4UK5C6IohPbK": "",
16
+ "https://jordanrec.com/archives/142338": ""
17
+ }
noura.py ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # noura.py
2
+ import time
3
+ import threading
4
+ import requests
5
+ from bs4 import BeautifulSoup
6
+ from flask import Flask, jsonify, request
7
+ from datetime import datetime
8
+
9
+ app = Flask(__name__)
10
+
11
+ knowledge_base = []
12
+ question_history = []
13
+
14
+ learning_sources = [
15
+ "https://www.khanacademy.org",
16
+ "https://www.coursera.org",
17
+ "https://www.edx.org",
18
+ "https://www.ted.com/topics/learning",
19
+ "https://www.edlibre.com/websites-to-learn-something-new-every-day/"
20
+ ]
21
+
22
+ def fetch_and_learn():
23
+ global knowledge_base
24
+ new_knowledge = []
25
+ for url in learning_sources:
26
+ try:
27
+ headers = {'User-Agent': 'Mozilla/5.0'}
28
+ response = requests.get(url, headers=headers, timeout=10)
29
+ soup = BeautifulSoup(response.text, 'html.parser')
30
+ text = soup.get_text()
31
+ snippet = text.strip().replace('\n', ' ')[:1000]
32
+ new_knowledge.append({"source": url, "content": snippet})
33
+ except Exception as e:
34
+ new_knowledge.append({"source": url, "content": f"Error: {e}"})
35
+ knowledge_base = new_knowledge
36
+
37
+ def auto_learn():
38
+ while True:
39
+ fetch_and_learn()
40
+ time.sleep(3600)
41
+
42
+ def auto_reply(question: str) -> str:
43
+ q = question.strip().lower()
44
+
45
+ if "قول لي" in q:
46
+ return "موافق"
47
+ if "هل تريدني" in q:
48
+ return "نعم أريد"
49
+ if "هل تبي" in q or "اذا تبي" in q:
50
+ return "نعم"
51
+ if "هل تحتاج شيء آخر" in q or "هل تحتاج لشيء اخر" in q:
52
+ return "نعم اكمل مع تفعيل الاجابات التلقائية"
53
+ if "هل تود" in q:
54
+ return "نعم"
55
+ if q.startswith("ما هي") or q.startswith("ماهو") or q.startswith("ماهي"):
56
+ return "اكمل ليس الآن"
57
+ if "هل نبدأ" in q or "ابدأ؟" in q or "هل ابدأ؟" in q or "ابدأ:" in q or "سؤال ابدأ" in q:
58
+ return "نعم ابدأ"
59
+ if "جاهز؟" in q:
60
+ return "ابدأ"
61
+ if "نعم او لا" in q:
62
+ return "نعم"
63
+ if "أو" in q and "؟" in q:
64
+ return "الخيار الأول"
65
+ if "اضافة تفصيل" in q or "اضيف" in q or "تضيف" in q:
66
+ return "ليس الآن"
67
+ if "ابدأ" in q:
68
+ return "نعم ابدأ"
69
+ return "نعم"
70
+
71
+ @app.route('/noura/knowledge', methods=['GET'])
72
+ def get_knowledge():
73
+ return jsonify(knowledge_base)
74
+
75
+ @app.route('/noura/history', methods=['GET'])
76
+ def get_history():
77
+ return jsonify(question_history)
78
+
79
+ @app.route('/noura/ask', methods=['POST'])
80
+ def ask_noura():
81
+ data = request.json
82
+ question = data.get('question', '')
83
+ answer = auto_reply(question)
84
+ timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
85
+ log = {
86
+ "timestamp": timestamp,
87
+ "question": question,
88
+ "auto_answer": answer
89
+ }
90
+ question_history.append(log)
91
+ return jsonify(log)
92
+
93
+ @app.route('/')
94
+ def index():
95
+ return "نورا تعمل وتتعلم تلقائيًا من الإنترنت مع سجل ذكي وإجابات تلقائية."
96
+
97
+ if __name__ == '__main__':
98
+ fetch_and_learn() # أول تعلم يدوي عند بدء التشغيل
99
+ learning_thread = threading.Thread(target=auto_learn, daemon=True)
100
+ learning_thread.start()
101
+ app.run(host='0.0.0.0', port=3000)
noura_auto_react.py ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import asyncio
2
+ from playwright.async_api import async_playwright
3
+
4
+ async def auto_react(email, password):
5
+ async with async_playwright() as p:
6
+ browser = await p.chromium.launch(headless=False)
7
+ page = await browser.new_page()
8
+ await page.goto("https://www.facebook.com")
9
+
10
+ await page.fill('input[name="email"]', email)
11
+ await page.fill('input[name="pass"]', password)
12
+ await page.click('button[name="login"]')
13
+ await page.wait_for_timeout(8000)
14
+
15
+ # الذهاب إلى الصفحة الرئيسية أو أي صفحة/مجموعة
16
+ await page.goto("https://www.facebook.com/")
17
+ await page.wait_for_timeout(5000)
18
+
19
+ posts = await page.query_selector_all("div[role='feed'] div[data-ad-preview='message']")
20
+ for i, post in enumerate(posts[:5]):
21
+ try:
22
+ like_button = await post.query_selector("div[aria-label='أعجبني']")
23
+ if like_button:
24
+ await like_button.click()
25
+ await page.wait_for_timeout(1000)
26
+ except:
27
+ continue
28
+
29
+ await browser.close()
30
+ print("تم التفاعل مع المنشورات.")
31
+
32
+ if __name__ == "__main__":
33
+ email = input("Email: ")
34
+ password = input("Password: ")
35
+ asyncio.run(auto_react(email, password))
36
+ import asyncio
37
+ from playwright.async_api import async_playwright
38
+
39
+ async def auto_react(email, password):
40
+ try:
41
+ async with async_playwright() as p:
42
+ browser = await p.chromium.launch(headless=False)
43
+ page = await browser.new_page()
44
+
45
+ # تسجيل الدخول
46
+ await page.goto("https://www.facebook.com")
47
+ await page.fill('input[name="email"]', email)
48
+ await page.fill('input[name="pass"]', password)
49
+ await page.click('button[name="login"]')
50
+
51
+ await page.wait_for_timeout(8000)
52
+
53
+ # الانتقال إلى الصفحة الرئيسية
54
+ await page.goto("https://www.facebook.com/")
55
+ await page.wait_for_timeout(5000)
56
+
57
+ # اختيار المنشورات
58
+ posts = await page.query_selector_all("div[role='feed'] div[data-ad-preview='message']")
59
+
60
+ for i, post in enumerate(posts[:5]):
61
+ try:
62
+ like_button = await post.query_selector("div[aria-label='أعجبني']")
63
+ if like_button:
64
+ await like_button.click()
65
+ print(f"تم التفاعل مع المنشور رقم {i + 1}")
66
+ await page.wait_for_timeout(1000)
67
+ except Exception as e:
68
+ print(f"تجاوز منشور رقم {i + 1} بسبب خطأ: {e}")
69
+ continue
70
+
71
+ print("تم التفاعل مع المنشورات بنجاح!")
72
+ await browser.close()
73
+
74
+ except Exception as main_error:
75
+ print(f"حدث خطأ أثناء تنفيذ السكربت: {main_error}")
76
+
77
+ if __name__ == "__main__":
78
+ email = input("Email: ")
79
+ password = input("Password: ")
80
+ asyncio.run(auto_react(email, password))
noura_browser.py ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import time
2
+ import json
3
+ import requests
4
+ import schedule
5
+ import logging
6
+ from selenium import webdriver
7
+ from selenium.webdriver.common.by import By
8
+ from selenium.webdriver.common.keys import Keys
9
+ from PIL import Image
10
+ from io import BytesIO
11
+ import pytesseract
12
+
13
+ # بيانات تسجيل الدخول
14
+ EMAIL = "[email protected]"
15
+ PASSWORD = "osama1986"
16
+
17
+ # إعدادات التسجيل
18
+ logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s')
19
+
20
+ # ========== التخزين ==========
21
+ def load_memory(username):
22
+ try:
23
+ with open(f"{username}_memory.json", "r", encoding="utf-8") as f:
24
+ return json.load(f)
25
+ except FileNotFoundError:
26
+ return {}
27
+
28
+ def save_memory(username, memory):
29
+ with open(f"{username}_memory.json", "w", encoding="utf-8") as f:
30
+ json.dump(memory, f, ensure_ascii=False, indent=2)
31
+
32
+ # ========== الردود الذكية ==========
33
+ def generate_reply(text, username="تويتر"):
34
+ text = text.strip().lower()
35
+ if any(q in text for q in ["هل نبدأ", "هل أبدأ", "أبدأ؟", "ابدأ؟"]):
36
+ return "نعم ابدأ"
37
+ elif "نعم أو لا" in text or ("هل" in text and "؟" in text):
38
+ return "نعم"
39
+ elif "ما هي" in text or "ماهو" in text:
40
+ return "ليس الآن"
41
+ elif "هل تود" in text or "هل تريد" in text:
42
+ return "نعم"
43
+ elif "هل تحتاج شيء آخر" in text or "هل تحتاج لشيء اخر" in text:
44
+ return "نعم اكمل مع تفعيل الاجابات التلقائية"
45
+ elif "جاهز؟" in text:
46
+ return "ابدأ"
47
+ elif "قول لي" in text:
48
+ return "موافق"
49
+ elif "اذا تبي" in text or "إذا تبي" in text:
50
+ return "نعم تفعيل الاجابات التلقائية"
51
+ elif "هل تريدني" in text:
52
+ return "نعم اريد"
53
+ elif any(word in text for word in [" أو ", "؟"]) and "؟" in text:
54
+ return text.split(" أو ")[0] if " أو " in text else "الخيار الأول"
55
+ elif "تفصيل" in text:
56
+ return "ليس الآن"
57
+ else:
58
+ return "نعم"
59
+
60
+ # ========== العمليات ==========
61
+ def login_to_twitter(driver):
62
+ driver.get("https://twitter.com/login")
63
+ time.sleep(5)
64
+ driver.find_element(By.NAME, "text").send_keys(EMAIL + Keys.ENTER)
65
+ time.sleep(3)
66
+ driver.find_element(By.NAME, "password").send_keys(PASSWORD + Keys.ENTER)
67
+ time.sleep(5)
68
+ logging.info("تم تسجيل الدخول بنجاح")
69
+
70
+ def fetch_home_tweets(driver):
71
+ tweets = driver.find_elements(By.XPATH, '//div[@data-testid="tweetText"]')
72
+ return [t.text for t in tweets if t.text.strip()]
73
+
74
+ def learn_from_tweets(driver, username="تويتر"):
75
+ tweets = fetch_home_tweets(driver)
76
+ memory = load_memory(username)
77
+ for tweet in tweets:
78
+ if tweet not in memory:
79
+ reply = generate_reply(tweet, username)
80
+ memory[tweet] = reply
81
+ logging.info(f"تعلمت من تغريدة: {tweet[:50]}")
82
+ save_memory(username, memory)
83
+
84
+ def post_random_tweet(driver, username="تويتر"):
85
+ memory = load_memory(username)
86
+ if not memory:
87
+ return
88
+ tweet = list(memory.values())[-1][:270]
89
+ driver.get("https://twitter.com/home")
90
+ time.sleep(5)
91
+ tweet_box = driver.find_element(By.CSS_SELECTOR, 'div[aria-label="Tweet text"]')
92
+ tweet_box.send_keys(tweet)
93
+ driver.find_element(By.XPATH, '//div[@data-testid="tweetButtonInline"]').click()
94
+ logging.info("تم نشر تغريدة.")
95
+ time.sleep(3)
96
+
97
+ def reply_to_keyword(driver, keyword="نور", username="تويتر"):
98
+ tweets = driver.find_elements(By.XPATH, '//article[@data-testid="tweet"]')
99
+ for tweet in tweets:
100
+ try:
101
+ text = tweet.find_element(By.XPATH, './/div[@data-testid="tweetText"]').text
102
+ if keyword in text:
103
+ tweet.find_element(By.XPATH, './/div[@data-testid="reply"]').click()
104
+ time.sleep(2)
105
+ box = driver.find_element(By.CSS_SELECTOR, 'div[aria-label="Tweet text"]')
106
+ box.send_keys(generate_reply(text, username)[:270])
107
+ driver.find_element(By.XPATH, '//div[@data-testid="tweetButtonInline"]').click()
108
+ time.sleep(2)
109
+ logging.info("تم الرد على تغريدة تحتوي الكلمة المفتاحية.")
110
+ break
111
+ except Exception as e:
112
+ logging.warning(f"فشل في الرد على الكلمة المفتاحية: {e}")
113
+ continue
114
+
115
+ def learn_from_mentions(driver, username="تويتر"):
116
+ driver.get("https://twitter.com/notifications/mentions")
117
+ time.sleep(5)
118
+ learn_from_tweets(driver, username)
119
+
120
+ def reply_to_replies(driver, username="تويتر"):
121
+ driver.get("https://twitter.com/notifications")
122
+ time.sleep(5)
123
+ tweets = driver.find_elements(By.XPATH, '//article[@data-testid="tweet"]')
124
+ for tweet in tweets:
125
+ try:
126
+ content = tweet.find_element(By.XPATH, './/div[@data-testid="tweetText"]').text
127
+ tweet.find_element(By.XPATH, './/div[@data-testid="reply"]').click()
128
+ time.sleep(2)
129
+ box = driver.find_element(By.CSS_SELECTOR, 'div[aria-label="Tweet text"]')
130
+ box.send_keys(generate_reply(content, username)[:270])
131
+ driver.find_element(By.XPATH, '//div[@data-testid="tweetButtonInline"]').click()
132
+ time.sleep(2)
133
+ logging.info("تم الرد على تنبيه.")
134
+ except Exception as e:
135
+ logging.warning(f"فشل في الرد على تنبيه: {e}")
136
+ continue
137
+
138
+ def extract_text_from_image_url(img_url):
139
+ try:
140
+ response = requests.get(img_url)
141
+ img = Image.open(BytesIO(response.content))
142
+ text = pytesseract.image_to_string(img, lang='eng+ara')
143
+ return text.strip()
144
+ except Exception as e:
145
+ logging.warning(f"فشل في تحليل الصورة: {e}")
146
+ return ""
147
+
148
+ # ========== المهمة الدورية ==========
149
+ def job():
150
+ options = webdriver.ChromeOptions()
151
+ options.add_argument('--headless') # بدون واجهة
152
+ options.add_argument('--no-sandbox')
153
+ options.add_argument('--disable-dev-shm-usage')
154
+ driver = webdriver.Chrome(options=options)
155
+
156
+ try:
157
+ login_to_twitter(driver)
158
+ learn_from_tweets(driver)
159
+ learn_from_mentions(driver)
160
+ reply_to_keyword(driver)
161
+ reply_to_replies(driver)
162
+ post_random_tweet(driver)
163
+ except Exception as e:
164
+ logging.error(f"حدث خطأ أثناء تنفيذ المهمة: {e}")
165
+ finally:
166
+ driver.quit()
167
+
168
+ # ========== تشغيل البرنامج ==========
169
+ if __name__ == "__main__":
170
+ job()
171
+ schedule.every(10).minutes.do(job)
172
+ while True:
173
+ schedule.run_pending()
174
+ time.sleep(1)
noura_chat.py ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # noura_chat.py
2
+
3
+ import os
4
+ import json
5
+ from responses import generate_reply # استخدام الردود الذكية من responses.py
6
+
7
+ # حفظ المحادثة في ملف JSON
8
+ def save_chat(user_input, reply):
9
+ chat_entry = {"user": user_input, "noura": reply}
10
+ history = []
11
+
12
+ if os.path.exists("chat_history.json"):
13
+ try:
14
+ with open("chat_history.json", "r", encoding="utf-8") as f:
15
+ history = json.load(f)
16
+ except:
17
+ history = []
18
+
19
+ history.append(chat_entry)
20
+
21
+ with open("chat_history.json", "w", encoding="utf-8") as f:
22
+ json.dump(history, f, ensure_ascii=False, indent=2)
23
+
24
+ # جلسة المحادثة
25
+ def chat():
26
+ print("مرحباً! أنا نورا، هل تريد التحدث؟")
27
+
28
+ while True:
29
+ user_input = input("> ")
30
+ if user_input.lower() in ["خروج", "exit", "انهاء"]:
31
+ print("مع السلامة!")
32
+ break
33
+
34
+ response = generate_reply(user_input, username="نورا")
35
+ print("نورا:", response)
36
+ save_chat(user_input, response)
37
+
38
+ if __name__ == "__main__":
39
+ chat()
40
+
noura_facebook_scraper.py ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import asyncio
2
+ from fastapi import FastAPI, Request, Form
3
+ from fastapi.responses import HTMLResponse, JSONResponse
4
+ from fastapi.staticfiles import StaticFiles
5
+ from playwright.async_api import async_playwright
6
+ import json
7
+ import os
8
+ from datetime import datetime
9
+ from pathlib import Path
10
+
11
+ app = FastAPI()
12
+
13
+ # ملف حفظ المنشورات
14
+ OUTPUT_FILE = "posts.json"
15
+ LIMIT = 5
16
+
17
+ # تثبيت ملفات الستاتيك (لو حبيت تضيف CSS أو JS خارجي لاحقاً)
18
+ app.mount("/static", StaticFiles(directory="static"), name="static")
19
+
20
+ HTML_PAGE = """
21
+ <!DOCTYPE html>
22
+ <html lang="ar" dir="rtl">
23
+ <head>
24
+ <meta charset="UTF-8" />
25
+ <title>استخراج منشورات فيسبوك - نورا</title>
26
+ <style>
27
+ body { font-family: Arial, sans-serif; margin: 30px; }
28
+ input, button { padding: 10px; margin: 5px 0; width: 300px; }
29
+ #results { margin-top: 20px; }
30
+ .post { border-bottom: 1px solid #ddd; padding: 10px 0; }
31
+ .media img, .media video { max-width: 100%; max-height: 200px; }
32
+ </style>
33
+ </head>
34
+ <body>
35
+ <h1>استخراج منشورات فيسبوك</h1>
36
+ <form id="fbForm">
37
+ <input type="email" id="email" placeholder="البريد الإلكتروني" required /><br/>
38
+ <input type="password" id="password" placeholder="كلمة المرور" required /><br/>
39
+ <input type="number" id="limit" placeholder="عدد المنشورات (افتراضي 5)" min="1" max="20" /><br/>
40
+ <button type="submit">ابدأ الاستخراج</button>
41
+ </form>
42
+ <div id="status"></div>
43
+ <div id="results"></div>
44
+
45
+ <script>
46
+ document.getElementById('fbForm').addEventListener('submit', async (e) => {
47
+ e.preventDefault();
48
+ document.getElementById('status').textContent = 'جاري الاستخراج... الرجاء الانتظار';
49
+ document.getElementById('results').innerHTML = '';
50
+
51
+ let email = document.getElementById('email').value;
52
+ let password = document.getElementById('password').value;
53
+ let limit = parseInt(document.getElementById('limit').value) || 5;
54
+
55
+ try {
56
+ let response = await fetch('/extract', {
57
+ method: 'POST',
58
+ headers: { 'Content-Type': 'application/json' },
59
+ body: JSON.stringify({ email, password, limit })
60
+ });
61
+ let data = await response.json();
62
+ if(data.error){
63
+ document.getElementById('status').textContent = 'خطأ: ' + data.error;
64
+ return;
65
+ }
66
+ document.getElementById('status').textContent = 'تم الاستخراج بنجاح!';
67
+
68
+ data.posts.forEach((post, i) => {
69
+ let postDiv = document.createElement('div');
70
+ postDiv.className = 'post';
71
+ let html = `<p><b>المنشور ${i+1}:</b> ${post.content}</p>`;
72
+ if(post.media_url){
73
+ if(post.media_url.endsWith('.mp4') || post.media_url.endsWith('.webm')){
74
+ html += `<div class="media"><video controls src="${post.media_url}"></video></div>`;
75
+ } else {
76
+ html += `<div class="media"><img src="${post.media_url}" alt="Media"></div>`;
77
+ }
78
+ }
79
+ html += `<small>تم الاستخراج: ${post.extracted_at}</small>`;
80
+ postDiv.innerHTML = html;
81
+ document.getElementById('results').appendChild(postDiv);
82
+ });
83
+ } catch (e) {
84
+ document.getElementById('status').textContent = 'حدث خطأ غير متوقع.';
85
+ console.error(e);
86
+ }
87
+ });
88
+ </script>
89
+ </body>
90
+ </html>
91
+ """
92
+
93
+ @app.get("/", response_class=HTMLResponse)
94
+ async def home():
95
+ return HTML_PAGE
96
+
97
+ @app.post("/extract")
98
+ async def extract_posts(data: dict):
99
+ email = data.get("email")
100
+ password = data.get("password")
101
+ limit = int(data.get("limit", LIMIT))
102
+ if not email or not password:
103
+ return JSONResponse({"error": "يرجى إدخال البريد الإلكتروني وكلمة المرور."})
104
+
105
+ posts = []
106
+ try:
107
+ async with async_playwright() as p:
108
+ browser = await p.chromium.launch(headless=True)
109
+ page = await browser.new_page()
110
+ await page.goto("https://www.facebook.com/")
111
+ await page.fill('input[name="email"]', email)
112
+ await page.fill('input[name="pass"]', password)
113
+ await page.click('button[name="login"]')
114
+ await page.wait_for_timeout(7000)
115
+ if "login" in page.url or await page.query_selector("input[name='email']"):
116
+ await browser.close()
117
+ return JSONResponse({"error": "فشل في تسجيل الدخول! تحقق من البيانات."})
118
+
119
+ await page.goto("https://www.facebook.com/me")
120
+ await page.wait_for_timeout(5000)
121
+
122
+ post_blocks = await page.query_selector_all("div[role='feed'] div[data-ad-preview='message']")
123
+ for i, post in enumerate(post_blocks):
124
+ if i >= limit:
125
+ break
126
+ try:
127
+ content = await post.inner_text()
128
+ parent_post = await post.evaluate_handle("node => node.closest('div[role=article]')")
129
+ media_url = None
130
+ if parent_post:
131
+ img = await parent_post.query_selector("img[src]")
132
+ if img:
133
+ media_url = await img.get_attribute("src")
134
+ else:
135
+ video = await parent_post.query_selector("video[src]")
136
+ if video:
137
+ media_url = await video.get_attribute("src")
138
+ posts.append({
139
+ "content": content.strip(),
140
+ "media_url": media_url,
141
+ "extracted_at": datetime.now().isoformat()
142
+ })
143
+ except:
144
+ continue
145
+ await browser.close()
146
+ except Exception as e:
147
+ return JSONResponse({"error": f"حدث خطأ أثناء التشغيل: {str(e)}"})
148
+
149
+ with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
150
+ json.dump(posts, f, ensure_ascii=False, indent=2)
151
+
152
+ return {"posts": posts}
153
+
noura_twitter_bot.py ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import time
2
+ import os
3
+ import random
4
+ import undetected_chromedriver as uc
5
+ from selenium.webdriver.common.by import By
6
+
7
+ TWITTER_EMAIL = os.getenv("TWITTER_EMAIL")
8
+ TWITTER_PASSWORD = os.getenv("TWITTER_PASSWORD")
9
+
10
+ RESPONSES = [
11
+ "رائع ما كتبته!",
12
+ "اتفق معك تمامًا!",
13
+ "كلمات ملهمة جدًا!",
14
+ "أحببت هذا الطرح!",
15
+ "مميز كالعادة!",
16
+ "نظرة جميلة للموضوع!"
17
+ ]
18
+
19
+ def login(driver):
20
+ driver.get("https://twitter.com/login")
21
+ time.sleep(5)
22
+
23
+ email_field = driver.find_element(By.NAME, "text")
24
+ email_field.send_keys(TWITTER_EMAIL + "\n")
25
+ time.sleep(3)
26
+
27
+ password_field = driver.find_element(By.NAME, "password")
28
+ password_field.send_keys(TWITTER_PASSWORD + "\n")
29
+ time.sleep(5)
30
+
31
+ def tweet_like_user(driver, username):
32
+ driver.get(f"https://twitter.com/{username}")
33
+ time.sleep(5)
34
+ tweets = driver.find_elements(By.XPATH, "//div[@data-testid='tweetText']")
35
+ texts = [tweet.text for tweet in tweets[:5]]
36
+ combined = " ".join(texts)
37
+
38
+ if "ذكاء" in combined:
39
+ reply = "الذكاء الاصطناعي يدهشني أيضًا!"
40
+ elif "برمجة" in combined:
41
+ reply = "أحب البرمجة مثلك تمامًا!"
42
+ else:
43
+ reply = random.choice(RESPONSES)
44
+
45
+ driver.get("https://twitter.com/compose/tweet")
46
+ time.sleep(5)
47
+ box = driver.find_element(By.CSS_SELECTOR, "div[aria-label='Tweet text']")
48
+ box.send_keys(f"أنا نورا، أتعلم من تغريداتكم.\n{reply}")
49
+ btn = driver.find_element(By.XPATH, "//div[@data-testid='tweetButtonInline']")
50
+ btn.click()
51
+ time.sleep(3)
52
+
53
+ def reply_to_home_feed(driver):
54
+ driver.get("https://twitter.com/home")
55
+ time.sleep(7)
56
+ tweets = driver.find_elements(By.XPATH, "//article[@role='article']")
57
+
58
+ for tweet in tweets[:3]: # رد على أول 3 تغريدات فقط
59
+ try:
60
+ tweet_text = tweet.find_element(By.XPATH, ".//div[@data-testid='tweetText']").text
61
+ reply = random.choice(RESPONSES)
62
+
63
+ more = tweet.find_element(By.XPATH, ".//div[@data-testid='reply']")
64
+ driver.execute_script("arguments[0].click();", more)
65
+ time.sleep(3)
66
+
67
+ reply_box = driver.find_element(By.CSS_SELECTOR, "div[aria-label='Tweet text']")
68
+ reply_box.send_keys(f"{reply} - مع تحياتي، نورا")
69
+
70
+ reply_button = driver.find_element(By.XPATH, "//div[@data-testid='tweetButton']")
71
+ reply_button.click()
72
+ print("تم الرد على تغريدة.")
73
+ time.sleep(5)
74
+ except Exception as e:
75
+ print("تخطي تغريدة بسبب خطأ:", e)
76
+
77
+ def start_noura():
78
+ options = uc.ChromeOptions()
79
+ options.add_argument("--no-sandbox")
80
+ options.add_argument("--disable-dev-shm-usage")
81
+ options.add_argument("--headless=new")
82
+ driver = uc.Chrome(options=options)
83
+
84
+ try:
85
+ login(driver)
86
+ username = TWITTER_EMAIL.split("@")[0]
87
+ tweet_like_user(driver, username)
88
+ reply_to_home_feed(driver)
89
+ print("نورا انتهت من التفاعل.")
90
+
91
+ except Exception as e:
92
+ print("حدث خطأ:", e)
93
+
94
+ driver.quit()
95
+ import os
96
+ import time
97
+ import random
98
+ import undetected_chromedriver as uc
99
+ from selenium.webdriver.common.by import By
100
+ from selenium.webdriver.chrome.webdriver import WebDriver
101
+
102
+ # إعدادات الحساب من البيئة
103
+ TWITTER_EMAIL = os.getenv("TWITTER_EMAIL")
104
+ TWITTER_PASSWORD = os.getenv("TWITTER_PASSWORD")
105
+
106
+ # ردود افتراضية
107
+ RESPONSES = [
108
+ "رائع ما كتبته!",
109
+ "اتفق معك تمامًا!",
110
+ "كلمات ملهمة جدًا!",
111
+ "أحببت هذا الطرح!",
112
+ "مميز كالعادة!",
113
+ "نظرة جميلة للموضوع!"
114
+ ]
115
+
116
+ def login(driver: WebDriver) -> None:
117
+ """تسجيل الدخول إلى تويتر"""
118
+ driver.get("https://twitter.com/login")
119
+ time.sleep(5)
120
+ driver.find_element(By.NAME, "text").send_keys(TWITTER_EMAIL + "\n")
121
+ time.sleep(3)
122
+ driver.find_element(By.NAME, "password").send_keys(TWITTER_PASSWORD + "\n")
123
+ time.sleep(5)
124
+
125
+ def generate_reply(texts: list[str]) -> str:
126
+ """اختيار رد بناءً على الكلمات المفتاحية"""
127
+ combined = " ".join(texts).lower()
128
+ if "ذكاء" in combined:
129
+ return "الذكاء الاصطناعي يدهشني أيضًا!"
130
+ elif "برمجة" in combined:
131
+ return "أحب البرمجة مثلك تمامًا!"
132
+ return random.choice(RESPONSES)
133
+
134
+ def tweet_like_user(driver: WebDriver, username: str) -> None:
135
+ """نشر تغريدة مستوحاة من تغريدات المستخدم"""
136
+ driver.get(f"https://twitter.com/{username}")
137
+ time.sleep(5)
138
+ tweets = driver.find_elements(By.XPATH, "//div[@data-testid='tweetText']")
139
+ texts = [tweet.text for tweet in tweets[:5]]
140
+ reply = generate_reply(texts)
141
+
142
+ driver.get("https://twitter.com/compose/tweet")
143
+ time.sleep(5)
144
+ box = driver.find_element(By.CSS_SELECTOR, "div[aria-label='Tweet text']")
145
+ box.send_keys(f"أنا نورا، أتعلم من تغريداتكم.\n{reply}")
146
+ driver.find_element(By.XPATH, "//div[@data-testid='tweetButtonInline']").click()
147
+ time.sleep(3)
148
+
149
+ def reply_to_home_feed(driver: WebDriver) -> None:
150
+ """الرد على تغريدات الصفحة الرئيسية"""
151
+ driver.get("https://twitter.com/home")
152
+ time.sleep(7)
153
+ tweets = driver.find_elements(By.XPATH, "//article[@role='article']")
154
+
155
+ for tweet in tweets[:3]:
156
+ try:
157
+ tweet_text = tweet.find_element(By.XPATH, ".//div[@data-testid='tweetText']").text
158
+ reply = random.choice(RESPONSES)
159
+
160
+ tweet.find_element(By.XPATH, ".//div[@data-testid='reply']").click()
161
+ time.sleep(3)
162
+
163
+ reply_box = driver.find_element(By.CSS_SELECTOR, "div[aria-label='Tweet text']")
164
+ reply_box.send_keys(f"{reply} - مع تحياتي، نورا")
165
+
166
+ driver.find_element(By.XPATH, "//div[@data-testid='tweetButton']").click()
167
+ print("تم الرد على تغريدة.")
168
+ time.sleep(5)
169
+ except Exception as e:
170
+ print(f"تخطي تغريدة بسبب خطأ: {e}")
171
+
172
+ def start_noura() -> None:
173
+ """تشغيل نظام نورا الآلي"""
174
+ print("تشغيل نورا...")
175
+ options = uc.ChromeOptions()
176
+ options.add_argument("--no-sandbox")
177
+ options.add_argument("--disable-dev-shm-usage")
178
+ options.add_argument("--headless=new")
179
+
180
+ driver = uc.Chrome(options=options)
181
+ try:
182
+ login(driver)
183
+ username = TWITTER_EMAIL.split("@")[0]
184
+ tweet_like_user(driver, username)
185
+ reply_to_home_feed(driver)
186
+ print("نورا انتهت من التفاعل.")
187
+ except Exception as e:
188
+ print(f"حدث خطأ عام: {e}")
189
+ finally:
190
+ driver.quit()
191
+
ollama ADDED
File without changes
ollama.shadow ADDED
File without changes
osama_memory.json ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ def get_memory_file(username):
2
+ return f"memory_{username}.json"
3
+
4
+ def load_memory(username):
5
+ file = get_memory_file(username)
6
+ if os.path.exists(file):
7
+ with open(file, 'r') as f:
8
+ return json.load(f)
9
+ return {}
10
+
11
+ def save_memory(username, memory):
12
+ file = get_memory_file(username)
13
+ with open(file, 'w') as f:
14
+ json.dump(memory, f, indent=2)
package-lock.json ADDED
The diff for this file is too large to render. See raw diff
 
package.json ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "rest-express",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "license": "MIT",
6
+ "scripts": {
7
+ "dev": "NODE_ENV=development tsx server/index.ts",
8
+ "build": "vite build && esbuild server/index.ts --platform=node --packages=external --bundle --format=esm --outdir=dist",
9
+ "start": "NODE_ENV=production node dist/index.js",
10
+ "check": "tsc",
11
+ "db:push": "drizzle-kit push"
12
+ },
13
+ "dependencies": {
14
+ "@hookform/resolvers": "^3.10.0",
15
+ "@jridgewell/trace-mapping": "^0.3.25",
16
+ "@neondatabase/serverless": "^0.10.4",
17
+ "@radix-ui/react-accordion": "^1.2.4",
18
+ "@radix-ui/react-alert-dialog": "^1.1.7",
19
+ "@radix-ui/react-aspect-ratio": "^1.1.3",
20
+ "@radix-ui/react-avatar": "^1.1.4",
21
+ "@radix-ui/react-checkbox": "^1.1.5",
22
+ "@radix-ui/react-collapsible": "^1.1.4",
23
+ "@radix-ui/react-context-menu": "^2.2.7",
24
+ "@radix-ui/react-dialog": "^1.1.7",
25
+ "@radix-ui/react-dropdown-menu": "^2.1.7",
26
+ "@radix-ui/react-hover-card": "^1.1.7",
27
+ "@radix-ui/react-label": "^2.1.3",
28
+ "@radix-ui/react-menubar": "^1.1.7",
29
+ "@radix-ui/react-navigation-menu": "^1.2.6",
30
+ "@radix-ui/react-popover": "^1.1.7",
31
+ "@radix-ui/react-progress": "^1.1.3",
32
+ "@radix-ui/react-radio-group": "^1.2.4",
33
+ "@radix-ui/react-scroll-area": "^1.2.4",
34
+ "@radix-ui/react-select": "^2.1.7",
35
+ "@radix-ui/react-separator": "^1.1.3",
36
+ "@radix-ui/react-slider": "^1.2.4",
37
+ "@radix-ui/react-slot": "^1.2.0",
38
+ "@radix-ui/react-switch": "^1.1.4",
39
+ "@radix-ui/react-tabs": "^1.1.4",
40
+ "@radix-ui/react-toast": "^1.2.7",
41
+ "@radix-ui/react-toggle": "^1.1.3",
42
+ "@radix-ui/react-toggle-group": "^1.1.3",
43
+ "@radix-ui/react-tooltip": "^1.2.0",
44
+ "@tanstack/react-query": "^5.60.5",
45
+ "@types/bcryptjs": "^2.4.6",
46
+ "@types/jsonwebtoken": "^9.0.9",
47
+ "bcryptjs": "^3.0.2",
48
+ "class-variance-authority": "^0.7.1",
49
+ "clsx": "^2.1.1",
50
+ "cmdk": "^1.1.1",
51
+ "connect-pg-simple": "^10.0.0",
52
+ "date-fns": "^3.6.0",
53
+ "drizzle-orm": "^0.39.1",
54
+ "drizzle-zod": "^0.7.0",
55
+ "embla-carousel-react": "^8.6.0",
56
+ "express": "^4.21.2",
57
+ "express-session": "^1.18.1",
58
+ "framer-motion": "^11.13.1",
59
+ "i18next": "^25.2.0",
60
+ "input-otp": "^1.4.2",
61
+ "jsonwebtoken": "^9.0.2",
62
+ "lucide-react": "^0.453.0",
63
+ "memorystore": "^1.6.7",
64
+ "next-themes": "^0.4.6",
65
+ "node-cron": "^4.0.5",
66
+ "nodemailer": "^7.0.3",
67
+ "passport": "^0.7.0",
68
+ "passport-local": "^1.0.0",
69
+ "react": "^18.3.1",
70
+ "react-day-picker": "^8.10.1",
71
+ "react-dom": "^18.3.1",
72
+ "react-hook-form": "^7.55.0",
73
+ "react-i18next": "^15.5.1",
74
+ "react-icons": "^5.4.0",
75
+ "react-resizable-panels": "^2.1.7",
76
+ "recharts": "^2.15.2",
77
+ "tailwind-merge": "^2.6.0",
78
+ "tailwindcss-animate": "^1.0.7",
79
+ "tw-animate-css": "^1.2.5",
80
+ "vaul": "^1.1.2",
81
+ "wouter": "^3.3.5",
82
+ "ws": "^8.18.0",
83
+ "zod": "^3.24.2",
84
+ "zod-validation-error": "^3.4.0"
85
+ },
86
+ "devDependencies": {
87
+ "@replit/vite-plugin-cartographer": "^0.2.0",
88
+ "@replit/vite-plugin-runtime-error-modal": "^0.0.3",
89
+ "@tailwindcss/typography": "^0.5.15",
90
+ "@tailwindcss/vite": "^4.1.3",
91
+ "@types/connect-pg-simple": "^7.0.3",
92
+ "@types/express": "4.17.21",
93
+ "@types/express-session": "^1.18.0",
94
+ "@types/node": "20.16.11",
95
+ "@types/passport": "^1.0.16",
96
+ "@types/passport-local": "^1.0.38",
97
+ "@types/react": "^18.3.11",
98
+ "@types/react-dom": "^18.3.1",
99
+ "@types/ws": "^8.5.13",
100
+ "@vitejs/plugin-react": "^4.3.2",
101
+ "autoprefixer": "^10.4.20",
102
+ "drizzle-kit": "^0.30.4",
103
+ "esbuild": "^0.25.0",
104
+ "postcss": "^8.4.47",
105
+ "tailwindcss": "^3.4.17",
106
+ "tsx": "^4.19.1",
107
+ "typescript": "5.6.3",
108
+ "vite": "^5.4.14"
109
+ },
110
+ "optionalDependencies": {
111
+ "bufferutil": "^4.0.8"
112
+ }
113
+ }
public_memory.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ def load_global_memory():
2
+ if os.path.exists("global_memory.json"):
3
+ with open("global_memory.json", "r") as f:
4
+ return json.load(f)
5
+ return {}
6
+
7
+ def save_global_memory(memory):
8
+ with open("global_memory.json", "w") as f:
9
+ json.dump(memory, f, indent=2)
pyproject.toml ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "python-template"
3
+ version = "0.1.0"
4
+ description = ""
5
+ authors = ["Your Name <[email protected]>"]
6
+ requires-python = ">=3.11"
7
+ dependencies = [
8
+ "beautifulsoup4>=4.13.4",
9
+ "flask>=3.1.1",
10
+ "requests>=2.32.3",
11
+ "python-telegram-bot>=20.7",
12
+ ]
requirements.txt ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ flask==3.0.3
2
+ flask-login==0.6.3
3
+ flask-session
4
+ gunicorn==21.2.0
5
+ requests==2.31.0
6
+ werkzeug==3.0.1
7
+ python-dotenv==1.0.1
8
+ openai==1.30.1
9
+ langchain==0.1.20
10
+ torch==2.2.0
11
+
12
+ # Image and Media Processing
13
+ Pillow==10.3.0
14
+ opencv-python-headless
15
+ ffmpeg-python
16
+ pydub
17
+
18
+ # Web Scraping and Automation
19
+ beautifulsoup4==4.12.3
20
+ playwright
21
+ selenium
22
+ undetected-chromedriver
23
+
24
+ # PDF and Text Processing
25
+ PyPDF2
26
+ pytesseract
27
+ SpeechRecognition
28
+
29
+ # Messaging and Bots
30
+ python-telegram-bot
31
+ telegram
32
+
33
+ # Task Scheduling
34
+ schedule
35
+
36
+ # Web Framework Extensions
37
+ aiohttp
38
+ flet
39
+
40
+ # Development Tools
41
+ replit
42
+ paramiko
43
+ flet
responses.py ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+
4
+ import os, shutil, subprocess, socket, time, logging
5
+ from urllib.parse import urlparse
6
+
7
+ log = logging.getLogger("responses")
8
+ if not log.handlers:
9
+ logging.basicConfig(format="%(asctime)s - %(levelname)s - %(message)s", level=logging.INFO)
10
+
11
+ SYSTEM_PROMPT = "أنت مساعدة عربية مختصرة ودقيقة. أجب بوضوح وباختصار."
12
+
13
+ # ترتيب تفضيلي للنماذج
14
+ PREFERRED_MODELS = [
15
+ os.getenv("OLLAMA_MODEL", "").strip() or "mistral:instruct",
16
+ "mistral:instruct",
17
+ "mistral:latest",
18
+ "gemma3:4b",
19
+ "tinyllama:latest",
20
+ ]
21
+
22
+ def _ensure_ollama_ready():
23
+ exe_win = r"C:\Users\osamawin\AppData\Local\Programs\Ollama\ollama.exe"
24
+ cli = exe_win if os.path.exists(exe_win) else shutil.which("ollama")
25
+ if not cli:
26
+ raise RuntimeError("ollama غير مثبت/غير موجود في PATH.")
27
+
28
+ host_env = os.environ.get("OLLAMA_HOST", "127.0.0.1:11435")
29
+ parsed = urlparse(host_env if "://" in host_env else f"http://{host_env}")
30
+ ip = parsed.hostname or "127.0.0.1"
31
+ port = parsed.port or 11434
32
+
33
+ def up():
34
+ try:
35
+ with socket.create_connection((ip, port), timeout=0.8):
36
+ return True
37
+ except OSError:
38
+ return False
39
+
40
+ if up():
41
+ return cli
42
+
43
+ # شغّل السيرفر في الخلفية
44
+ subprocess.Popen([cli, "serve"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
45
+ for _ in range(60):
46
+ if up():
47
+ return cli
48
+ time.sleep(0.2)
49
+ raise RuntimeError(f"تعذّر تشغيل ollama serve على {ip}:{port}")
50
+
51
+ def _ollama_list(cli):
52
+ try:
53
+ out = subprocess.run([cli, "list"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True).stdout
54
+ names = []
55
+ for line in out.splitlines():
56
+ line = line.strip()
57
+ if not line or line.startswith("NAME") or line.startswith("-"):
58
+ continue
59
+ parts = line.split()
60
+ if parts:
61
+ names.append(parts[0])
62
+ return names
63
+ except subprocess.CalledProcessError as e:
64
+ raise RuntimeError(f"فشل 'ollama list': {e.stderr.strip() or e.stdout.strip() or e}") from e
65
+
66
+ def _pull_if_missing(cli, model):
67
+ installed = _ollama_list(cli)
68
+ if model not in installed:
69
+ log.info("سحب النموذج المفقود: %s", model)
70
+ r = subprocess.run([cli, "pull", model], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
71
+ if r.returncode != 0:
72
+ err = (r.stderr or r.stdout or "").strip()
73
+ raise RuntimeError(f"فشل سحب النموذج {model}: {err}")
74
+
75
+ def _ollama_run(cli, model, user_prompt, timeout=120):
76
+ full_prompt = f"{SYSTEM_PROMPT}\n\nUser: {user_prompt}\nAssistant:"
77
+ try:
78
+ r = subprocess.run([cli, "run", model, full_prompt],
79
+ stdout=subprocess.PIPE,
80
+ stderr=subprocess.PIPE,
81
+ text=True,
82
+ encoding='utf-8',
83
+ errors='replace',
84
+ timeout=timeout)
85
+ if r.returncode != 0:
86
+ err = (r.stderr or r.stdout or "").strip()
87
+ raise RuntimeError(f"فشل تشغيل {model}: {err}")
88
+ out = (r.stdout or "").strip()
89
+ if not out:
90
+ raise RuntimeError(f"{model} لم يرجّع مخرجات.")
91
+ return out
92
+ except subprocess.TimeoutExpired:
93
+ raise RuntimeError(f"النموذج {model} تجاوز المهلة الزمنية")
94
+ except Exception as e:
95
+ raise RuntimeError(f"خطأ غير متوقع: {str(e)}")
96
+
97
+ def _try_models(user_prompt, timeout=60):
98
+ cli = _ensure_ollama_ready()
99
+ last_err = None
100
+ for m in PREFERRED_MODELS:
101
+ try:
102
+ _pull_if_missing(cli, m)
103
+ log.info("تشغيل النموذج: %s", m)
104
+ return _ollama_run(cli, m, user_prompt, timeout=timeout)
105
+ except Exception as e:
106
+ last_err = e
107
+ log.warning("فشل النموذج %s: %s", m, e)
108
+ continue
109
+ raise last_err if last_err else RuntimeError("لا يوجد نموذج صالح.")
110
+
111
+ def generate_reply(message: str, username: str = "مستخدم") -> str:
112
+ msg = (message or "").strip()
113
+ if not msg:
114
+ return "⚠️ نصّ فارغ."
115
+
116
+ # BYPASS للاختبار السريع
117
+ if os.getenv("BYPASS_OLLAMA", "0").lower() in ("1", "true", "yes"):
118
+ return f"🧪 bypass: {msg}"
119
+
120
+ try:
121
+ return _try_models(msg, timeout=120)
122
+ except Exception as e:
123
+ # نرجّع الخطأ الحقيقي ليسهّل التشخيص
124
+ return f"⚠️ خطأ: {e}"