إتقان أتمتة macOS مع JavaScript: من Shortcuts إلى Scriptable التدفقات

٥ ديسمبر ٢٠٢٥

Mastering macOS Automation with JavaScript: From Shortcuts to Scriptable Workflows

باختصار

  • macOS تدعم الأتمتة عبر JavaScript للأتمتة (JXA)، وهي بديل حديث لـ AppleScript.
  • يمكنك أتمتة Finder و Mail و Safari وتطبيقات macOS الأخرى مباشرة باستخدام واجهات JavaScript APIs.
  • دمج Shortcuts و Automator و JXA لإنشاء سير عمل متينة عبر التطبيقات.
  • تعلم كيفية بناء واختبار وتأمين سكربتات الأتمتة باستخدام أمثلة واقعية.
  • اكتشف متى تكون الأتمتة تستحق البناء—ومتى يكون العمل اليدوي أو التطبيقات الأصلية أفضل.

ما ستتعلمه

  • ما هو JavaScript للأتمتة (JXA) وكيف يندرج ضمن أتمتة macOS.
  • كيفية كتابة وتشغيل وتصحيح أخطاء سكربتات JXA باستخدام Script Editor وأدوات سطر الأوامر.
  • كيفية دمج الأتمتة مع macOS Shortcuts و Automator.
  • كيفية التعامل مع الأذونات والبيئة المعزولة والمخاوف الأمنية.
  • كيفية هيكلة واختبار وصيانة سير عمل الأتمتة مثل المحترفين.

المتطلبات الأساسية

قبل البدء، يجب أن يكون لديك:

  • معرفة أساسية ببنية 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

العصر الأداة اللغة المزايا الرئيسية الاستخدام النموذجي
التسعينيات–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

  1. قم بتشغيل Script Editor (موجود في /Applications/Utilities/).
  2. اختر File → New.
  3. في شريط الأدوات، اضبط اللغة على 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 كمنصة أبل الرئيسية للأتمتة2. لكن JXA لا يزال يلعب دورًا حاسمًا: يمكنك استدعاء سكريبتات JXA داخل Shortcuts.

مثال: تفعيل سكريبت JXA من Shortcut

  1. أنشئ Shortcut جديدًا.
  2. أضف إجراء Run JavaScript for Automation.
  3. الصق سكريبت JXA الخاص بك.
  4. أضف مُحفز 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, Browser) لمشروع معين.
  • إدارة الملفات: تنظيم لقطات الشاشة أو التنزيلات باستخدام تسميات محددة.

على سبيل المثال، قد يستخدم مطور واجهة أمامية نص 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 اذهب إلى إعدادات النظام → الخصوصية & الأمان → الأتمتة واسمح بالوصول.
مرجع تطبيق غير محدد التطبيق غير قابل للبرمجة النصية استخدم Script Editor → File → Open Dictionary للتحقق مما إذا كان التطبيق يدعم البرمجة النصية.
النص لا يعمل علامة لغوية خاطئة تأكد من استخدام -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 Console

  • استخدم Result pane لفحص قيم الإرجاع.
  • سجل إخراج التصحيح باستخدام 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 للعمليات الثقيلة على الملفات.

على سبيل المثال، بدلاً من تسمية الملفات واحدة تلو الأخرى، استخدم استدعاء 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.


الأخطاء الشائعة التي يرتكبها الجميع

  1. خلط سينتاكس AppleScript في JXA — هما لغتان مختلفتان.
  2. نسيان تمكين أذونات الأتمتة في إعدادات النظام.
  3. استخدام حلقات متزامنة للتحكم في التطبيقات — قد تؤدي إلى تجمد الواجهة.
  4. عدم التحقق من قواميس التطبيقات — ليس كل تطبيق يدعم البرمجة النصية.
  5. تجاهل تحذيرات الأمان — قد تفشل السكريبتات بصمت.

دراسة حالة: أتمتة سير عمل إنتاج الفيديو

أتمتت استوديو إبداعي صغير عملية تصدير الفيديو باستخدام 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 للسيرورات غير المتزامنة.
  • إجراءات Automator بـ Swift للأداء الأصلي.
  • 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 لتشغيل السكريبتات.

الهوامش

  1. وثائق مطوري Apple – JavaScript للأتمتة: https://developer.apple.com/library/archive/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/

  2. Apple Support – Use Shortcuts on Mac: https://support.apple.com/guide/shortcuts-mac/welcome/mac 2

  3. Apple Platform Security Guide – Transparency, Consent, and Control (TCC): https://support.apple.com/guide/security/transparency-consent-and-control-secb7f9e31d4/web

  4. Apple Developer Documentation – Shell Scripting Primer: https://developer.apple.com/library/archive/documentation/OpenSource/Conceptual/ShellScripting/Introduction/Introduction.html