nibraslite 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
nibraslite/README.md ADDED
@@ -0,0 +1,294 @@
1
+ # NibrasLite — مكتبة مساعدة خفيفة لسيلينيوم بواجهة عربية
2
+
3
+ ![Python](https://img.shields.io/badge/Python-3.11%2B-blue.svg)
4
+ ![Selenium](https://img.shields.io/badge/Selenium-4.48%2B-43B02A.svg)
5
+ ![Platform](https://img.shields.io/badge/Platform-Windows_%7C_macOS_%7C_Linux-lightgrey.svg)
6
+ ![License](https://img.shields.io/badge/License-MIT-green.svg)
7
+
8
+ مكتبة بايثون خفيفة تربط كودك بمتصفح Chrome **مستقر ودائم** — النافذة لا تُغلق عند انتهاء السكربت.
9
+ تستورد واجهة السيلينيوم كاملة من مكان واحد، مع نظام بروفايلات، حقن كوكيز، كشف ذاتي، ودعم بروكسي متعدد الأنواع.
10
+
11
+ ---
12
+
13
+ ## ✨ الميزات
14
+
15
+ | الميزة | الوصف |
16
+ |--------|-------|
17
+ | 🔄 **جلسة دائمة** | شغّل Chrome مرة واحدة، عدّ السكربتات وتبقى النافذة والتبويبات والكوكيز حيّة |
18
+ | 🐍 **واجهة سيلينيوم كاملة** | `By` · `Keys` · `Select` · `ActionChains` · `WebDriverWait` · `EC` + كل الاستثناءات |
19
+ | 🎭 **Stealth مدمج** | إخفاء آثار الأتمتة بـ JavaScript خاص — بلا أي مكتبة ثالثة |
20
+ | 📁 **نظام بروفايلات** | بروفايل دائم افتراضي · بروفايلات مسمّاة · بروفايلات مؤقتة تُحذف تلقائياً |
21
+ | 🍪 **حقن الكوكيز** | لصق جدول DevTools → `new_coc.txt` → تحويله عبر `convert_cookies.py` |
22
+ | 🌐 **بروكسي متعدد** | `proxy_http` · `proxy_https` · `proxy_socks4` · `proxy_socks5` + دالة `proxy_check` |
23
+ | 🖥️ **CLI جاهز** | أوامر مثل `start` · `attach` · `stop` · `status` · `profiles` مباشرة من التيرمينال |
24
+ | 🧪 **فحص ذاتي 20/20** | اختبارات شاملة لكل ميزة للتأكد من عدم regressions |
25
+ | 🪟 **متعدد المنصات** | يعمل على Windows / macOS / Linux (يكشف Chrome تلقائياً) |
26
+
27
+ ---
28
+
29
+ ## 📦 التثبيت
30
+
31
+ ```bash
32
+ pip install selenium>=4.48
33
+ ```
34
+
35
+ لا تحتاج تثبيت أي حزمة إضافية — المكتبة تعتمد على Selenium فقط.
36
+
37
+ تأكد من وجود Chrome أو Chromium مُثبَّت على جهازك.
38
+
39
+ ---
40
+
41
+ ## 🚀 الاستخدام السريع
42
+
43
+ ### 1. تشغيل المتصفح والبدء بالفحص
44
+
45
+ ```python
46
+ import browser
47
+
48
+ # بدء جلسة دائمة + stealth في سطر واحد
49
+ driver = browser.ensure("https://example.com")
50
+
51
+ # استخدام كامل واجهة السيلينيوم
52
+ driver.find_element("By.NAME", "q").send_keys("nibras")
53
+ driver.find_element("By.NAME", "q").submit()
54
+ ```
55
+
56
+ ### 2. الـ REPL التفاعلي
57
+
58
+ ```bash
59
+ python browser.py start
60
+ python browser.py attach # فتح REPL متصل بالنافذة الحالية
61
+ ```
62
+
63
+ ### 3. سكريبت مستقل
64
+
65
+ ```python
66
+ import browser
67
+
68
+ driver = browser.attach() # الربط بنافذة شغّالة (لا تبدأ واحدة جديدة)
69
+ browser.stealth(driver) # تفعيل إخفاء الأتمتة
70
+ driver.get("https://example.com")
71
+ ```
72
+
73
+ ### 4. مثال كامل مع كوكيز
74
+
75
+ ```python
76
+ import browser, json
77
+ from pathlib import Path
78
+
79
+ driver = browser.ensure(apply_stealth=True)
80
+ browser.goto(driver, "https://accounts.google.com")
81
+
82
+ cookies = json.loads(Path("session_cookies.json").read_text(encoding="utf-8"))
83
+ ok, failed = browser.inject(driver, cookies)
84
+ print(f"✅ {ok} كوكيز حقّنت | ❌ {failed} فشلت")
85
+ ```
86
+
87
+ ---
88
+
89
+ ## 📁 هيكل الملفات
90
+
91
+ ```
92
+ sel_nibras/
93
+ ├── browser.py # ❤️ قلب المكتبة — دورة الحياة + stealth + كوكيز + عناصر + CLI
94
+ ├── selfcheck.py # 20 فحص ذاتي يغطي كل الميزات
95
+ ├── test.py # سكربت Crashlytics أحادي الاستخدام
96
+ ├── example.py # نموذج استخدام عام لأي موقع
97
+ ├── probe.py # فاحص سريع لأي صفحة (DOM + stealth report)
98
+ ├── convert_cookies.py # يحوّل لصق DevTools → JSON قابل للحقن
99
+ ├── browser_guide.html # دليل عربي بصري للمستخدم
100
+ ├── README.md # هذا الملف
101
+ ├── _profile/ # البروفايل الدائم الافتراضي (gitignored)
102
+ └── profiles/ # بروفايلات مسمّاة إضافية (gitignored)
103
+ ```
104
+
105
+ ---
106
+
107
+ ## ⌨️ أوامر CLI
108
+
109
+ ```bash
110
+ python browser.py start [--url URL] [--name NAME] [--temp] [--port N] [--ua "USER-AGENT"]
111
+ python browser.py attach [--name NAME] [--port N]
112
+ python browser.py status [--all]
113
+ python browser.py stop [--name NAME] [--port N] [--all] [--keep]
114
+ python browser.py profiles
115
+ python browser.py profile new <name>
116
+ python browser.py profile rm <name> [-y]
117
+ python selfcheck.py # تشغيل الفحص الذاتي
118
+ ```
119
+
120
+ ---
121
+
122
+ ## 🔧 المتغيرات البيئية
123
+
124
+ | المتغيّر | القيمة الافتراضية | الوصف |
125
+ |----------|-------------------|-------|
126
+ | `NIBRAS_PORT` | `9222` | منفذ Debug للربط |
127
+ | `NIBRAS_PROFILE` | `_profile/` | مسار البروفايل الدائم |
128
+ | `NIBRAS_UA` | — | تجاوز User-Agent |
129
+ | `NIBRAS_HEADLESS` | `0` | `1` = وضع بدون واجهة |
130
+ | `NIBRAS_CHROME` | — | مسار Chrome.exe صريح |
131
+ | `NIBRAS_CHROME_VERSION` | — | إصدار Chrome المُستهدف |
132
+
133
+ ---
134
+
135
+ ## 🛡️ Stealth — الإخفاء المدمج
136
+
137
+ لا نستخدم أي مكتبة خارجية. الـ stealth مبني بـ JavaScript يُحقَن في كل تبويبة:
138
+
139
+ ```javascript
140
+ // ما يخفيه STEALTH_JS:
141
+ navigator.webdriver = false
142
+ navigator.languages = [...] // حسب locale الحقيقي
143
+ navigator.hardwareConcurrency // مطابق لجهاز المستخدم
144
+ window.chrome.runtime // موجود كمتصفح حقيقي
145
+ WebGL vendor/renderer // مخفي (بدون SwiftShader)
146
+ permissions.query(notifications) // لا يعيد "denied"
147
+ ```
148
+
149
+ > ⚠️ **تنويه**: هذا Stealth **خفيف** ومخصص للمواقع البسيطة. لا يغطي أنظمة الكشف المتقدمة
150
+ > مثل Google reCAPTCHA v3 أو Cloudflare Turnstile. للمواقع الحساسة استخدم أدوات متخصصة.
151
+
152
+ ---
153
+
154
+ ## 📊 نظام البروفايلات
155
+
156
+ | النوع | المسار | يبقى بعد الإيقاف؟ | طريقة الاستخدام |
157
+ |-------|--------|:------------------:|----------------|
158
+ | **افتراضي** | `_profile/` | ✅ نعم | `browser.py start` |
159
+ | **مسمّى** | `profiles/<name>/` | ✅ نعم | `browser.py start --name work` |
160
+ | **مسار صريح** | أي مسار تختاره | ✅ نعم | `browser.py start --profile /path/to/dir` |
161
+ | **مؤقت** | OS temp dir | ❌ لا (إلا `--keep`) | `browser.py start --temp` |
162
+
163
+ لتشغيل حسابين في وقت واحد: `--name a` و `--name b` — المكتبة تختار منافذ حرة تلقائياً.
164
+
165
+ ---
166
+
167
+ ## 🔗 تدفّق الكوكيز
168
+
169
+ ```
170
+ [متصفح آخر] → DevTools → Console → copy table
171
+ ↓
172
+ new_coc.txt
173
+ ↓
174
+ python convert_cookies.py
175
+ ↓
176
+ session_cookies.json
177
+ ↓
178
+ browser.inject(driver, cookies)
179
+ ```
180
+
181
+ الدالة `inject` تستخدم CDP `Network.setCookie` وتدعم `__Host-*` و `SameSite`.
182
+
183
+ ---
184
+
185
+ ## 📈 قائمة الـ APIs العامة
186
+
187
+ ### دورة الحياة
188
+ ```python
189
+ browser.start(...) → port # تشغيل Chrome مستقل
190
+ browser.attach(...) → driver # ربط بنافذة شغّالة
191
+ browser.ensure(url, ...) → driver # الكل في واحد (start + attach + stealth)
192
+ browser.kill(...) # إيقاف Chrome الخاص بنا فقط
193
+ browser.is_alive(port) → bool
194
+ browser.close_browser(driver) # إغلاق النافذة كلها
195
+ ```
196
+
197
+ ### البروفايلات
198
+ ```python
199
+ browser.list_profiles() → list[(name, size_bytes)]
200
+ browser.delete_profile(name, yes=False)
201
+ browser.running_instances() → list[(port, profile)]
202
+ browser.find_port(name=None) → int | None
203
+ browser.next_free_port() → int
204
+ ```
205
+
206
+ ### الكوكيز
207
+ ```python
208
+ browser.cookies_load(path) → list[dict]
209
+ browser.cookies_save(driver, path)
210
+ browser.inject(driver, cookies) → (ok_count, fail_count)
211
+ browser.clear(driver, domain=None)
212
+ browser.list_cookies(driver)
213
+ browser.from_devtools_table(text) → list[dict]
214
+ ```
215
+
216
+ ### الـ Stealth
217
+ ```python
218
+ browser.stealth(driver, all_tabs=True)
219
+ browser.check_stealth(driver) → dict{raw, tests, passed}
220
+ browser.print_stealth(driver) → bool
221
+ ```
222
+
223
+ ### العناصر والانتظار
224
+ ```python
225
+ browser.wait(driver, sel, state, timeout=20) → WebElement
226
+ browser.wait_all(driver, sel, timeout=20) → list[WebElement]
227
+ browser.wait_gone(driver, sel, timeout=20) → bool
228
+ browser.exist / visible / clickable(driver, sel, timeout=0) → bool
229
+ browser.one(driver, sel, timeout=0) → WebElement | None
230
+ browser.find(driver, sel) → list[WebElement]
231
+ ```
232
+
233
+ ### الأحداث
234
+ ```python
235
+ browser.goto / click / clickn / type_text / body_text / dump
236
+ browser.eval_js / scroll / screenshot / tabs / new_tab / switch_tab / accept_alert
237
+ ```
238
+
239
+ ### البروكسي
240
+ ```python
241
+ browser.proxy_check("1.2.3.4", 8080, user="u", pass="p") → dict
242
+ browser.proxy_http / proxy_https / proxy_socks4 / proxy_socks5
243
+ browser.proxy_combine("socks5", "addr", port)
244
+ ```
245
+
246
+ ### كائن Browser (الواجهة الشاملة)
247
+ ```python
248
+ from browser import Browser, By
249
+ b = Browser.ensure("https://example.com")
250
+ b.find_element(By.ID, "q") # → دالة سيلينيوم أصلية (marshaled تلقائياً)
251
+ b.click("#go") # → دالة مكتبتنا
252
+ b.wait("#t", "visible", 5) # → دالة مكتبتنا
253
+ b.driver # → WebDriver الخام
254
+ ```
255
+
256
+ ---
257
+
258
+ ## 🧪 التشغيل
259
+
260
+ ```bash
261
+ # تشغيل الفحص الذاتي الكامل
262
+ python selfcheck.py
263
+
264
+ # تشغيل مثال عام
265
+ python example.py
266
+
267
+ # فحص صفحة محددة
268
+ python probe.py
269
+ ```
270
+
271
+ ---
272
+
273
+ ## ⚠️ ملاحظات مهمة
274
+
275
+ - **لا تستخدم `driver.quit()`** — يغلق النافذة الدائمة؛ استخدم `browser.close_browser()` أو `browser.py stop`
276
+ - **لا ترفع `new_coc.txt` أو `session_cookies.json`** — تحوي بيانات دخول سرّية
277
+ - البروفايل `_profile/` يعيش بين الجلسات = تسجيل الدخول محفوظ
278
+ - `NIBRAS_*` هي البادئة الوحيدة المعتمدة حالياً (تم التصحيح من `SEL_BINRAS_*`)
279
+
280
+ ---
281
+
282
+ ## 🤝 المساهمة
283
+
284
+ 1. اقرأ [README.md](README.md) (هذا الملف) قبل أي تعديل
285
+ 2. أضف الدالة الجديدة في `browser.py`
286
+ 3. أضف اختباراً في `selfcheck.py`
287
+ 4. حدّث هذا الملف
288
+ 5. اختبر: `python selfcheck.py`
289
+
290
+ ---
291
+
292
+ ## 📜 الرخصة
293
+
294
+ MIT — حرية الاستخدام والتعديل والتوزيع.
nibraslite/__init__.py ADDED
@@ -0,0 +1,4 @@
1
+ """NibrasLite — lightweight persistent Selenium helper."""
2
+ from __future__ import annotations
3
+
4
+ __version__ = "0.1.0"