Spaces:
Runtime error
Runtime error
Upload 60 files
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .env +23 -0
- .gitattributes +1 -0
- .replit +23 -0
- =20.7 +0 -0
- Edit +0 -0
- Nora-AlQahtani.gitignore +160 -0
- Nora-AlQahtani.replit +20 -0
- ai_conference.py +65 -0
- ai_controller.py +36 -0
- analyzer.py +398 -0
- app.py +26 -0
- bot.log +545 -0
- bot.py +75 -0
- bot_responses.log +3 -0
- brain.py +151 -0
- config.json +10 -0
- config.py +12 -0
- core.py +19 -0
- email_reader.py +81 -0
- facebook_bot.py +64 -0
- flet_ui.py +13 -0
- global_memory.json +0 -0
- history.json +230 -0
- install_log.txt +22 -0
- install_packages.py +159 -0
- knowledge_base.json +1 -0
- knowledge_search.py +31 -0
- learned_links.json +1 -0
- learner.py +115 -0
- main.py +293 -0
- mainphone.py +85 -0
- media_analyzer.py +153 -0
- memory.html +130 -0
- memory.py +187 -0
- memory_1421046090.json +17 -0
- noura.py +101 -0
- noura_auto_react.py +80 -0
- noura_browser.py +174 -0
- noura_chat.py +40 -0
- noura_facebook_scraper.py +153 -0
- noura_twitter_bot.py +191 -0
- ollama +0 -0
- ollama.shadow +0 -0
- osama_memory.json +14 -0
- package-lock.json +0 -0
- package.json +113 -0
- public_memory.json +9 -0
- pyproject.toml +12 -0
- requirements.txt +43 -0
- responses.py +124 -0
.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}"
|