إتقان أتمتة macOS مع JavaScript: من Shortcuts إلى Scriptable Workflows
٥ ديسمبر ٢٠٢٥
TL;DR
- macOS تدعم الأتمتة من خلال JavaScript لأتمتة (JXA)، بديل حديث لـ AppleScript.
- يمكنك أتمتة Finder و Mail و Safari وغيرها من تطبيقات macOS مباشرة باستخدام JavaScript APIs.
- دمج Shortcuts و Automator و JXA لسير عمل متينة عبر التطبيقات.
- تعلم كيفية بناء واختبار وتأمين سكريبتات الأتمتة باستخدام أمثلة واقعية.
- اكتشف متى تكون الأتمتة تستحق البناء—ومتى يكون العمل اليدوي أو التطبيقات الأصلية أفضل.
ما ستتعلمه
- ما هو JavaScript لأتمتة (JXA) وكيف يندرج ضمن أتمتة macOS.
- كيفية كتابة وتشغيل وتصحيح أخطاء سكريبتات JXA باستخدام Script Editor وأدوات سطر الأوامر.
- كيفية دمج الأتمتة مع Shortcuts و Automator في macOS.
- كيفية التعامل مع الأذونات والعزلة والمخاوف الأمنية.
- كيفية هيكلة واختبار وصيانة سير عمل الأتمتة مثل المحترفين.
المتطلبات الأساسية
قبل البدء، يجب أن يكون لديك:
- معرفة أساسية ببنية JavaScript (ES5/ES6).
- الوصول إلى نظام macOS (يُنصح باستخدام macOS Catalina أو أحدث).
- فهم أساسي لـ Terminal و أذونات macOS.
المقدمة: لماذا لا تزال الأتمتة في macOS مهمة
الأتمتة في macOS لها تاريخ طويل — من AppleScript في التسعينيات إلى سير عمل Automator في العقد 2000، والآن Shortcuts و JXA. على الرغم من أن AppleScript لا يزال قويًا، إلا أن تركيبه قد يبدو قديمًا للمطورين الحديثين. هنا يأتي JavaScript لأتمتة (JXA).
تم تقديم JXA مع OS X Yosemite، مما يسمح لك بكتابة سكريبتات الأتمتة باستخدام JavaScript مع الاستفادة من نظام Apple Event1. يمكنك التحكم في التطبيقات الأصلية، وتعديل الملفات، وحتى التفاعل مع مربعات الحوار النظامية — كل ذلك باستخدام لغة برمجة مألوفة.
باختصار: يمكنك أتمتة جهاز Mac باستخدام نفس اللغة التي تستخدمها للتطبيقات الويب.
تطور أتمتة macOS
| العصر | الأداة | اللغة | المميزات الرئيسية | الاستخدام النموذجي |
|---|---|---|---|---|
| 1990s–2010s | AppleScript | AppleScript | تكامل عميق مع التطبيقات | أتمتة Finder و Mail و iTunes |
| 2005–2020 | Automator | قائمة على واجهة المستخدم الرسومية | لا يتطلب كودًا | سير عمل للمستخدمين النهائيين |
| 2014–الحاضر | JXA | JavaScript | بنية حديثة، تطبيقات قابلة للبرمجة | أتمتة صديقة للمطورين |
| 2021–الحاضر | Shortcuts | مرئي + قابل للبرمجة | أتمتة متعددة الأجهزة | سير عمل موحدة لنظام Apple البيئي |
كل جيل بُني على سابقه. JXA يسد الفجوة بين قوة AppleScript وانتشار JavaScript، بينما Shortcuts تجلب الأتمتة إلى iOS وmacOS تحت واجهة واحدة.
البدء: أول سكريبت JXA
الخطوة 1. افتح Script Editor
- افتح Script Editor (الموجود في
/Applications/Utilities/). - اختر File → New.
- في شريط الأدوات، اضبط اللغة على JavaScript.
الخطوة 2. اكتب سكريبت Finder بسيط
// Example: Open a Finder window to your Documents folder
var Finder = Application('Finder');
Finder.open(Path('/Users/' + $.NSProcessInfo.processInfo.userName + '/Documents'));
الخطوة 3. شغّله
انقر على Run. Finder يجب أن يفتح مجلد المستندات الخاص بك.
تشغيل سكريبتات JXA من Terminal
يمكنك تنفيذ سكريبتات JXA من سطر الأوامر باستخدام osascript:
osascript -l JavaScript ~/scripts/openDocs.js
مثال إخراج Terminal:
$ osascript -l JavaScript openDocs.js
Finder opened: /Users/alex/Documents
هذا مفيد بشكل خاص لمهام CI/CD وأدوات المطورين أو دمج الأتمتة في سكريبتات shell.
بناء أتمتة عملية: إعادة تسمية الملفات دفعة واحدة
لننشئ سكريبتًا يقوم بإعادة تسمية جميع الملفات .png في مجلد باستخدام بادئة تاريخ.
السكريبت الكامل
const app = Application.currentApplication();
app.includeStandardAdditions = true;
const Finder = Application('Finder');
const folder = Finder.chooseFolder("Select a folder to rename PNGs:");
const files = Finder.items.of(folder).whose({ name: { _endsWith: '.png' } });
const datePrefix = new Date().toISOString().split('T')[0];
files().forEach(file => {
const oldName = file.name();
const newName = `${datePrefix}-${oldName}`;
file.name = newName;
});
app.displayNotification(`${files.length} files renamed`, { withTitle: 'Batch Rename Complete' });
كيف يعمل
- يستخدم Finder API لاختيار مجلد.
- يقوم بتصفية الملفات التي تنتهي بـ
.png. - يُضيف تاريخ اليوم الحالي في بداية اسم كل ملف.
- يعرض إشعار macOS أصلي.
تحدي جرّبه بنفسك
قم بتعديل السكريبت لـ:
- أعد تسمية الملفات ذات الامتداد
.jpgو.jpeg. - انقل الملفات المُعاد تسميتها إلى مجلد فرعي يسمى
Processed.
دمج JXA مع Shortcuts
منذ macOS Monterey، استبدلت Shortcuts Automator كمنصة الأتمتة الرئيسية لشركة Apple2. لكن JXA لا يزال يلعب دورًا حاسمًا: يمكنك استدعاء سكريبتات JXA داخل Shortcuts.
مثال: تشغيل سكريبت JXA من اختصار
- أنشئ اختصارًا جديدًا.
- أضف إجراء تشغيل JavaScript للأتمتة.
- الصق سكريبت JXA الخاص بك.
- أضف مُحفز Quick Action (مثل النقر بزر الماوس الأيمن في Finder → Quick Actions).
هذا يتيح لك تشغيل أتمتتك من أي مكان — حتى عبر Siri أو اختصارات لوحة المفاتيح.
متى تستخدم مقابل متى لا تستخدم JXA
| حالة الاستخدام | استخدم JXA | تجنب JXA |
|---|---|---|
| أتمتة تطبيقات macOS الأصلية (Finder, Mail, Safari) | ✅ | |
| التكامل مع iOS Shortcuts | ✅ | |
| بناء أتمتات متعددة المنصات | ❌ (استخدم Node.js أو Python بدلًا من ذلك) | |
| حسابات مكثفة أو سير عمل غير متزامن | ❌ (JXA أحادي الخيط) | |
| نصوص إنتاجية شخصية سريعة | ✅ | |
| خطوط أنابيب أتمتة على مستوى المؤسسات | ❌ (فكر في AppleScript + shell أو أدوات MDM) |
مثال واقعي: أتمتة أدوات المطورين
يستخدم العديد من المطورين أتمتة macOS لتبسيط المهام المتكررة:
- أتمتة البناء: تشغيل بناءات Xcode وفتح السجلات تلقائيًا.
- إعداد البيئة: تشغيل تطبيقات متعددة (Terminal, VS Code, متصفح) لمشروع معين.
- إدارة الملفات: تنظيم لقطات الشاشة أو التنزيلات باستخدام تسميات محددة.
على سبيل المثال، قد يستخدم مطور الواجهة الأمامية سكربت JXA لفتح خادم محلي ومتصفح ومُحرر في خطوة واحدة:
const app = Application.currentApplication();
app.includeStandardAdditions = true;
Application('Terminal').doScript('cd ~/projects/myapp && npm start');
Application('Google Chrome').openLocation('http://localhost:3000');
Application('Visual Studio Code').activate();
يقوم هذا السكربت بتشغيل بيئة تطوير كاملة في ثوانٍ.
المزالق الشائعة & الحلول
| المشكلة | السبب | الحل |
|---|---|---|
| رفض الصلاحية | إعدادات خصوصية macOS | اذهب إلى System Settings → الخصوصية والأمان → الأتمتة واسمح بالوصول. |
| مرجع تطبيق غير محدد | التطبيق غير قابل للسكربت | استخدم Script Editor → ملف → فتح القاموس للتحقق من دعم التطبيق للسكربت. |
| السكربت لا يعمل | علامة لغة خاطئة | تأكد من استخدام -l JavaScript في osascript. |
| إشعار غير ظاهر | أذونات الإشعارات | قم بتمكين الإشعارات لـ Script Editor أو Terminal. |
أنماط معالجة الأخطاء
JXA يدعم JavaScript try/catch القياسي، ولكن يمكنك أيضًا عرض تنبيهات ودية للمستخدم:
try {
const Mail = Application('Mail');
const inbox = Mail.inbox();
console.log(`Inbox has ${inbox.messages.length} messages`);
} catch (error) {
const app = Application.currentApplication();
app.includeStandardAdditions = true;
app.displayDialog(`Error: ${error.message}`);
}
نصيحة: دائمًا قم بتغليف استدعاءات جسر AppleScript في try/catch — أخطاء JXA قد تكون غامضة.
اختبار وتصحيح أخطاء سكربتات JXA
1. استخدام كونسول Script Editor
- استخدم لوحة Result للتحقق من قيم الإرجاع.
- سجل إخراج التصحيح باستخدام
console.log().
2. استخدام Terminal
- تشغيل السكربتات باستخدام
osascript -l JavaScript. - استخدم
exit(1)في حالة الفشل للتكامل مع سكربتات CI.
3. استخدام اختبار الوحدات عبر Node.js (متقدم)
يمكنك محاكاة أجزاء من منطق الأتمتة الخاص بك في Node.js باستخدام محاكيات لاختبار المنطق التجاري قبل التشغيل على macOS.
اعتبارات الأمان
يمكن لسكربتات الأتمتة الوصول إلى بيانات حساسة أو التحكم في التطبيقات — لذا فإن macOS تفرض عزلًا صارمًا3.
نقاط أمان رئيسية
- تتطلب السكربتات موافقة المستخدم للتحكم في التطبيقات.
- تُخزن أذونات الأتمتة في قاعدة بيانات TCC (الشفافية، الموافقة، والتحكم).
- تجنب تخزين بيانات الاعتماد بشكل نصي عادي — استخدم Keychain Access أو المتغيرات البيئية.
مثال: الوصول إلى Keychain بشكل آمن
const app = Application.currentApplication();
app.includeStandardAdditions = true;
const password = app.doShellScript('security find-generic-password -w -a myuser -s myservice');
يقوم هذا باسترجاع كلمة المرور المخزنة في Keychain بشكل آمن.
الأداء والقابلية للتوسع
سكربتات JXA أحادية الخيط ومبنية على الأحداث. وهي مناسبة لأتمتة مستوى المستخدم ولكنها ليست مناسبة للأحمال عالية الأداء.
نصائح الأداء
- قلل من تشغيل التطبيقات — أعد استخدام مراجع Application.
- قم بتشغيل العمليات دفعة واحدة بدلاً من التكرار لكل ملف.
- استخدم أوامر shell للتعامل مع عمليات I/O الثقيلة للملفات.
على سبيل المثال، بدلاً من تغيير أسماء الملفات واحدة تلو الأخرى، استخدم استدعاء shell:
Application.currentApplication().doShellScript('for f in *.png; do mv "$f" "2025-$f"; done');
يمكن أن يكون هذا أسرع بـ 10–50 مرة للمجلدات الكبيرة4.
المراقبة والقابلية للملاحظة
بينما لا توفر macOS قابلية ملاحظة مدمجة لسكربتات الأتمتة، يمكنك:
- سجل في الملفات باستخدام
doShellScript('echo ... >> ~/automation.log'). - استخدم
displayNotification()للحصول على ملاحظات للمستخدم. - دمج مع أدوات الطرف الثالث مثل Raycast أو Alfred للحصول على رؤية أفضل.
نظرة عامة على البنية
هكذا تتكامل JXA في نظام أتمتة macOS:
graph TD
A[User Action] --> B[Shortcuts or Script Trigger]
B --> C[JXA Script]
C --> D[Apple Event Bridge]
D --> E[macOS Applications]
E --> F[System APIs / Files / Network]
يوضح هذا النموذج أن JXA تعمل كجسر بين إجراءات المستخدم ونظام أحداث Apple في macOS.
الأخطاء الشائعة التي يرتكبها الجميع
- خلط سينتاكس AppleScript في JXA — هما لغتان مختلفتان.
- نسيان تمكين أذونات الأتمتة في إعدادات النظام.
- استخدام حلقات متزامنة للتحكم في التطبيقات — قد تؤدي إلى تجمد واجهة المستخدم.
- عدم التحقق من قواميس التطبيقات — ليست كل التطبيقات تدعم البرمجة النصية.
- تجاهل تحذيرات الأمان — قد تفشل السكربتات بصمت.
دراسة حالة: أتمتة سير عمل إنتاج الفيديو
أتمتت دراسة حالة صغيرة عملية تصدير الفيديو باستخدام JXA:
- الهدف: تصدير مشاريع Final Cut Pro ورفعها تلقائيًا إلى YouTube.
- الحل: سكربت JXA مُشغَّل بواسطة Shortcut ينفذ أمر تصدير Final Cut Pro، ويضغط الفيديو باستخدام سكربت shell، ويرفعه عبر API.
- النتيجة: تقليل وقت التصدير اليدوي من 15 دقيقة إلى أقل من دقيقتين.
بينما تقتصر برمجة Final Cut Pro النصية، فإن دمج JXA + shell + API أنشأ سير عمل هجين قوي وسهل الصيانة.
دليل استكشاف الأخطاء وإصلاحها
| الأعراض | السبب المحتمل | الإصلاح |
|---|---|---|
| السكربت يعمل لكن لا يحدث شيء | التطبيق غير قابل للبرمجة النصية أو عدم الإذن | تحقق من قاموس التطبيق وإعدادات النظام → الأتمتة |
osascript يعيد خطأ في السينتاكس |
نقص علامة -l JavaScript |
حدد دائمًا -l JavaScript |
| إجراءات Finder تفشل بصمت | Finder غير نشط | استخدم Finder.activate() قبل تنفيذ الإجراءات |
| الإشعارات غير معروضة | أذونات الإشعارات | تمكينها في إعدادات النظام → الإشعارات |
متى تتجاوز JXA
إذا أصبحت أتمتتك معقدة، فكر في:
- جسر Node.js + AppleScript للعملية غير المتزامنة.
- إجراءات Swift Automator للأداء الأصلي.
- Shortcuts API لسير العمل عبر الأجهزة.
JXA مثالية للأتمتة الشخصية وإنتاجية المطورين، لكنها ليست مناسبة للتنسيق على نطاق المؤسسات.
النقاط الرئيسية
JXA تجلب قوة JavaScript الحديثة لأتمتة macOS. هي مثالية للمطورين الذين يريدون أتمتة التطبيقات الأصلية، وتبسيط سير العمل، والتكامل مع Shortcuts — كل ذلك باستخدام لغة مألوفة.
أبرز النقاط:
- استخدم
osascript -l JavaScriptلتشغيل سكريبتات JXA. - دمج مع Shortcuts لإنشاء محفزات مرنة.
- تعامل دائمًا مع الأذونات والأمان بحذر.
- اختبر السكريبتات في Script Editor قبل الاستخدام الإنتاجي.
الأسئلة الشائعة
1. هل JXA مُعَطَّل؟
لا. JXA لا يزال مدعومًا في macOS، على الرغم من أن Apple تركز على Shortcuts للمستخدمين النهائيين2.
2. هل يمكن لـ JXA التحكم في تطبيقات الطرف الثالث؟
نعم، إذا كان التطبيق يعرض دليل AppleScript.
3. هل يمكنني استخدام async/await في JXA؟
لا. JXA يعمل في بيئة JavaScriptCore متزامنة.
4. هل JXA يعمل على iOS؟
لا. JXA مخصص لـ macOS فقط.
5. هل يمكنني توزيع سكريبتات JXA؟
نعم. احفظها كـ .scpt أو .app لمشاركة.
الخطوات التالية
- استكشف ميزة Script Editor → Open Dictionary.
- دمج JXA مع Shortcuts لأتمتة هجينة.
- جرّب Raycast أو Alfred لتشغيل السكريبتات.
الملاحظات
-
وثائق مطوري Apple – JavaScript للأتمتة: https://developer.apple.com/library/archive/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/ ↩
-
دعم Apple – استخدام Shortcuts على Mac: https://support.apple.com/guide/shortcuts-mac/welcome/mac ↩ ↩2
-
دليل أمان منصة Apple – الشفافية والموافقة والتحكم (TCC): https://support.apple.com/guide/security/transparency-consent-and-control-secb7f9e31d4/web ↩
-
وثائق مطوري Apple – مقدمة في كتابة سكريبتات Shell: https://developer.apple.com/library/archive/documentation/OpenSource/Conceptual/ShellScripting/Introduction/Introduction.html ↩