
أداة إخفاء البيانات في صور JPG
# jdvrif
***jdvrif*** (*JPG Data Vehicle*) هي أداة سطر أوامر سريعة وسهلة الاستخدام لإخفاء البيانات (steganography) تُستخدم لإخفاء واستخراج أي نوع من الملفات عبر صورة **JPG**. ***لينكس فقط***.
يتم ضغط ملف بياناتك باستخدام ***libdeflate/zlib***، ثم تشفيره باستخدام ***XChaCha20-Poly1305*** (***libsodium*** secretstream) بمفتاح مشتق بواسطة ***Argon2id*** من ***رمز استرداد PIN*** مُولَّد عشوائيًا، ثم يُضمَّن أخيرًا في صورة الغلاف. يُعرض رمز PIN مرة واحدة فقط، في نهاية عملية ***conceal***، ولا يُخزَّن في أي مكان على الإطلاق: فبدونه لا يمكن استرداد الملف المخفي.
باستخدام ***وضع الإخفاء الافتراضي***، يمكنك إخفاء أي نوع من الملفات، مع تحديد حجم الصورة النهائية بحد أقصى ***2GiB***. أما أوضاع الإخفاء الأخرى الخاصة بالمنصات ومواقع التواصل الاجتماعي المتوافقة (*المذكورة أدناه*) فلها حدود حجم خاصة بها ***أصغر بكثير*** ومتطلبات أخرى.
تتوفر [***نسخة ويب***](https://cleasbycode.co.uk/jdvrif/app/) من ***jdvrif***، يمكنك استخدامها فورًا كبديل مريح عن تنزيل شيفرة المصدر الخاصة بواجهة سطر الأوامر (CLI) وترجمتها. تقتصر عمليات رفع الملفات عبر الويب على **20MiB**.
تتوفر أيضًا نسخة تجريبية مكتوبة بلغة ***Rust*** [***jdvrif-rs***](https://github.com/CleasbyCode/jdvrif-rs) لمن يهتم بتلك اللغة. وهي متوافقة من حيث الصيغة: إذ يمكن لأي من البنيتين استرداد صور الأخرى.
تستند ***jdvrif*** جزئيًا إلى ***[التقنية المُنفَّذة](https://www.vice.com/en/article/bj4wxm/tiny-picture-twitter-complete-works-of-shakespeare-steganography)*** من قبل الباحث الأمني ***[David Buchanan](https://www.da.vidbuchanan.co.uk/).***

*صورة توضيحية: **"A place of concealment"** / ***PIN: 7912872750612437051****
## كيف تُخفي jdvrif البيانات
على عكس طريقة الإخفاء الشائعة [***LSB***](https://ctf101.org/forensics/what-is-stegonagraphy/) (*أقل بت دلالة*) التي تُخفي البيانات داخل بكسلات صورة الغلاف، فإن ***jdvrif*** تُخفي البيانات في الغالب داخل ***مقاطع التطبيقات*** (application segments) لصورة ***JPG*** (ICC، EXIF، XMP، إلخ).
| وضع الإخفاء | أين تذهب البيانات | مشاركة الصورة الناتجة على |
| --- | --- | --- |
| *(بدون خيار)* | مقاطع ملف التعريف APP2/ICC | X-Twitter، Tumblr، Mastodon، Pixelfed، PostImage، ImgBB، ImgPile، Flickr |
| ***-b*** | مقاطع EXIF / Photoshop / XMP المؤطَّرة | ***Bluesky*** فقط |
| ***-r*** | معاملات JPEG DCT (***QIM***) | ***Reddit*** فقط |
| ***-x*** | معاملات JPEG DCT (***J-UNIWARD/STC***) | ***X-Twitter*** فقط |
الاستثناءان الوحيدان من طريقة تخزين المقاطع الافتراضية هما ***Reddit*** و***X-Twitter***. فكلاهما له وضع إخفاء خاص به، ولا يستخدم أي من هذين الوضعين مقاطع البيانات الوصفية على الإطلاق: إذ تحمل ***-r*** و***-x*** الحمولة في معاملات DCT الخاصة بصورة ***JPG*** بدلًا من ذلك.
تُعيد ***Reddit*** ترميز الصور المرفوعة وتتجاهل مقاطع البيانات الوصفية التي يعتمد عليها الوضع الافتراضي، لذا فإن ***-r*** هو الوضع الوحيد الذي يعمل هناك. أما ***X-Twitter*** فتحتفظ بمقطع ICC واحد صغير، لذا لا يزال الوضع الافتراضي يعمل على تلك المنصة، لكن فقط لحمولة صغيرة جدًا.
بالنسبة لوضع الإخفاء الخاص بـ ***Reddit*** (***-r***)، نستخدم [***طريقة إخفاء QIM***](https://www.google.com/search?q=QIM+steganography+method&sourceid=chrome&ie=UTF-8&source=chrome.ctxt) (*تضمين مؤشر التكميم في نطاق JPEG DCT*)، إذ إنها طريقة التخزين الوحيدة التي تعمل حاليًا مع ***Reddit***. تُحوَّل صورة الغلاف إلى baseline Q75 4:2:0 وتُحمَل الحمولة في كتل DCT الخاصة بالإضاءة (luminance) لديها.
لتعظيم سعة التخزين لمنصة ***Reddit***، استخدم صورة غلاف بأبعاد كبيرة، مثل **2048x2048**، **4096x4096**، **8192x8192 (الحد الأقصى)**، إلخ.
جودة صورة الغلاف ليست مهمة لهذه الطريقة، وينبغي إبقاؤها بسيطة عند الأبعاد الكبيرة للمساعدة في تقليل حجم ملف صورة الغلاف إلى الحد الأدنى.
في حين أن منصة ***X-Twitter*** يمكنها استخدام الطريقة الافتراضية التي توفرها ***jdvrif***، حيث تُخفى البيانات داخل مقاطع APP2/ICC، فإن ***X-Twitter*** تحدّ ذلك بمقطع ICC واحد بحد أقصى للحجم لا يتجاوز **~10KiB** فقط.
لحمل أكثر من **~10KiB**، استخدم وضع الإخفاء الخاص بمنصة ***X-Twitter*** (***-x***). يتخلى هذا الوضع عن مقاطع البيانات الوصفية بالكامل — فلا يُكتب أي شيء إلى ملف تعريف ICC — ويستخدم بدلاً من ذلك [***طريقة إخفاء المعلومات التكيفية J-UNIWARD مع ترميز Syndrome-Trellis (STC)***](https://www.google.com/search?q=adaptive+J-UNIWARD+steganography+method+with+Syndrome-Trellis+Coding+(STC)). يُعاد ترميز صورة الغلاف إلى 4:2:0 تدريجية بالجودة المستمدة من مصدرها (بحد أقصى **Q97**).
لتعظيم سعة التخزين لمنصة ***X-Twitter***، استخدم صورة غلاف عالية الجودة/غنية بالتفاصيل بأبعاد كبيرة، مثل **1024x1024**، **2048x2048**، **4096x4096 (الحد الأقصى)**، إلخ.
يقوم الحاملان ***-r*** و***-x*** بتشفير بياناتك وربط موقعها برمز الاسترداد PIN الخاص بك باستخدام ***Argon2id***، لكن التضمين لا يزال يغيّر إحصاءات DCT للصورة، لذا قد يكشف تحليل الإخفاء المتخصص أن الصورة تحمل بيانات مخفية.
تظل صور ***-r*** و***-x*** التي أُنشئت باستخدام ***jdvrif v9.0*** قابلة للاسترداد، لكن ***v9.0*** لا يمكنه استرداد صور ***-r*** أو ***-x*** التي أُنشئت باستخدام ***v9.1***.
يحمل كلا وضعي DCT بيانات أقل بكثير من الوضع الافتراضي، لذا استخدم ***capsize*** لقياس صورة الغلاف قبل اختيار الحمولة (انظر [التحقق من السعة](#checking-capacity-with-capsize)).
## المتطلبات والترجمة البرمجية (Linux)
تتطلب عملية البناء **CMake 3.20 أو أحدث**، و`flock` من **util-linux**، وإما **Ninja** (المفضّل) أو **Make**. يجب أن يكون المترجم **GCC 14 أو أحدث**، أو **Clang 18 أو أحدث** مقترنًا بمكتبة قياسية C++23 تنفّذ ميزات مثل `std::format` و`std::print`. المكتبات الأصلية المطلوبة هي **libsodium**، و**libjpeg-turbo** (*كل من واجهتي `turbojpeg` و`libjpeg`*)، و**zlib**، و**libdeflate**. **OpenMP** اختياري: عند توفره فإنه يوازي تمريرة حساب التكلفة الخاصة بـ J-UNIWARD في ***-x***.
```console
$ sudo apt update
$ sudo apt install g++ cmake ninja-build util-linux libsodium-dev libturbojpeg0-dev libjpeg-dev zlib1g-dev libdeflate-dev
$ g++ --version # confirm the reported version is 14 or newer
$ chmod +x compile_jdvrif.sh
$ ./compile_jdvrif.sh
$ sudo cp jdvrif /usr/bin
```
إذا كانت توزيعتك توفّر GCC 14 كحزمة ذات إصدار محدد، فثبّت `g++-14` وابنِ باستخدام `CXX=g++-14 ./compile_jdvrif.sh`.
يحتفظ الغلاف بملفات الكائنات المتتبَّعة للاعتماديات تحت `src/build/`، لذا تعيد الاستدعاءات اللاحقة بناء ما تغيّر فقط، ولا يستبدل الملف التنفيذي `jdvrif` المنشور إلا بعد بناء كامل وناجح. اضبط `JDVRIF_JOBS=<count>` لتغيير حد التوازي (الافتراضي: عدد وحدات المعالجة المركزية، بحد أقصى 8)، أو `JDVRIF_BUILD_DIR=<path>` لاستخدام ذاكرة تخزين مؤقت منفصلة للبناء، أو `BUILD_MODE=sanitize` لبناء ASan/UBSan.
## الاستخدام
```console
$ jdvrif
Usage: jdvrif conceal [-b|-r|-x] <cover_image> <secret_file>
jdvrif recover <cover_image>
jdvrif capsize [-r|-x] <cover_image>
jdvrif --info
```
شغّل `jdvrif --info` للحصول على الدليل المدمج الكامل للأوضاع وخيارات المنصات وحدود الحجم.
```console
$ jdvrif conceal your_cover_image.jpg your_secret_file.doc
Platform compatibility for output image:-
✓ X-Twitter
✓ Tumblr
✓ Mastodon
✓ Pixelfed
✓ PostImage
✓ ImgBB
✓ ImgPile
✓ Flickr
Recovery PIN: [***2166776980318349924***]
Important: Keep your PIN safe, so that you can extract the hidden file.
Saved "file-embedded" JPG image: jrif_4e87c566c.jpg (143029 bytes).
Complete!
$ jdvrif recover jrif_4e87c566c.jpg
PIN: *******************
Extracted hidden file: your_secret_file.doc (6165 bytes).
Complete! Please check your file.
```
jdvrif ***mode*** arguments:
***conceal*** - يضغط ويشفّر ويضمّن ملف بياناتك السري داخل صورة غلاف ***JPG***.
***recover*** - يفكّ التشفير ويفكّ الضغط ويستخرج ملف البيانات المخفي من صورة غلاف ***JPG*** (*يتطلب رقم PIN للاستعادة*).
***capsize*** - يبلّغ عن سعة الحمل لصورة غلاف من أجل الوضع ***-r*** أو ***-x***. لا يتم حفظ أي صورة.
متطلبات صورة الغلاف:
● JPEG فقط، بحجم **400x400** بكسل على الأقل، وبإحدى صيغتي التدرّج الرمادي أو ألوان YCbCr — يجب تحويل صور CMYK/YCCK إلى RGB أولاً.
● الأبعاد العليا الافتراضية وأبعاد ***-b*** هي **4096x4096px**؛ يستخدم ***-r*** حدّ **8192x8192px**، بينما يقتصر ***-x*** أيضاً على **4096x4096px**.
● يرفض الوضع الافتراضي (*بدون خيار*) أيضاً صور الغلاف التي تكون جودة JPEG المقدّرة لها أعلى من **Q97**؛ أعد حفظ الصورة بجودة أقل إذا رُفضت.
متطلبات ملف البيانات السري:
● يجب ألا يتجاوز اسم الملف المضمّن **20 بايت**، ويجب ألا يبدأ بـ `.` أو `-` أو ينتهي بمسافة أو `.`، ويجب أن يكون UTF-8 صالحاً دون أحرف تحكّم أو أحرف تنسيق ثنائية الاتجاه أو أي من `/ \ : * ? " < > |`. يُخزَّن الاسم في الصورة ويُستعاد عند ***recover***.
● يُضغط ملف بياناتك قبل التشفير، باستثناء أنواع الملفات المعروفة بأنها مضغوطة مسبقاً (`.zip`، `.7z`، `.mp4`، `.jpg`، `.png`، إلخ). في الوضعين الافتراضي و***-b*** تتخطى تلك الأنواع الضغط فقط عندما تكون أكبر من **10MiB**؛ أما في الوضعين ***-r*** و***-x*** فتتخطاه دائماً. لأي شيء آخر مخصّص لحدّ حجم صغير على منصة ما، فكّر في ضغطه بنفسك أولاً (*zip، rar، 7z، إلخ*) حتى تعرف حجمه المخزَّن بدقة.
## المنصات المتوافقة
\******************
ملاحظة: ***Bluesky*** الآن يحفظ الصور بصيغة ***WEBP*** افتراضياً.
لحفظ صورة بصيغة ***JPG***، حتى تتمكن من استعادة البيانات المخفية باستخدام ***jdvrif***:-
انقر أولاً على الصورة في المنشور لفتحها، ثم انقر بزر الفأرة الأيمن على الصورة. من القائمة، اختر ***Open image in new tab***.
اختر التبويب الجديد وفي شريط العنوان، انتقل إلى نهاية العنوان وأضف ***@jpg*** ثم اضغط Enter.
انقر بزر الفأرة الأيمن على الصورة ومن القائمة اختر ***Save image...***
يجب أن تُنزَّل صورتك الآن بصيغة ***JPG***، والتي ستعمل الآن مع ***jdvrif***.
إذا كنت تريد أداة لإخفاء البيانات باستخدام صور ***WEBP*** لنشرها على ***Bluesky***، يمكنك استخدام أداة إخفاء المعلومات عبر سطر الأوامر ***WEBP*** الخاصة بي ***[wbpdv](https://github.com/CleasbyCode/wbpdv)***
\******************
*حدّ حجم النشر يُقاس بالحجم ***المجتمع*** لـ ***صورة الغلاف*** + ***ملف البيانات المضغوط:****
● ***Flickr*** (**200MiB**)، ***ImgPile*** (**100MiB**)، ***ImgBB*** (**32MiB**)، ***PostImage*** (**32MiB**)، ***Pixelfed*** (**15MiB**).
*حدّ الحجم يُقاس ***فقط*** بـ ***حجم ملف البيانات المضغوط:****
● ***Mastodon*** (**~6MiB**)، ***Tumblr*** (**~64KiB**)، ***X-Twitter*** (**~10KiB / الطريقة الافتراضية**).
على سبيل المثال، مع ***Mastodon***، إذا كانت صورة غلافك **1MiB** فلا يزال بإمكانك تضمين ملف بيانات يصل إلى حدّ الحجم **~6MiB**.
**أخرى: منصات لها وضع إخفاء خاص بها:**
● ***Bluesky*** (***خيار -b***). يجب ألا يتجاوز ملف ***JPG*** النهائي "*المضمَّن فيه الملف*" **2,000,000 بايت (~1.9MiB)**، لذا تتقاسم صورة الغلاف وملف البيانات المضغوط ميزانية واحدة. يجب ألا يتجاوز ملف البيانات المضغوط وحده **~171KiB**. صورة الغلاف التي تبلغ بالفعل 2,000,000 بايت لا تترك أي مساحة على الإطلاق، لذا أبقِ الغلاف أصغر من الحدّ بمقدار حجم ملف بياناتك المضغوط على الأقل. يُشترط سكربت "***create_bsky_post.py***" لنشر هذه الصور على ***Bluesky***. *مزيد من المعلومات عن هذا السكربت في أسفل الصفحة.*
● ***Reddit*** (***خيار -r***). يجب ألا يزيد حجم صورة الغلاف وملف البيانات كلٌّ على حدة عن **20MiB**، لكن سعة الحمل الفعلية لصورة الغلاف ***أصغر بكثير*** وتعتمد على أبعادها. استخدم `jdvrif capsize -r` لقياسها.
● ***X-Twitter*** (***خيار -x***). يجب ألا يتجاوز حجم صورة الغلاف وملف البيانات **5MiB** لكل منهما، ويجب ألا تتجاوز أبعاد الغلاف **4096x4096** بكسل. سعة الناقل الفعلية ***أصغر بكثير*** وتعتمد على جودة الصورة وأبعادها. استخدم `jdvrif capsize -x` لقياسها.
في الوضع الافتراضي ووضع ***-b***، يتم أيضًا تحسين صورة الغلاف بلا فقدان قبل الاستخدام، ويجب ألا يتجاوز حجمها **4MiB** بعد تلك الخطوة.
بالنسبة للمنصات مثل ***X-Twitter*** و***Reddit*** و***Tumblr***، التي لديها حدود صغيرة لحجم البيانات، قد ترغب في التركيز على البيانات التي تُضغط جيدًا، مثل الملفات النصية وغيرها.
https://github.com/user-attachments/assets/af330d09-f65d-4f75-8290-883078be34b3
https://github.com/user-attachments/assets/fc454d42-0240-4864-b44b-ce5ef7cfd94c
## فحص السعة باستخدام capsize
تُجهّز ***capsize*** صورة الغلاف تمامًا كما تفعل ***conceal***، ثم تُبلّغ عن مقدار الحمولة المشفّرة التي يمكنها حملها. لا يُكتب أي شيء على القرص. استخدم ***-r*** لناقل ***Reddit*** و***-x*** لناقل ***X-Twitter*** (***-x*** هو الخيار الافتراضي إذا لم يُعطَ أي خيار).
```console
$ jdvrif capsize -r basic_img_large_dims.jpg
Reddit capacity check for conceal -r mode only.
Cover Image: 384KiB, 8192x8192, Baseline YCbCr 4:2:0, Standard Q75 quantization (C3).
Theoretical C3 capacity limit for this cover image: 436906 bytes (~426KiB).
Conservative maximum compressed capacity with a 20-character filename: 436792 bytes (~426KiB).
Recommended maximum compressed capacity with a 20-character filename: 435768 bytes (~425KiB).
```
الحجم المبلغ عنه هو سعة ***المغلّف*** المشفّر الإجمالية، وليس حدًا خامًا لملف السر: يستهلك اسم الملف وبيانات التشفير والاسترداد الوصفية من 95 إلى 114 بايتًا لحمولة أحادية الإطار، وتضيف الحمولات الأكبر عبئًا إضافيًا من التغليف. لا تستهدف الحد النظري — حيث تسمح السعة، أبقِ الحمولة المضغوطة أقل بـ **1KiB** على الأقل من الحد الأقصى المتحفظ. فحص الحجم الذي يُجريه ***conceal*** هو الفحص المعتمد.
## خيارات منصة وضع الإخفاء
لإنشاء صور ***JPG*** متوافقة "*ذات بيانات مخفية*" لنشرها على منصة ***Reddit***، يجب عليك استخدام الخيار ***-r*** مع وضع ***conceal***.
```console
$ jdvrif conceal -r my_image.jpg hidden.doc
```
هذه الصور متوافقة فقط للنشر على ***Reddit***. سيُفقد ملف البيانات المضمّن الخاص بك إذا نُشر على منصة مختلفة.
عند حفظ/تنزيل صورة من ***Reddit*** تأكد من النقر على الصورة داخل المنشور لتوسيعها بالكامل قبل الحفظ.
https://github.com/user-attachments/assets/ead3c34c-dd9a-4018-9ea3-0746fbdfdb8b
لإنشاء صور ***JPG*** متوافقة "*data-concealed*" للنشر على منصة ***X-Twitter*** باستخدام طريقة إخفاء المعلومات J-UNIWARD، يجب عليك استخدام الخيار ***-x*** مع وضع ***conceal***.
```console
$ jdvrif conceal -x my_image.jpg hidden.doc
```
هذه الصور متوافقة فقط للنشر على ***X-Twitter***. ستفقد ملف البيانات المضمّن إذا نُشرت على منصة مختلفة.
عند حفظ/تنزيل صورة من ***X-Twitter***، تأكد من النقر على الصورة داخل المنشور لتوسيعها بالكامل قبل الحفظ.
لإنشاء صور ***JPG*** متوافقة "*ذات ملف مضمّن*" للنشر على منصة ***Bluesky***، يجب عليك استخدام الخيار ***-b*** مع وضع ***conceal***.
```console
$ jdvrif conceal -b my_image.jpg hidden.doc
```
هذه الصور متوافقة فقط للنشر على ***Bluesky***. ستتم إزالة ملف البيانات المضمّن الخاص بك إذا نُشر على منصة مختلفة.
يُطلب منك أيضًا استخدام سكربت Python [create_bsky_post.py](https://github.com/CleasbyCode/jdvrif/blob/main/src/bsky/create_bsky_post.py) (الموجود في مجلد ***src/bsky*** في المستودع) لنشر الصورة على ***Bluesky***.
لن يعمل إذا نشرت الصور على ***Bluesky*** عبر موقع المتصفح أو تطبيق الهاتف المحمول.
لاستخدام السكربت، ستحتاج إلى إنشاء [***app password***](https://bsky.app/settings/app-passwords) من حسابك على ***Bluesky***. مرّر بيانات اعتمادك عبر متغيرات البيئة بدلًا من سطر الأوامر، حيث ستكون مرئية للمستخدمين المحليين الآخرين عبر أدوات مثل `ps`:
```console
$ pip install -r bsky/requirements.txt
$ export ATP_AUTH_HANDLE='you.bsky.social'
$ read -rsp 'Bluesky app password: ' ATP_AUTH_PASSWORD && export ATP_AUTH_PASSWORD
$ python3 bsky/create_bsky_post.py \
--image jrif_4e87c566c.jpg \
--alt-text "alt-text here [optional]" \
"standard post text here [required]"
$ unset ATP_AUTH_PASSWORD
```
راجع [src/bsky/README.md](https://github.com/CleasbyCode/jdvrif/blob/main/src/bsky/README.md) للاطلاع على مجموعة الخيارات الكاملة (*الصور المتعددة، والردود، ومنشورات الاقتباس، وبطاقات الروابط*) وللتعرف على ما تحمي منه النسخة المُحصّنة من السكربت.
https://github.com/user-attachments/assets/1daef508-d304-491f-bfe2-2cdbb5d62081
## الاختبارات
يأخذ كل سكربت اختبار في `src/tests` الملف التنفيذي المطلوب اختباره:
```console
$ bash tests/run_golden_tests.sh --bin ./jdvrif # recover pre-built images with known PINs
$ bash tests/run_roundtrip_tests.sh --bin ./jdvrif # fresh conceal/recover round-trips
$ bash tests/run_security_smoke.sh --bin ./jdvrif # negative-path and boundary checks
$ bash tests/run_reddit_tests.sh --bin ./jdvrif # -r QIM carrier
$ bash tests/run_twitter_tests.sh --bin ./jdvrif # -x J-UNIWARD/STC carrier
$ bash tests/run_io_security_tests.sh --bin ./jdvrif # input-size bounds, PIN signal/job-control handling
$ bash tests/run_jpeg_safety_tests.sh # JPEG parser/decoder safety (builds its own test binary)
$ bash tests/run_bsky_tests.sh # Bluesky posting helper
```
## برمجيات وأصول الطرف الثالث
### التطبيقات الأساسية
- [libsodium](https://github.com/jedisct1/libsodium) — التوليد العشوائي التشفيري، واشتقاق مفاتيح Argon2id، وتدفقات الأسرار XChaCha20-Poly1305. مرتبطة ديناميكيًا كمكتبة نظام.
الترخيص: [ISC License](https://github.com/jedisct1/libsodium/blob/master/LICENSE)
حقوق النشر (c) 2013–2026 Frank Denis.
- [libjpeg-turbo](https://github.com/libjpeg-turbo/libjpeg-turbo) — معالجة JPEG والتحويل بدون فقدان. مرتبطة ديناميكيًا كمكتبة نظام.
يعتمد هذا البرنامج جزئيًا على عمل Independent JPEG Group.
التراخيص: [Independent JPEG Group License, Modified BSD 3-Clause License,
and zlib License](https://github.com/libjpeg-turbo/libjpeg-turbo/blob/2.1.5/LICENSE.md).
حقوق النشر © 1991–2020 Thomas G. Lane وGuido Vollbeding.
حقوق النشر © 2009–2023 D. R. Commander. جميع الحقوق محفوظة.
حقوق النشر © 2015 Viktor Szathmáry. جميع الحقوق محفوظة.
- [zlib](https://github.com/madler/zlib) — ضغط zlib وفك الضغط المتدفق. مرتبطة ديناميكيًا كمكتبة نظام.
الترخيص: [zlib License](https://github.com/madler/zlib/blob/develop/LICENSE)
حقوق النشر (C) 1995–2026 Jean-loup Gailly وMark Adler.
- [libdeflate](https://github.com/ebiggers/libdeflate) — ضغط سريع لكامل المخزن المؤقت بصيغة zlib. مرتبطة ديناميكيًا كمكتبة نظام.
الترخيص: [MIT](https://github.com/ebiggers/libdeflate/blob/master/COPYING)
حقوق النشر 2016 Eric Biggers.
حقوق النشر 2024 Google LLC.
### الشيفرة والأصول المضمّنة
- [Compact ICC Profiles](https://github.com/saucecontrol/Compact-ICC-Profiles) — ملف تعريف ICC مضمّن متوافق مع Adobe.
الترخيص: [CC0 1.0 Universal](https://github.com/saucecontrol/Compact-ICC-Profiles/blob/master/license)
### مساعد النشر الاختياري على Bluesky
- Bryan Newbold / ATProto Hacker Cookbook — create_bsky_post.py — الأساس لمساعد النشر على Bluesky [المتفرّع](https://gist.github.com/CleasbyCode/1eb678ca1fa1975b1c1e20aeec33637e) (src/bsky/create_bsky_post.py).
للاطلاع، راجع [نسخة Cookbook](https://github.com/bluesky-social/cookbook/blob/main/python-bsky-post/create_bsky_post.py)
الترخيص: [CC0 1.0 Universal](https://github.com/bluesky-social/cookbook/blob/main/LICENSE-CC0).
- Requests — طلبات HTTP وواجهة Bluesky API.
الترخيص: [Apache 2.0](https://github.com/psf/requests/blob/main/LICENSE) / [NOTICE](https://github.com/psf/requests/blob/main/NOTICE)
حقوق النشر 2019 Kenneth Reitz.
- Beautiful Soup 4 — تحليل بيانات HTML وOpen Graph الوصفية.
الترخيص: [MIT](https://pypi.org/project/beautifulsoup4/)
حقوق النشر (c) Leonard Richardson.
- Pillow — التحقق من الصور وأبعادها ومعالجة نسبة العرض إلى الارتفاع.
الترخيص: [MIT-CMU](https://github.com/python-pillow/Pillow/blob/main/LICENSE)
حقوق نشر PIL © 1997–2011 Secret Labs AB و© 1995–2011 Fredrik Lundh والمساهمون.
حقوق نشر Pillow © 2010 Jeffrey “Alex” Clark والمساهمون.
##