اليوم في البرنامج: أين يمكنك تطبيق Google Apps Script إذا انتهت الأفكار العادية. أتمتة العمل مع VPNBook من خلال سلسلة من البرامج النصية بلغات مختلفة لا أعرفها. Nedo-cURL بواسطة Mikrotik. برقية عبر مكان واحد ، حتى لا تكون في مكان آخر ، يسمح بالإشراف الذاتي.
الجزء 1. بلا عنوان
منذ عام ، كتبت ملاحظة "
تقريبا OCR للحصول على كلمة مرور VPNBook. PHP + Mikrotik " حول كيفية إعداد استرداد كلمة المرور التلقائي في جهاز توجيه Mikrotik للوصول المجاني إلى VPN عبر VPNBook. بداية القصة هناك.
منذ ذلك الحين ، تدفقت الكثير من المياه ، وفي روسيا قاموا بحظر موقع VPNBook ، ولكن ليس خوادم VPN العامة نفسها ، والتي يتم نشرها على هذا الموقع. سيناريو PHP هذا لفك تشفير صورة PNG لكلمة مرور في سلسلة نصية يجب أن يعمل الآن أيضًا عند تشغيله على خادم لا تمر مرورته عبر نظام الحظر. ولكن منذ بعض الوقت ، من خلال تجربة
script.google.com لخدمة Google Apps Script (GAS) ، قررت التخلي عن البرنامج النصي PHP على خادم ويب خارجي ، واستبداله جزئيًا أو كليًا ببرنامج نصي GAS يعمل كتطبيق ويب (تطبيق ويب). لم أفهم سياسة التنفيذ وقيود GAS ، لكن كل ما فعلته يعمل في حساب Google مجاني ولا يطلب المال حتى الآن. ليس لدي هدف لوصف Google Apps Script بالتفصيل. تعتمد GAS على لغة JavaScript ، ويمكنك استخدام مكتبات JS التابعة لجهات خارجية ، ويمكنك نشر البرنامج النصي كتطبيق ويب ، والذي يمكن إتاحته للجميع دون إذن. لم تكن إمكانات تطبيق GAS الحالي كافية بالنسبة لي ، لذلك اضطررت إلى الخروج والبحث عن حلول.
في البداية قررت أن أكتب وكيلًا لصور PNG. كان من المفترض أن يطلب برنامج الويب النصي صورة كلمة مرور من موقع VPNBook (أذكر أنه تم نشر كلمة المرور هناك في PNG) ومنحها للعميل الذي دعا هذا البرنامج النصي لفك تشفيره. هذه طريقة للالتفاف حول القفل. هنا التقى أول قيود الغاز. اتضح أن البرنامج النصي لا يمكنه عرض صورة MIME / png ، ولكن فقط تنسيقات النص ، JSON ، TEXT ، XML ، إلخ. ولكن كان هناك طريقة للالتفاف حول هذا. يمكنك تشفير PNG إلى Base64 وإرجاع سلسلة نصية إلى العميل. هناك نصوص مشابهة على الإنترنت ، على سبيل المثال
techslides.com/image-proxy-with-google-app-scripts . أنا فقط تبسيط واحد منهم. كنت بحاجة إلى صورة واحدة فقط وإخراج سلاسل Base64 فقط. والنتيجة هي برنامج نصي يتكون من دالة doGet واحدة فقط - معالج طلب GET يقوم بإرجاع سلسلة استجابة.
function doGet() { var response = UrlFetchApp.fetch('https://www.vpnbook.com/password.php'); var b64 = Utilities.base64Encode(response.getContent());
مثال على إخراج المتصفح:
iVBORw0KGgoAAAANSUhEUgAAAGQAAAANAQMAAABl11mFAAAABlBMVEX29vZMTExY89ZbAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAVUlEQVQImWNgIBrwSzCw/2ZgOADhSc5gYJCG8wxQedLdCcYFNXcgPHOZsxuSZxx7BuFZzsjdcJi34TBU5Y3cjc3IvM3McJ7kjNxtzDwwffwSIB7UTACt/h52C5DFqQAAAABJRU5ErkJggg==
بعد ذلك يأتي البرنامج النصي PHP ، والذي يمكن وضعه على الخادم داخل المنطقة مع قفل الموارد. إنه مشابه جدًا للبرنامج النصي من المقال السابق ، باستثناء تغيير بسيط في معلمات استدعاء cURL. أنت بحاجة إلى السماح لـ cURL بتجاوز HTTP / 1.1 302 تم النقل مؤقتًا ، لأن عند استدعاء GAS ، تتم إعادة التوجيه من عنوان البرنامج النصي على الويب إلى عنوان مؤقت ديناميكي:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
و Base64 فك:
$imgOCR = imagecreatefromstring(base64_decode($output));
يقوم برنامج PHP النصي بفك تشفير كلمة مرور PNG وإرجاعها كسلسلة نصية. علاوة على ذلك ، كما في المقالة الأولى في الجزء حول Mikrotik. يلتقط الموجه كلمة المرور باستخدام الجلب.
وكانت النتيجة مثل هذا المخطط للعمل من 2 الخدمات الوسيطة أمام Mikrotik.
الجزء 2. دفع على الغاز. تخلص من PHP النصي فك
أثناء التجارب مع GAS ، نشأت فكرة التخلي عن وحدة فك ترميز كلمة المرور في PHP ، وإعادة كتابتها في GAS. وهنا تم اكتشاف مشكلة كبيرة: لا يحتوي البرنامج النصي لـ Google على وظائف معالجة PNG ، الشيء الوحيد الذي يمكن القيام به هو تحويل PNG إلى صفيف بايت. لم يكن هناك أي شك في أي تلاعب مع أجزاء الصورة وبكسل. حصلت على Github أبحث عن مكتبة JS للعمل مع PNG ، لقد وجدت الكثير منها: PNG.js ، UPNG.js ، pngjs. لا يدعم البعض عمق ألوان 1 بت لوحدة بكسل PNG (صورة بكلمة مرور). سحبوا على طول مكتبات ضغط zlib. بشكل عام ، بدا لي كل هذا مرهقًا بعض الشيء ، وقررت أن أكتب بمفردي محولًا بدائيًا فقط لصورتي PNG إلى صورة نقطية مع وظيفة الوصول إلى البكسل بواسطة إحداثيات XY. ثم جاء الانغماس الكامل في تنسيق PNG: محرر سداسي عشرية ، معايير القراءة ، أكوام من الأوصاف على الشبكة. وأخيرًا ، صادفت قسم بابوا نيو غينيا من ملف IDAT ، معبأًا بـ zlib ، والذي تضمن مجموعة من البكسلات.
كانت تتطلب وظيفة لتفريغ zlib ، والتي بالطبع لم تكن في GAS. والمثير للدهشة أن لديهم gzip / ungzip و zip / unzip ، لكن لا يوجد zlib. بعد أن قرأت عن gzip (المستوى الثاني من الانغماس بعد تنسيق PNG) ، توصلت إلى استنتاج أنه لن يكون من الممكن تجميع "دراجة" على شكل أرشيف gzip من قسم IDAT ، على الرغم من استخدام ضغط zlib هناك وهناك. لأن لإنشاء أرشيف gzip صالح ، يلزمك معرفة طول البيانات التي تم فك حزمتها ، والتي لم أستطع الحصول عليها دون تفريغها :) وبالطول الخطأ ، اعتبرت GAS أن الأرشيف تالف. في النهاية ، التفتت إلى Github ووجدت حلاً رائعًا: zlib.js لمكتبة تطبيقات Google Apps (https://github.com/hinimub/zlib.js/blob/develop/README.en.md). الذي تم إعداده خصيصًا للاندماج في مشاريع GAS من خلال مكتبات المشروع الرئيسية. ثم بدأ اللغز يتلاقى. بعد كتابة إلغاء ضغط صفيف البكسل ووظيفة الوصول إلى إحداثيات XY بكسل ، كان من الممكن نقل برنامج فك التشفير من PHP إلى GAS.
بشكل منفصل حساب جدول تجزئة قاموس من أحرف كلمة المرور المحتملة. هذا إجراء لمرة واحدة قمت به في برنامج تابع لجهة خارجية (في LabVIEW ، مرحبًا ، زملاء). يمكن تخصيص كل حرف في الصورة على شكل 8 بتات (بدون مسافة بادئة) × 10 خطوط. 1 بايت يكفي لترميز 8 بكسل لسطر حرف واحد. يمكنك تخزين سلسلة من البيكسلات في عدد صحيح (بايت) ، والحرف بأكمله كتسلسل من 10 بايت. اتضح 10 أرقام عرافة لكل حرف. بعد ذلك ، يكرر وحدة فك ترميز GAS السلف PHP الخاص به.
والنتيجة هي برنامج نصي يعمل بالكامل في GAS. function doGet() {
'A'، 'FCC6C3C6FCC6C3C3C6FC': 'B'، '3E63C1C0C0C0C0C1633E': 'C'، 'FCC6C3C3C3C3C3C3C6FC': 'D'، 'FEC0C0C0FCC0C0C0C0FE': 'E'، 'FFC0C0C0FCC0C0C0C0C0': 'F function doGet() {
'،' C3C3C3C3FFC3C3C3C3C3 ':' H '،' 7E18181818181818187E ':' I '،' 1E666666466C38 ':' J '،' C3C6CCD8F0F0D8CCC6C3 ':' K '،' C0C0C0C0C0C0C0C0C0FE ':' L '، function doGet() {
' C3E3F3F3DBDBCFC7C7C3 ':' N '،' 3C66C3C3C3C3C3C3663C ':' O '،' FEC3C3C3FEC0C0C0C0C0 ':' P '،' 3C66C3C3C3C3DBCF663D ':' Q '،' FEC3C3C3FEF8CCC6C3C3 ':' R '،' 7EC3C0C07E333C37E function doGet() {
000B6DBDBDBDBDBDB ':' م '،' 000DCE6C3C3C3C3C3 ':' ن '،' 0003C66C3C3C3663C ':' س '،' 000DCE6C3C3C3E6DC ':' ع '،' 0003B67C3C3C3673B ':' ف '،' 000DE736060606060 " function doGet() {
ينفذ البرنامج النصي أسلوب GET فقط. عند تنفيذ طلب GET لهذا البرنامج النصي ، الذي تم نشره كتطبيق ويب ، ستحتوي الاستجابة على الفور على كلمة المرور التي تم فك شفرتها في شكل سلسلة.
الجزء 3. Mikrotik وانتقلت مؤقتا 302
لذلك ، لدينا برنامج نصي يعمل على خوادم Web App الخارجية ، وهو مستقل عن الأقفال ويعيد كلمة مرور نص عادي. ويبدو أنه لا يوجد شيء أسهل من طلب ذلك باستخدام أمر الجلب في RouterOS Mikrotik. ولكن بعد ذلك انتظرني مفاجأة أخرى. استجابةً للطلب (تم تغيير العناوين الحقيقية) ، يُرجع إحضار "302 تم نقله مؤقتًا".
[admin@MikroTik] /environment> :put ([/tool fetch url="https://script.google.com/macros/s/A.....A/exec" http-method=get output=user as-value]->"data") failure: closing connection: <302 Moved Temporarily "https://script.googleusercontent.com/macros/echo?user_content_key=....."> 173.194.222.138:443 (4) [admin@MikroTik] /environment>
في بداية المقال ، كتبت بالفعل عن هذا. عند الوصول إلى عنوان URL الثابت والمعروف في البرنامج النصي لتطبيق الويب ، تعيد Google التوجيه إلى عنوان URL المؤقت ، والذي بدوره يُرجع استجابة للطلب. ولكن على عكس PHP cURL ، فإن إحضار RouterOS لا يعرف كيفية إجراء عمليات إعادة التوجيه ، بل إنه يعيد الفشل. لكن forum.mikrotik.com لم يحدث على الفور ، ولكن كان هناك حل بديل. يمكنك إعادة توجيه إخراج الجلب القياسي من وحدة التحكم إلى ملف عن طريق استدعاء التنفيذ غير المتزامن في مهمة منفصلة عن طريق الالتفاف: التنفيذ. يمكنك بعد ذلك استرداد عنوان URL المعاد توجيهه وإعادة جلبه بالفعل باستخدام العنوان الجديد. الذي يتم أدناه.
فيما يلي النص الكامل لبرنامج نصي Mikrotik للعمل مع تطبيق GAS Web App الجزء 4. وكيل Telegram الغاز
قررت أن أخصص هذا الجزء للتكرار التالي لدمج خدمة Telegram في Mikrotik. سيكون استخدام GAS هنا ذا أهمية أكاديمية بحتة إذا لم يكن الأمر واقعًا لحظر خدمة Telegram ، بما في ذلك api.telegram.org ، والتي تعمل من خلالها برامج الروبوت مع الخدمة. تكرر الفكرة الفكرة في بداية المقالة حول بروكسي طلب صور PNG.
في هذه الحالة ، تتم كتابة GAS Web App لطلبات الوكيل من Mikrtotik إلى api.telegram.org. كأساس ، أخذت نصيًا جاهزًا من manzoorwanijk ، WPTelegram Google Script
gist.github.com/manzoorwanijk/ee9ed032caedf2bb0c83dea73bc9a28e . يمكن لهذا البرنامج النصي تعيين العديد من طرق Telegram API (ولكن ليس كلها). في args ، يمكنك تمرير كائن JSON يحتوي على معلمات الطلب ، على سبيل المثال
{"chat_id":"123","text":"HelloWorld"}
. ولكن بالنسبة لمهمتي المتمثلة في إرسال رسائل نصية من RouterOS Mikrtotik ، بدا أن التنفيذ معقد وبسطته. في النهاية ، يمكنك عمومًا كتابة العديد من البرامج النصية لتطبيقات الويب للتعبير عن طرق Telegram API المختلفة. إليكم تطبيقي لأسلوب sendMessage. يمكن تبسيطه بشكل أكبر عن طريق تضمين اسم أسلوب sendMessage الذي يتم استدعاؤه ، وحتى bot_token و chat_id في نص الدالة requestHandler.
function doGet(e) { if(typeof e !== 'undefined'){ return ContentService.createTextOutput(requestHandler(e)); } } function doPost(e) { if(typeof e !== 'undefined'){ return ContentService.createTextOutput(requestHandler(e)); } } function requestHandler(e){ if (typeof e.parameter.bot_token === 'undefined'){ return 'Error! Bot token not provided'; } else if (typeof e.parameter.method === 'undefined') { return 'Error! Method name not provided'; } else if (typeof e.parameter.chat_id === 'undefined') { return 'Error! Chat id not provide'; } else if (typeof e.parameter.text === 'undefined') { return 'Error! Text not provide'; } if (e.parameter.method === 'sendMessage') { var data = { "method": "post", "muteHttpExceptions": true, payload : 'chat_id=' + e.parameter.chat_id + '&text=' + e.parameter.text } return UrlFetchApp.fetch('https://api.telegram.org/bot' + e.parameter.bot_token + '/' + e.parameter.method, data).getContentText(); } }
بعد نشر البرنامج النصي في تطبيق الويب ، يمكنك تنفيذ طلب في متصفح GET للتحقق:
https://script.google.com/macros/s/A.....A/exec?bot_token=3.....3&method=sendMessage&chat_id=2.....3&text=testtext123
أو في طلب RouterOS POST:
:do { /tool fetch url=("https://script.google.com/macros/s/A.....A/exec") keep-result=no http-method=post http-data=("bot_token=3.....3&method=sendMessage&chat_id=2.....3&text=testtext123") } on-error={ }
يتم لف الطلب في حالة خطأ ، لأنه ، كما هو موضح أعلاه ، ستلقي المكالمة الأولى لجلب استثناء "Moved مؤقتًا 302" وسيوقف البرنامج النصي بدون معالج الخطأ عند هذه النقطة. مكالمة واحدة للجلب دون إعادة توجيه كافية لإرسال الرسالة ، وبالتالي فإن المكالمة الثانية لإحضارها ليست ضرورية إذا كنت لا تحتاج إلى كائن JSON الذي تم إرجاعه بواسطة Telegram API.
الجزء 5. النهائي
أحضرت تطبيقاتي الحقيقية عند تقاطع Google Apps Script مع خدمات أخرى. يمكنك الخروج مع الكثير. على سبيل المثال ، اكتب روبوت Telegram في GAS ، والذي سوف يستجيب بكلمة مرور VPNBook مع طلبات التخزين المؤقت لتقليل الحمل على VPNBook (خدمة ذاكرة التخزين المؤقت) ، وكل هذا سيكون في برنامج نصي GAS واحد. يمكنك الكتابة على GAS على نظام تسجيل أو تكوينات احتياطية لـ Mikrtotik ، والتي سيتم وضعها في ملفات محرّر مستندات Google وجداول بيانات Google ، وغير ذلك الكثير.