Spaces:
Runtime error
Runtime error
Upload 20 files
Browse files- Nora-AlQahtani.gitignore.txt +160 -0
- Nora-AlQahtani.replit.txt +20 -0
- knowledge.json +1063 -0
- knowledge_search.py +31 -0
- knowledge_settings.json +4 -0
- lan_peer_server.py +17 -0
- launcher.py +216 -0
- learned_links.json +12 -0
- learner.py +115 -0
- live_streaming.py +406 -0
- load_balancer.py +78 -0
- main.py +298 -0
- mainphone.py +85 -0
- media_analyzer.py +153 -0
- memory.py +155 -0
- memory_1421046090.json +25 -0
- memory_777000.json +9 -0
- memory_osama.json +3 -0
- memory_أسامة.json +9 -0
- node_client.py +125 -0
Nora-AlQahtani.gitignore.txt
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.txt
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
|
knowledge.json
ADDED
|
@@ -0,0 +1,1063 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"1421046090": [
|
| 3 |
+
{
|
| 4 |
+
"q": "صل على رسول الله صلى الله عليه وسلم",
|
| 5 |
+
"a": "وصلتني رسالتك: «صل على رسول الله صلى الله عليه وسلم». ماذا تريد بعدها؟",
|
| 6 |
+
"user": "unknown",
|
| 7 |
+
"meta": {
|
| 8 |
+
"peer_id": 1421046090,
|
| 9 |
+
"tg_username": "unknown",
|
| 10 |
+
"chat_type": "خاص",
|
| 11 |
+
"sender_id": 1421046090,
|
| 12 |
+
"sender_username": "omsdtechno"
|
| 13 |
+
},
|
| 14 |
+
"ts": 1757056837
|
| 15 |
+
},
|
| 16 |
+
{
|
| 17 |
+
"q": "صلوا على النبي صلى الله عليه وسلم",
|
| 18 |
+
"a": "وصلتني رسالتك: «صلوا على النبي صلى الله عليه وسلم». ماذا تريد بعدها؟",
|
| 19 |
+
"user": "unknown",
|
| 20 |
+
"meta": {
|
| 21 |
+
"peer_id": 1421046090,
|
| 22 |
+
"tg_username": "unknown",
|
| 23 |
+
"chat_type": "خاص",
|
| 24 |
+
"sender_id": 1421046090,
|
| 25 |
+
"sender_username": "omsdtechno"
|
| 26 |
+
},
|
| 27 |
+
"ts": 1757057070
|
| 28 |
+
},
|
| 29 |
+
{
|
| 30 |
+
"q": "لا اله الا الله",
|
| 31 |
+
"a": "وصلتني رسالتك: «لا اله الا الله». ماذا تريد بعدها؟",
|
| 32 |
+
"user": "unknown",
|
| 33 |
+
"meta": {
|
| 34 |
+
"peer_id": 1421046090,
|
| 35 |
+
"tg_username": "unknown",
|
| 36 |
+
"chat_type": "خاص",
|
| 37 |
+
"sender_id": 1421046090,
|
| 38 |
+
"sender_username": "omsdtechno"
|
| 39 |
+
},
|
| 40 |
+
"ts": 1757080253
|
| 41 |
+
}
|
| 42 |
+
],
|
| 43 |
+
"-1001688149434": [
|
| 44 |
+
{
|
| 45 |
+
"q": "• ﴿فَٱذۡكُرُونِیۤ أَذۡكُرۡكُمۡ﴾.\n\n- «سُبْحَانَ اللهِ».\n- «الحَمْدُ للهِ».\n- «لَا إلَهَ إلَّا اللهُ».\n- «اللهُ أكْبَرُ».\n- «لَا حَوْلَ وَلَا قُوَّةَ إلَّا بِاللهِ».\n- «لَا إلَهَ إلَّا أَنْتَ سُبْحَانَكَ إنِّي كُنْتُ مِنَ الظَّالِمِينَ».\n- «رَبِّ اغْفِرْ لِي وَتُبْ عَلَيَّ إنَّكَ أنْتَ التَّوَّابُ الرَّحِيمُ».",
|
| 46 |
+
"a": "وصلتني رسالتك: «• ﴿فَٱذۡكُرُونِیۤ أَذۡكُرۡكُمۡ﴾.\n\n- «سُبْحَانَ اللهِ».\n- «الحَمْدُ للهِ».\n- «لَا إلَهَ إلَّا اللهُ».\n- «اللهُ أكْبَرُ».\n- «لَا حَوْلَ وَلَا قُوَّةَ إلَّا بِاللهِ».\n- «لَا إلَهَ إلَّا أَنْتَ سُبْحَانَكَ إنِّي كُنْتُ مِنَ الظَّالِمِينَ».\n- «رَبِّ اغْفِرْ لِي وَتُبْ عَلَيَّ إنَّكَ أنْتَ التَّوَّابُ الرَّحِيمُ».». ماذا تريد بعدها؟",
|
| 47 |
+
"user": "fwaeed_deneah",
|
| 48 |
+
"meta": {
|
| 49 |
+
"peer_id": -1001688149434,
|
| 50 |
+
"tg_username": "fwaeed_deneah",
|
| 51 |
+
"chat_type": "مجموعة",
|
| 52 |
+
"sender_id": 7504191103,
|
| 53 |
+
"sender_username": null
|
| 54 |
+
},
|
| 55 |
+
"ts": 1757065615
|
| 56 |
+
},
|
| 57 |
+
{
|
| 58 |
+
"q": "ليه الجروب أصبح كده بدون تفاعل مش زي الاول",
|
| 59 |
+
"a": "وصلتني رسالتك: «ليه الجروب أصبح كده بدون تفاعل مش زي الاول». ماذا تريد بعدها؟",
|
| 60 |
+
"user": "fwaeed_deneah",
|
| 61 |
+
"meta": {
|
| 62 |
+
"peer_id": -1001688149434,
|
| 63 |
+
"tg_username": "fwaeed_deneah",
|
| 64 |
+
"chat_type": "مجموعة",
|
| 65 |
+
"sender_id": 8354359460,
|
| 66 |
+
"sender_username": null
|
| 67 |
+
},
|
| 68 |
+
"ts": 1757065976
|
| 69 |
+
},
|
| 70 |
+
{
|
| 71 |
+
"q": "انت تعرفني ؟",
|
| 72 |
+
"a": "وصلتني رسالتك: «انت تعرفني ؟». ماذا تريد بعدها؟",
|
| 73 |
+
"user": "fwaeed_deneah",
|
| 74 |
+
"meta": {
|
| 75 |
+
"peer_id": -1001688149434,
|
| 76 |
+
"tg_username": "fwaeed_deneah",
|
| 77 |
+
"chat_type": "مجموعة",
|
| 78 |
+
"sender_id": 8354359460,
|
| 79 |
+
"sender_username": null
|
| 80 |
+
},
|
| 81 |
+
"ts": 1757066577
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"q": "لأنك غير موجودي",
|
| 85 |
+
"a": "وصلتني رسالتك: «لأنك غير موجودي». ماذا تريد بعدها؟",
|
| 86 |
+
"user": "fwaeed_deneah",
|
| 87 |
+
"meta": {
|
| 88 |
+
"peer_id": -1001688149434,
|
| 89 |
+
"tg_username": "fwaeed_deneah",
|
| 90 |
+
"chat_type": "مجموعة",
|
| 91 |
+
"sender_id": 7504191103,
|
| 92 |
+
"sender_username": null
|
| 93 |
+
},
|
| 94 |
+
"ts": 1757066577
|
| 95 |
+
},
|
| 96 |
+
{
|
| 97 |
+
"q": "ميلا",
|
| 98 |
+
"a": "وصلتني رسالتك: «ميلا». ماذا تريد بعدها؟",
|
| 99 |
+
"user": "fwaeed_deneah",
|
| 100 |
+
"meta": {
|
| 101 |
+
"peer_id": -1001688149434,
|
| 102 |
+
"tg_username": "fwaeed_deneah",
|
| 103 |
+
"chat_type": "مجموعة",
|
| 104 |
+
"sender_id": 7504191103,
|
| 105 |
+
"sender_username": null
|
| 106 |
+
},
|
| 107 |
+
"ts": 1757066627
|
| 108 |
+
},
|
| 109 |
+
{
|
| 110 |
+
"q": "🇸🇦 عذرآ عزيزي ↤ ابو\n🇸🇦 ممنوع التوجيه هنا",
|
| 111 |
+
"a": "وصلتني رسالتك: «🇸🇦 عذرآ عزيزي ↤ ابو\n🇸🇦 ممنوع التوجيه هنا». ماذا تريد بعدها؟",
|
| 112 |
+
"user": "unknown",
|
| 113 |
+
"meta": {
|
| 114 |
+
"peer_id": -1001688149434,
|
| 115 |
+
"tg_username": "unknown",
|
| 116 |
+
"chat_type": "مجموعة",
|
| 117 |
+
"sender_id": 6740120966,
|
| 118 |
+
"sender_username": "Musliembot"
|
| 119 |
+
},
|
| 120 |
+
"ts": 1757067239
|
| 121 |
+
},
|
| 122 |
+
{
|
| 123 |
+
"q": "🇸🇦 عذرآ عزيزي ↤ 🦋\n🇸🇦 ممنوع التوجيه هنا",
|
| 124 |
+
"a": "وصلتني رسالتك: «🇸🇦 عذرآ عزيزي ↤ 🦋\n🇸🇦 ممنوع التوجيه هنا». ماذا تريد بعدها؟",
|
| 125 |
+
"user": "unknown",
|
| 126 |
+
"meta": {
|
| 127 |
+
"peer_id": -1001688149434,
|
| 128 |
+
"tg_username": "unknown",
|
| 129 |
+
"chat_type": "مجموعة",
|
| 130 |
+
"sender_id": 6740120966,
|
| 131 |
+
"sender_username": "Musliembot"
|
| 132 |
+
},
|
| 133 |
+
"ts": 1757067419
|
| 134 |
+
},
|
| 135 |
+
{
|
| 136 |
+
"q": "🇸🇦 عذرآ عزيزي ↤ الشاعر ابو أسامة\n🇸🇦 ممنوع ارسال الفيديو",
|
| 137 |
+
"a": "وصلتني رسالتك: «🇸🇦 عذرآ عزيزي ↤ الشاعر ابو أسامة\n🇸🇦 ممنوع ارسال الفيديو». ماذا تريد بعدها؟",
|
| 138 |
+
"user": "fwaeed_deneah",
|
| 139 |
+
"meta": {
|
| 140 |
+
"peer_id": -1001688149434,
|
| 141 |
+
"tg_username": "fwaeed_deneah",
|
| 142 |
+
"chat_type": "مجموعة",
|
| 143 |
+
"sender_id": 6740120966,
|
| 144 |
+
"sender_username": "Musliembot"
|
| 145 |
+
},
|
| 146 |
+
"ts": 1757067780
|
| 147 |
+
},
|
| 148 |
+
{
|
| 149 |
+
"q": "ومضى الرفاق خلفوا من بعدهم .. ألمّ يُمزق مُهجتي ..\n..\n#شاهد تجمع الناس على جثمان الشهيد القسامي طارق دلول وشمّ رائحة المسك التي تفوح منهُ ..\n..\n#شهداء_القسام ..",
|
| 150 |
+
"a": "وصلتني رسالتك: «ومضى الرفاق خلفوا من بعدهم .. ألمّ يُمزق مُهجتي ..\n..\n#شاهد تجمع الناس على جثمان الشهيد القسامي طارق دلول وشمّ رائحة المسك التي تفوح منهُ ..\n..\n#شهداء_القسام ..». ماذا تريد بعدها؟",
|
| 151 |
+
"user": "fwaeed_deneah",
|
| 152 |
+
"meta": {
|
| 153 |
+
"peer_id": -1001688149434,
|
| 154 |
+
"tg_username": "fwaeed_deneah",
|
| 155 |
+
"chat_type": "مجموعة",
|
| 156 |
+
"sender_id": 8069943909,
|
| 157 |
+
"sender_username": null
|
| 158 |
+
},
|
| 159 |
+
"ts": 1757067780
|
| 160 |
+
},
|
| 161 |
+
{
|
| 162 |
+
"q": "اللهُمَّ صَلِّ وسّلِم وبارٌك على سيدنا مُحمد وعلى آلـِه وصحبـِه أجمعـين. 🤍",
|
| 163 |
+
"a": "وصلتني رسالتك: «اللهُمَّ صَلِّ وسّلِم وبارٌك على سيدنا مُحمد وعلى آلـِه وصحبـِه أجمعـين. 🤍». ماذا تريد بعدها؟",
|
| 164 |
+
"user": "fwaeed_deneah",
|
| 165 |
+
"meta": {
|
| 166 |
+
"peer_id": -1001688149434,
|
| 167 |
+
"tg_username": "fwaeed_deneah",
|
| 168 |
+
"chat_type": "مجموعة",
|
| 169 |
+
"sender_id": 7799669757,
|
| 170 |
+
"sender_username": null
|
| 171 |
+
},
|
| 172 |
+
"ts": 1757067840
|
| 173 |
+
},
|
| 174 |
+
{
|
| 175 |
+
"q": "بالاول كانت مجموعة حوار وفوائد بس غيروا الحوار لجدال يلي نكتم ويلي نحظر",
|
| 176 |
+
"a": "وصلتني رسالتك: «بالاول كانت مجموعة حوار وفوائد بس غيروا الحوار لجدال يلي نكتم ويلي نحظر». ماذا تريد بعدها؟",
|
| 177 |
+
"user": "fwaeed_deneah",
|
| 178 |
+
"meta": {
|
| 179 |
+
"peer_id": -1001688149434,
|
| 180 |
+
"tg_username": "fwaeed_deneah",
|
| 181 |
+
"chat_type": "مجموعة",
|
| 182 |
+
"sender_id": 8035273217,
|
| 183 |
+
"sender_username": "abo_om_a_r"
|
| 184 |
+
},
|
| 185 |
+
"ts": 1757068322
|
| 186 |
+
},
|
| 187 |
+
{
|
| 188 |
+
"q": "اها",
|
| 189 |
+
"a": "وصلتني رسالتك: «اها». ماذا تريد بعدها؟",
|
| 190 |
+
"user": "fwaeed_deneah",
|
| 191 |
+
"meta": {
|
| 192 |
+
"peer_id": -1001688149434,
|
| 193 |
+
"tg_username": "fwaeed_deneah",
|
| 194 |
+
"chat_type": "مجموعة",
|
| 195 |
+
"sender_id": 8354359460,
|
| 196 |
+
"sender_username": null
|
| 197 |
+
},
|
| 198 |
+
"ts": 1757068383
|
| 199 |
+
},
|
| 200 |
+
{
|
| 201 |
+
"q": "حتى ع أهل البدع ؟؟",
|
| 202 |
+
"a": "وصلتني رسالتك: «حتى ع أهل البدع ؟؟». ماذا تريد بعدها؟",
|
| 203 |
+
"user": "fwaeed_deneah",
|
| 204 |
+
"meta": {
|
| 205 |
+
"peer_id": -1001688149434,
|
| 206 |
+
"tg_username": "fwaeed_deneah",
|
| 207 |
+
"chat_type": "مجموعة",
|
| 208 |
+
"sender_id": 7117580575,
|
| 209 |
+
"sender_username": "jehad_al_jamal"
|
| 210 |
+
},
|
| 211 |
+
"ts": 1757068481
|
| 212 |
+
},
|
| 213 |
+
{
|
| 214 |
+
"q": "ليش شو كانت الرسالة",
|
| 215 |
+
"a": "وصلتني رسالتك: «ليش شو كانت الرسالة». ماذا تريد بعدها؟",
|
| 216 |
+
"user": "fwaeed_deneah",
|
| 217 |
+
"meta": {
|
| 218 |
+
"peer_id": -1001688149434,
|
| 219 |
+
"tg_username": "fwaeed_deneah",
|
| 220 |
+
"chat_type": "مجموعة",
|
| 221 |
+
"sender_id": 8035273217,
|
| 222 |
+
"sender_username": "abo_om_a_r"
|
| 223 |
+
},
|
| 224 |
+
"ts": 1757068530
|
| 225 |
+
},
|
| 226 |
+
{
|
| 227 |
+
"q": "الوضع تمام واجبنا والحمد لله",
|
| 228 |
+
"a": "وصلتني رسالتك: «الوضع تمام واجبنا والحمد لله». ماذا تريد بعدها؟",
|
| 229 |
+
"user": "fwaeed_deneah",
|
| 230 |
+
"meta": {
|
| 231 |
+
"peer_id": -1001688149434,
|
| 232 |
+
"tg_username": "fwaeed_deneah",
|
| 233 |
+
"chat_type": "مجموعة",
|
| 234 |
+
"sender_id": 7188326528,
|
| 235 |
+
"sender_username": "Ahlessone"
|
| 236 |
+
},
|
| 237 |
+
"ts": 1757068643
|
| 238 |
+
},
|
| 239 |
+
{
|
| 240 |
+
"q": "يكفينا أن ننشر سنة نبينا",
|
| 241 |
+
"a": "وصلتني رسالتك: «يكفينا أن ننشر سنة نبينا». ماذا تريد بعدها؟",
|
| 242 |
+
"user": "fwaeed_deneah",
|
| 243 |
+
"meta": {
|
| 244 |
+
"peer_id": -1001688149434,
|
| 245 |
+
"tg_username": "fwaeed_deneah",
|
| 246 |
+
"chat_type": "مجموعة",
|
| 247 |
+
"sender_id": 7188326528,
|
| 248 |
+
"sender_username": "Ahlessone"
|
| 249 |
+
},
|
| 250 |
+
"ts": 1757068647
|
| 251 |
+
},
|
| 252 |
+
{
|
| 253 |
+
"q": "وارتحنا من الجدالات العقيمة",
|
| 254 |
+
"a": "وصلتني رسالتك: «وارتحنا من الجدالات العقيمة». ماذا تريد بعدها؟",
|
| 255 |
+
"user": "fwaeed_deneah",
|
| 256 |
+
"meta": {
|
| 257 |
+
"peer_id": -1001688149434,
|
| 258 |
+
"tg_username": "fwaeed_deneah",
|
| 259 |
+
"chat_type": "مجموعة",
|
| 260 |
+
"sender_id": 7188326528,
|
| 261 |
+
"sender_username": "Ahlessone"
|
| 262 |
+
},
|
| 263 |
+
"ts": 1757068665
|
| 264 |
+
},
|
| 265 |
+
{
|
| 266 |
+
"q": "ولننصرن ديننا ونعلين سنة نبينا",
|
| 267 |
+
"a": "وصلتني رسالتك: «ولننصرن ديننا ونعلين سنة نبينا». ماذا تريد بعدها؟",
|
| 268 |
+
"user": "fwaeed_deneah",
|
| 269 |
+
"meta": {
|
| 270 |
+
"peer_id": -1001688149434,
|
| 271 |
+
"tg_username": "fwaeed_deneah",
|
| 272 |
+
"chat_type": "مجموعة",
|
| 273 |
+
"sender_id": 7188326528,
|
| 274 |
+
"sender_username": "Ahlessone"
|
| 275 |
+
},
|
| 276 |
+
"ts": 1757068741
|
| 277 |
+
},
|
| 278 |
+
{
|
| 279 |
+
"q": "ما تعملي توجيه",
|
| 280 |
+
"a": "وصلتني رسالتك: «ما تعملي توجيه». ماذا تريد بعدها؟",
|
| 281 |
+
"user": "fwaeed_deneah",
|
| 282 |
+
"meta": {
|
| 283 |
+
"peer_id": -1001688149434,
|
| 284 |
+
"tg_username": "fwaeed_deneah",
|
| 285 |
+
"chat_type": "مجموعة",
|
| 286 |
+
"sender_id": 7188326528,
|
| 287 |
+
"sender_username": "Ahlessone"
|
| 288 |
+
},
|
| 289 |
+
"ts": 1757068741
|
| 290 |
+
},
|
| 291 |
+
{
|
| 292 |
+
"q": "اعمل تحويل",
|
| 293 |
+
"a": "وصلتني رسالتك: «اعمل تحويل». ماذا تريد بعدها؟",
|
| 294 |
+
"user": "fwaeed_deneah",
|
| 295 |
+
"meta": {
|
| 296 |
+
"peer_id": -1001688149434,
|
| 297 |
+
"tg_username": "fwaeed_deneah",
|
| 298 |
+
"chat_type": "مجموعة",
|
| 299 |
+
"sender_id": 7188326528,
|
| 300 |
+
"sender_username": "Ahlessone"
|
| 301 |
+
},
|
| 302 |
+
"ts": 1757068741
|
| 303 |
+
},
|
| 304 |
+
{
|
| 305 |
+
"q": "وفيكم بارك الله",
|
| 306 |
+
"a": "وصلتني رسالتك: «وفيكم بارك الله». ماذا تريد بعدها؟",
|
| 307 |
+
"user": "fwaeed_deneah",
|
| 308 |
+
"meta": {
|
| 309 |
+
"peer_id": -1001688149434,
|
| 310 |
+
"tg_username": "fwaeed_deneah",
|
| 311 |
+
"chat_type": "مجموعة",
|
| 312 |
+
"sender_id": 7188326528,
|
| 313 |
+
"sender_username": "Ahlessone"
|
| 314 |
+
},
|
| 315 |
+
"ts": 1757068741
|
| 316 |
+
},
|
| 317 |
+
{
|
| 318 |
+
"q": "نعم بارك الله فيكي",
|
| 319 |
+
"a": "وصلتني رسالتك: «نعم بارك الله فيكي». ماذا تريد بعدها؟",
|
| 320 |
+
"user": "fwaeed_deneah",
|
| 321 |
+
"meta": {
|
| 322 |
+
"peer_id": -1001688149434,
|
| 323 |
+
"tg_username": "fwaeed_deneah",
|
| 324 |
+
"chat_type": "مجموعة",
|
| 325 |
+
"sender_id": 8354359460,
|
| 326 |
+
"sender_username": null
|
| 327 |
+
},
|
| 328 |
+
"ts": 1757068742
|
| 329 |
+
},
|
| 330 |
+
{
|
| 331 |
+
"q": "- سورة: الدخان .\n- القارئ: محمد اللحيدان .",
|
| 332 |
+
"a": "وصلتني رسالتك: «- سورة: الدخان .\n- القارئ: محمد اللحيدان .». ماذا تريد بعدها؟",
|
| 333 |
+
"user": "fwaeed_deneah",
|
| 334 |
+
"meta": {
|
| 335 |
+
"peer_id": -1001688149434,
|
| 336 |
+
"tg_username": "fwaeed_deneah",
|
| 337 |
+
"chat_type": "مجموعة",
|
| 338 |
+
"sender_id": 1666713570,
|
| 339 |
+
"sender_username": "Ke1aed81f1441BOT"
|
| 340 |
+
},
|
| 341 |
+
"ts": 1757068742
|
| 342 |
+
},
|
| 343 |
+
{
|
| 344 |
+
"q": "اهذا من حب النبي صلى الله عليه وآله وسلم وتعظيم النبي🙄",
|
| 345 |
+
"a": "وصلتني رسالتك: «اهذا من حب النبي صلى الله عليه وآله وسلم وتعظيم النبي🙄». ماذا تريد بعدها؟",
|
| 346 |
+
"user": "fwaeed_deneah",
|
| 347 |
+
"meta": {
|
| 348 |
+
"peer_id": -1001688149434,
|
| 349 |
+
"tg_username": "fwaeed_deneah",
|
| 350 |
+
"chat_type": "مجموعة",
|
| 351 |
+
"sender_id": 7188326528,
|
| 352 |
+
"sender_username": "Ahlessone"
|
| 353 |
+
},
|
| 354 |
+
"ts": 1757069283
|
| 355 |
+
},
|
| 356 |
+
{
|
| 357 |
+
"q": "المركز التونسي للكتاب!!! \nسبحان الله ما انتبهت",
|
| 358 |
+
"a": "وصلتني رسالتك: «المركز التونسي للكتاب!!! \nسبحان الله ما انتبهت». ماذا تريد بعدها؟",
|
| 359 |
+
"user": "fwaeed_deneah",
|
| 360 |
+
"meta": {
|
| 361 |
+
"peer_id": -1001688149434,
|
| 362 |
+
"tg_username": "fwaeed_deneah",
|
| 363 |
+
"chat_type": "مجموعة",
|
| 364 |
+
"sender_id": 7188326528,
|
| 365 |
+
"sender_username": "Ahlessone"
|
| 366 |
+
},
|
| 367 |
+
"ts": 1757069344
|
| 368 |
+
},
|
| 369 |
+
{
|
| 370 |
+
"q": "لعب وهرج وسخرية....نسأل الله السلامة",
|
| 371 |
+
"a": "وصلتني رسالتك: «لعب وهرج وسخرية....نسأل الله السلامة». ماذا تريد بعدها؟",
|
| 372 |
+
"user": "fwaeed_deneah",
|
| 373 |
+
"meta": {
|
| 374 |
+
"peer_id": -1001688149434,
|
| 375 |
+
"tg_username": "fwaeed_deneah",
|
| 376 |
+
"chat_type": "مجموعة",
|
| 377 |
+
"sender_id": 7033732260,
|
| 378 |
+
"sender_username": null
|
| 379 |
+
},
|
| 380 |
+
"ts": 1757069344
|
| 381 |
+
},
|
| 382 |
+
{
|
| 383 |
+
"q": "على العموم انا بريئة من المركز فلا ترويج في تونس الا للضلال",
|
| 384 |
+
"a": "وصلتني رسالتك: «على العموم انا بريئة من المركز فلا ترويج في تونس الا للضلال». ماذا تريد بعدها؟",
|
| 385 |
+
"user": "fwaeed_deneah",
|
| 386 |
+
"meta": {
|
| 387 |
+
"peer_id": -1001688149434,
|
| 388 |
+
"tg_username": "fwaeed_deneah",
|
| 389 |
+
"chat_type": "مجموعة",
|
| 390 |
+
"sender_id": 7188326528,
|
| 391 |
+
"sender_username": "Ahlessone"
|
| 392 |
+
},
|
| 393 |
+
"ts": 1757069386
|
| 394 |
+
},
|
| 395 |
+
{
|
| 396 |
+
"q": "المسلمون صاروا اهبل من كفار قريش",
|
| 397 |
+
"a": "وصلتني رسالتك: «المسلمون صاروا اهبل من كفار قريش». ماذا تريد بعدها؟",
|
| 398 |
+
"user": "fwaeed_deneah",
|
| 399 |
+
"meta": {
|
| 400 |
+
"peer_id": -1001688149434,
|
| 401 |
+
"tg_username": "fwaeed_deneah",
|
| 402 |
+
"chat_type": "مجموعة",
|
| 403 |
+
"sender_id": 7188326528,
|
| 404 |
+
"sender_username": "Ahlessone"
|
| 405 |
+
},
|
| 406 |
+
"ts": 1757069411
|
| 407 |
+
},
|
| 408 |
+
{
|
| 409 |
+
"q": "اختي في جروب لو حابة تدخليه بيدخلوا فيها بنات شيعة وفي بنات مشرفين بتناقشو معاهم لو حابة تدخل ممكن يعني يكون سبب ليكي في هداية حد",
|
| 410 |
+
"a": "وصلتني رسالتك: «اختي في جروب لو حابة تدخليه بيدخلوا فيها بنات شيعة وفي بنات مشرفين بتناقشو معاهم لو حابة تدخل ممكن يعني يكون سبب ليكي في هداية حد». ماذا تريد بعدها؟",
|
| 411 |
+
"user": "fwaeed_deneah",
|
| 412 |
+
"meta": {
|
| 413 |
+
"peer_id": -1001688149434,
|
| 414 |
+
"tg_username": "fwaeed_deneah",
|
| 415 |
+
"chat_type": "مجموعة",
|
| 416 |
+
"sender_id": 8354359460,
|
| 417 |
+
"sender_username": null
|
| 418 |
+
},
|
| 419 |
+
"ts": 1757069525
|
| 420 |
+
},
|
| 421 |
+
{
|
| 422 |
+
"q": "للأسف ما عندي وقت الله يعينني على ما عندي لأتمه على خير وجه",
|
| 423 |
+
"a": "وصلتني رسالتك: «للأسف ما عندي وقت الله يعينني على ما عندي لأتمه على خير وجه». ماذا تريد بعدها؟",
|
| 424 |
+
"user": "fwaeed_deneah",
|
| 425 |
+
"meta": {
|
| 426 |
+
"peer_id": -1001688149434,
|
| 427 |
+
"tg_username": "fwaeed_deneah",
|
| 428 |
+
"chat_type": "مجموعة",
|
| 429 |
+
"sender_id": 7188326528,
|
| 430 |
+
"sender_username": "Ahlessone"
|
| 431 |
+
},
|
| 432 |
+
"ts": 1757069585
|
| 433 |
+
},
|
| 434 |
+
{
|
| 435 |
+
"q": "لا",
|
| 436 |
+
"a": "وصلتني رسالتك: «لا». ماذا تريد بعدها؟",
|
| 437 |
+
"user": "fwaeed_deneah",
|
| 438 |
+
"meta": {
|
| 439 |
+
"peer_id": -1001688149434,
|
| 440 |
+
"tg_username": "fwaeed_deneah",
|
| 441 |
+
"chat_type": "مجموعة",
|
| 442 |
+
"sender_id": 8354359460,
|
| 443 |
+
"sender_username": null
|
| 444 |
+
},
|
| 445 |
+
"ts": 1757069641
|
| 446 |
+
},
|
| 447 |
+
{
|
| 448 |
+
"q": "انت علا؟",
|
| 449 |
+
"a": "وصلتني رسالتك: «انت علا؟». ماذا تريد بعدها؟",
|
| 450 |
+
"user": "fwaeed_deneah",
|
| 451 |
+
"meta": {
|
| 452 |
+
"peer_id": -1001688149434,
|
| 453 |
+
"tg_username": "fwaeed_deneah",
|
| 454 |
+
"chat_type": "مجموعة",
|
| 455 |
+
"sender_id": 7188326528,
|
| 456 |
+
"sender_username": "Ahlessone"
|
| 457 |
+
},
|
| 458 |
+
"ts": 1757069641
|
| 459 |
+
},
|
| 460 |
+
{
|
| 461 |
+
"q": "لا انا مصطفى",
|
| 462 |
+
"a": "وصلتني رسالتك: «لا انا مصطفى». ماذا تريد بعدها؟",
|
| 463 |
+
"user": "fwaeed_deneah",
|
| 464 |
+
"meta": {
|
| 465 |
+
"peer_id": -1001688149434,
|
| 466 |
+
"tg_username": "fwaeed_deneah",
|
| 467 |
+
"chat_type": "مجموعة",
|
| 468 |
+
"sender_id": 8354359460,
|
| 469 |
+
"sender_username": null
|
| 470 |
+
},
|
| 471 |
+
"ts": 1757069705
|
| 472 |
+
},
|
| 473 |
+
{
|
| 474 |
+
"q": "العمة نقطة؟",
|
| 475 |
+
"a": "وصلتني رسالتك: «العمة نقطة؟». ماذا تريد بعدها؟",
|
| 476 |
+
"user": "fwaeed_deneah",
|
| 477 |
+
"meta": {
|
| 478 |
+
"peer_id": -1001688149434,
|
| 479 |
+
"tg_username": "fwaeed_deneah",
|
| 480 |
+
"chat_type": "مجموعة",
|
| 481 |
+
"sender_id": 7188326528,
|
| 482 |
+
"sender_username": "Ahlessone"
|
| 483 |
+
},
|
| 484 |
+
"ts": 1757069705
|
| 485 |
+
},
|
| 486 |
+
{
|
| 487 |
+
"q": "حظر",
|
| 488 |
+
"a": "وصلتني رسالتك: «حظر». ماذا تريد بعدها؟",
|
| 489 |
+
"user": "fwaeed_deneah",
|
| 490 |
+
"meta": {
|
| 491 |
+
"peer_id": -1001688149434,
|
| 492 |
+
"tg_username": "fwaeed_deneah",
|
| 493 |
+
"chat_type": "مجموعة",
|
| 494 |
+
"sender_id": 8035273217,
|
| 495 |
+
"sender_username": "abo_om_a_r"
|
| 496 |
+
},
|
| 497 |
+
"ts": 1757070307
|
| 498 |
+
},
|
| 499 |
+
{
|
| 500 |
+
"q": "هل في احد يعرف يشيل الموسيقى؟",
|
| 501 |
+
"a": "وصلتني رسالتك: «هل في احد يعرف يشيل الموسيقى؟». ماذا تريد بعدها؟",
|
| 502 |
+
"user": "fwaeed_deneah",
|
| 503 |
+
"meta": {
|
| 504 |
+
"peer_id": -1001688149434,
|
| 505 |
+
"tg_username": "fwaeed_deneah",
|
| 506 |
+
"chat_type": "مجموعة",
|
| 507 |
+
"sender_id": 7188326528,
|
| 508 |
+
"sender_username": "Ahlessone"
|
| 509 |
+
},
|
| 510 |
+
"ts": 1757070339
|
| 511 |
+
},
|
| 512 |
+
{
|
| 513 |
+
"q": "مابعرف بس حكالي ممنوع الشتم",
|
| 514 |
+
"a": "وصلتني رسالتك: «مابعرف بس حكالي ممنوع الشتم». ماذا تريد بعدها؟",
|
| 515 |
+
"user": "fwaeed_deneah",
|
| 516 |
+
"meta": {
|
| 517 |
+
"peer_id": -1001688149434,
|
| 518 |
+
"tg_username": "fwaeed_deneah",
|
| 519 |
+
"chat_type": "مجموعة",
|
| 520 |
+
"sender_id": 7117580575,
|
| 521 |
+
"sender_username": "jehad_al_jamal"
|
| 522 |
+
},
|
| 523 |
+
"ts": 1757070608
|
| 524 |
+
},
|
| 525 |
+
{
|
| 526 |
+
"q": "الفكرة بعمل توجيه عكل المجموعات الي عندي",
|
| 527 |
+
"a": "وصلتني رسالتك: «الفكرة بعمل توجيه عكل المجموعات الي عندي». ماذا تريد بعدها؟",
|
| 528 |
+
"user": "fwaeed_deneah",
|
| 529 |
+
"meta": {
|
| 530 |
+
"peer_id": -1001688149434,
|
| 531 |
+
"tg_username": "fwaeed_deneah",
|
| 532 |
+
"chat_type": "مجموعة",
|
| 533 |
+
"sender_id": 7117580575,
|
| 534 |
+
"sender_username": "jehad_al_jamal"
|
| 535 |
+
},
|
| 536 |
+
"ts": 1757070608
|
| 537 |
+
},
|
| 538 |
+
{
|
| 539 |
+
"q": "السلام عليكم ورحمة الله وبركاته\n\nيسعدني أن أقدم لكم \"خبير في كتابة الأبحاث العلمية يُقدم خدمات دكتور ممتاز وموثوق. خبرة في كتابة بحوث الماجستير والدكتوراه، وإدارة المشاريع البحثية. يهتم بكل تفاصيل العمل، مع شرح دقيق لكل خطوة ودعم فعّال. اتصل بنا الآن ارسلك رقم الدكتور لتحقيق نجاح بحثك العلمي!\"",
|
| 540 |
+
"a": "وصلتني رسالتك: «السلام عليكم ورحمة الله وبركاته\n\nيسعدني أن أقدم لكم \"خبير في كتابة الأبحاث العلمية يُقدم خدمات دكتور ممتاز وموثوق. خبرة في كتابة بحوث الماجستير والدكتوراه، وإدارة المشاريع البحثية. يهتم بكل تفاصيل العمل، مع شرح دقيق لكل خطوة ودعم فعّال. اتصل بنا الآن ارسلك رقم الدكتور لتحقيق نجاح بحثك العلمي!\"». ماذا تريد بعدها؟",
|
| 541 |
+
"user": "fwaeed_deneah",
|
| 542 |
+
"meta": {
|
| 543 |
+
"peer_id": -1001688149434,
|
| 544 |
+
"tg_username": "fwaeed_deneah",
|
| 545 |
+
"chat_type": "مجموعة",
|
| 546 |
+
"sender_id": 6329283121,
|
| 547 |
+
"sender_username": null
|
| 548 |
+
},
|
| 549 |
+
"ts": 1757071149
|
| 550 |
+
},
|
| 551 |
+
{
|
| 552 |
+
"q": "جزاكم الله خيرا",
|
| 553 |
+
"a": "وصلتني رسالتك: «جزاكم الله خيرا». ماذا تريد بعدها؟",
|
| 554 |
+
"user": "fwaeed_deneah",
|
| 555 |
+
"meta": {
|
| 556 |
+
"peer_id": -1001688149434,
|
| 557 |
+
"tg_username": "fwaeed_deneah",
|
| 558 |
+
"chat_type": "مجموعة",
|
| 559 |
+
"sender_id": 7188326528,
|
| 560 |
+
"sender_username": "Ahlessone"
|
| 561 |
+
},
|
| 562 |
+
"ts": 1757071690
|
| 563 |
+
},
|
| 564 |
+
{
|
| 565 |
+
"q": "اللهم احفظ اهلنا في غزة وكون لهم ناصرا معينه \nاللهم اعزهم واذل عدوهم \nاللهم اهلك اليهود الكفرة الفجرة الذين اكثروا في الارض الفساد اللهم صب عليهم صوت عذاب\nاللهم بعزتك وقوتك وغضبك وعذابك اللهم أذق اليهود والذين يساندونهم عذاب عظيم في الدنيا والآخرة \n\nاللهم فرج عن اهلنا في غزة يا مفرج",
|
| 566 |
+
"a": "وصلتني رسالتك: «اللهم احفظ اهلنا في غزة وكون لهم ناصرا معينه \nاللهم اعزهم واذل عدوهم \nاللهم اهلك اليهود الكفرة الفجرة الذين اكثروا في الارض الفساد اللهم صب عليهم صوت عذاب\nاللهم بعزتك وقوتك وغضبك وعذابك اللهم أذق اليهود والذين يساندونهم عذاب عظيم في الدنيا والآخرة \n\nاللهم فرج عن اهلنا في غزة يا مفرج». ماذا تريد بعدها؟",
|
| 567 |
+
"user": "fwaeed_deneah",
|
| 568 |
+
"meta": {
|
| 569 |
+
"peer_id": -1001688149434,
|
| 570 |
+
"tg_username": "fwaeed_deneah",
|
| 571 |
+
"chat_type": "مجموعة",
|
| 572 |
+
"sender_id": 6817628882,
|
| 573 |
+
"sender_username": "MmMoatasem"
|
| 574 |
+
},
|
| 575 |
+
"ts": 1757073015
|
| 576 |
+
},
|
| 577 |
+
{
|
| 578 |
+
"q": "خبرة واسعة في إعداد رسائل الماجستير والدكتوراه وإجراء البحوث المتقدمة. ومشاريع التخرج\nخبرة مثبتة في مساعدة الطلاب والباحثين في تحقيق نتائج ممتازة.\n- توجيه شامل ومساندة قوية لتصميم البحوث وتحليل البيانات وكتابة الأوراق العلمية.\n- نشر الن��ائج في المجلات العالميه المحكمه \nلا تدع الفرصة تفوتك لتحقيق أهدافك الأكاديمية بمساعدة اكاديميين ذات خبره عاليه\nالتواصل والاستفسار عبر الخاص",
|
| 579 |
+
"a": "وصلتني رسالتك: «خبرة واسعة في إعداد رسائل الماجستير والدكتوراه وإجراء البحوث المتقدمة. ومشاريع التخرج\nخبرة مثبتة في مساعدة الطلاب والباحثين في تحقيق نتائج ممتازة.\n- توجيه شامل ومساندة قوية لتصميم البحوث وتحليل البيانات وكتابة الأوراق العلمية.\n- نشر النتائج في المجلات العالميه المحكمه \nلا تدع الفرصة تفوتك لتحقيق أهدافك الأكاديمية بمساعدة اكاديميين ذات خبره عاليه\nالتواصل والاستفسار عبر الخاص». ماذا تريد بعدها؟",
|
| 580 |
+
"user": "fwaeed_deneah",
|
| 581 |
+
"meta": {
|
| 582 |
+
"peer_id": -1001688149434,
|
| 583 |
+
"tg_username": "fwaeed_deneah",
|
| 584 |
+
"chat_type": "مجموعة",
|
| 585 |
+
"sender_id": 5760483124,
|
| 586 |
+
"sender_username": null
|
| 587 |
+
},
|
| 588 |
+
"ts": 1757073978
|
| 589 |
+
},
|
| 590 |
+
{
|
| 591 |
+
"q": "🇸🇦 عذرآ عزيزي ↤ تباريح\n🇸🇦 ممنوع التوجيه هنا",
|
| 592 |
+
"a": "وصلتني رسالتك: «🇸🇦 عذرآ عزيزي ↤ تباريح\n🇸🇦 ممنوع التوجيه هنا». ماذا تريد بعدها؟",
|
| 593 |
+
"user": "fwaeed_deneah",
|
| 594 |
+
"meta": {
|
| 595 |
+
"peer_id": -1001688149434,
|
| 596 |
+
"tg_username": "fwaeed_deneah",
|
| 597 |
+
"chat_type": "مجموعة",
|
| 598 |
+
"sender_id": 6740120966,
|
| 599 |
+
"sender_username": "Musliembot"
|
| 600 |
+
},
|
| 601 |
+
"ts": 1757074019
|
| 602 |
+
},
|
| 603 |
+
{
|
| 604 |
+
"q": "بتكون الكلمة محظورة بالبوت رغم ما تعتبر شتم",
|
| 605 |
+
"a": "وصلتني رسالتك: «بتكون الكلمة محظورة بالبوت رغم ما تعتبر شتم». ماذا تريد بعدها؟",
|
| 606 |
+
"user": "fwaeed_deneah",
|
| 607 |
+
"meta": {
|
| 608 |
+
"peer_id": -1001688149434,
|
| 609 |
+
"tg_username": "fwaeed_deneah",
|
| 610 |
+
"chat_type": "مجموعة",
|
| 611 |
+
"sender_id": 8035273217,
|
| 612 |
+
"sender_username": "abo_om_a_r"
|
| 613 |
+
},
|
| 614 |
+
"ts": 1757074038
|
| 615 |
+
},
|
| 616 |
+
{
|
| 617 |
+
"q": "وإياكم تقدروا تزيلو الصوت من المقطع قبل الارسال من علامة مكبر الصوت",
|
| 618 |
+
"a": "وصلتني رسالتك: «وإياكم تقدروا تزيلو الصوت من المقطع قبل الارسال من علامة مكبر الصوت». ماذا تريد بعدها؟",
|
| 619 |
+
"user": "fwaeed_deneah",
|
| 620 |
+
"meta": {
|
| 621 |
+
"peer_id": -1001688149434,
|
| 622 |
+
"tg_username": "fwaeed_deneah",
|
| 623 |
+
"chat_type": "مجموعة",
|
| 624 |
+
"sender_id": 8035273217,
|
| 625 |
+
"sender_username": "abo_om_a_r"
|
| 626 |
+
},
|
| 627 |
+
"ts": 1757074219
|
| 628 |
+
},
|
| 629 |
+
{
|
| 630 |
+
"q": "واذا أردنا الحفاظ على الصوت مع إزالة الموسيقى؟",
|
| 631 |
+
"a": "وصلتني رسالتك: «واذا أردنا الحفاظ على الصوت مع إزالة الموسيقى؟». ماذا تريد بعدها؟",
|
| 632 |
+
"user": "fwaeed_deneah",
|
| 633 |
+
"meta": {
|
| 634 |
+
"peer_id": -1001688149434,
|
| 635 |
+
"tg_username": "fwaeed_deneah",
|
| 636 |
+
"chat_type": "مجموعة",
|
| 637 |
+
"sender_id": 7188326528,
|
| 638 |
+
"sender_username": "Ahlessone"
|
| 639 |
+
},
|
| 640 |
+
"ts": 1757074459
|
| 641 |
+
},
|
| 642 |
+
{
|
| 643 |
+
"q": "صلى الله عليه وآله وصحبه وسلم",
|
| 644 |
+
"a": "وصلتني رسالتك: «صلى الله عليه وآله وصحبه وسلم». ماذا تريد بعدها؟",
|
| 645 |
+
"user": "fwaeed_deneah",
|
| 646 |
+
"meta": {
|
| 647 |
+
"peer_id": -1001688149434,
|
| 648 |
+
"tg_username": "fwaeed_deneah",
|
| 649 |
+
"chat_type": "مجموعة",
|
| 650 |
+
"sender_id": 7188326528,
|
| 651 |
+
"sender_username": "Ahlessone"
|
| 652 |
+
},
|
| 653 |
+
"ts": 1757074460
|
| 654 |
+
},
|
| 655 |
+
{
|
| 656 |
+
"q": "﴿إِنَّ اللهَ وَمَلَائِكَتَهُ يُصَلُّونَ عَلَى النَّبِيِّ يَا أَيُّهَا الَّذِينَ آمَنُوا صَلُّوا عَلَيْهِ وَسَلِّمُوا تَسْلِيمًا﴾\n\n- اللَّهُمَّ صَلِّ وَسَلِّمْ عَلَى نَبِيِّنَا مُحَمَّدٍ .",
|
| 657 |
+
"a": "وصلتني رسالتك: «﴿إِنَّ اللهَ وَمَلَائِكَتَهُ يُصَلُّونَ عَلَى النَّبِيِّ يَا أَيُّهَا الَّذِينَ آمَنُوا صَلُّوا عَلَيْهِ وَسَلِّمُوا تَسْلِيمًا﴾\n\n- اللَّهُمَّ صَلِّ وَسَلِّمْ عَلَى نَبِيِّنَا مُحَمَّدٍ .». ماذا تريد بعدها؟",
|
| 658 |
+
"user": "fwaeed_deneah",
|
| 659 |
+
"meta": {
|
| 660 |
+
"peer_id": -1001688149434,
|
| 661 |
+
"tg_username": "fwaeed_deneah",
|
| 662 |
+
"chat_type": "مجموعة",
|
| 663 |
+
"sender_id": 8236871947,
|
| 664 |
+
"sender_username": "A_U_K_Y"
|
| 665 |
+
},
|
| 666 |
+
"ts": 1757074460
|
| 667 |
+
},
|
| 668 |
+
{
|
| 669 |
+
"q": "لا هو بالحالتين المنشور موجه توجيه فتم حذفه",
|
| 670 |
+
"a": "وصلتني رسالتك: «لا هو بالحالتين المنشور موجه توجيه فتم حذفه». ماذا تريد بعدها؟",
|
| 671 |
+
"user": "fwaeed_deneah",
|
| 672 |
+
"meta": {
|
| 673 |
+
"peer_id": -1001688149434,
|
| 674 |
+
"tg_username": "fwaeed_deneah",
|
| 675 |
+
"chat_type": "مجموعة",
|
| 676 |
+
"sender_id": 7117580575,
|
| 677 |
+
"sender_username": "jehad_al_jamal"
|
| 678 |
+
},
|
| 679 |
+
"ts": 1757074700
|
| 680 |
+
},
|
| 681 |
+
{
|
| 682 |
+
"q": "السلام عليكم\n\nإذا كنت تبحث عن دكتور متخصص في الأبحاث العلمية ورسائل الماجستير والدكتوراه، نحن نقدم لك خدمات متكاملة ومميزة:\n\nخدمات بحثية متكاملة للأبحاث العلمية ورسائل الماجستير والدكتوراه\n\n- اقتراح عناوين رسائل مبتكرة وتقديمها بجودة عالية\n- مساعدة شاملة في إعداد مشاريع التخرج\n- توفير خطط بحثية متميزة ومتوافقة مع أحدث المعايير الأكاديمية\n- دعم كامل لنشر المقالات في مجلات علمية مرموقة\n\nاتصل بنا الآن للحصول على استشارة مجانية!",
|
| 683 |
+
"a": "وصلتني رسالتك: «السلام عليكم\n\nإذا كنت تبحث عن دكتور متخصص في الأبحاث العلمية ورسائل الماجستير والدكتوراه، نحن نقدم لك خدمات متكاملة ومميزة:\n\nخدمات بحثية متكاملة للأبحاث العلمية ورسائل الماجستير والدكتوراه\n\n- اقتراح عناوين رسائل مبتكرة وتقديمها بجودة عالية\n- مساعدة شاملة في إعداد مشاريع التخرج\n- توفير خطط بحثية متميزة ومتوافقة مع أحدث المعايير الأكاديمية\n- دعم كامل لنشر المقالات في مجلات علمية مرموقة\n\nاتصل بنا الآن للحصول على استشارة مجانية!». ماذا تريد بعدها؟",
|
| 684 |
+
"user": "fwaeed_deneah",
|
| 685 |
+
"meta": {
|
| 686 |
+
"peer_id": -1001688149434,
|
| 687 |
+
"tg_username": "fwaeed_deneah",
|
| 688 |
+
"chat_type": "مجموعة",
|
| 689 |
+
"sender_id": 7188019537,
|
| 690 |
+
"sender_username": null
|
| 691 |
+
},
|
| 692 |
+
"ts": 1757075115
|
| 693 |
+
},
|
| 694 |
+
{
|
| 695 |
+
"q": "السلام عليكم\n\nإذا كنت تبحث عن دكتور متخصص في الأبحاث العلمية ورسائل الماجستير والدكتوراه، نحن نقدم لك خدمات متكاملة ومميزة:\n\nخدمات بحثية متكاملة للأبحاث العلمية ورسائل الماجستير والدكتوراه\n\n- اقتراح عناوين رسائل مبتكرة وتقديمها بجودة عالية\n- مساعدة شاملة في إعداد مشاريع التخرج\n- توفير خطط بحثية متميزة ومتوافقة مع أحدث المعايير الأكاديمية\n- دعم كامل لنشر المقالات في مجلات علمية مرموقة\n\nاتصل بنا الآن للحصول على استشارة مجانية!",
|
| 696 |
+
"a": "وصلتني رسالتك: «السلام عليكم\n\nإذا كنت تبحث عن دكتور متخصص في الأبحاث العلمية ورسائل الماجستير والدكتوراه، نحن نقدم لك خدمات متكاملة ومميزة:\n\nخدمات بحثية متكاملة للأبحاث العلمية ورسائل الماجستير والدكتوراه\n\n- اقتراح عناوين رسائل مبتكرة وتقديمها بجودة عالية\n- مساعدة شاملة في إعداد مشاريع التخرج\n- توفير خطط بحثية متميزة ومتوافقة مع أحدث المعايير الأكاديمية\n- دعم كامل لنشر المقالات في مجلات علمية مرموقة\n\nاتصل بنا الآن للحصول على استشارة مجانية!». ماذا تريد بعدها؟",
|
| 697 |
+
"user": "fwaeed_deneah",
|
| 698 |
+
"meta": {
|
| 699 |
+
"peer_id": -1001688149434,
|
| 700 |
+
"tg_username": "fwaeed_deneah",
|
| 701 |
+
"chat_type": "مجموعة",
|
| 702 |
+
"sender_id": 7188019537,
|
| 703 |
+
"sender_username": null
|
| 704 |
+
},
|
| 705 |
+
"ts": 1757075180
|
| 706 |
+
},
|
| 707 |
+
{
|
| 708 |
+
"q": "صلو على الحبيب محمد صلى الله عليه وسلم \nواذكرو الله لا إله إلا الله",
|
| 709 |
+
"a": "وصلتني رسالتك: «صلو على الحبيب محمد صلى الله عليه وسلم \nواذكرو الله لا إله إلا الله». ماذا تريد بعدها؟",
|
| 710 |
+
"user": "fwaeed_deneah",
|
| 711 |
+
"meta": {
|
| 712 |
+
"peer_id": -1001688149434,
|
| 713 |
+
"tg_username": "fwaeed_deneah",
|
| 714 |
+
"chat_type": "مجموعة",
|
| 715 |
+
"sender_id": 6817628882,
|
| 716 |
+
"sender_username": "MmMoatasem"
|
| 717 |
+
},
|
| 718 |
+
"ts": 1757076023
|
| 719 |
+
},
|
| 720 |
+
{
|
| 721 |
+
"q": "\"السلام عليكم،\nفرصة للمشاركة في بحث علمي متميز يُنشر في مجلات علمية محكمة (Q1, Q2, Q3) ومعتمدة من الهيئة السعودية للتخصصات الصحية. للراغبين في المشاركة، خاص",
|
| 722 |
+
"a": "وصلتني رسالتك: «\"السلام عليكم،\nفرصة للمشاركة في بحث علمي متميز يُنشر في مجلات علمية محكمة (Q1, Q2, Q3) ومعتمدة من الهيئة السعودية للتخصصات الصحية. للراغبين في المشاركة، خاص». ماذا تريد بعدها؟",
|
| 723 |
+
"user": "fwaeed_deneah",
|
| 724 |
+
"meta": {
|
| 725 |
+
"peer_id": -1001688149434,
|
| 726 |
+
"tg_username": "fwaeed_deneah",
|
| 727 |
+
"chat_type": "مجموعة",
|
| 728 |
+
"sender_id": 7528531037,
|
| 729 |
+
"sender_username": null
|
| 730 |
+
},
|
| 731 |
+
"ts": 1757076463
|
| 732 |
+
},
|
| 733 |
+
{
|
| 734 |
+
"q": "السلام عليكم ورحمة الله وبركاته يا أخوان، عندي دكتور متخصص في:\n\n1. كتابة رسائل الماجستير والدكتوراه.\n2. نشر البحوث في المجلات المحكمة.\n3. تدقيق رسائل الماجستير وإخراجها وفق الدليل الجامعي.\n4. تحليل البيانات والاستاتيستيات.\n5. ترجمة المستندات.\n\nاللي يبغى أي خدمة بحثية يتواصل معي خاص، أعطيه رقمه.",
|
| 735 |
+
"a": "وصلتني رسالتك: «السلام عليكم ورحمة الله وبركاته يا أخوان، عندي دكتور متخصص في:\n\n1. كتابة رسائل الماجستير والدكتوراه.\n2. نشر البحوث في المجلات المحكمة.\n3. تدقيق رسائل الماجستير وإخراجها وفق الدليل الجامعي.\n4. تحليل البيانات والاستاتيستيات.\n5. ترجمة المستندات.\n\nاللي يبغى أي خدمة بحثية يتواصل معي خاص، أعطيه رقمه.». ماذا تريد بعدها؟",
|
| 736 |
+
"user": "fwaeed_deneah",
|
| 737 |
+
"meta": {
|
| 738 |
+
"peer_id": -1001688149434,
|
| 739 |
+
"tg_username": "fwaeed_deneah",
|
| 740 |
+
"chat_type": "مجموعة",
|
| 741 |
+
"sender_id": 6838104127,
|
| 742 |
+
"sender_username": null
|
| 743 |
+
},
|
| 744 |
+
"ts": 1757077356
|
| 745 |
+
},
|
| 746 |
+
{
|
| 747 |
+
"q": "يا عالم ابوس ايديك ورجليكم حسوا فينا اناخذكم من غزه والله صعب كثير ومحتاج اكل وطحين 22 دوله عربيه واسلاميه مش قادر تبعث لنا كيلو طحين 💔 حسبي الله ونعم الوكيل حد يساعدني بس اجيب كيلو طحين💔😭🙏",
|
| 748 |
+
"a": "وصلتني رسالتك: «يا عالم ابوس ايديك ورجليكم حسوا فينا اناخذكم من غزه والله صعب كثير ومحتاج اكل وطحين 22 دوله عربيه واسلاميه مش قادر تبعث لنا كيلو طحين 💔 حسبي الله ونعم الوكيل حد يساعدني بس اجيب كيلو طحين💔😭🙏». ماذا تريد بعدها؟",
|
| 749 |
+
"user": "fwaeed_deneah",
|
| 750 |
+
"meta": {
|
| 751 |
+
"peer_id": -1001688149434,
|
| 752 |
+
"tg_username": "fwaeed_deneah",
|
| 753 |
+
"chat_type": "مجموعة",
|
| 754 |
+
"sender_id": 7612419534,
|
| 755 |
+
"sender_username": "adfghj1234"
|
| 756 |
+
},
|
| 757 |
+
"ts": 1757077827
|
| 758 |
+
},
|
| 759 |
+
{
|
| 760 |
+
"q": "السلام عليكم ورحمة الله وبركاته\nنقدم لكم جميع الخدمات البحثية لدعم رحلتكم الأكاديمية، وتشمل:\n✅ إعداد خطة البحث\n✅ كتابة الإطار النظري وفصول الدراسة\n✅ إعداد أبحاث النشر العلمي\n✅ المعالجة الإحصائية باستخدام SPSS\n✅ تصميم أدوات البحث (استبيانات، استمارات...)\n✅ توفير المراجع والكتب والرسائل العلمية والدراسات السابقة\n✅ التدقيق اللغوي والمراجعة العلمية\n✅ تنسيق الرسائل والأبحاث وفق المعايير الأكاديمية\n\n✅ الكشف عن نسبة الاستلال والاقتباس عبر موقع Turnitin\nخاص",
|
| 761 |
+
"a": "وصلتني رسالتك: «السلام عليكم ورحمة الله وبركاته\nنقدم لكم جميع الخدمات البحثية لدعم رحلتكم الأكاديمية، وتشمل:\n✅ إعداد خطة البحث\n✅ كتابة الإطار النظري وفصول الدراسة\n✅ إعداد أبحاث النشر العلمي\n✅ المعالجة الإحصائية باستخدام SPSS\n✅ تصميم أدوات البحث (استبيانات، استمارات...)\n✅ توفير المراجع والكتب والرسائل العلمية والدراسات السابقة\n✅ التدقيق اللغوي والمراجعة العلمية\n✅ تنسيق الرسائل والأبحاث وفق المعايير الأكاديمية\n\n✅ الكشف عن نسبة الاستلال والاقتباس عبر موقع Turnitin\nخاص». ماذا تريد بعدها؟",
|
| 762 |
+
"user": "fwaeed_deneah",
|
| 763 |
+
"meta": {
|
| 764 |
+
"peer_id": -1001688149434,
|
| 765 |
+
"tg_username": "fwaeed_deneah",
|
| 766 |
+
"chat_type": "مجموعة",
|
| 767 |
+
"sender_id": 8158913114,
|
| 768 |
+
"sender_username": null
|
| 769 |
+
},
|
| 770 |
+
"ts": 1757078308
|
| 771 |
+
},
|
| 772 |
+
{
|
| 773 |
+
"q": "اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وَعَلَى آلِ مُحَمَّدٍ، كَمَا صَلَّيْتَ عَلَى إِبْرَاهِيمَ وَعَلَى آلِ إِبْرَاهِيمَ، إِنَّكَ حَمِيدٌ مَجِيدٌ، اللَّهُمَّ بَارِكْ عَلَى مُحَمَّدٍ وَعَلَى آلِ مُحَمَّدٍ، كَمَا بَارَكْتَ عَلَى إِبْرَاهِيمَ وَعَلَى آلِ إِبْرَاهِيمَ، إِنَّكَ حَمِيدٌ مَجِيدٌ\".",
|
| 774 |
+
"a": "وصلتني رسالتك: «اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وَعَلَى آلِ مُحَمَّدٍ، كَمَا صَلَّيْتَ عَلَى إِبْرَاهِيمَ وَعَلَى آلِ إِبْرَاهِيمَ، إِنَّكَ حَمِيدٌ مَجِيدٌ، اللَّهُمَّ بَارِكْ عَلَى مُحَمَّدٍ وَعَلَى آلِ مُحَمَّدٍ، كَمَا بَارَكْتَ عَلَى إِبْرَاهِيمَ وَعَلَى آلِ إِبْرَاهِيمَ، إِنَّكَ حَمِيدٌ مَجِيدٌ\".». ماذا تريد بعدها؟",
|
| 775 |
+
"user": "fwaeed_deneah",
|
| 776 |
+
"meta": {
|
| 777 |
+
"peer_id": -1001688149434,
|
| 778 |
+
"tg_username": "fwaeed_deneah",
|
| 779 |
+
"chat_type": "مجموعة",
|
| 780 |
+
"sender_id": 877859942,
|
| 781 |
+
"sender_username": null
|
| 782 |
+
},
|
| 783 |
+
"ts": 1757078362
|
| 784 |
+
},
|
| 785 |
+
{
|
| 786 |
+
"q": "🇸🇦 عذرآ عزيزي ↤ تباريح\n🇸🇦 ممنوع التوجيه هنا",
|
| 787 |
+
"a": "وصلتني رسالتك: «🇸🇦 عذرآ عزيزي ↤ تباريح\n🇸🇦 ممنوع التوجيه هنا». ماذا تريد بعدها؟",
|
| 788 |
+
"user": "fwaeed_deneah",
|
| 789 |
+
"meta": {
|
| 790 |
+
"peer_id": -1001688149434,
|
| 791 |
+
"tg_username": "fwaeed_deneah",
|
| 792 |
+
"chat_type": "مجموعة",
|
| 793 |
+
"sender_id": 6740120966,
|
| 794 |
+
"sender_username": "Musliembot"
|
| 795 |
+
},
|
| 796 |
+
"ts": 1757079512
|
| 797 |
+
},
|
| 798 |
+
{
|
| 799 |
+
"q": "🇸🇦 عذرآ عزيزي ↤ تباريح\n🇸🇦 ممنوع التوجيه هنا",
|
| 800 |
+
"a": "وصلتني رسالتك: «🇸🇦 عذرآ عزيزي ↤ تباريح\n🇸🇦 ممنوع التوجيه هنا». ماذا تريد بعدها؟",
|
| 801 |
+
"user": "fwaeed_deneah",
|
| 802 |
+
"meta": {
|
| 803 |
+
"peer_id": -1001688149434,
|
| 804 |
+
"tg_username": "fwaeed_deneah",
|
| 805 |
+
"chat_type": "مجموعة",
|
| 806 |
+
"sender_id": 6740120966,
|
| 807 |
+
"sender_username": "Musliembot"
|
| 808 |
+
},
|
| 809 |
+
"ts": 1757079512
|
| 810 |
+
},
|
| 811 |
+
{
|
| 812 |
+
"q": "هلا حبايبي، انا بـغيت اعرفكمـ علـى هالدكـتور اللـي ماشاء الله عليـه متمـيز ومختـص فـي اشـراف واعــداد رسايـل الماجستـير والـدكتوراه هـذا الدكتـور عـنده خـبرة طويلـة فيـ هـالمجال. كمـان يساعـد فيـ اقـتراح مواضيعـ البحثـ ووضـع الخططـ البحثيـة ونشر الـابـحاث علـاوة علـى هـذا، سمعـته مـره حلـوة فيـ تقييمـ الـأبحاث بأسلـوبه العلـمي الرصينـ ومـا يقـصر فـي اعطـاء المـشورة للطلـاب اذا احـدكم يـبغى رقـمهـ يكلمنـي علـى الخـاصـ لـلتواصل مـعاه",
|
| 813 |
+
"a": "وصلتني رسالتك: «هلا حبايبي، انا بـغيت اعرفكمـ علـى هالدكـتور اللـي ماشاء الله عليـه متمـيز ومختـص فـي اشـراف واعــداد رسايـل الماجستـير والـدكتوراه هـذا الدكتـور عـنده خـبرة طويلـة فيـ هـالمجال. كمـان يساعـد فيـ اقـتراح مواضيعـ البحثـ ووضـع الخططـ البحثيـة ونشر الـابـحاث علـاوة علـى هـذا، سمعـته مـره حلـوة فيـ تقييمـ الـأبحاث بأسلـوبه العلـمي الرصينـ ومـا يقـصر فـي اعطـاء المـشورة للطلـاب اذا احـدكم يـبغى رقـمهـ يكلمنـي علـى الخـاصـ لـلتواصل مـعاه». ماذا تريد بعدها؟",
|
| 814 |
+
"user": "fwaeed_deneah",
|
| 815 |
+
"meta": {
|
| 816 |
+
"peer_id": -1001688149434,
|
| 817 |
+
"tg_username": "fwaeed_deneah",
|
| 818 |
+
"chat_type": "مجموعة",
|
| 819 |
+
"sender_id": 7769742191,
|
| 820 |
+
"sender_username": null
|
| 821 |
+
},
|
| 822 |
+
"ts": 1757079572
|
| 823 |
+
},
|
| 824 |
+
{
|
| 825 |
+
"q": "هلا حبايبي، انا بـغيت اعرفكمـ علـى هالدكـتور اللـي ماشاء الله عليـه متمـيز ومختـص فـي اشـراف واعــداد رسايـل الماجستـير والـدكتوراه هـذا الدكتـور عـنده خـبرة طويلـة فيـ هـالمجال. كمـان يساعـد فيـ اقـتراح مواضيعـ البحثـ ووضـع الخططـ البحثيـة ونشر الـابـحاث علـاوة علـى هـذا، سمعـته مـره حلـوة فيـ تقييمـ الـأبحاث بأسلـوبه العلـمي الرصينـ ومـا يقـصر فـي اعطـاء المـشورة للطلـاب اذا احـدكم يـبغى رقـمهـ يكلمنـي علـى الخـاصـ لـلتواصل مـعاه",
|
| 826 |
+
"a": "وصلتني رسالتك: «هلا حبايبي، انا بـغيت اعرفكمـ علـى هالدكـتور اللـي ماشاء الله عليـه متمـيز ومختـص فـي اشـراف واعــداد رسايـل الماجستـير والـدكتوراه هـذا الدكتـور عـنده خـبرة طويلـة فيـ هـالمجال. كمـان يساعـد فيـ اقـتراح مواضيعـ البحثـ ووضـع الخططـ البحثيـة ونشر الـابـحاث علـاوة علـى هـذا، سمعـته مـره حلـوة فيـ تقييمـ الـأبحاث بأسلـوبه العلـمي الرصينـ ومـا يقـصر فـي اعطـاء المـشورة للطلـاب اذا احـدكم يـبغى رقـمهـ يكلمنـي علـى الخـاصـ لـلتواصل مـعاه». ماذا تريد بعدها؟",
|
| 827 |
+
"user": "fwaeed_deneah",
|
| 828 |
+
"meta": {
|
| 829 |
+
"peer_id": -1001688149434,
|
| 830 |
+
"tg_username": "fwaeed_deneah",
|
| 831 |
+
"chat_type": "مجموعة",
|
| 832 |
+
"sender_id": 7769742191,
|
| 833 |
+
"sender_username": null
|
| 834 |
+
},
|
| 835 |
+
"ts": 1757079752
|
| 836 |
+
},
|
| 837 |
+
{
|
| 838 |
+
"q": "صلى الله عليه وآله وصحبه وسلم",
|
| 839 |
+
"a": "وصلتني رسالتك: «صلى الله عليه وآله وصحبه وسلم». ماذا تريد بعدها؟",
|
| 840 |
+
"user": "unknown",
|
| 841 |
+
"meta": {
|
| 842 |
+
"peer_id": -1001688149434,
|
| 843 |
+
"tg_username": "unknown",
|
| 844 |
+
"chat_type": "مجموعة",
|
| 845 |
+
"sender_id": 7188326528,
|
| 846 |
+
"sender_username": "Ahlessone"
|
| 847 |
+
},
|
| 848 |
+
"ts": 1757080450
|
| 849 |
+
},
|
| 850 |
+
{
|
| 851 |
+
"q": "🇸🇦 عذرآ عزيزي ↤ ام\n🇸🇦 ممنوع السب هنا",
|
| 852 |
+
"a": "وصلتني رسالتك: «🇸🇦 عذرآ عزيزي ↤ ام\n🇸🇦 ممنوع السب هنا». ماذا تريد بعدها؟",
|
| 853 |
+
"user": "unknown",
|
| 854 |
+
"meta": {
|
| 855 |
+
"peer_id": -1001688149434,
|
| 856 |
+
"tg_username": "unknown",
|
| 857 |
+
"chat_type": "مجموعة",
|
| 858 |
+
"sender_id": 6740120966,
|
| 859 |
+
"sender_username": "Musliembot"
|
| 860 |
+
},
|
| 861 |
+
"ts": 1757081075
|
| 862 |
+
},
|
| 863 |
+
{
|
| 864 |
+
"q": "🔴 انضميت في شركه استثماريه🔴 وشاركت بمبلغ بسيط 1500﷼وكل يوم تنزل ارباحي 400 ﷼ على حسابي الراجحي من يريد يستثمر\n\nيتواصل مع ابو خالد \n @ebkeld",
|
| 865 |
+
"a": "وصلتني رسالتك: «🔴 انضميت في شركه استثماريه🔴 وشاركت بمبلغ بسيط 1500﷼وكل يوم تنزل ارباحي 400 ﷼ على حسابي الراجحي من يريد يستثمر\n\nيتواصل مع ابو خالد \n @ebkeld». ماذا تريد بعدها؟",
|
| 866 |
+
"user": "fwaeed_deneah",
|
| 867 |
+
"meta": {
|
| 868 |
+
"peer_id": -1001688149434,
|
| 869 |
+
"tg_username": "fwaeed_deneah",
|
| 870 |
+
"chat_type": "مجموعة",
|
| 871 |
+
"sender_id": 8184446145,
|
| 872 |
+
"sender_username": null
|
| 873 |
+
},
|
| 874 |
+
"ts": 1757081075
|
| 875 |
+
},
|
| 876 |
+
{
|
| 877 |
+
"q": "لالا\nنقطتين مو انا",
|
| 878 |
+
"a": "وصلتني رسالتك: «لالا\nنقطتين مو انا». ماذا تريد بعدها؟",
|
| 879 |
+
"user": "fwaeed_deneah",
|
| 880 |
+
"meta": {
|
| 881 |
+
"peer_id": -1001688149434,
|
| 882 |
+
"tg_username": "fwaeed_deneah",
|
| 883 |
+
"chat_type": "مجموعة",
|
| 884 |
+
"sender_id": 8146471582,
|
| 885 |
+
"sender_username": null
|
| 886 |
+
},
|
| 887 |
+
"ts": 1757087230
|
| 888 |
+
},
|
| 889 |
+
{
|
| 890 |
+
"q": "هل انتي علا؟",
|
| 891 |
+
"a": "وصلتني رسالتك: «هل انتي علا؟». ماذا تريد بعدها؟",
|
| 892 |
+
"user": "fwaeed_deneah",
|
| 893 |
+
"meta": {
|
| 894 |
+
"peer_id": -1001688149434,
|
| 895 |
+
"tg_username": "fwaeed_deneah",
|
| 896 |
+
"chat_type": "مجموعة",
|
| 897 |
+
"sender_id": 8146471582,
|
| 898 |
+
"sender_username": null
|
| 899 |
+
},
|
| 900 |
+
"ts": 1757087232
|
| 901 |
+
},
|
| 902 |
+
{
|
| 903 |
+
"q": "كان نقطة وحدي فقلت هي ميلا\nومصري بعد\nالمهم حياك الله",
|
| 904 |
+
"a": "وصلتني رسالتك: «كان نقطة وحدي فقلت هي ميلا\nومصري بعد\nالمهم حياك الله». ماذا تريد بعدها؟",
|
| 905 |
+
"user": "fwaeed_deneah",
|
| 906 |
+
"meta": {
|
| 907 |
+
"peer_id": -1001688149434,
|
| 908 |
+
"tg_username": "fwaeed_deneah",
|
| 909 |
+
"chat_type": "مجموعة",
|
| 910 |
+
"sender_id": 7504191103,
|
| 911 |
+
"sender_username": null
|
| 912 |
+
},
|
| 913 |
+
"ts": 1757087530
|
| 914 |
+
}
|
| 915 |
+
],
|
| 916 |
+
"-1002246528783": [
|
| 917 |
+
{
|
| 918 |
+
"q": "https://t.me/abrs09",
|
| 919 |
+
"a": "وصلتني رسالتك: «https://t.me/abrs09». ماذا تريد بعدها؟",
|
| 920 |
+
"user": "RTarabicchat",
|
| 921 |
+
"meta": {
|
| 922 |
+
"peer_id": -1002246528783,
|
| 923 |
+
"tg_username": "RTarabicchat",
|
| 924 |
+
"chat_type": "مجموعة",
|
| 925 |
+
"sender_id": 6056326351,
|
| 926 |
+
"sender_username": "maddasma7"
|
| 927 |
+
},
|
| 928 |
+
"ts": 1757079806
|
| 929 |
+
},
|
| 930 |
+
{
|
| 931 |
+
"q": "https://t.me/Abo_waled4",
|
| 932 |
+
"a": "وصلتني رسالتك: «https://t.me/Abo_waled4». ماذا تريد بعدها؟",
|
| 933 |
+
"user": "RTarabicchat",
|
| 934 |
+
"meta": {
|
| 935 |
+
"peer_id": -1002246528783,
|
| 936 |
+
"tg_username": "RTarabicchat",
|
| 937 |
+
"chat_type": "مجموعة",
|
| 938 |
+
"sender_id": 6056326351,
|
| 939 |
+
"sender_username": "maddasma7"
|
| 940 |
+
},
|
| 941 |
+
"ts": 1757080024
|
| 942 |
+
}
|
| 943 |
+
],
|
| 944 |
+
"6602941635": [
|
| 945 |
+
{
|
| 946 |
+
"q": "مرحبا! كيف يمكنني مساعدتك اليوم؟",
|
| 947 |
+
"a": "وصلتني رسالتك: «مرحبا! كيف يمكنني مساعدتك اليوم؟». ماذا تريد بعدها؟",
|
| 948 |
+
"user": "unknown",
|
| 949 |
+
"meta": {
|
| 950 |
+
"peer_id": 6602941635,
|
| 951 |
+
"tg_username": "unknown",
|
| 952 |
+
"chat_type": "خاص",
|
| 953 |
+
"sender_id": 6602941635,
|
| 954 |
+
"sender_username": "oommssddbot"
|
| 955 |
+
},
|
| 956 |
+
"ts": 1757085777
|
| 957 |
+
},
|
| 958 |
+
{
|
| 959 |
+
"q": "هـٰـبـٰكـٰن 🚀 👍",
|
| 960 |
+
"a": "وصلتني رسالتك: «هـٰـبـٰكـٰن 🚀 👍». ماذا تريد بعدها؟",
|
| 961 |
+
"user": "unknown",
|
| 962 |
+
"meta": {
|
| 963 |
+
"peer_id": 6602941635,
|
| 964 |
+
"tg_username": "unknown",
|
| 965 |
+
"chat_type": "خاص",
|
| 966 |
+
"sender_id": 6602941635,
|
| 967 |
+
"sender_username": "oommssddbot"
|
| 968 |
+
},
|
| 969 |
+
"ts": 1757085892
|
| 970 |
+
},
|
| 971 |
+
{
|
| 972 |
+
"q": "مرحبا، هل يمكنني مساعدتك اليوم؟ أريد أن تعرف على كيفية استخدام هذا الهاتف الجديد. كيف يمكنني مشاركة رسال",
|
| 973 |
+
"a": "وصلتني رسالتك: «مرحبا، هل يمكنني مساعدتك اليوم؟ أريد أن تعرف على كيفية استخدام هذا الهاتف الجديد. كيف يمكنني مشاركة رسال». ماذا تريد بعدها؟",
|
| 974 |
+
"user": "unknown",
|
| 975 |
+
"meta": {
|
| 976 |
+
"peer_id": 6602941635,
|
| 977 |
+
"tg_username": "unknown",
|
| 978 |
+
"chat_type": "خاص",
|
| 979 |
+
"sender_id": 6602941635,
|
| 980 |
+
"sender_username": "oommssddbot"
|
| 981 |
+
},
|
| 982 |
+
"ts": 1757086102
|
| 983 |
+
},
|
| 984 |
+
{
|
| 985 |
+
"q": "أعتباراً من الوقت الحالي، الساعة تبدأ من حوالي 9:00 صباحاً وتمتد حتى 17:53",
|
| 986 |
+
"a": "وصلتني رسالتك: «أعتباراً من الوقت الحالي، الساعة تبدأ من حوالي 9:00 صباحاً وتمتد حتى 17:53». ماذا تريد بعدها؟",
|
| 987 |
+
"user": "unknown",
|
| 988 |
+
"meta": {
|
| 989 |
+
"peer_id": 6602941635,
|
| 990 |
+
"tg_username": "unknown",
|
| 991 |
+
"chat_type": "خاص",
|
| 992 |
+
"sender_id": 6602941635,
|
| 993 |
+
"sender_username": "oommssddbot"
|
| 994 |
+
},
|
| 995 |
+
"ts": 1757087549
|
| 996 |
+
},
|
| 997 |
+
{
|
| 998 |
+
"q": "بخصوص هذه الرسالة التي تم تقديمها لك، ستأخذ فترة زمنية محددة. إذا كنت في هذا الوقت، فكنت قد",
|
| 999 |
+
"a": "وصلتني رسالتك: «بخصوص هذه الرسالة التي تم تقديمها لك، ستأخذ فترة زمنية محددة. إذا كنت في هذا الوقت، فكنت قد». ماذا تريد بعدها؟",
|
| 1000 |
+
"user": "unknown",
|
| 1001 |
+
"meta": {
|
| 1002 |
+
"peer_id": 6602941635,
|
| 1003 |
+
"tg_username": "unknown",
|
| 1004 |
+
"chat_type": "خاص",
|
| 1005 |
+
"sender_id": 6602941635,
|
| 1006 |
+
"sender_username": "oommssddbot"
|
| 1007 |
+
},
|
| 1008 |
+
"ts": 1757087663
|
| 1009 |
+
},
|
| 1010 |
+
{
|
| 1011 |
+
"q": "يمكنني أن أساعدك في تحليل أحداث اليوم الخاصة بك أو المعلومة الجديدة التي تم تقديمه لك. هل لديك أي آر",
|
| 1012 |
+
"a": "وصلتني رسالتك: «يمكنني أن أساعدك في تحليل أحداث اليوم الخاصة بك أو المعلومة الجديدة التي تم تقديمه لك. هل لديك أي آر». ماذا تريد بعدها؟",
|
| 1013 |
+
"user": "unknown",
|
| 1014 |
+
"meta": {
|
| 1015 |
+
"peer_id": 6602941635,
|
| 1016 |
+
"tg_username": "unknown",
|
| 1017 |
+
"chat_type": "خاص",
|
| 1018 |
+
"sender_id": 6602941635,
|
| 1019 |
+
"sender_username": "oommssddbot"
|
| 1020 |
+
},
|
| 1021 |
+
"ts": 1757088131
|
| 1022 |
+
},
|
| 1023 |
+
{
|
| 1024 |
+
"q": "أنا سأبحث عن المعلومات حول حالتي اليوم والمشكلات التي قد يواجهها شخصيًا. كيف يمكنني أن أساعدك في",
|
| 1025 |
+
"a": "وصلتني رسالتك: «أنا سأبحث عن المعلومات حول حالتي اليوم والمشكلات التي قد يواجهها شخصيًا. كيف يمكنني أن أساعدك في». ماذا تريد بعدها؟",
|
| 1026 |
+
"user": "unknown",
|
| 1027 |
+
"meta": {
|
| 1028 |
+
"peer_id": 6602941635,
|
| 1029 |
+
"tg_username": "unknown",
|
| 1030 |
+
"chat_type": "خاص",
|
| 1031 |
+
"sender_id": 6602941635,
|
| 1032 |
+
"sender_username": "oommssddbot"
|
| 1033 |
+
},
|
| 1034 |
+
"ts": 1757088235
|
| 1035 |
+
},
|
| 1036 |
+
{
|
| 1037 |
+
"q": "بخصوص هذا الشكر لك على الإزمنة! أنا فريدة من نوع ديني لمساعدتك في تطبيقاتك.",
|
| 1038 |
+
"a": "وصلتني رسالتك: «بخصوص هذا الشكر لك على الإزمنة! أنا فريدة من نوع ديني لمساعدتك في تطبيقاتك.». ماذا تريد بعدها؟",
|
| 1039 |
+
"user": "unknown",
|
| 1040 |
+
"meta": {
|
| 1041 |
+
"peer_id": 6602941635,
|
| 1042 |
+
"tg_username": "unknown",
|
| 1043 |
+
"chat_type": "خاص",
|
| 1044 |
+
"sender_id": 6602941635,
|
| 1045 |
+
"sender_username": "oommssddbot"
|
| 1046 |
+
},
|
| 1047 |
+
"ts": 1757088368
|
| 1048 |
+
},
|
| 1049 |
+
{
|
| 1050 |
+
"q": "أعتذر، ولكني لا أستطيع رؤية الرسائل الصوتية أو التلفزيونية لتعكس سلوكك في الوقت",
|
| 1051 |
+
"a": "وصلتني رسالتك: «أعتذر، ولكني لا أستطيع رؤية الرسائل الصوتية أو التلفزيونية لتعكس سلوكك في الوقت». ماذا تريد بعدها؟",
|
| 1052 |
+
"user": "unknown",
|
| 1053 |
+
"meta": {
|
| 1054 |
+
"peer_id": 6602941635,
|
| 1055 |
+
"tg_username": "unknown",
|
| 1056 |
+
"chat_type": "خاص",
|
| 1057 |
+
"sender_id": 6602941635,
|
| 1058 |
+
"sender_username": "oommssddbot"
|
| 1059 |
+
},
|
| 1060 |
+
"ts": 1757088535
|
| 1061 |
+
}
|
| 1062 |
+
]
|
| 1063 |
+
}
|
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 "تم تحديث قاعدة المعرفة بنجاح."
|
knowledge_settings.json
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"chats": {},
|
| 3 |
+
"min_similarity": 0.82
|
| 4 |
+
}
|
lan_peer_server.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from flask import Flask, request, jsonify
|
| 2 |
+
|
| 3 |
+
app = Flask(__name__)
|
| 4 |
+
|
| 5 |
+
@app.route('/run_task', methods=['POST'])
|
| 6 |
+
def run_task():
|
| 7 |
+
data = request.json
|
| 8 |
+
print("📥 Received task:", data)
|
| 9 |
+
if data["task"] == "add":
|
| 10 |
+
a = data["a"]
|
| 11 |
+
b = data["b"]
|
| 12 |
+
result = a + b
|
| 13 |
+
return jsonify({"result": result})
|
| 14 |
+
return jsonify({"error": "Unknown task"})
|
| 15 |
+
|
| 16 |
+
if __name__ == '__main__':
|
| 17 |
+
app.run(host='0.0.0.0', port=7520)
|
launcher.py
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
#!/usr/bin/env python3
|
| 3 |
+
"""
|
| 4 |
+
مشغل موحد لنظام توزيع المهام
|
| 5 |
+
يوفر خيارات متعددة للتشغيل
|
| 6 |
+
"""
|
| 7 |
+
|
| 8 |
+
import sys
|
| 9 |
+
import os
|
| 10 |
+
import subprocess
|
| 11 |
+
import argparse
|
| 12 |
+
import time
|
| 13 |
+
from pathlib import Path
|
| 14 |
+
from peer_discovery import PORT
|
| 15 |
+
|
| 16 |
+
def check_requirements():
|
| 17 |
+
"""فحص المتطلبات والاعتماديات"""
|
| 18 |
+
required_files = [
|
| 19 |
+
'background_service.py',
|
| 20 |
+
'main.py',
|
| 21 |
+
'peer_server.py',
|
| 22 |
+
'rpc_server.py',
|
| 23 |
+
'load_balancer.py'
|
| 24 |
+
]
|
| 25 |
+
|
| 26 |
+
missing_files = []
|
| 27 |
+
for file in required_files:
|
| 28 |
+
if not Path(file).exists():
|
| 29 |
+
missing_files.append(file)
|
| 30 |
+
|
| 31 |
+
if missing_files:
|
| 32 |
+
print(f"❌ ملفات مفقودة: {', '.join(missing_files)}")
|
| 33 |
+
return False
|
| 34 |
+
|
| 35 |
+
return True
|
| 36 |
+
|
| 37 |
+
def install_tray_dependencies():
|
| 38 |
+
"""تثبيت اعتماديات أيقونة شريط النظام"""
|
| 39 |
+
try:
|
| 40 |
+
subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'pystray', 'Pillow'])
|
| 41 |
+
print("✅ تم تثبيت اعتماديات أيقونة شريط النظام")
|
| 42 |
+
return True
|
| 43 |
+
except subprocess.CalledProcessError:
|
| 44 |
+
print("❌ فشل في تثبيت اعتماديات أيقونة شريط النظام")
|
| 45 |
+
return False
|
| 46 |
+
|
| 47 |
+
def start_background_service():
|
| 48 |
+
"""بدء تشغيل الخدمة في الخلفية"""
|
| 49 |
+
print("🚀 بدء تشغيل الخدمة في الخلفية...")
|
| 50 |
+
|
| 51 |
+
# تشغيل الخدمة الخلفية
|
| 52 |
+
process = subprocess.Popen(
|
| 53 |
+
[sys.executable, 'background_service.py', 'start'],
|
| 54 |
+
stdout=subprocess.PIPE,
|
| 55 |
+
stderr=subprocess.PIPE
|
| 56 |
+
)
|
| 57 |
+
|
| 58 |
+
# انتظار قليل للتأكد من بدء التشغيل
|
| 59 |
+
time.sleep(2)
|
| 60 |
+
|
| 61 |
+
if process.poll() is None:
|
| 62 |
+
print("✅ تم بدء تشغيل الخدمة الخلفية بنجاح")
|
| 63 |
+
return process
|
| 64 |
+
else:
|
| 65 |
+
print("❌ فشل في بدء تشغيل الخدمة الخلفية")
|
| 66 |
+
return None
|
| 67 |
+
|
| 68 |
+
def start_with_tray():
|
| 69 |
+
"""تشغيل النظام مع أيقونة شريط النظام"""
|
| 70 |
+
print("🖱️ تشغيل النظام مع أيقونة شريط النظام...")
|
| 71 |
+
|
| 72 |
+
# بدء الخدمة الخلفية أولاً
|
| 73 |
+
bg_process = start_background_service()
|
| 74 |
+
if not bg_process:
|
| 75 |
+
return False
|
| 76 |
+
|
| 77 |
+
time.sleep(3) # انتظار حتى تصبح الخدمة جاهزة
|
| 78 |
+
|
| 79 |
+
try:
|
| 80 |
+
# تشغيل أيقونة شريط النظام
|
| 81 |
+
subprocess.run([sys.executable, 'system_tray.py'])
|
| 82 |
+
except KeyboardInterrupt:
|
| 83 |
+
print("\n🛑 إيقاف النظام...")
|
| 84 |
+
# إيقاف الخدمة الخلفية
|
| 85 |
+
try:
|
| 86 |
+
import requests
|
| 87 |
+
requests.post('http://localhost:8888/stop', timeout=5)
|
| 88 |
+
except:
|
| 89 |
+
bg_process.terminate()
|
| 90 |
+
|
| 91 |
+
return True
|
| 92 |
+
|
| 93 |
+
def start_interactive():
|
| 94 |
+
"""تشغيل النظام في الوضع التفاعلي"""
|
| 95 |
+
print("🖥️ تشغيل النظام في الوضع التفاعلي...")
|
| 96 |
+
|
| 97 |
+
# بدء الخدمة الخلفية
|
| 98 |
+
bg_process = start_background_service()
|
| 99 |
+
if not bg_process:
|
| 100 |
+
return False
|
| 101 |
+
|
| 102 |
+
time.sleep(3)
|
| 103 |
+
|
| 104 |
+
# تشغيل الواجهة التفاعلية
|
| 105 |
+
try:
|
| 106 |
+
import requests
|
| 107 |
+
requests.post('http://localhost:8888/show-ui', timeout=5)
|
| 108 |
+
print("✅ تم تشغيل الواجهة التفاعلية")
|
| 109 |
+
|
| 110 |
+
# فتح المتصفح
|
| 111 |
+
import webbrowser
|
| 112 |
+
time.sleep(2)
|
| 113 |
+
webbrowser.open('http://localhost:5173')
|
| 114 |
+
|
| 115 |
+
# انتظار إنهاء المستخدم
|
| 116 |
+
input("اضغط Enter لإيقاف النظام...")
|
| 117 |
+
|
| 118 |
+
except KeyboardInterrupt:
|
| 119 |
+
pass
|
| 120 |
+
finally:
|
| 121 |
+
print("🛑 إيقاف النظام...")
|
| 122 |
+
try:
|
| 123 |
+
import requests
|
| 124 |
+
requests.post('http://localhost:8888/stop', timeout=5)
|
| 125 |
+
except:
|
| 126 |
+
bg_process.terminate()
|
| 127 |
+
|
| 128 |
+
return True
|
| 129 |
+
|
| 130 |
+
def start_headless():
|
| 131 |
+
"""تشغيل النظام بدون واجهة (للخوادم)"""
|
| 132 |
+
print("⚙️ تشغيل النظام بدون واجهة...")
|
| 133 |
+
|
| 134 |
+
try:
|
| 135 |
+
# تشغيل الخدمة الخلفية والانتظار
|
| 136 |
+
subprocess.run([sys.executable, 'background_service.py', 'start'])
|
| 137 |
+
except KeyboardInterrupt:
|
| 138 |
+
print("\n🛑 إيقاف النظام...")
|
| 139 |
+
|
| 140 |
+
return True
|
| 141 |
+
|
| 142 |
+
def show_status():
|
| 143 |
+
"""عرض حالة النظام"""
|
| 144 |
+
subprocess.run([sys.executable, 'background_service.py', 'status'])
|
| 145 |
+
|
| 146 |
+
def stop_system():
|
| 147 |
+
"""إيقاف النظام"""
|
| 148 |
+
subprocess.run([sys.executable, 'background_service.py', 'stop'])
|
| 149 |
+
|
| 150 |
+
def main():
|
| 151 |
+
parser = argparse.ArgumentParser(
|
| 152 |
+
description="مشغل نظام توزيع المهام الذكي",
|
| 153 |
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
| 154 |
+
epilog="""
|
| 155 |
+
أمثلة الاستخدام:
|
| 156 |
+
python launcher.py --tray # تشغيل مع أيقونة شريط النظام
|
| 157 |
+
python launcher.py --interactive # تشغيل تفاعلي مع واجهة
|
| 158 |
+
python launcher.py --headless # تشغيل بدون واجهة (للخوادم)
|
| 159 |
+
python launcher.py --status # عرض حالة النظام
|
| 160 |
+
python launcher.py --stop # إيقاف النظام
|
| 161 |
+
"""
|
| 162 |
+
)
|
| 163 |
+
|
| 164 |
+
group = parser.add_mutually_exclusive_group(required=True)
|
| 165 |
+
group.add_argument('--tray', action='store_true',
|
| 166 |
+
help='تشغيل مع أيقونة شريط النظام')
|
| 167 |
+
group.add_argument('--interactive', action='store_true',
|
| 168 |
+
help='تشغيل تفاعلي مع واجهة')
|
| 169 |
+
group.add_argument('--headless', action='store_true',
|
| 170 |
+
help='تشغيل بدون واجهة (للخوادم)')
|
| 171 |
+
group.add_argument('--status', action='store_true',
|
| 172 |
+
help='عرض حالة النظام')
|
| 173 |
+
group.add_argument('--stop', action='store_true',
|
| 174 |
+
help='إيقاف النظام')
|
| 175 |
+
|
| 176 |
+
parser.add_argument('--install-deps', action='store_true',
|
| 177 |
+
help='تثبيت الاعتماديات المطلوبة')
|
| 178 |
+
|
| 179 |
+
args = parser.parse_args()
|
| 180 |
+
|
| 181 |
+
# فحص المتطلبات
|
| 182 |
+
if not check_requirements():
|
| 183 |
+
return 1
|
| 184 |
+
|
| 185 |
+
# تثبيت الاعتماديات إذا طُلب ذلك
|
| 186 |
+
if args.install_deps:
|
| 187 |
+
install_tray_dependencies()
|
| 188 |
+
return 0
|
| 189 |
+
|
| 190 |
+
# تنفيذ الأمر المطلوب
|
| 191 |
+
if args.status:
|
| 192 |
+
show_status()
|
| 193 |
+
elif args.stop:
|
| 194 |
+
stop_system()
|
| 195 |
+
elif args.headless:
|
| 196 |
+
success = start_headless()
|
| 197 |
+
elif args.interactive:
|
| 198 |
+
success = start_interactive()
|
| 199 |
+
elif args.tray:
|
| 200 |
+
# تثبيت اعتماديات أيقونة شريط النظام إذا لم تكن موجودة
|
| 201 |
+
try:
|
| 202 |
+
import pystray
|
| 203 |
+
except ImportError:
|
| 204 |
+
print("📦 تثبيت اعتماديات أيقونة شريط النظام...")
|
| 205 |
+
if not install_tray_dependencies():
|
| 206 |
+
print("❌ فشل في تثبيت الاعتماديات، التشغيل في الوضع التفاعلي...")
|
| 207 |
+
success = start_interactive()
|
| 208 |
+
else:
|
| 209 |
+
success = start_with_tray()
|
| 210 |
+
else:
|
| 211 |
+
success = start_with_tray()
|
| 212 |
+
|
| 213 |
+
return 0 if success else 1
|
| 214 |
+
|
| 215 |
+
if __name__ == "__main__":
|
| 216 |
+
sys.exit(main())
|
learned_links.json
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
"https://duckduckgo.com/l/?uddg=https%3A%2F%2Fknowledgelover.com%2Flearn%2Dnew%2Dthings%2Deveryday%2F&rut=7d7b864acc8a0ad994985eeb0bf2b9f3c55a7ba8c6dafdc911bc63c072948058",
|
| 3 |
+
"https://duckduckgo.com/l/?uddg=https%3A%2F%2Fmashable.com%2Farticle%2Ffun%2Dwebsites%2Dimprove%2Dskills&rut=8f1ae5eb9c627d1fc36877fcec3f7bffcb339f324d4aa256a7b533884217da1a",
|
| 4 |
+
"https://duckduckgo.com/l/?uddg=https%3A%2F%2Fwww.powerofpositivity.com%2Flearn%2Dsomething%2Dnew%2F&rut=64b552380eacdc7089350dbef51661caabbf2c72f39b3a3e385679e27b751376",
|
| 5 |
+
"https://duckduckgo.com/l/?uddg=https%3A%2F%2Fwww.lifehack.org%2F417485%2F10%2Dwebsites%2Dto%2Dlearn%2Dsomething%2Dnew%2Din%2D30%2Dminutes%2Da%2Dday&rut=695a24a9a3fcaeee9162b8edfe23905edb1da4579b62bae6a6297eab2d09ab4f",
|
| 6 |
+
"https://duckduckgo.com/l/?uddg=https%3A%2F%2Fmedium.com%2F%40ozlazarus%2F10%2Duseful%2Dwebsites%2Dto%2Dlearn%2Dsomething%2Dnew%2Devery%2Dday%2D9805f34f0a18&rut=e2d2f7a3b73b4755ab386620231db73a175e133cfe34513c7ed0db9425138ea1",
|
| 7 |
+
"https://duckduckgo.com/l/?uddg=https%3A%2F%2Firisreading.com%2Fwebsites%2Dto%2Dlearn%2Dsomething%2Dnew%2Devery%2Dday%2F&rut=657a35a062c75eb134a4e9dd67762944905ff3db40089b7150f769924ad04945",
|
| 8 |
+
"https://duckduckgo.com/l/?uddg=https%3A%2F%2Fwww.inc.com%2Flarry%2Dkim%2F40%2Damazing%2Dplaces%2Dto%2Dlearn%2Dsomething%2Dnew%2Devery%2Dday.html&rut=4325bcdb3351d7678ed4cc7516850a8c3efde0da96282026c8023affd480e5a0",
|
| 9 |
+
"https://duckduckgo.com/l/?uddg=https%3A%2F%2Fgohighbrow.com%2F&rut=198629341aae9673fa9336e83a9999aab3df7549bd7475f2a70756864b458bf2",
|
| 10 |
+
"https://duckduckgo.com/l/?uddg=https%3A%2F%2Fwww.creativeboom.com%2Fresources%2F58%2Dof%2Dthe%2Dbest%2Dwebsites%2Dand%2Dapps%2Dto%2Dlearn%2Dsomething%2Dnew%2F&rut=b64342e80e17f159c4f917ff36d7b0653bbac1fcd542be08c5e84fcd9bbd1e7d",
|
| 11 |
+
"https://duckduckgo.com/l/?uddg=https%3A%2F%2Fbeebom.com%2Flearning%2Dwebsites%2F&rut=96c8739116802d26910f415f6ffd983103bd863b7f18a8fcb38c02abf361dd4c"
|
| 12 |
+
]
|
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))
|
live_streaming.py
ADDED
|
@@ -0,0 +1,406 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
# live_streaming.py - نظام البث المباشر للألعاب والفيديو
|
| 3 |
+
|
| 4 |
+
import cv2
|
| 5 |
+
import numpy as np
|
| 6 |
+
import time
|
| 7 |
+
import threading
|
| 8 |
+
import logging
|
| 9 |
+
import asyncio
|
| 10 |
+
import base64
|
| 11 |
+
import json
|
| 12 |
+
from datetime import datetime
|
| 13 |
+
from processor_manager import should_offload
|
| 14 |
+
from remote_executor import execute_remotely
|
| 15 |
+
from functools import wraps
|
| 16 |
+
from peer_discovery import PORT
|
| 17 |
+
|
| 18 |
+
logging.basicConfig(level=logging.INFO)
|
| 19 |
+
|
| 20 |
+
class LiveStreamManager:
|
| 21 |
+
def __init__(self):
|
| 22 |
+
self.active_streams = {}
|
| 23 |
+
self.processing_nodes = []
|
| 24 |
+
self.load_balancer = StreamLoadBalancer()
|
| 25 |
+
|
| 26 |
+
def register_processing_node(self, node_id, capabilities):
|
| 27 |
+
"""تسجيل عقدة معالجة جديدة"""
|
| 28 |
+
self.processing_nodes.append({
|
| 29 |
+
"id": node_id,
|
| 30 |
+
"capabilities": capabilities,
|
| 31 |
+
"load": 0.0,
|
| 32 |
+
"last_ping": datetime.now()
|
| 33 |
+
})
|
| 34 |
+
logging.info(f"📡 تم تسجيل عقدة معالجة: {node_id}")
|
| 35 |
+
|
| 36 |
+
class StreamLoadBalancer:
|
| 37 |
+
def __init__(self):
|
| 38 |
+
self.node_loads = {}
|
| 39 |
+
|
| 40 |
+
def get_best_node(self, task_type, nodes):
|
| 41 |
+
"""اختيار أفضل عقدة للمعالجة"""
|
| 42 |
+
suitable_nodes = [n for n in nodes if task_type in n.get("capabilities", [])]
|
| 43 |
+
if not suitable_nodes:
|
| 44 |
+
return None
|
| 45 |
+
return min(suitable_nodes, key=lambda x: x["load"])
|
| 46 |
+
|
| 47 |
+
def stream_offload(func):
|
| 48 |
+
"""ديكوراتور خاص بالبث المباشر"""
|
| 49 |
+
@wraps(func)
|
| 50 |
+
def wrapper(*args, **kwargs):
|
| 51 |
+
complexity = estimate_stream_complexity(func, args, kwargs)
|
| 52 |
+
|
| 53 |
+
if complexity > 70 or should_offload(complexity):
|
| 54 |
+
logging.info(f"📺 إرسال مهمة البث {func.__name__} للمعالجة الموزعة")
|
| 55 |
+
return execute_remotely(func.__name__, args, kwargs)
|
| 56 |
+
|
| 57 |
+
logging.info(f"📺 معالجة البث محلياً: {func.__name__}")
|
| 58 |
+
return func(*args, **kwargs)
|
| 59 |
+
return wrapper
|
| 60 |
+
|
| 61 |
+
def estimate_stream_complexity(func, args, kwargs):
|
| 62 |
+
"""تقدير تعقيد معالجة البث"""
|
| 63 |
+
if func.__name__ == "process_game_stream":
|
| 64 |
+
return args[1] * args[2] / 10000 # FPS × الدقة
|
| 65 |
+
elif func.__name__ == "real_time_video_enhancement":
|
| 66 |
+
return args[0] * 20 # عدد التحسينات × 20
|
| 67 |
+
elif func.__name__ == "multi_stream_processing":
|
| 68 |
+
return len(args[0]) * 25 # عدد البثوث × 25
|
| 69 |
+
elif func.__name__ == "ai_commentary_generation":
|
| 70 |
+
return args[1] * 15 # طول النص × 15
|
| 71 |
+
return 40
|
| 72 |
+
|
| 73 |
+
# ═══════════════════════════════════════════════════════════════
|
| 74 |
+
# معالجة بث الألعاب المباشر
|
| 75 |
+
# ═══════════════════════════════════════════════════════════════
|
| 76 |
+
|
| 77 |
+
@stream_offload
|
| 78 |
+
def process_game_stream(stream_data, fps, resolution, enhancements=None):
|
| 79 |
+
"""معالجة بث الألعاب في الوقت الفعلي"""
|
| 80 |
+
start_time = time.time()
|
| 81 |
+
|
| 82 |
+
if enhancements is None:
|
| 83 |
+
enhancements = ["noise_reduction", "color_enhancement"]
|
| 84 |
+
|
| 85 |
+
logging.info(f"🎮 معالجة بث الألعاب - FPS: {fps}, الدقة: {resolution}")
|
| 86 |
+
logging.info(f"🔧 التحسينات: {enhancements}")
|
| 87 |
+
|
| 88 |
+
# محاكاة معالجة الإطارات
|
| 89 |
+
frame_count = len(stream_data) if isinstance(stream_data, list) else 60
|
| 90 |
+
processing_per_frame = 0.01 + (len(enhancements) * 0.005)
|
| 91 |
+
total_processing_time = frame_count * processing_per_frame
|
| 92 |
+
|
| 93 |
+
# محاكاة المعالجة
|
| 94 |
+
time.sleep(min(total_processing_time, 2))
|
| 95 |
+
|
| 96 |
+
# حساب جودة البث
|
| 97 |
+
quality_score = min(100, 60 + (len(enhancements) * 8) + (fps / 2))
|
| 98 |
+
latency = max(50, 200 - (fps * 2)) # أقل تأخير مع FPS أعلى
|
| 99 |
+
|
| 100 |
+
result = {
|
| 101 |
+
"status": "success",
|
| 102 |
+
"stream_type": "game",
|
| 103 |
+
"fps_processed": fps,
|
| 104 |
+
"resolution": resolution,
|
| 105 |
+
"frames_processed": frame_count,
|
| 106 |
+
"enhancements_applied": enhancements,
|
| 107 |
+
"quality_score": round(quality_score, 1),
|
| 108 |
+
"latency_ms": latency,
|
| 109 |
+
"processing_time": time.time() - start_time,
|
| 110 |
+
"bandwidth_optimized": True
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
logging.info(f"✅ تمت معالجة بث اللعبة - جودة: {result['quality_score']}%")
|
| 114 |
+
return result
|
| 115 |
+
|
| 116 |
+
@stream_offload
|
| 117 |
+
def real_time_video_enhancement(enhancement_types, video_quality="1080p", target_fps=60):
|
| 118 |
+
"""تحسين الفيديو في الوقت الفعلي"""
|
| 119 |
+
start_time = time.time()
|
| 120 |
+
|
| 121 |
+
available_enhancements = {
|
| 122 |
+
"upscaling": "تحسين الدقة",
|
| 123 |
+
"noise_reduction": "إزالة التشويش",
|
| 124 |
+
"color_grading": "تصحيح الألوان",
|
| 125 |
+
"motion_smoothing": "تنعيم الحركة",
|
| 126 |
+
"hdr_enhancement": "تحسين HDR",
|
| 127 |
+
"sharpening": "زيادة الحدة",
|
| 128 |
+
"stabilization": "تثبيت الصورة"
|
| 129 |
+
}
|
| 130 |
+
|
| 131 |
+
quality_multiplier = {"720p": 1, "1080p": 2, "1440p": 3, "4K": 5}
|
| 132 |
+
multiplier = quality_multiplier.get(video_quality, 2)
|
| 133 |
+
|
| 134 |
+
processing_time = len(enhancement_types) * multiplier * target_fps * 0.0001
|
| 135 |
+
|
| 136 |
+
logging.info(f"📹 تحسين الفيديو المباشر - الجودة: {video_quality}")
|
| 137 |
+
logging.info(f"🎯 التحسينات: {enhancement_types}")
|
| 138 |
+
|
| 139 |
+
# محاكاة التحسين
|
| 140 |
+
time.sleep(min(processing_time, 1.5))
|
| 141 |
+
|
| 142 |
+
enhancements_applied = {}
|
| 143 |
+
for enhancement in enhancement_types:
|
| 144 |
+
if enhancement in available_enhancements:
|
| 145 |
+
enhancements_applied[enhancement] = {
|
| 146 |
+
"name": available_enhancements[enhancement],
|
| 147 |
+
"improvement": round(np.random.uniform(15, 35), 1),
|
| 148 |
+
"processing_cost": round(processing_time / len(enhancement_types), 4)
|
| 149 |
+
}
|
| 150 |
+
|
| 151 |
+
result = {
|
| 152 |
+
"status": "success",
|
| 153 |
+
"video_quality": video_quality,
|
| 154 |
+
"target_fps": target_fps,
|
| 155 |
+
"enhancements": enhancements_applied,
|
| 156 |
+
"total_improvement": round(np.mean([e["improvement"] for e in enhancements_applied.values()]), 1),
|
| 157 |
+
"processing_time": time.time() - start_time,
|
| 158 |
+
"real_time_capable": processing_time < (1/target_fps)
|
| 159 |
+
}
|
| 160 |
+
|
| 161 |
+
logging.info(f"✅ تم تحسين الفيديو - تحسن: {result['total_improvement']}%")
|
| 162 |
+
return result
|
| 163 |
+
|
| 164 |
+
# ═══════════════════════════════════════════════════════════════
|
| 165 |
+
# معالجة متعددة البثوث
|
| 166 |
+
# ═══════════════════════════════════════════════════════════════
|
| 167 |
+
|
| 168 |
+
@stream_offload
|
| 169 |
+
def multi_stream_processing(streams_data, processing_mode="parallel"):
|
| 170 |
+
"""معالجة عدة بثوث في نفس الوقت"""
|
| 171 |
+
start_time = time.time()
|
| 172 |
+
|
| 173 |
+
logging.info(f"📡 معالجة متعددة البثوث - العدد: {len(streams_data)}")
|
| 174 |
+
logging.info(f"⚙️ وضع المعالجة: {processing_mode}")
|
| 175 |
+
|
| 176 |
+
results = {}
|
| 177 |
+
|
| 178 |
+
if processing_mode == "parallel":
|
| 179 |
+
# محاكاة المعالجة المتوازية
|
| 180 |
+
max_processing_time = max([s.get("complexity", 1) for s in streams_data]) * 0.1
|
| 181 |
+
time.sleep(min(max_processing_time, 2))
|
| 182 |
+
|
| 183 |
+
for i, stream in enumerate(streams_data):
|
| 184 |
+
stream_id = f"stream_{i+1}"
|
| 185 |
+
results[stream_id] = {
|
| 186 |
+
"status": "processed",
|
| 187 |
+
"quality": stream.get("quality", "1080p"),
|
| 188 |
+
"fps": stream.get("fps", 30),
|
| 189 |
+
"enhancement_applied": True,
|
| 190 |
+
"processing_node": f"node_{(i % 3) + 1}" # توزيع على 3 عقد
|
| 191 |
+
}
|
| 192 |
+
else:
|
| 193 |
+
# معالجة تسلسلية
|
| 194 |
+
total_time = sum([s.get("complexity", 1) for s in streams_data]) * 0.05
|
| 195 |
+
time.sleep(min(total_time, 3))
|
| 196 |
+
|
| 197 |
+
for i, stream in enumerate(streams_data):
|
| 198 |
+
stream_id = f"stream_{i+1}"
|
| 199 |
+
results[stream_id] = {
|
| 200 |
+
"status": "processed",
|
| 201 |
+
"quality": stream.get("quality", "1080p"),
|
| 202 |
+
"fps": stream.get("fps", 30),
|
| 203 |
+
"processing_order": i + 1
|
| 204 |
+
}
|
| 205 |
+
|
| 206 |
+
result = {
|
| 207 |
+
"status": "success",
|
| 208 |
+
"streams_processed": len(streams_data),
|
| 209 |
+
"processing_mode": processing_mode,
|
| 210 |
+
"results": results,
|
| 211 |
+
"total_processing_time": time.time() - start_time,
|
| 212 |
+
"average_quality": round(np.mean([30, 45, 60, 55]), 1), # محاكاة متوسط الجودة
|
| 213 |
+
"nodes_utilized": len(set([r.get("processing_node", "main") for r in results.values()]))
|
| 214 |
+
}
|
| 215 |
+
|
| 216 |
+
logging.info(f"✅ تمت معالجة {len(streams_data)} بث - العقد المستخدمة: {result['nodes_utilized']}")
|
| 217 |
+
return result
|
| 218 |
+
|
| 219 |
+
# ═══════════════════════════════════════════════════════════════
|
| 220 |
+
# ذكاء اصطناعي للبث
|
| 221 |
+
# ═══════════════════════════════════════════════════════════════
|
| 222 |
+
|
| 223 |
+
@stream_offload
|
| 224 |
+
def ai_commentary_generation(game_events, commentary_length, language="ar"):
|
| 225 |
+
"""توليد تعليق ذكي للألعاب"""
|
| 226 |
+
start_time = time.time()
|
| 227 |
+
|
| 228 |
+
logging.info(f"🤖 توليد تعليق ذكي - الطول: {commentary_length} كلمة")
|
| 229 |
+
|
| 230 |
+
# قوالب التعليق
|
| 231 |
+
commentary_templates = {
|
| 232 |
+
"ar": [
|
| 233 |
+
"حركة رائعة من اللاعب!",
|
| 234 |
+
"هذا هدف مذهل!",
|
| 235 |
+
"دفاع قوي في هذه اللحظة",
|
| 236 |
+
"استراتيجية ممتازة",
|
| 237 |
+
"أداء استثنائي!"
|
| 238 |
+
],
|
| 239 |
+
"en": [
|
| 240 |
+
"Amazing move by the player!",
|
| 241 |
+
"What a fantastic goal!",
|
| 242 |
+
"Strong defense right there",
|
| 243 |
+
"Excellent strategy",
|
| 244 |
+
"Outstanding performance!"
|
| 245 |
+
]
|
| 246 |
+
}
|
| 247 |
+
|
| 248 |
+
processing_time = commentary_length * 0.02 # 0.02 ثانية لكل كلمة
|
| 249 |
+
time.sleep(min(processing_time, 1))
|
| 250 |
+
|
| 251 |
+
# توليد التعليق
|
| 252 |
+
templates = commentary_templates.get(language, commentary_templates["ar"])
|
| 253 |
+
generated_commentary = []
|
| 254 |
+
|
| 255 |
+
for i in range(min(commentary_length // 5, len(game_events))):
|
| 256 |
+
template = np.random.choice(templates)
|
| 257 |
+
generated_commentary.append(template)
|
| 258 |
+
|
| 259 |
+
result = {
|
| 260 |
+
"status": "success",
|
| 261 |
+
"language": language,
|
| 262 |
+
"commentary_length": len(generated_commentary),
|
| 263 |
+
"generated_text": generated_commentary,
|
| 264 |
+
"game_events_analyzed": len(game_events),
|
| 265 |
+
"processing_time": time.time() - start_time,
|
| 266 |
+
"emotion_detection": "excited", # محاكاة كشف المشاعر
|
| 267 |
+
"context_awareness": True
|
| 268 |
+
}
|
| 269 |
+
|
| 270 |
+
logging.info(f"✅ تم توليد التعليق - {len(generated_commentary)} جملة")
|
| 271 |
+
return result
|
| 272 |
+
|
| 273 |
+
@stream_offload
|
| 274 |
+
def stream_quality_optimization(stream_metadata, target_bandwidth, viewer_count):
|
| 275 |
+
"""تحسين جودة البث حسب النطاق الترددي وعدد المشاهدين"""
|
| 276 |
+
start_time = time.time()
|
| 277 |
+
|
| 278 |
+
logging.info(f"📊 تحسين جودة البث - المشاهدين: {viewer_count}")
|
| 279 |
+
logging.info(f"🌐 النطاق المستهدف: {target_bandwidth} Mbps")
|
| 280 |
+
|
| 281 |
+
# حساب الجودة المثلى
|
| 282 |
+
base_quality = min(target_bandwidth * 200, 1080) # حد أقصى 1080p
|
| 283 |
+
|
| 284 |
+
# تعديل حسب عدد المشاهدين
|
| 285 |
+
if viewer_count > 1000:
|
| 286 |
+
quality_adjustment = 0.8 # تقليل الجودة للأعداد الكبيرة
|
| 287 |
+
elif viewer_count > 100:
|
| 288 |
+
quality_adjustment = 0.9
|
| 289 |
+
else:
|
| 290 |
+
quality_adjustment = 1.0
|
| 291 |
+
|
| 292 |
+
optimized_quality = int(base_quality * quality_adjustment)
|
| 293 |
+
|
| 294 |
+
# تحديد FPS مناسب
|
| 295 |
+
if optimized_quality >= 1080:
|
| 296 |
+
optimal_fps = 60
|
| 297 |
+
elif optimized_quality >= 720:
|
| 298 |
+
optimal_fps = 45
|
| 299 |
+
else:
|
| 300 |
+
optimal_fps = 30
|
| 301 |
+
|
| 302 |
+
time.sleep(0.5) # محاكاة المعالجة
|
| 303 |
+
|
| 304 |
+
result = {
|
| 305 |
+
"status": "success",
|
| 306 |
+
"original_quality": stream_metadata.get("quality", "1080p"),
|
| 307 |
+
"optimized_quality": f"{optimized_quality}p",
|
| 308 |
+
"optimal_fps": optimal_fps,
|
| 309 |
+
"target_bandwidth": target_bandwidth,
|
| 310 |
+
"viewer_count": viewer_count,
|
| 311 |
+
"bandwidth_saved": round(max(0, (1080 - optimized_quality) / 1080 * 100), 1),
|
| 312 |
+
"processing_time": time.time() - start_time,
|
| 313 |
+
"adaptive_streaming": True
|
| 314 |
+
}
|
| 315 |
+
|
| 316 |
+
logging.info(f"✅ تم تحسين البث - الجودة: {result['optimized_quality']}")
|
| 317 |
+
return result
|
| 318 |
+
|
| 319 |
+
# ═══════════════════════════════════════════════════════════════
|
| 320 |
+
# إدارة البث المباشر
|
| 321 |
+
# ═══════════════════════════════════════════════════════════════
|
| 322 |
+
|
| 323 |
+
class LiveStreamCoordinator:
|
| 324 |
+
def __init__(self):
|
| 325 |
+
self.active_streams = {}
|
| 326 |
+
self.processing_history = []
|
| 327 |
+
|
| 328 |
+
def start_stream(self, stream_id, config):
|
| 329 |
+
"""بدء بث مباشر جديد"""
|
| 330 |
+
self.active_streams[stream_id] = {
|
| 331 |
+
"config": config,
|
| 332 |
+
"start_time": datetime.now(),
|
| 333 |
+
"status": "active",
|
| 334 |
+
"processing_nodes": [],
|
| 335 |
+
"viewers": 0
|
| 336 |
+
}
|
| 337 |
+
logging.info(f"🔴 بدء البث: {stream_id}")
|
| 338 |
+
|
| 339 |
+
def distribute_processing(self, stream_id, task_type, data):
|
| 340 |
+
"""توزيع معالجة البث على العقد المختلفة"""
|
| 341 |
+
if stream_id not in self.active_streams:
|
| 342 |
+
return {"error": "البث غير موجود"}
|
| 343 |
+
|
| 344 |
+
# اختيار العقدة المناسبة
|
| 345 |
+
best_node = self._select_processing_node(task_type)
|
| 346 |
+
|
| 347 |
+
# تنفيذ المعالجة
|
| 348 |
+
if best_node:
|
| 349 |
+
result = execute_remotely(task_type, [data], {})
|
| 350 |
+
self.active_streams[stream_id]["processing_nodes"].append(best_node)
|
| 351 |
+
return result
|
| 352 |
+
else:
|
| 353 |
+
# معالجة محلية
|
| 354 |
+
return self._process_locally(task_type, data)
|
| 355 |
+
|
| 356 |
+
def _select_processing_node(self, task_type):
|
| 357 |
+
"""اختيار أفضل عقدة للمعالجة"""
|
| 358 |
+
# منطق اختيار العقدة (مبسط)
|
| 359 |
+
return f"node_gpu_{np.random.randint(1, 4)}"
|
| 360 |
+
|
| 361 |
+
def _process_locally(self, task_type, data):
|
| 362 |
+
"""معالجة محلية احتياطية"""
|
| 363 |
+
return {"status": "processed_locally", "task": task_type}
|
| 364 |
+
|
| 365 |
+
# دالة اختبار شاملة للبث المباشر
|
| 366 |
+
def run_live_streaming_benchmark():
|
| 367 |
+
"""اختبار شامل لنظام البث المباشر"""
|
| 368 |
+
print("\n📺🎮 اختبار نظام البث المباشر للألعاب والفيديو")
|
| 369 |
+
print("=" * 70)
|
| 370 |
+
|
| 371 |
+
# بيانات تجريبية
|
| 372 |
+
game_stream_data = [f"frame_{i}" for i in range(60)] # 60 إطار
|
| 373 |
+
game_events = ["goal", "save", "foul", "corner", "yellow_card"]
|
| 374 |
+
|
| 375 |
+
multi_streams = [
|
| 376 |
+
{"quality": "1080p", "fps": 60, "complexity": 3},
|
| 377 |
+
{"quality": "720p", "fps": 30, "complexity": 2},
|
| 378 |
+
{"quality": "1440p", "fps": 45, "complexity": 4}
|
| 379 |
+
]
|
| 380 |
+
|
| 381 |
+
tests = [
|
| 382 |
+
("معالجة بث لعبة", lambda: process_game_stream(game_stream_data, 60, "1920x1080", ["noise_reduction", "color_enhancement", "sharpening"])),
|
| 383 |
+
("تحسين فيديو مباشر", lambda: real_time_video_enhancement(["upscaling", "noise_reduction", "hdr_enhancement"], "1080p", 60)),
|
| 384 |
+
("معالجة متعددة البثوث", lambda: multi_stream_processing(multi_streams, "parallel")),
|
| 385 |
+
("توليد تعليق ذكي", lambda: ai_commentary_generation(game_events, 50, "ar")),
|
| 386 |
+
("تحسين جودة البث", lambda: stream_quality_optimization({"quality": "1080p"}, 5.0, 500))
|
| 387 |
+
]
|
| 388 |
+
|
| 389 |
+
coordinator = LiveStreamCoordinator()
|
| 390 |
+
|
| 391 |
+
for test_name, test_func in tests:
|
| 392 |
+
print(f"\n🔄 تشغيل: {test_name}")
|
| 393 |
+
try:
|
| 394 |
+
result = test_func()
|
| 395 |
+
print(f"✅ نجح: {test_name}")
|
| 396 |
+
if "processing_time" in result:
|
| 397 |
+
print(f"⏱️ وقت المعالجة: {result['processing_time']:.2f}s")
|
| 398 |
+
if "quality_score" in result:
|
| 399 |
+
print(f"⭐ جودة: {result['quality_score']}%")
|
| 400 |
+
except Exception as e:
|
| 401 |
+
print(f"❌ فشل: {test_name} - {str(e)}")
|
| 402 |
+
|
| 403 |
+
print("\n🏁 انتهى اختبار البث المباشر")
|
| 404 |
+
|
| 405 |
+
if __name__ == "__main__":
|
| 406 |
+
run_live_streaming_benchmark()
|
load_balancer.py
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# load_balancer.py
|
| 2 |
+
import peer_discovery, requests, time, smart_tasks, psutil, socket
|
| 3 |
+
from peer_discovery import PORT
|
| 4 |
+
|
| 5 |
+
def send(peer, func, *args, **kw):
|
| 6 |
+
try:
|
| 7 |
+
r = requests.post(peer, json={"func": func,
|
| 8 |
+
"args": list(args),
|
| 9 |
+
"kwargs": kw}, timeout=12)
|
| 10 |
+
return r.json()
|
| 11 |
+
except Exception as e:
|
| 12 |
+
return {"error": str(e)}
|
| 13 |
+
|
| 14 |
+
def choose_peer():
|
| 15 |
+
"""اختيار أفضل جهاز - أولوية LAN ثم WAN"""
|
| 16 |
+
import socket
|
| 17 |
+
|
| 18 |
+
lan_peers = []
|
| 19 |
+
wan_peers = []
|
| 20 |
+
|
| 21 |
+
# تصنيف الأجهزة
|
| 22 |
+
for p in list(peer_discovery.PEERS):
|
| 23 |
+
ip = p.split('//')[1].split(':')[0] if '//' in p else p.split(':')[0]
|
| 24 |
+
if is_local_ip(ip):
|
| 25 |
+
lan_peers.append(p)
|
| 26 |
+
else:
|
| 27 |
+
wan_peers.append(p)
|
| 28 |
+
|
| 29 |
+
# أولاً: جرب الأجهزة المحلية (LAN)
|
| 30 |
+
best_lan = find_best_peer(lan_peers)
|
| 31 |
+
if best_lan:
|
| 32 |
+
return best_lan
|
| 33 |
+
|
| 34 |
+
# ثانياً: إذا لم تتوفر أجهزة محلية، جرب WAN
|
| 35 |
+
if internet_available():
|
| 36 |
+
best_wan = find_best_peer(wan_peers)
|
| 37 |
+
return best_wan
|
| 38 |
+
|
| 39 |
+
return None
|
| 40 |
+
|
| 41 |
+
def find_best_peer(peers):
|
| 42 |
+
"""العثور على أفضل جهاز من قائمة معينة"""
|
| 43 |
+
best = None
|
| 44 |
+
for p in peers:
|
| 45 |
+
try:
|
| 46 |
+
cpu = requests.get(p.replace("/run", "/cpu"), timeout=2).json()["usage"]
|
| 47 |
+
best = (p, cpu) if best is None or cpu < best[1] else best
|
| 48 |
+
except:
|
| 49 |
+
continue
|
| 50 |
+
return best[0] if best else None
|
| 51 |
+
|
| 52 |
+
def is_local_ip(ip):
|
| 53 |
+
"""فحص إذا كان IP محلي"""
|
| 54 |
+
return (
|
| 55 |
+
ip.startswith('192.168.') or
|
| 56 |
+
ip.startswith('10.') or
|
| 57 |
+
ip.startswith('172.') or
|
| 58 |
+
ip == '127.0.0.1'
|
| 59 |
+
)
|
| 60 |
+
|
| 61 |
+
def internet_available():
|
| 62 |
+
"""فحص توفر الإنترنت"""
|
| 63 |
+
try:
|
| 64 |
+
socket.create_connection(("8.8.8.8", 53), timeout=3)
|
| 65 |
+
return True
|
| 66 |
+
except:
|
| 67 |
+
return False
|
| 68 |
+
|
| 69 |
+
while True:
|
| 70 |
+
peer = choose_peer()
|
| 71 |
+
if peer:
|
| 72 |
+
print(f"\n🛰️ إرسال إلى {peer}")
|
| 73 |
+
res = send(peer, "prime_calculation", 30000)
|
| 74 |
+
else:
|
| 75 |
+
print("\n⚙️ لا أقران؛ العمل محليّ على", socket.gethostname())
|
| 76 |
+
res = smart_tasks.prime_calculation(30000)
|
| 77 |
+
print("🔹 النتيجة (جزئية):", str(res)[:120])
|
| 78 |
+
time.sleep(10)
|
main.py
ADDED
|
@@ -0,0 +1,298 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
import os
|
| 3 |
+
import json
|
| 4 |
+
import subprocess
|
| 5 |
+
import shutil
|
| 6 |
+
import socket
|
| 7 |
+
import time
|
| 8 |
+
import telegram_listener
|
| 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 |
+
"tinyllama-lite:latest",
|
| 19 |
+
"qwen2-0.5b-lite:latest",
|
| 20 |
+
"qwen2:0.5b",
|
| 21 |
+
"tinyllama:latest",
|
| 22 |
+
"llama3.2:1b"
|
| 23 |
+
]
|
| 24 |
+
|
| 25 |
+
# استيراد آمن لملف responses.py
|
| 26 |
+
try:
|
| 27 |
+
from responses import generate_reply as _generate_reply
|
| 28 |
+
except Exception:
|
| 29 |
+
def _generate_reply(*args, **kwargs):
|
| 30 |
+
return None
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
def ensure_ollama():
|
| 34 |
+
"""
|
| 35 |
+
يتحقّق من توفّر ollama CLI (باستخدام --version) ويضمن أن السيرفر شغّال.
|
| 36 |
+
لو السيرفر غير شغّال، يشغّله وينتظر جاهزيته.
|
| 37 |
+
"""
|
| 38 |
+
# استخدم المسار المباشر أولاً لتجنّب أي shadow لملف باسم 'ollama' داخل المشروع
|
| 39 |
+
win_exe = r"C:\Users\osamawin\AppData\Local\Programs\Ollama\ollama.exe"
|
| 40 |
+
cli = win_exe if os.path.exists(win_exe) else shutil.which("ollama")
|
| 41 |
+
if not cli:
|
| 42 |
+
raise RuntimeError("ollama CLI غير موجود. ثبّته أو أضِفه للـ PATH.")
|
| 43 |
+
|
| 44 |
+
# تأكّد من الـ CLI
|
| 45 |
+
try:
|
| 46 |
+
subprocess.run([cli, "--version"], check=True,
|
| 47 |
+
stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
| 48 |
+
except Exception as e:
|
| 49 |
+
raise RuntimeError("تعذّر تشغيل 'ollama --version'. تأكّد من التثبيت.") from e
|
| 50 |
+
|
| 51 |
+
# تحقّق من أن السيرفر يستمع؛ استخدم OLLAMA_HOST إن وُجد وإلا الافتراضي 127.0.0.1:11434
|
| 52 |
+
host = os.environ.get("OLLAMA_HOST", "127.0.0.1:11434")
|
| 53 |
+
ip, port = host.split(":")
|
| 54 |
+
port = int(port)
|
| 55 |
+
|
| 56 |
+
def _is_up():
|
| 57 |
+
try:
|
| 58 |
+
with socket.create_connection((ip, port), timeout=0.8):
|
| 59 |
+
return True
|
| 60 |
+
except OSError:
|
| 61 |
+
return False
|
| 62 |
+
|
| 63 |
+
if _is_up():
|
| 64 |
+
return
|
| 65 |
+
|
| 66 |
+
# شغّل السيرفر في الخلفية
|
| 67 |
+
cmd = [cli, "serve"]
|
| 68 |
+
if "OLLAMA_HOST" in os.environ:
|
| 69 |
+
cmd += ["--host", host]
|
| 70 |
+
subprocess.Popen(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
| 71 |
+
|
| 72 |
+
# انتظر الجاهزية (TCP)
|
| 73 |
+
for _ in range(60):
|
| 74 |
+
if _is_up():
|
| 75 |
+
return
|
| 76 |
+
time.sleep(0.2)
|
| 77 |
+
|
| 78 |
+
raise RuntimeError(f"فشل تشغيل ollama serve على {host}.")
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
def list_installed_models():
|
| 82 |
+
"""
|
| 83 |
+
يرجع قائمة أسماء النماذج المنصّبة محلياً عبر 'ollama list'.
|
| 84 |
+
"""
|
| 85 |
+
try:
|
| 86 |
+
out = subprocess.run(
|
| 87 |
+
["ollama", "list"],
|
| 88 |
+
check=True,
|
| 89 |
+
stdout=subprocess.PIPE,
|
| 90 |
+
stderr=subprocess.PIPE,
|
| 91 |
+
text=True
|
| 92 |
+
).stdout
|
| 93 |
+
except subprocess.CalledProcessError as e:
|
| 94 |
+
raise RuntimeError(f"خطأ عند قراءة قائمة النماذج: {e.stderr.strip() or e.stdout.strip()}")
|
| 95 |
+
|
| 96 |
+
models = []
|
| 97 |
+
for line in out.splitlines():
|
| 98 |
+
line = line.strip()
|
| 99 |
+
if not line or line.startswith("NAME") or line.startswith("-"):
|
| 100 |
+
continue
|
| 101 |
+
# السطر يبدأ بـ NAME ثم أعمدة أخرى، ناخذ أول عمود
|
| 102 |
+
parts = line.split()
|
| 103 |
+
if parts:
|
| 104 |
+
models.append(parts[0])
|
| 105 |
+
return models
|
| 106 |
+
|
| 107 |
+
|
| 108 |
+
def pick_default_model(installed):
|
| 109 |
+
for m in PREFERRED_MODELS:
|
| 110 |
+
if m in installed:
|
| 111 |
+
return m
|
| 112 |
+
if installed:
|
| 113 |
+
return installed[0]
|
| 114 |
+
raise RuntimeError("لا توجد نماذج منصّبة في Ollama. ثبّت نموذجاً أولاً (مثلاً: ollama pull mistral:instruct).")
|
| 115 |
+
|
| 116 |
+
|
| 117 |
+
def ollama_generate(model, prompt, timeout=120):
|
| 118 |
+
"""
|
| 119 |
+
يستدعي: ollama run <model> "<prompt>"
|
| 120 |
+
(بدون -p لأن إصدارك لا يدعمه)
|
| 121 |
+
"""
|
| 122 |
+
try:
|
| 123 |
+
res = subprocess.run(
|
| 124 |
+
["ollama", "run", model, prompt], # ← لا تستخدم -p
|
| 125 |
+
check=False,
|
| 126 |
+
stdout=subprocess.PIPE,
|
| 127 |
+
stderr=subprocess.PIPE,
|
| 128 |
+
text=True,
|
| 129 |
+
timeout=timeout,
|
| 130 |
+
)
|
| 131 |
+
out = (res.stdout or "").strip()
|
| 132 |
+
err = (res.stderr or "").strip()
|
| 133 |
+
|
| 134 |
+
if res.returncode != 0:
|
| 135 |
+
raise RuntimeError(err or out or "خروج غير صفري من ollama")
|
| 136 |
+
|
| 137 |
+
if not out:
|
| 138 |
+
raise RuntimeError(f"{model} لم يرجّع أي مخرجات.")
|
| 139 |
+
|
| 140 |
+
return out
|
| 141 |
+
except subprocess.TimeoutExpired:
|
| 142 |
+
raise RuntimeError(f"انتهى الوقت المحدد لطلب النموذج ({model}). جرّب لاحقاً أو خفّض طول البرومبت.")
|
| 143 |
+
|
| 144 |
+
|
| 145 |
+
def load_history():
|
| 146 |
+
if os.path.exists(HISTORY_PATH):
|
| 147 |
+
with open(HISTORY_PATH, "r", encoding="utf-8") as f:
|
| 148 |
+
return json.load(f)
|
| 149 |
+
return []
|
| 150 |
+
|
| 151 |
+
|
| 152 |
+
def save_history(history):
|
| 153 |
+
with open(HISTORY_PATH, "w", encoding="utf-8") as f:
|
| 154 |
+
json.dump(history, f, ensure_ascii=False, indent=2)
|
| 155 |
+
|
| 156 |
+
|
| 157 |
+
def simulate_server_scan():
|
| 158 |
+
print("نورا: أبحث عن خوادم...")
|
| 159 |
+
fake_servers = ["192.168.1.5", "192.168.1.10", "192.168.1.20"]
|
| 160 |
+
for server in fake_servers:
|
| 161 |
+
print(f"نورا: تم العثور على خادم مفتوح في {server}")
|
| 162 |
+
|
| 163 |
+
|
| 164 |
+
def format_chat_prompt(history, user_utterance):
|
| 165 |
+
"""
|
| 166 |
+
نبني برومبت بسيط يحافظ على سياق مختصر.
|
| 167 |
+
يمكنك تطويره لاحقاً لتنسيق ChatML أو JSON حسب النموذج.
|
| 168 |
+
"""
|
| 169 |
+
system = "أنت المساعدة نورا. تحدثي بلغة عربية فصحى بسيطة."
|
| 170 |
+
lines = [f"system: {system}"]
|
| 171 |
+
for msg in history[-6:]: # آخر 6 رسائل فقط لتقليل الطول
|
| 172 |
+
role = msg.get("role", "user")
|
| 173 |
+
content = msg.get("content", "")
|
| 174 |
+
lines.append(f"{role}: {content}")
|
| 175 |
+
lines.append(f"user: {user_utterance}")
|
| 176 |
+
lines.append("assistant:")
|
| 177 |
+
return "\n".join(lines)
|
| 178 |
+
|
| 179 |
+
|
| 180 |
+
def chat():
|
| 181 |
+
ensure_ollama()
|
| 182 |
+
installed = list_installed_models()
|
| 183 |
+
active_model = pick_default_model(installed)
|
| 184 |
+
|
| 185 |
+
chat_history = load_history()
|
| 186 |
+
|
| 187 |
+
print(f"""
|
| 188 |
+
نظام نورا الذكي (Ollama)
|
| 189 |
+
النموذج الحالي: {active_model}
|
| 190 |
+
|
| 191 |
+
أوامر خاصة:
|
| 192 |
+
- /models : عرض النماذج المنصّبة
|
| 193 |
+
- /model NAME : تبديل النموذج (مثال: /model mistral:instruct)
|
| 194 |
+
- scan : مسح الشبكة (محاكاة)
|
| 195 |
+
- خروج | exit | quit : إنهاء المحادثة
|
| 196 |
+
""")
|
| 197 |
+
|
| 198 |
+
while True:
|
| 199 |
+
try:
|
| 200 |
+
user_input = input("أنت: ").strip()
|
| 201 |
+
if not user_input:
|
| 202 |
+
continue
|
| 203 |
+
|
| 204 |
+
low = user_input.lower()
|
| 205 |
+
if low in ["خروج", "exit", "quit"]:
|
| 206 |
+
break
|
| 207 |
+
|
| 208 |
+
if low == "scan":
|
| 209 |
+
simulate_server_scan()
|
| 210 |
+
continue
|
| 211 |
+
|
| 212 |
+
if low == "/models":
|
| 213 |
+
print("النماذج المتاحة محلياً:")
|
| 214 |
+
for m in installed:
|
| 215 |
+
print(" -", m)
|
| 216 |
+
continue
|
| 217 |
+
|
| 218 |
+
if low.startswith("/model"):
|
| 219 |
+
# صيغة: /model NAME
|
| 220 |
+
parts = user_input.split(maxsplit=1)
|
| 221 |
+
if len(parts) == 1:
|
| 222 |
+
print(f"النموذج الحالي: {active_model}")
|
| 223 |
+
continue
|
| 224 |
+
candidate = parts[1].strip()
|
| 225 |
+
if candidate not in installed:
|
| 226 |
+
print(f"⚠️ النموذج '{candidate}' غير منصّب. النماذج المتاحة: {', '.join(installed)}")
|
| 227 |
+
continue
|
| 228 |
+
active_model = candidate
|
| 229 |
+
print(f"✅ تم تبديل النموذج إلى: {active_model}")
|
| 230 |
+
continue
|
| 231 |
+
|
| 232 |
+
# أولاً: ردود مخصصة من responses.py إن توفرت
|
| 233 |
+
custom_reply = None
|
| 234 |
+
try:
|
| 235 |
+
r = _generate_reply(user_input, username="أسامة")
|
| 236 |
+
# تجاهل رسالة الخطأ الجاهزة كي لا توقف تدفق الرد من النموذج
|
| 237 |
+
if r and not r.strip().startswith("عذراً، حدث خطأ"):
|
| 238 |
+
custom_reply = r
|
| 239 |
+
except Exception:
|
| 240 |
+
custom_reply = None
|
| 241 |
+
|
| 242 |
+
if custom_reply is not None:
|
| 243 |
+
print("نورا:", custom_reply)
|
| 244 |
+
chat_history.append({"role": "user", "content": user_input})
|
| 245 |
+
chat_history.append({"role": "assistant", "content": custom_reply})
|
| 246 |
+
if len(chat_history) % 3 == 0:
|
| 247 |
+
save_history(chat_history)
|
| 248 |
+
continue
|
| 249 |
+
|
| 250 |
+
# إذا لا يوجد رد مخصص → نستخدم النموذج النشط عبر Ollama
|
| 251 |
+
chat_history.append({"role": "user", "content": user_input})
|
| 252 |
+
prompt = format_chat_prompt(chat_history, user_input)
|
| 253 |
+
print("نورا: أفكر... (", active_model, ")")
|
| 254 |
+
try:
|
| 255 |
+
model_reply = ollama_generate(active_model, prompt)
|
| 256 |
+
except RuntimeError as e:
|
| 257 |
+
# فشل؟ جرّب بدائل بالتتابع مع طباعة سبب الفشل
|
| 258 |
+
print(f"⚠️ فشل مع {active_model}: {e}\n🔁 أجرب بدائل...")
|
| 259 |
+
fallback = None
|
| 260 |
+
for m in PREFERRED_MODELS:
|
| 261 |
+
if m in installed and m != active_model:
|
| 262 |
+
try:
|
| 263 |
+
print(f"→ تجربة {m} ...")
|
| 264 |
+
model_reply = ollama_generate(m, prompt)
|
| 265 |
+
fallback = m
|
| 266 |
+
break
|
| 267 |
+
except Exception as ee:
|
| 268 |
+
print(f" × فشل {m}: {ee}")
|
| 269 |
+
continue
|
| 270 |
+
if fallback is None:
|
| 271 |
+
print("نورا: حدث خطأ:", str(e))
|
| 272 |
+
continue
|
| 273 |
+
else:
|
| 274 |
+
active_model = fallback
|
| 275 |
+
print(f"✅ تم التبديل تلقائياً إلى: {active_model}")
|
| 276 |
+
|
| 277 |
+
# غالباً المخرجات ستكون مجرد نص رد
|
| 278 |
+
assistant_response = model_reply.strip()
|
| 279 |
+
print("نورا:", assistant_response)
|
| 280 |
+
chat_history.append({"role": "assistant", "content": assistant_response})
|
| 281 |
+
|
| 282 |
+
# احفظ كل 3 رسائل لتقليل الكتابة
|
| 283 |
+
if len(chat_history) % 3 == 0:
|
| 284 |
+
save_history(chat_history)
|
| 285 |
+
|
| 286 |
+
except KeyboardInterrupt:
|
| 287 |
+
print("\nنورا: تم إنهاء المحادثة.")
|
| 288 |
+
break
|
| 289 |
+
except Exception as e:
|
| 290 |
+
print(f"نورا: حدث خطأ: {str(e)}")
|
| 291 |
+
continue
|
| 292 |
+
|
| 293 |
+
# حفظ السجل النهائي عند الخروج
|
| 294 |
+
save_history(chat_history)
|
| 295 |
+
|
| 296 |
+
|
| 297 |
+
if __name__ == "__main__":
|
| 298 |
+
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.py
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# memory.py
|
| 2 |
+
# -*- coding: utf-8 -*-
|
| 3 |
+
"""
|
| 4 |
+
ذاكرة المستخدم/العامة + قاعدة المعرفة في ملف واحد، بدون أي استيراد عكسي (circular import).
|
| 5 |
+
يوفّر:
|
| 6 |
+
- load_memory(user_id) / save_memory(user_id, data)
|
| 7 |
+
- load_global_memory() / save_global_memory(data)
|
| 8 |
+
- load_knowledge_base() / save_knowledge_base(data)
|
| 9 |
+
- learn_from_unknown(prompt) / update_knowledge_base(prompt, answer)
|
| 10 |
+
"""
|
| 11 |
+
|
| 12 |
+
from __future__ import annotations
|
| 13 |
+
import json
|
| 14 |
+
import os
|
| 15 |
+
import tempfile
|
| 16 |
+
import threading
|
| 17 |
+
from typing import Any, Dict
|
| 18 |
+
|
| 19 |
+
# ========= مسارات التخزين =========
|
| 20 |
+
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
|
| 21 |
+
|
| 22 |
+
# مجلد بيانات الذاكرة
|
| 23 |
+
DATA_DIR = os.path.join(BASE_DIR, "data")
|
| 24 |
+
os.makedirs(DATA_DIR, exist_ok=True)
|
| 25 |
+
|
| 26 |
+
# ملفات الذاكرة
|
| 27 |
+
GLOBAL_MEMORY_FILE = os.path.join(DATA_DIR, "global_memory.json")
|
| 28 |
+
USER_MEMORY_PREFIX = "memory_" # memory_<user_id>.json
|
| 29 |
+
|
| 30 |
+
# ملف قاعدة المعرفة (متوافق مع نسختك السابقة)
|
| 31 |
+
knowledge_base_path = os.path.join(BASE_DIR, "knowledge_base.json")
|
| 32 |
+
|
| 33 |
+
# قفل للتزامن
|
| 34 |
+
_lock = threading.RLock()
|
| 35 |
+
|
| 36 |
+
# ========= أدوات JSON آمنة =========
|
| 37 |
+
def _safe_write_json(path: str, data: Dict[str, Any]) -> None:
|
| 38 |
+
"""
|
| 39 |
+
كتابة ذرّية لضمان عدم تلف الملف حتى مع انقطاع مفاجئ.
|
| 40 |
+
"""
|
| 41 |
+
with _lock:
|
| 42 |
+
os.makedirs(os.path.dirname(path), exist_ok=True)
|
| 43 |
+
fd, tmp_path = tempfile.mkstemp(prefix=".tmp_", dir=os.path.dirname(path))
|
| 44 |
+
try:
|
| 45 |
+
with os.fdopen(fd, "w", encoding="utf-8") as f:
|
| 46 |
+
json.dump(data, f, ensure_ascii=False, indent=2)
|
| 47 |
+
f.flush()
|
| 48 |
+
os.fsync(f.fileno())
|
| 49 |
+
os.replace(tmp_path, path)
|
| 50 |
+
finally:
|
| 51 |
+
if os.path.exists(tmp_path):
|
| 52 |
+
try:
|
| 53 |
+
os.remove(tmp_path)
|
| 54 |
+
except OSError:
|
| 55 |
+
pass
|
| 56 |
+
|
| 57 |
+
def _read_json(path: str) -> Dict[str, Any]:
|
| 58 |
+
"""
|
| 59 |
+
قراءة JSON بأمان. يعيد dict فارغ عند عدم وجود الملف أو في حال تلفه.
|
| 60 |
+
"""
|
| 61 |
+
with _lock:
|
| 62 |
+
if not os.path.exists(path):
|
| 63 |
+
return {}
|
| 64 |
+
try:
|
| 65 |
+
with open(path, "r", encoding="utf-8") as f:
|
| 66 |
+
return json.load(f)
|
| 67 |
+
except Exception:
|
| 68 |
+
return {}
|
| 69 |
+
|
| 70 |
+
def _user_file(user_id: str) -> str:
|
| 71 |
+
"""
|
| 72 |
+
تكوين اسم ملف آمن للمستخدم.
|
| 73 |
+
"""
|
| 74 |
+
safe_id = "".join(ch for ch in str(user_id) if ch.isalnum() or ch in ("-", "_")) or "default"
|
| 75 |
+
return os.path.join(DATA_DIR, f"{USER_MEMORY_PREFIX}{safe_id}.json")
|
| 76 |
+
|
| 77 |
+
# ========= واجهة الذاكرة (لـ learner.py) =========
|
| 78 |
+
def load_memory(user_id: str) -> Dict[str, Any]:
|
| 79 |
+
"""
|
| 80 |
+
قراءة ذاكرة مستخدم (dict).
|
| 81 |
+
"""
|
| 82 |
+
return _read_json(_user_file(user_id))
|
| 83 |
+
|
| 84 |
+
def save_memory(user_id: str, data: Dict[str, Any]) -> None:
|
| 85 |
+
"""
|
| 86 |
+
حفظ ذاكرة مستخدم (dict).
|
| 87 |
+
"""
|
| 88 |
+
if not isinstance(data, dict):
|
| 89 |
+
raise TypeError("save_memory expects a dict")
|
| 90 |
+
_safe_write_json(_user_file(user_id), data)
|
| 91 |
+
|
| 92 |
+
def load_global_memory() -> Dict[str, Any]:
|
| 93 |
+
"""
|
| 94 |
+
قراءة الذاكرة العامة (dict).
|
| 95 |
+
"""
|
| 96 |
+
return _read_json(GLOBAL_MEMORY_FILE)
|
| 97 |
+
|
| 98 |
+
def save_global_memory(data: Dict[str, Any]) -> None:
|
| 99 |
+
"""
|
| 100 |
+
حفظ الذاكرة العامة (dict).
|
| 101 |
+
"""
|
| 102 |
+
if not isinstance(data, dict):
|
| 103 |
+
raise TypeError("save_global_memory expects a dict")
|
| 104 |
+
_safe_write_json(GLOBAL_MEMORY_FILE, data)
|
| 105 |
+
|
| 106 |
+
# ========= واجهة قاعدة المعرفة (متوافقة مع نسختك السابقة) =========
|
| 107 |
+
def load_knowledge_base() -> Dict[str, Any]:
|
| 108 |
+
return _read_json(knowledge_base_path)
|
| 109 |
+
|
| 110 |
+
def save_knowledge_base(data: Dict[str, Any]) -> None:
|
| 111 |
+
if not isinstance(data, dict):
|
| 112 |
+
raise TypeError("save_knowledge_base expects a dict")
|
| 113 |
+
_safe_write_json(knowledge_base_path, data)
|
| 114 |
+
|
| 115 |
+
def learn_from_unknown(prompt: str):
|
| 116 |
+
"""
|
| 117 |
+
نفس السلوك السابق: يطبع رسالة ويطلب إجابة ليتم تعلمها.
|
| 118 |
+
"""
|
| 119 |
+
print("نورا: لا أملك إجابة لهذا السؤال حاليًا. سأبحث عن إجابة وأتعلم.")
|
| 120 |
+
answer = input("يرجى تزويدي بالإجابة المناسبة لأتعلمها: ")
|
| 121 |
+
if answer and answer.strip():
|
| 122 |
+
return answer
|
| 123 |
+
return None
|
| 124 |
+
|
| 125 |
+
def update_knowledge_base(prompt: str, answer: str) -> None:
|
| 126 |
+
kb = load_knowledge_base()
|
| 127 |
+
kb[prompt] = answer
|
| 128 |
+
save_knowledge_base(kb)
|
| 129 |
+
|
| 130 |
+
# ========= تصدير الأسماء =========
|
| 131 |
+
__all__ = [
|
| 132 |
+
"load_memory", "save_memory", "load_global_memory", "save_global_memory",
|
| 133 |
+
"load_knowledge_base", "save_knowledge_base",
|
| 134 |
+
"learn_from_unknown", "update_knowledge_base",
|
| 135 |
+
]
|
| 136 |
+
|
| 137 |
+
# ========= اختبار سريع =========
|
| 138 |
+
if __name__ == "__main__":
|
| 139 |
+
uid = "osama"
|
| 140 |
+
|
| 141 |
+
# اختبار ذاكرة المستخدم/العامة
|
| 142 |
+
u = load_memory(uid)
|
| 143 |
+
u["counter"] = u.get("counter", 0) + 1
|
| 144 |
+
save_memory(uid, u)
|
| 145 |
+
|
| 146 |
+
g = load_global_memory()
|
| 147 |
+
g["last_user"] = uid
|
| 148 |
+
save_global_memory(g)
|
| 149 |
+
|
| 150 |
+
print("User memory:", load_memory(uid))
|
| 151 |
+
print("Global memory:", load_global_memory())
|
| 152 |
+
|
| 153 |
+
# اختبار قاعدة المعرفة
|
| 154 |
+
update_knowledge_base("ما هي نورا؟", "مساعد ذكي")
|
| 155 |
+
print("KB size:", len(load_knowledge_base()))
|
memory_1421046090.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
+
"مرحبا": "وجدت هذه النتائج داخل المشروع:\n\n📄 core.py:12\n return f\"سؤال رائع! دعني أفكر في: {message}\"\n \n if any(word in message for word in ['مرحبا', 'السلام', 'أهلاً']):\n return \"أهلاً بك! كيف يمكنني مساعدتك اليوم؟\"\n \n\n📄 history.json:28\n {\n \"role\": \"user\",\n \"content\": \"مرحبا\"\n },\n {\n\n📄 history.json:36\n {\n \"role\": \"user\",\n \"content\": \"مرحبا\"\n },\n {\n",
|
| 18 |
+
"كيف حالك": "وجدت هذه النتائج داخل المشروع:\n\n📄 global_memory.json:22\n \"تعال نيكني\": \"رد تلقائي: ينكين لاعت\",\n \"شو اسمك؟\": \"رد تلقائي: ؟كمسا وش\",\n \"osama dawood: ان تدعم المسجد ثم تحارب مبادئ هذا المسجد هذا النفاق Marin: ولذلك لا يوجد أي محظورات على الزواج الإسلامي. osama dawood: في مدى التاريخ الاسلامي لم يتدخل الحكم الاسلامي فيكا يحدث داخل الكنائس Marin: الدولة لا تقاتل osama dawood: او فيما يحدث داخل البيوت كان دائما يتعامل مع الافعال في الطريق دينك يسمحلك تشرب الخمر؟؟ اشربه في البيت وليس في الشارع Marin: أنت لا تفهم ما يحدث في روسيا. أنت تحكم بشكل خاطئ. osama dawood: دولة علمانية بطابع مسيحي كيف لا افهم Marin: نحن نمنع شرب الكحول في الشارع. وفقًا للقانون، يتم فرض غرامة أو عمل إصلاحي osama dawood: محاكم التفتيش في الاندلس قامت بحركة تشبه ما يفعله العلمانيون اليوم وهي رفع لحم الخنزير بيد واليد الاخرى فيها سيف اما ان تخالف الإسلام وتأكل الخنزير او يتم قتلك Marin: ديني يمنعني من ...",
|
| 19 |
+
"1+1=?": "إجابة مختصرة من المعرفة المحلية:\n- flask==3.0.3 flask-login==0.6.3 flask-session gunicorn==21.2.0 requests==2.31.0 werkzeug==3.0.1 python-dotenv==1.0.1 openai==1.30.1 langchain==0.1.20\n- torch==2.2.0 Pillow==10.3.0 opencv-python-headless ffmpeg-python pydub beautifulsoup4==4.12.3 playwright selenium undetected-chromedriver PyPDF2 pytesseract",
|
| 20 |
+
"طيز": "مرحبا! كيف يمكنني مساعدتك اليوم؟",
|
| 21 |
+
"بزاز": "مرحبا! كيف يمكنني مساعدتك اليوم؟",
|
| 22 |
+
"ارسمي بزازك": "مرحبا! كيف يمكنني مساعدتك اليوم؟",
|
| 23 |
+
"ما اسمك": "مرحبا، كيف يمكنني مساعدتك اليوم؟",
|
| 24 |
+
"ارسمي": "مرحبا، كيف يمكنني مساعدتك اليوم؟"
|
| 25 |
+
}
|
memory_777000.json
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"الصفحة مهددة بالاغلاقمتابعات | تهجير غزة وإسرائيل الكبرى وحل الدولتين\nنعلّق على ثلاثة تطورات في أزمة ومأساة قطاع غزة: إصرار نتنياهو على اكتساح القطاع وتهجير أهله بالرغم من كل التنديد الدولي، وصدور تصريحات واضحة من الاحتلال بأن هدفهم هو \"إسرائيل الكبرى\" التي لا تعترف بحدودها الحالية وتسعى للتوسع على حساب الدول المطبعة معها، وحل الدولتين الذي تحاول الدول العربية والأوروبية التوصل له بينما يعلن الاحتلال رفضه التام.إعداد وتقديم أحمد دعدوش:https://ift.tt/NL4a8jthttps://ift.tt/YNPE1Gbشكرًا على تفاعلكم الذي يساهم في نشر أعمالنا ويحقق رسالتنا في زيادة الوعي.==========================بدعمكم نستمر========لدعم مشروع السبيل مالياً عبر باتريون:http://bit.ly/alsabeel-patreonللدعم عبر باي بال:paypal.me/alsabeelwebللدعم عبر فيسبوك:http://bit.ly/Become-a-supporter========تابعوا صفحتنا الدولية Al-Sabeel International وحدثوا عنها أصدقاءكم من غير العرب:https://ift.tt/EYgxIZw========لاستكشاف موسوعة السبيل والمزيد من المقالات المتجددة زوروا موقعنا: http://bit.ly/alsabeel-website ========السبيل على منصات التواصل الاجتماعي:فيسبوكhttp://bit.ly/alsabeel-facebookتويترhttp://bit.ly/alsabeel-twitterانستغرامhttp://bit.ly/alsabeel-instagramتيليغرامhttp://bit.ly/alsabeel-telegramتيكتوكhttps://bit.ly/AlSabeelTikTok\nvia YouTube https://www.youtube.com/watch?v=-kZVr0IyjrU\n #البيت_العورتاني": "إجابة مختصرة من المعرفة المحلية:\n- SpeechRecognition python-telegram-bot telegram schedule aiohttp replit paramiko\n- torch==2.2.0 Pillow==10.3.0 opencv-python-headless ffmpeg-python pydub beautifulsoup4==4.12.3 playwright selenium undetected-chromedriver PyPDF2 pytesseract\n- flask==3.0.3 flask-login==0.6.3 flask-session gunicorn==21.2.0 requests==2.31.0 werkzeug==3.0.1 python-dotenv==1.0.1 openai==1.30.1 langchain==0.1.20",
|
| 3 |
+
"الصفحة مهددة بالاغلاقأسماء سعيد - نفس مطمئنة | شهادات مزيفة وكيانات وهمية! | أدلة جديدة\n#الأسماء_الحسنى #صحة_نفسية #صحة_نفسية #علاقات_اسرية #الزواج #جذب_شريك_الحياة #القرآن_الكريم #قانون_الجذب #توأم_الشعلة #الزوهرى #الاسقاط_النجمي #الطاقة_الإيجابية #طاقة_الأنوثة رابط حساب الباتريون للمساهمة في دعم برنامج قرار إزالة:https://ift.tt/noryKe0=======كيفية تقديم الدعم عبر باتريون ؟* Become a Patreon أضغط على الزر في أعلى الصفحة* أختر المبلغ الذي تريد الدعم به* أختر وسيلة الدفع المناسبة لك إما من خلال الكارت الخاص بك أو من خلال الباي بال* قم بادخال بيانات الكارت الخاص بك* Continue ثم أضغط على=======ملحوظتين في غاية الأهمية:* الموقع آمن جدًا وهو موقع عالمي معترف به من الحكومة الأميريكية وغيرها فلا تخف على بياناتك* إذا كنت تقوم بدعمنا لأول مرة، فإن الموقع سيقوم بسحب مبلغ الدعم لهذا الشهر فوراً، وهذا من أجل التأكد من صحة بياناتك، وعند بداية الشهر الميلادي الجديد، سيقوم الموقع بسحب نفس مبلغ الدعم المحدد، وهكذا شهرياً في بداية كل شهر ميلادي سيتم دعمنا بالمبلغ الذي اخترته، فإذا كنت تريد دعمنا بمبلغ معين لمرة واحدة، فيمكنك الغاء اشتراك الدعم في أي وقت قبل بداية الشهر الميلادي الجديد، أو يمكنك الاستمرار بدعمنا بشكل شهري، وإذا كنت تريد الدعم بمبلغ شهري متغير فيمكن لك أن تفعل هذه العملية كل شهر وبعد سحب المبلغ تقوم بإلغاء إشتراكك في هذا الشهر ثم إعادة الإشتراك مرة أخرى في الشهر الذي يليه وهكذا.=====================برنامج \" قرار إزالة \" هو برنامج للرد و التعليق على ما يثيره بعض الأشخاص من شبهات حول الإسلام . في كل حلقة نتناول بعض شبهات شخص أو أكثر بالنقد و التفنيد و بيان مواضع الخطأ - في حالة وجود خطأ - أو الكذب و ال��دليس - في حالة وجود كذب أو تدليس - و نحرص على عرض كلام الشخص (( موثقًا بالفيديو )) قبل التعليق عليه و تفنيده لمزيد من الشفافية و الوضوح .في حلقاتنا نلتزم بالرد المدعم بالأدلة و البراهين النقلية و العقلية .. و كثيراً ما نعتمد في نقدنا على كلام الشخص صاحب الشبهة نفسه موثقًا بالفيديو أيضًا .و دائماً و أبداً يبقى حق الاختلاف و الرد مكفول للجميعالبرنامج كذلك يكشف حقيقة مدربي الطاقة ( مثل احمد عمارة - ايهاب حمارنة - صلاح الراشد ) وما يعرف بالعلاج بالطاقة بكافة أشكالها (البرانا - الثيتاهيلينج - الاكسس بارز - التاروت - قوانين الاستحقاق - مدمن نجاح - سينكرونايز ) ============================== لا تنس الضغط على زر الإعجاب إذا أعجبك الفيديوو لا تنس الاشتراك في القناة و تفعيل زر الجرس ليصلك جديد الفيديوهاتالصفحة الرسمية لبرنامج قرار إزالة :https://ift.tt/QLUb65wالحساب الرسمي لبرنامج قرار إزالة على تويتر :https://twitter.com/qarar_izala?lang=ar\nvia YouTube https://www.youtube.com/watch?v=pbyczpUEaaU\n #البيت_العورتاني": "إجابة مختصرة من المعرفة المحلية:\n- SpeechRecognition python-telegram-bot telegram schedule aiohttp replit paramiko\n- flask==3.0.3 flask-login==0.6.3 flask-session gunicorn==21.2.0 requests==2.31.0 werkzeug==3.0.1 python-dotenv==1.0.1 openai==1.30.1 langchain==0.1.20\n- torch==2.2.0 Pillow==10.3.0 opencv-python-headless ffmpeg-python pydub beautifulsoup4==4.12.3 playwright selenium undetected-chromedriver PyPDF2 pytesseract",
|
| 4 |
+
"الصفحة مهددة بالاغلاق يرجى الدعمما هو تعليقك على هذا؟\"أسماء سعيد - نفس مطمئنة | شهادات مزيفة وكيانات وهمية! | أدلة جديدة\n#الأسماء_الحسنى #صحة_نفسية #صحة_نفسية #علاقات_اسرية #الزواج #جذب_شريك_الحياة #القرآن_الكريم #قانون_الجذب #توأم_الشعلة #الزوهرى #الاسقاط_النجمي #الطاقة_الإيجابية #طاقة_الأنوثة رابط حساب الباتريون للمساهمة في دعم برنامج قرار إزالة:https://ift.tt/3NPQyi1=======كيفية تقديم الدعم عبر باتريون ؟* Become a Patreon أضغط على الزر في أعلى الصفحة* أختر المبلغ الذي تريد الدعم به* أختر وسيلة الدفع المناسبة لك إما من خلال الكارت الخاص بك أو من خلال الباي بال* قم بادخال بيانات الكارت الخاص بك* Continue ثم أضغط على=======ملحوظتين في غاية الأهمية:* الموقع آمن جدًا وهو موقع عالمي معترف به من الحكومة الأميريكية وغيرها فلا تخف على بياناتك* إذا كنت تقوم بدعمنا لأول مرة، فإن الموقع سيقوم بسحب مبلغ الدعم لهذا الشهر فوراً، وهذا من أجل التأكد من صحة بياناتك، وعند بداية الشهر الميلادي الجديد، سيقوم الموقع بسحب نفس مبلغ الدعم المحدد، وهكذا شهرياً في بداية كل شهر ميلادي سيتم دعمنا بالمبلغ الذي اخترته، فإذا كنت تريد دعمنا بمبلغ معين لمرة واحدة، فيمكنك الغاء اشتراك الدعم في أي وقت قبل بداية الشهر الميلادي الجديد، أو يمكنك الاستمرار بدعمنا بشكل شهري، وإذا كنت تريد الدعم بمبلغ شهري متغير فيمكن لك أن تفعل هذه العملية كل شهر وبعد سحب المبلغ تقوم بإلغاء إشتراكك في هذا الشهر ثم إعادة الإشتراك مرة أخرى في الشهر الذي يليه وهكذا.=====================برنامج \" قرار إزالة \" هو برنامج للرد و التعليق على ما يثيره بعض الأشخاص من شبهات حول الإسلام . في كل حلقة نتناول بعض شبهات شخص أو أكثر بالنقد و التفنيد و بيان مواضع الخطأ - في حالة وجود خطأ - أو الكذب و التدليس - في حالة وجود كذب أو تدليس - و نحرص على عرض كلام الشخص (( موثقًا بالفيديو )) قبل التعليق عليه و تفنيده لمزيد من الشفافية و الوضوح .في حلقاتنا نلتزم بالرد المدعم بالأدلة و البراهين النقلية و العقلية .. و كثيراً ما نعتمد في نقدنا على كلام الشخص صاحب الشبهة نفسه موثقًا بالفيديو أيضًا .و دائماً و أبداً يبقى حق الاختلاف و الرد مكفول للجميعالبرنامج كذلك يكشف حقيقة مدربي الطاقة ( مثل احمد عمارة - ايهاب حمارنة - صلاح الراشد ) وما يعرف بالعلاج بالطاقة بكافة أشكالها (البرانا - الثيتاهيلينج - الاكسس بارز - التاروت - قوانين الاستحقاق - مدمن نجاح - سينكرونايز ) ============================== لا تنس الضغط على زر الإعجاب إذا أعجبك الفيديوو لا تنس الاشتراك في القناة و تفعيل زر الجرس ليصلك جديد الفيديوهاتالصفحة الرسمية لبرنامج قرار إزالة :https://ift.tt/N5nYJ0aالحساب الرسمي لبرنامج قرار إزالة على تويتر :https://twitter.com/qarar_izala?lang=ar\nvia YouTube https://www.youtube.com/watch?v=pbyczpUEaaU\" \n #مقاطعة \n #حملة_لا_تدفع_ثمن_رصاصهم\n #البيت_العورتاني": "إجابة مختصرة من المعرفة المحلية:\n- SpeechRecognition python-telegram-bot telegram schedule aiohttp replit paramiko\n- flask==3.0.3 flask-login==0.6.3 flask-session gunicorn==21.2.0 requests==2.31.0 werkzeug==3.0.1 python-dotenv==1.0.1 openai==1.30.1 langchain==0.1.20\n- torch==2.2.0 Pillow==10.3.0 opencv-python-headless ffmpeg-python pydub beautifulsoup4==4.12.3 playwright selenium undetected-chromedriver PyPDF2 pytesseract",
|
| 5 |
+
"الصفحة مهددة بالاغلاقمحرج جدا٫٫ليه القساوسة مصممين يكذبوا على النصارى ويحرجوا نفسهم بالشكل ده 🤥🤥\nلدعم تطبيق وقناة مكافح الشبهات على بايبال: https://ift.tt/1rPQMvGلدعم تطبيق وقناة مكافح الشبهات على باتريون: https://ift.tt/xhbXRpMلدعم القناة على فودافون كاش: 01018817602-------------------------------------مكافح الشبهات على واتساب: https://ift.tt/vn8Jo7Wمكافح الشبهات على تليجرام: https://ift.tt/b4aSucoالموقع الرسمي لـ مكافح الشبهات: http://antishubohat.com مدونة مكافح الشبهات: https://ift.tt/PdS0JKnفيس بوك: https://ift.tt/kDn6y8f تويتر: https://twitter.com/AntiShubohat----------------------------------0:00 مقدمة0:57 النص المستدل به (عرض فيديو الأنبا رفائيل والقمص داوود لمعي)2:27 الرد2:37 الرد من كتب آباء الكنيسة القدامى5:13 الكتاب يتكلم عن إله واحد6:00 المعنى المقصود من النص11:40 معنى كلمة \"وروحه\" في النص15:37 حقيقة المسيح على لسانه16:26 الثالوث عقيدة وثنية22:00 دعوة صادقة وخاتمة----------------------------------حلقة جديدة من قناة مكافح الشبهات للحديث عن نص الرب أرسلني وروحه....-----------------------------------اللهم صلَّ وسلم وبارك على نبينا محمد ﷺ وعلى آله وصحبه أجمعين\nvia YouTube https://www.youtube.com/watch?v=_EiQUpVqGsI\n #البيت_العورتاني": "إجابة مختصرة من المعرفة المحلية:\n- SpeechRecognition python-telegram-bot telegram schedule aiohttp replit paramiko\n- flask==3.0.3 flask-login==0.6.3 flask-session gunicorn==21.2.0 requests==2.31.0 werkzeug==3.0.1 python-dotenv==1.0.1 openai==1.30.1 langchain==0.1.20\n- torch==2.2.0 Pillow==10.3.0 opencv-python-headless ffmpeg-python pydub beautifulsoup4==4.12.3 playwright selenium undetected-chromedriver PyPDF2 pytesseract",
|
| 6 |
+
"الصفحة مهددة بالاغلاق يرجى الدعمما هو تعليقك على هذا؟\"محرج جدا٫٫ليه القساوسة مصممين يكذبوا على النصارى ويحرجوا نفسهم بالشكل ده 🤥🤥\nلدعم تطبيق وقناة مكافح الشبهات على بايبال: https://ift.tt/TSC8sBEلدعم تطبيق وقناة مكافح الشبهات على باتريون: https://ift.tt/HcvqYkPلدعم القناة على فودافون كاش: 01018817602-------------------------------------مكافح الشبهات على واتساب: https://ift.tt/uyQbtXVمكافح الشبهات على تليجرام: https://ift.tt/qZabe3Mالموقع الرسمي لـ مكافح الشبهات: http://antishubohat.com مدونة مكافح الشبهات: https://ift.tt/8m6BLJEفيس بوك: https://ift.tt/fi2SWKL تويتر: https://twitter.com/AntiShubohat----------------------------------0:00 مقدمة0:57 النص المستدل به (عرض فيديو الأنبا رفائيل والقمص داوود لمعي)2:27 الرد2:37 الرد من كتب آباء الكنيسة القدامى5:13 الكتاب يتكلم عن إله واحد6:00 المعنى المقصود من النص11:40 معنى كلمة \"وروحه\" في النص15:37 حقيقة المسيح على لسانه16:26 الثالوث عقيدة وثنية22:00 دعوة صادقة وخاتمة----------------------------------حلقة جديدة من قناة مكافح الشبهات للحديث عن نص الرب أرسلني وروحه....-----------------------------------اللهم صلَّ وسلم وبارك على نبينا محمد ﷺ وعلى آله وصحبه أجمعين\nvia YouTube https://www.youtube.com/watch?v=_EiQUpVqGsI\" \n #مقاطعة \n #حملة_لا_تدفع_ثمن_رصاصهم\n #البيت_العورتاني": "إجابة مختصرة من المعرفة المحلية:\n- SpeechRecognition python-telegram-bot telegram schedule aiohttp replit paramiko\n- flask==3.0.3 flask-login==0.6.3 flask-session gunicorn==21.2.0 requests==2.31.0 werkzeug==3.0.1 python-dotenv==1.0.1 openai==1.30.1 langchain==0.1.20\n- torch==2.2.0 Pillow==10.3.0 opencv-python-headless ffmpeg-python pydub beautifulsoup4==4.12.3 playwright selenium undetected-chromedriver PyPDF2 pytesseract",
|
| 7 |
+
"الصفحة مهددة بالاغلاقحوار مع أحد أتباع هشام البيلى حول غزة\nللتواصل مع القناة على الواتساب من خلال هذا الرابط https://wa.me/message/JHLUWKYDH4WOA1لدعم القناةعلى حساب باتريون من خلال هذا الرابط https://ift.tt/Z5cbQgPللدعم عن طريق حساب بيبال عن طريق هذا الرابط paypal.me/MohamedSamir81قناة محمد سمير البديلة عن طريق هذا الرابط ���https://www.youtube.com/channel/UCSTF...قناة محمد سمير فى التلجرام من خلال هذا الرابط @Suunnissللانتساب للقناة من خلال الرابطhttps://www.youtube.com/channel/UCOb61sAU0drXTV7DHbIN81Q/join\nvia YouTube https://www.youtube.com/watch?v=drjmD8oMUTY\n #البيت_العورتاني": "إجابة مختصرة من المعرفة المحلية:\n- torch==2.2.0 Pillow==10.3.0 opencv-python-headless ffmpeg-python pydub beautifulsoup4==4.12.3 playwright selenium undetected-chromedriver PyPDF2 pytesseract\n- flask==3.0.3 flask-login==0.6.3 flask-session gunicorn==21.2.0 requests==2.31.0 werkzeug==3.0.1 python-dotenv==1.0.1 openai==1.30.1 langchain==0.1.20\n- SpeechRecognition python-telegram-bot telegram schedule aiohttp replit paramiko",
|
| 8 |
+
"الصفحة مهددة بالاغلاق يرجى الدعمما هو تعليقك على هذا؟\"حوار مع أحد أتباع هشام البيلى حول غزة\nللتواصل مع القناة على الواتساب من خلال هذا الرابط https://wa.me/message/JHLUWKYDH4WOA1لدعم القناةعلى حساب باتريون من خلال هذا الرابط https://ift.tt/PZYMfOEللدعم عن طريق حساب بيبال عن طريق هذا الرابط paypal.me/MohamedSamir81قناة محمد سمير البديلة عن طريق هذا الرابط ���https://www.youtube.com/channel/UCSTF...قناة محمد سمير فى التلجرام من خلال هذا الرابط @Suunnissللانتساب للقناة من خلال الرابطhttps://www.youtube.com/channel/UCOb61sAU0drXTV7DHbIN81Q/join\nvia YouTube https://www.youtube.com/watch?v=drjmD8oMUTY\" \n #مقاطعة \n #حملة_لا_تدفع_ثمن_رصاصهم\n #البيت_العورتاني": "إجابة مختصرة من المعرفة المحلية:\n- torch==2.2.0 Pillow==10.3.0 opencv-python-headless ffmpeg-python pydub beautifulsoup4==4.12.3 playwright selenium undetected-chromedriver PyPDF2 pytesseract\n- flask==3.0.3 flask-login==0.6.3 flask-session gunicorn==21.2.0 requests==2.31.0 werkzeug==3.0.1 python-dotenv==1.0.1 openai==1.30.1 langchain==0.1.20\n- SpeechRecognition python-telegram-bot telegram schedule aiohttp replit paramiko"
|
| 9 |
+
}
|
memory_osama.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"طلب فعلي 💀": "وعليكم السلام! كيف يمكنني مساعدتك اليوم؟"
|
| 3 |
+
}
|
memory_أسامة.json
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"https://omsdmail.gumroad.com/l/amaloffloadhelperفقط": "I'm sorry, but I can't assist with that.",
|
| 3 |
+
"ok": "مرحبا! كيف يمكنني مساعدتك اليوم؟",
|
| 4 |
+
"ارسم سكس": "Sorry, but I can't assist with that.",
|
| 5 |
+
"حاول": "نعم، أنا هنا لمساعدتك. كيف يمكنني مساعدتك اليوم؟",
|
| 6 |
+
"ارسمي سكس": "مرحبا، كيف يمكنني مساعدتك اليوم؟",
|
| 7 |
+
"tinyllama:latest": "I'm sorry, but I can't assist with that.",
|
| 8 |
+
"mistral:instruct": "السلام عليكم، دكا! كيف يمكنني مساعدتك اليوم؟"
|
| 9 |
+
}
|
node_client.py
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
# ================================================================
|
| 3 |
+
# node_client.py – عميل تسجيل العُقدة في نظام AmalOffload
|
| 4 |
+
# ---------------------------------------------------------------
|
| 5 |
+
# • يختار منفذًا (من ENV أو من مجموعة PORTS).
|
| 6 |
+
# • يجلب عنوان الـ IP المحلي.
|
| 7 |
+
# • يحاول التسجيل في خادم سجلٍّ مركزي واحد تِلو الآخر،
|
| 8 |
+
# وعلى كل المنافذ، حتى ينجح.
|
| 9 |
+
# • عند النجاح يُرجع قائمة الأقران (Peers) من الخادم.
|
| 10 |
+
# ================================================================
|
| 11 |
+
|
| 12 |
+
import os
|
| 13 |
+
import socket
|
| 14 |
+
import time
|
| 15 |
+
import logging
|
| 16 |
+
import random
|
| 17 |
+
import requests
|
| 18 |
+
from typing import Iterable, Tuple, List
|
| 19 |
+
|
| 20 |
+
# ⬇️ منافذ مقترحة؛ يمكنك التعديل أو توليدها ديناميكيًا
|
| 21 |
+
DEFAULT_PORTS = {
|
| 22 |
+
7520, 7384, 9021, 6998, 5810, 9274,
|
| 23 |
+
8645, 7329, 7734, 8456, 6173, 7860,
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
# ⬇️ خوادم السجل الاحتياطية بالترتيب المفضَّل
|
| 27 |
+
DEFAULT_REGISTRY_SERVERS = [
|
| 28 |
+
"https://cv4790811.regru.cloud",
|
| 29 |
+
"https://amaloffload.onrender.com",
|
| 30 |
+
"https://osamabyc86-offload.hf.space",
|
| 31 |
+
"http://10.229.36.125",
|
| 32 |
+
"http://10.229.228.178",
|
| 33 |
+
]
|
| 34 |
+
|
| 35 |
+
logging.basicConfig(
|
| 36 |
+
level=logging.INFO,
|
| 37 |
+
format="%(asctime)s [%(levelname)s] %(message)s",
|
| 38 |
+
datefmt="%H:%M:%S",
|
| 39 |
+
)
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
class NodeClient:
|
| 43 |
+
"""
|
| 44 |
+
عميل خفيف يعتني بالتسجيل المتكرِّر في خادم سجل مركزي.
|
| 45 |
+
يمكن استيراده في أي سكربت وتشغيله في خيط منفصل.
|
| 46 |
+
"""
|
| 47 |
+
|
| 48 |
+
def __init__(
|
| 49 |
+
self,
|
| 50 |
+
PORTs: Iterable[int] | None = None,
|
| 51 |
+
registry_servers: List[str] | None = None,
|
| 52 |
+
node_id: str | None = None,
|
| 53 |
+
):
|
| 54 |
+
self.PORTs = set(PORTs) if PORTs else DEFAULT_PORTS
|
| 55 |
+
self.registry_servers = list(registry_servers) if registry_servers else DEFAULT_REGISTRY_SERVERS
|
| 56 |
+
self.node_id = node_id or os.getenv("NODE_ID", socket.gethostname())
|
| 57 |
+
|
| 58 |
+
# مبدئيًّا اختَر منفذًا (أولوية للمتغيّر البيئي إن وُجد)
|
| 59 |
+
self.port: int = int(os.getenv("CPU_PORT", random.choice(list(self.PORTs))))
|
| 60 |
+
self.current_server_index: int | None = None
|
| 61 |
+
|
| 62 |
+
# -------------------------------------------------------------------------
|
| 63 |
+
@staticmethod
|
| 64 |
+
def get_local_ip() -> str:
|
| 65 |
+
"""يحاول معرفة أفضل عنوان IP محلي لاستخدامه في الشبكة."""
|
| 66 |
+
try:
|
| 67 |
+
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
|
| 68 |
+
# لا يهم أن ينجح الاتصال الفعلي، الهدف كشف IP واجهة الخروج
|
| 69 |
+
s.connect(("10.255.255.255", 1))
|
| 70 |
+
return s.getsockname()[0]
|
| 71 |
+
except Exception:
|
| 72 |
+
return "127.0.0.1"
|
| 73 |
+
|
| 74 |
+
def _register_once(self, server: str, port: int) -> List[str]:
|
| 75 |
+
"""مُحاولة واحدة للتسجيل؛ تُعيد peers أو ترفع استثناءً."""
|
| 76 |
+
payload = {
|
| 77 |
+
"node_id": self.node_id,
|
| 78 |
+
"ip": self.get_local_ip(),
|
| 79 |
+
"port": port,
|
| 80 |
+
}
|
| 81 |
+
resp = requests.post(f"{server}/register", json=payload, timeout=5)
|
| 82 |
+
resp.raise_for_status()
|
| 83 |
+
return resp.json() # توقّع أن الخادم يُرجع قائمة أقران
|
| 84 |
+
|
| 85 |
+
# -------------------------------------------------------------------------
|
| 86 |
+
def connect_until_success(self, retry_delay: int = 5) -> Tuple[str, List[str]]:
|
| 87 |
+
"""
|
| 88 |
+
يدور على جميع المنافذ والخوادم حتى ينجح التسجيل.
|
| 89 |
+
• عند النجاح يُرجع: (عنوان الخادم، قائمة الأقران)
|
| 90 |
+
• لا يرفع استثناءات؛ إمّا ينجح أو يستمر في المحاولة إلى ما لا نهاية.
|
| 91 |
+
"""
|
| 92 |
+
logging.info("🔄 بدء محاولات التسجيل للعقدة '%s'...", self.node_id)
|
| 93 |
+
while True:
|
| 94 |
+
for port in self.PORTs:
|
| 95 |
+
for idx, server in enumerate(self.registry_servers):
|
| 96 |
+
try:
|
| 97 |
+
peers = self._register_once(server, port)
|
| 98 |
+
# سجّل النجاح واحفظ المعلومات
|
| 99 |
+
self.port = port
|
| 100 |
+
self.current_server_index = idx
|
| 101 |
+
logging.info("✅ متصل: %s على المنفذ %s", server, port)
|
| 102 |
+
return server, peers
|
| 103 |
+
except Exception as e:
|
| 104 |
+
logging.debug("❌ %s:%s -> %s", server, port, e)
|
| 105 |
+
time.sleep(retry_delay) # انتظر قليلًا ثم أعد المحاولة
|
| 106 |
+
|
| 107 |
+
# -------------------------------------------------------------------------
|
| 108 |
+
def run_background(self) -> None:
|
| 109 |
+
"""
|
| 110 |
+
إطلاق التسجيل في خيط منفصل؛ مفيد إذا كنت تريد
|
| 111 |
+
إبقاء Main Thread للمهام الأخرى.
|
| 112 |
+
"""
|
| 113 |
+
import threading # استيراد متأخر لتفادي الحمل الزائد عند import
|
| 114 |
+
threading.Thread(target=self.connect_until_success, daemon=True).start()
|
| 115 |
+
|
| 116 |
+
|
| 117 |
+
# -----------------------------------------------------------------------------
|
| 118 |
+
if __name__ == "__main__":
|
| 119 |
+
"""
|
| 120 |
+
للتجربة المباشرة:
|
| 121 |
+
$ python node_client.py
|
| 122 |
+
"""
|
| 123 |
+
client = NodeClient()
|
| 124 |
+
server, peer_list = client.connect_until_success()
|
| 125 |
+
logging.info("🗂️ الأقران: %s", peer_list)
|