البرمجة الحديثة: نظرة بعد 25 عامًا من الاستراحة أو كما كتبت في روبوت Telegram

تبدو المهمة بسيطة عندما لا تعرف شيئًا عنها وعندما تقرر.

في يوم "رائع" ، أدركت أنني لست مهتمًا بالجلوس في العديد من المنتديات ، لكنني أريد إنشاء قناة خاصة بي ومشاركة "الحكمة".

أحب ميزات Telegram المضمنة فيها بما في ذلك برامج الروبوت ، لذلك تم إنشاء القناة في شكل مدونة هناك. بدأ في البحث عن برامج الروبوت للمساعدة في كتابة الرسائل .... وبما أنني لا أريد العثور عليه. حسنا ، اكتبها بنفسك. ينصح الأشخاص الأذكياء بالكتابة في بيثون.

قرأت أول درس تعليمي على الإنترنت في 149 صفحة. أنا معتاد على Pascal و FoxPro و Interbase وحتى (ها ها ها 3 مرات) قبل 20 عامًا ، قمت ببيع برامجي ، وبعد ذلك بطريقة ما لم تنجح ، دخلت التجارة. ساعدني كمبرمج كثيرًا في تحديد مهام للمبرمجين بالمناسبة. لكن بالعودة إلى بيثون ، يبدو أنه ليس شيئًا معقدًا ، لأنه كان من الممكن البرمجة على BASIC أيضًا ، وهذه ليست شهادتي الجامعية مع مجمع برمجيات الأجهزة الخاص بمولد التحقق من MIG في Assembler. مشكلة واحدة ، كانت جميعها منذ فترة طويلة ، لذا فقد عدت إلى العنوان - يبدو أنها بسيطة ، لأنني لا أعرف شيئًا عن المهمة حتى الآن ، لكن الأمر يستحق المحاولة.

قررت أنه من الأنسب إنشاء مشروع من هاتف ذكي إلى Android ، لأنه دائمًا في متناول اليد. لذا ضع:

  1. Pydroid 3 - IDE لـ Python 3 في الواقع Python لنظام Android.
  2. BotFather ، في Telegram ، نقوم بتثبيت والد جميع برامج الروبوت - ستحتاج إليها للحصول على معرف الروبوت الخاص بك وإعداد الإعدادات الأساسية.
  3. تطبيق إعادة تشغيل لإطلاق مشروع على heroku.
  4. GIT تطبيق لاستضافة المستودعات عبر الإنترنت.
  5. الزجاج الأمامي بدون VPN في أي مكان؟
  6. Termux الطرفية المحاكي وبيئة لينكس.

وما هو بيت القصيد؟ البرمجة على الهاتف الذكي ممكنة من الناحية النظرية ، ولكنها مستحيلة من الناحية العملية. تحقق من الكود قدر الإمكان ، واصلح الخطأ ، واستكشف الأداء.

هذه مقدمة طويلة ، وما أردت الحصول عليه من روبوتي. في البداية بدا لي ما يكفي لإضافة Hashtag في نهاية الرسالة. ثم جاءت الفكرة "لتغطيتها" برابط لقناتي ، لذلك مع إعادة النشر سيكون هناك إغراء إضافي لمصدر القناة. ثم أضاف أتمتة الرابط المصدر ، حيث أتلقى الرسالة منه. بعد ذلك ، سأجعل استطرادا. الإعلان ، بالطبع ، هو محرك التقدم. ولكن في بعض الأحيان يذهب المبلغ من خلال السقف. تم اختيار Telegram من قبلي ، من بين أشياء أخرى ، لأن هناك فرصة لمحاربة هذا الأخير. أحترم قراء قناتي وبالتالي أقوم بتنظيف الأخبار المثيرة للاهتمام الموجودة على Ineta من الإعلان وأرسلها إلى القناة. في الوقت نفسه ، أحترم المؤلفين وأقدم دائمًا رابط للمصدر في شكل "اقرأ المزيد ...". بسبب كره الإعلانات ، أقوم بتنزيل المحتوى من YouTube وتحميله في قناتي كملف فيديو. في لحظة معينة ، أصبح برنامج الروبوت الذي قام بتنزيل الفيديو مجنونًا وبدأ بإرسال إعلانات لي كل ساعة. لذلك في روبوتي ، كانت هناك فرصة لتنزيل الفيديو من YouTube. في الآونة الأخيرة ، بالمناسبة ، قابلت مؤلف هذا الروبوت ، لقد فوجئ به للغاية ، لأنه ووفقا له ، يرسل الإعلانات "فقط" 20 مرة في الشهر. حدث الشيء نفسه مع الروبوت الذي يصنع العلامة المائية - تم إرساله إلى الفرن ، وأتيحت لي الفرصة لصنع علامة مائية.

من أجل كتابة برنامج من نقطة الصفر ، كان علي البحث في الكثير من المعلومات على الإنترنت. آمل أن يساعد أولئك الذين يتبعون خطواتي. إذن ، من أين أتلقى المعلومات وماذا استخدمت:

  1. مقالات عن هبر ساعدتني حقًا. لذلك ، لن أعيد كتابة كيفية التثبيت وما. كل شيء هناك. بالمناسبة ، اتصلت بالمؤلفين بطريقة شخصية ولم يرفضوا مساعدتي أبدًا.
  2. github هي خدمة استضافة المستودعات عبر الإنترنت مع جميع ميزات التحكم في الإصدار الموزع ووظيفة التحكم في المصدر. كتاب تمهيدي
  3. heroku عبارة عن نظام PaaS قائم على السحابة يدعم عددًا من لغات البرمجة. تخلى عنه بسرعة كبيرة.
  4. pyTelegramBotAPI - إحدى المكتبات الرئيسية عند كتابة روبوت لبرنامج Telegrams.
  5. بوت هجاء تعليمي
  6. بيثون 3 للمبتدئين
  7. السير: معلومات للمطورين
  8. مرجع HTML
  9. في أي مكان دون VPN؟

سوف تظهر الغطاس الثاني أو خطة الحرب. عندما بدأت في كتابة الروبوت ، كان أول شيء نظرت إليه هو رموز شخص آخر. إذا لم يكن هناك kamenty ، يمكن للمرء أن يفهم بالكاد:

هزت الأرض مثل صدورنا
الخيول مختلطة في حفنة ، والناس ،
وكرات من ألف بندقية
اندمجت في عواء طويل ...

كتب Lermontov عن الرمز. كومة يحتوي على وظائف ، والديكور. لا يوجد رمز الجمال ، لا أحد يهتم بالموارد. على الرغم من أن الجمال من المرجح أن يرى مازوشي غريب الأطوار. إن معنى عبارة مبرمج مألوف "أنظر إلى البرنامج ، ربما يمكنك أن تكتشفه" وصلتني بسرعة كبيرة. كان أهم انفجار في الدماغ عندما أدركت أخيرًا أن الشفرة تحركها الأحداث وليس التسلسل. هذا هو مستوى مختلف.

المشكلة الثانية هي عدم وجود وثائق جيدة. حتى في Basurm. سأقدم مثالا. أرسل صورة إلى البرقيات ، وهو يهزها بلا خجل. اتضح أنه تم كتابة وسيطة غير صالحة في السطر:

file_info = bot.get_file(message.photo[-1].file_id) 

وما هي الوثائق؟ نذهب إلى المصدر

صورة

صورة

هذا هو مجموعة. يمكنك المشي على طول ذلك ، ودراسة أين يعود الحجم. شكرا لك ، اقترح الأشخاص الأذكياء ما يصف. على الرغم من ما أتحدث عنه ، حتى لو كان المعلمون في حيرة.

عندما كتبت رمز العلامة المائية ، استخدمت خطًا مجانيًا ولجعله غامقًا ، قمت بتطبيق الحل لعرض الرسالة ثلاث مرات مع إزاحة بكسل ، لا أعرف مدى جمال الحل ، لكنه يعمل.

 font = ImageFont.truetype("Pillow/Tests/fonts/FreeMono.ttf", width//20) pos = (width//4, height - height//10) text = skanal drawing.text(pos, text, fill=black, font=font) pos = (1 + width // 4, 1 + height - height // 10) drawing.text(pos, text, fill=black, font=font) pos = (2 + width // 4, 2 + height - height // 10) drawing.text(pos, text, fill=black, font=font) 

يتم تحديد الموضع ، كما ترون ، اعتمادًا على حجم الصورة وارتفاع الخط أيضًا. صادفت على الفور نقطة مثيرة للاهتمام: على الرغم من أن الخط جزء لا يتجزأ من مكتبة PIL ، حيث أن السطر الأول يقول إنه يعمل محليًا ، ولكن في Docker لا يعمل. المخرج هو تنزيله إلى المستودع ، وإضافة المسار إلى ملف البيئة وكتابة مسار آخر في البرنامج.

حدث شيء آخر غير مفهوم بالنسبة لي للصورة بعد المعالجة باستخدام مكتبة PIL (مباشرة بعد العلامة المائية). أرسلها إلى روبوتي:

  with open(photo_path, 'rb') as fi: bot.send_photo(message.chat.id, fi) 

كل شيء رائع ، أنا أحب الصورة. ثم أحتاج لإضافة تعليق على الصورة ومعرفة ما إذا كان كل شيء يبدو جميلًا معًا؟ نكتب:

 bot.send_photo(message.chat.id, message.photo[-1].file_id, caption=' ') 

لسبب ما ، الصورة الأصلية ، غير المجهزة يذهب إلى الروبوت. حسنًا ، دعونا نحاول خداع: getupdates.offset -1 بلا معنى ، Telegram متأكد من أن هذه هي الصورة نفسها. حسنا ، نحن نفعل هذا:

  with open(photo_path, 'rb') as fi: info = bot.send_photo(message.chat.id, fi) 

كتابة:

 bot.send_photo(message.chat.id, info.photo[-1].file_id, caption=' ') 

والنتيجة هي نفسها - يتم عرض الصورة الأصلية. وفقط استبدال الرسالة في الوسيطة الأولى بالمعلومات أعطى النتيجة المرجوة.

سأعطيك أيضًا رمزًا مثيرًا للاهتمام على مستوى الدخول من YouTube (ملاحظة: دون التحقق من الخطأ):

 elif message.entities: #    pkanal = 6 for item in message.entities: if item.type == "url" and message.text.find(' ') == -1: if 'youtube.com' in message.text or 'youtu.be' in message.text: #    ydl_opts = {'outtmpl': '/tmp/f.mp3', 'preferredcodec': 'mp3', 'max_filesize': 60000000} link_of_the_video = message.text with youtube_dl.YoutubeDL(ydl_opts) as ydl: ydl.download([link_of_the_video]) bot.delete_message(message.chat.id, message.message_id) if os.path.exists('/tmp/f.mp3'): #   video = open('/tmp/f.mp3', 'rb') bot.send_video(message.chat.id, video) os.remove('/tmp/f.mp3') pkanal = 6 else: #   bot.send_message(message.chat.id, '  ', parse_mode='html', disable_web_page_preview=True) 

بالنسبة لي ، كان حجر العثرة هو أن الكيانات عبارة عن مجموعة من المصفوفات وتحتاج إلى "تجاوز" المصفوفة بأكملها حتى يفهم الروبوت أننا نعمل على ارتباط. اتضح أيضًا أن المستخدمين يرسلون الرابط إلى برنامج الروبوت كـ "مشاركة" من YouTube ، بحيث يتم كتابة "youtu.be" أيضًا في المثال. لم أتوصل إلى طريقة لإرسال ملف على الفور إلى Telegram ، لذلك نقوم بحفظه وإرساله ثم حذفه. أثناء الاختبار ، أُبلغت على الفور أن الأشخاص سيبدأون تنزيل الملفات العملاقة - في وقت لاحق ، اضطررت إلى فرض قيود.

قبل إصدار الروبوت ، أصبح من الواضح فجأة أنني لم يكن لدي شيك للتحقق من حقوق الوصول إلى القناة. على سبيل المثال ، مع معرفة قناتي ، يمكن لأي مستخدم روبوت إرسال رسالة إلى هناك ، لأنه الروبوت هو المسؤول. كان عليّ القيام بالتحقق على وجه السرعة:

 if message.from_user.id in [adm_obj.user.id for adm_obj in bot.get_chat_administrators(chat_id)]: 

هنا نحصل على قائمة المسؤولين من القناة ونرى ما إذا كان مؤلف الرسالة هو أيضًا مسؤول.

بضع كلمات حول كيف كان عليك القتال مع Roskomnadzor. نظرًا لأن الوصول إلى واجهة برمجة التطبيقات محظور ، لتطوير الروبوت محليًا ، يلزمك المرور بطريقة أو بأخرى من خلال المدافعين الشجعان. يمكنك القيام بذلك بطريقتين - من خلال VPN أو من خلال وكيل. الطريقة الأسهل والأسرع و "العادية" هي نفق ssh: نحن نؤسس اتصالًا بين العميل والخادم الوكيل ، ونحصل على منفذ على المضيف المحلي حيث يمكن إرسال حركة المرور من جانبنا ، وسيخرج من الجانب الآخر (بالفعل في مكان ما في ألمانيا). للراحة ، يمكنك إضافة بعض مظاهر التشغيل التلقائي لهذا الاتصال - برنامج نصي واختصار على سطح المكتب ، والذي سيتم تشغيله ، إذا لزم الأمر. من خلال الأسلوب "العادي" ، أعني هنا الحالة التي نتحكم فيها في نقاط الدخول والخروج بأنفسنا - على اليسار هو جهاز الكمبيوتر المحمول الخاص بنا ، على اليمين هو VPS في ألمانيا. في الوسط ، يمكن اعتراض حركة المرور بالقدر الذي ترغب فيه ، ويتم تشفيرها ، وعند الخروج نجد أنفسنا في ولاية دولة أخرى ، ولا تسري عليها قوانين الاتحاد الروسي. كإضافة ، نحصل على ضمان إضافي بأن الخادم الوكيل لن يتم تغييره أو إيقاف تشغيله حتى نقوم بذلك بمفردنا. أي على عكس أي عم VPN ، لدينا راحة البال والثقة في المستقبل.

سيناريو

 /home/user/proxy.sh 

رمز البرنامج النصي

 #!/bin/bash ssh -f -D 1080 user@12.34.56.78 sleep 72000 

بعد أن أنشأنا اتصالًا بالخادم والمنفذ مفتوحًا ، نحتاج إلى توجيه حركة المرور بطريقة ما إلى هناك. عند السير على الطريق الأقل مقاومة ومن أجل عدم التفكير في كيفية تكوين الخادم الوكيل في IDE \ docker \ python ، يمكنك عمل إعداد واحد للجميع ، وستكون سلاسل الوكلاء مثل هذا الإعداد. إذا قمت بتشغيل أي برنامج باستخدام هذه الأداة المساعدة ، فسوف يعيد توجيه حركة المرور عبر سلسلة الوكيل المسجلة في التكوين.

 /etc/proxychains.conf 

في حالتنا ، هذه سلسلة واحدة والكتابة ليست صعبة.

 socks5 127.0.0.1 1080 

وهناك عكاز آخر تم إجراؤه لعدم تكوين VPN (السخرية) وهو طريقة لإطلاق تطبيق Python من PyCharm. في الحالة البسيطة ، لتشغيل التطبيق من خلال سلاسل الوكيل ، ما عليك سوى كتابة proxychains app.py وهذا كل شيء. ولكن IDE يتطلب دائما مترجم. من السهل التغلب على ذلك - إنشاء "تكوين تشغيل" جديد ، واختيار نص برمجي. واملأ الحقول

صورة

بعد ذلك ، يبدأ الإطلاق من وجهة نظر IDE بهذا الشكل: proxychains python3 app.py - هذا هو بالضبط ما نحتاج إليه. وبالتالي ، عندما نريد أن نبدأ مشروعًا ، كل ما نحتاج إليه هو تشغيل البرنامج النصي على سطح المكتب ، ثم الضغط على زر "التشغيل" في بيئة تطوير متكاملة لإطلاق الروبوت ، وسيتم تنفيذ الجزء المتبقي من السحر بواسطة البروكسيات و ssh.

وأخيرا ، يتم كتابة الروبوت ، واختبارها. ما التالي؟ من ناحية ، أود أن أعلن نفسي ، من ناحية أخرى ، أعتقد أنه يمكن أن يكون مفيدًا حقًا لشخص ما. وهنا نواجه مشكلة برقية أخرى ؛ ليس لديها كتالوج واحد من القنوات والبوتات. من الممكن تماماً وجود روبوت مشابه لبرنامجي ، ولكني أكرر أنني لم أجده. وفي مكان ما في الترام ، يجلس رجل ويعاني ، ويرغب في ترتيب رسالة بشكل جميل في القناة ويفعل كل شيء مع الأقلام.

إذا قمت بتشغيل روبوتي بالفعل ، فعندئذ رأيت أن هناك علامة # للإعلان. كيف ذلك؟ - أنت تسأل. وهنا تحدثت عن المشكلة مع المستخدمين النهائيين - الكثير منهم ينشرون إعلانات على قنواتهم وسرعان ما اعتادوا على كتابة الرسائل باستخدام الروبوت ، وطلبوا مني الإضافة. قد لا تحب الإعلان ، قم بمكافحته ، ولكن هذه حقائق قاسية وضرورية للمستخدمين.

المشروع غير ربحي ، لذلك أعتقد أنه يمكنك استدعاء الروبوت نفسهSGK_espace_bot.

وهنا هو الفيديو كيفية استخدامها
سأكون ممتنا لأي نقد بناء.

Source: https://habr.com/ru/post/ar477178/


All Articles