پاورشیل کا استعمال کرتے ہوئے گریڈ 7-9 میں اسکول کے بچوں کے لیے ایک سادہ ٹیلی گرام بوٹ کا سانچہ

ایک دوست کے ساتھ بات چیت کے دوران، مجھے اچانک معلوم ہوا کہ ان کے اسکول میں گریڈ 8-10 کے بچوں کو بالکل بھی پروگرامنگ نہیں سکھائی جاتی۔ ورڈ، ایکسل اور سب کچھ۔ کوئی لوگو نہیں، پاسکل بھی نہیں، یہاں تک کہ ایکسل کے لیے VBA بھی نہیں۔

میں بہت حیران ہوا، انٹرنیٹ کھولا اور پڑھنا شروع کیا۔
ایک خصوصی اسکول کے کاموں میں سے ایک نئی نسل کی تعلیم کو فروغ دینا ہے جو انفارمیشن سوسائٹی کی ترقی اور طرز زندگی کے حالات کے مطابق ہو۔
یہ کورس طلباء کو پاسکل پروگرامنگ زبان کی بنیادی تعمیرات کے بارے میں اپنے علم کو عملی طور پر مستحکم کرنے کی اجازت دے گا۔ (2017 کے لئے کچھ جمنازیم کے پروگرام سے)

آخر میں، میں نے چند گھنٹے گزارنے اور "اسکول کے بچوں کے لیے ایک سادہ بوٹ بنانے کا طریقہ" کی ایک مثال بنانے کا فیصلہ کیا۔

کٹ کے نیچے یہ ہے کہ پاورشیل میں ایک اور سادہ بوٹ کیسے لکھا جائے اور اسے ویب ہک، سفید IPs، سرشار سرورز، کلاؤڈ میں تعینات ورچوئل مشینیں، وغیرہ کے بغیر کام کرنے کا طریقہ - باقاعدہ ونڈوز والے گھر کے پی سی پر۔

TLDR: گرائمیکل اور حقائق کی غلطیوں کے ساتھ ایک اور بورنگ مضمون، پڑھنے کے لیے کچھ نہیں، کوئی مزاح نہیں، کوئی تصویر نہیں۔

مضمون میں کوئی نئی بات نہیں ہے، اس سے پہلے لکھی گئی تقریباً ہر چیز Habré پر موجود ہے، مثال کے طور پر مضامین میں ہدایات: ٹیلیگرام میں بوٹس کیسے بنائیں и سسٹم ایڈمنسٹریٹر کے لیے ٹیلیگرام بوٹ.
مزید یہ کہ مضمون جان بوجھ کر بے کار ہے تاکہ ہر بار تعلیمی لٹریچر کا حوالہ نہ دیا جائے۔ متن میں Gang 4، PowerShell Deep Dives یا، یوں کہیے، The 5 Pillars of the AWS Well-architected Framework کا کوئی حوالہ نہیں ہے۔

دیباچے کے بجائے، آپ اسے چھوڑ سکتے ہیں۔

بلا جھجھک نظر انداز کریں۔2006 میں، مائیکروسافٹ نے اس وقت کے ونڈوز ایکس پی، وسٹا، اور سرور 1.0 کے لیے پاور شیل 2003 جاری کیا۔ کچھ طریقوں سے، اس نے cmdbat اسکرپٹس، vb اسکرپٹس، Windows Script Host اور JScript جیسی چیزوں کو بدل دیا۔

اب بھی، لوپس، کلاسز، فنکشنز، MS GUI کالز کی موجودگی کے باوجود، PowerShell کو لوگو کے اختیارات کے بعد صرف اگلا مرحلہ سمجھا جا سکتا ہے، بجائے اس کے کہ شاید اب بھی استعمال شدہ Delphi (یا کچھ پرانا) ہو۔ گٹ انضمام اور وغیرہ.

پاورشیل نسبتاً کم ہی استعمال ہوتا ہے؛ آپ اس کا سامنا صرف پاور شیل کور، وی ایم ویئر vSphere پاور سی ایل آئی، ایزور پاور شیل، ایم ایس ایکسچینج، مطلوبہ اسٹیٹ کنفیگریشن، کی شکل میں کر سکتے ہیں۔ پاور شیل ویب رسائی اور ایک درجن یا اس سے زیادہ شاذ و نادر ہی استعمال ہونے والے پروگرام اور فنکشنز۔ شاید اسے ریلیز کے ساتھ دوسری ہوا ملے گی۔ ڈبلیو ایس ایل 2، لیکن یہ بالکل نہیں ہے.

پاورشیل کے تین بڑے فوائد بھی ہیں:

  1. یہ نسبتاً آسان ہے، اس کے بارے میں بہت سارے ادب اور مثالیں موجود ہیں، اور یہاں تک کہ روسی زبان میں بھی، مثال کے طور پر، Foreach کے بارے میں ایک مضمون - کتاب سے پاور شیل گہرائی میں - فرق () اور {} کے بارے میں
  2. وہ ایڈیٹر کے ساتھ جاتا ہے۔ ISE، ونڈوز کے ساتھ شامل ہے۔ یہاں تک کہ وہاں کسی قسم کا ڈیبگر بھی ہے۔
  3. اس سے کال کرنا آسان ہے۔ گرافیکل انٹرفیس کی تعمیر کے اجزاء.

0. تیاری۔

ہمیں ضرورت ہو گی:

  • ونڈوز پی سی (میرے پاس ونڈوز 10 ہے)
  • کم از کم کسی قسم کی انٹرنیٹ تک رسائی (مثال کے طور پر NAT کے ذریعے)
  • ان لوگوں کے لیے جن کی ٹیلیگرام تک محدود رسائی ہے - براؤزر میں فری گیٹ انسٹال اور کنفیگر کیا گیا ہے، کچھ مشکل صورتوں میں، سمپل ڈی این ایس کرپٹ کے ساتھ
  • آپ کے فون پر کام کرنے والا ٹیلیگرام کلائنٹ ہے۔
  • بہت بنیادی باتوں کو سمجھنا - متغیر، صف، لوپ کیا ہے؟

مضامین کھولے اور پڑھے - ہدایات: ٹیلیگرام میں بوٹس کیسے بنائیں и سسٹم ایڈمنسٹریٹر کے لیے ٹیلیگرام بوٹ

1. آئیے ایک اور ٹیسٹ بوٹ بنائیں۔

چونکہ ہر کوئی یہ پہلے سے جانتا ہے، اور ہو چکا ہے، آپ اسے چھوڑ بھی سکتے ہیں۔جیسا کہ اوپر مضمون میں کہا گیا ہے - سب سے پہلے، ٹیلیگرام کے لیے ایک بوٹ - یہ اب بھی ایک ایپلی کیشن ہے جو آپ کی طرف چل رہی ہے اور Telegram Bot API سے درخواستیں کر رہی ہے۔ مزید یہ کہ API واضح ہے - بوٹ پیرامیٹرز کے ساتھ ایک مخصوص URL تک رسائی حاصل کرتا ہے، اور ٹیلیگرام JSON آبجیکٹ کے ساتھ جواب دیتا ہے۔

متعلقہ مسائل: اگر کسی نامعلوم طریقے سے آپ JSON آبجیکٹ سے کچھ کوڈ لیتے ہیں اور کسی طرح اسے عمل درآمد کے لیے بھیجتے ہیں (مقصد پر نہیں)، تو آپ کے لیے کوڈ پر عمل درآمد کیا جائے گا۔

تخلیق کے عمل کو اوپر دو مضامین میں بیان کیا گیا ہے، لیکن میں دہراتا ہوں: ایک ٹیلیگرام میں ہم رابطے کھولتے ہیں، @botfather کو تلاش کرتے ہیں، اسے بتاتے ہیں /newbot، Botfortest12344321 بوٹ بنائیں، اسے Mynext1234bot کہتے ہیں، اور ایک منفرد کلید کے ساتھ ایک پیغام موصول ہوتا ہے۔ فارم 1234544311:AbcDefNNNNNNNNNNNNNN

چابی کا خیال رکھیں اور اسے نہ دیں!

پھر آپ بوٹ کو ترتیب دے سکتے ہیں، مثال کے طور پر، اسے گروپس میں شامل کرنے سے منع کریں، لیکن پہلے مراحل میں یہ ضروری نہیں ہے۔

آئیے BotFather سے "/mybot" کے لیے پوچھیں اور اگر ہمیں کچھ پسند نہیں ہے تو ترتیبات کو ایڈجسٹ کریں۔

آئیے رابطے دوبارہ کھولیں، وہاں @Botfortest12344321 تلاش کریں (@ کے ساتھ تلاش شروع کرنا لازمی ہے)، "شروع کریں" پر کلک کریں اور بوٹ پر لکھیں "/روبوٹس کی شان"۔ / نشان درکار ہے، اقتباسات کی ضرورت نہیں ہے۔
بوٹ، یقینا، کچھ بھی جواب نہیں دے گا.

آئیے چیک کریں کہ بوٹ بن گیا ہے اور اسے کھولیں۔

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNN/getMe
جہاں 1234544311:AbcDefNNNNNNNNNNNNNN پہلے موصول ہوئی کلید ہے،
اور ایک لائن حاصل کریں۔
{"OK":true,"result":{""}}

ہمارے پاس پہلا خفیہ جملہ (ٹوکن) ہے۔ اب ہمیں دوسرا خفیہ نمبر تلاش کرنے کی ضرورت ہے - بوٹ کے ساتھ چیٹ کی ID۔ ہر چیٹ، گروپ وغیرہ انفرادی ہے اور اس کا اپنا نمبر ہوتا ہے (کبھی کبھی مائنس کے ساتھ - اوپن گروپس کے لیے)۔ اس نمبر کو تلاش کرنے کے لیے، ہمیں براؤزر میں درخواست کرنے کی ضرورت ہے (درحقیقت، براؤزر میں یہ بالکل ضروری نہیں ہے، لیکن بہتر تفہیم کے لیے آپ اس سے شروعات کر سکتے ہیں) پتہ (جہاں 1234544311:NNNNNNNNNN آپ کا ٹوکن ہے۔

https://api.telegram.org/bot1234544311:NNNNNNNNN/getUpdates

اور اس طرح کا جواب حاصل کریں۔

{"OK":true,"result":[{"update_id":...,... چیٹ":{"id":123456789

ہمیں chat_id کی ضرورت ہے۔

آئیے چیک کریں کہ ہم چیٹ کو دستی طور پر لکھ سکتے ہیں: براؤزر سے ایڈریس پر کال کریں۔

https://api.telegram.org/botваштокен/sendMessage?chat_id=123456789&text="Life is directed motion"

اگر آپ کو اپنی چیٹ میں بوٹ سے کوئی پیغام موصول ہوتا ہے، تو ٹھیک ہے، آپ اگلے مرحلے پر چلتے ہیں۔

اس طرح (براؤزر کے ذریعے) آپ ہمیشہ چیک کر سکتے ہیں کہ آیا لنک جنریشن میں مسائل ہیں، یا کہیں کوئی چیز چھپی ہوئی ہے اور کام نہیں کر رہی ہے۔

پڑھنا جاری رکھنے سے پہلے آپ کو کیا جاننے کی ضرورت ہے۔

ٹیلیگرام میں کئی قسم کے گروپ چیٹس ہیں (کھلی، بند)۔ ان چیٹس کے لیے، کچھ فنکشنز (مثال کے طور پر، آئی ڈی) مختلف ہیں، جو بعض اوقات کچھ مسائل کا باعث بنتے ہیں۔

آئیے فرض کریں کہ یہ 2019 کا اختتام ہے، اور یہاں تک کہ ہمارے وقت کا ہیرو، معروف مین آرکسٹرا (منتظم، وکیل، انفارمیشن سیکیورٹی ماہر، پروگرامر اور عملی طور پر MVP) Evgeniy V. $i متغیر کو ایک صف سے ممتاز کرتا ہے، لوپس میں مہارت حاصل کر لی ہے، اگلے دو سالوں میں دیکھو چاکلیٹی میں مہارت حاصل کر لے گا، اور پھر PowerShell کے ساتھ متوازی پروسیسنگ и ForEach-Object Parallel یہ آئے گا.

1. ہم سوچتے ہیں کہ ہمارا بوٹ کیا کرے گا۔

میرے پاس کوئی خیال نہیں تھا، مجھے سوچنا پڑا۔ میں پہلے ہی ایک بوٹ نوٹ بک لکھ چکا ہوں۔ میں ایک بوٹ نہیں بنانا چاہتا تھا "جو کہیں کچھ بھیجتا ہے۔" Azure سے جڑنے کے لیے آپ کو کریڈٹ کارڈ کی ضرورت ہے، لیکن طالب علم کو یہ کہاں سے ملے گا؟ واضح رہے کہ سب کچھ اتنا برا نہیں ہے: اہم بادل کسی قسم کی آزمائشی مدت مفت دیتے ہیں (لیکن آپ کو پھر بھی کریڈٹ کارڈ نمبر کی ضرورت ہے - اور ایسا لگتا ہے کہ اس سے ایک ڈالر ڈیبٹ ہو جائے گا۔ مجھے یاد نہیں ہے کہ اگر اسے بعد میں واپس کر دیا گیا۔)

AI ML کے بغیر بوٹ-غریب-شاعر-بیور بنانا اتنا دلچسپ نہیں ہے۔

میں نے ایک ایسا بوٹ بنانے کا فیصلہ کیا جو مجھے (یا مجھے نہیں) لغت کے انگریزی الفاظ کی یاد دلائے گا۔
ڈیٹا بیس کے ساتھ ہلچل سے بچنے کے لیے، لغت کو ٹیکسٹ فائل میں محفوظ کیا جائے گا اور دستی طور پر اپ ڈیٹ کیا جائے گا۔
اس صورت میں، کام کام کی بنیادی باتوں کو ظاہر کرنا ہے، اور کم از کم جزوی طور پر تیار شدہ مصنوعات بنانا نہیں ہے.

2. پہلی بار کیا اور کیسے آزمانا

آئیے ایک فولڈر بنائیں C:poshtranslate
سب سے پہلے، آئیے دیکھتے ہیں کہ ہمارے پاس کس قسم کا پاور شیل ہے، آئیے اسٹارٹ رن کے ذریعے ISE لانچ کرتے ہیں۔
پاورشیل ہے
یا انسٹال شدہ پروگراموں میں پاورشیل ISE تلاش کریں۔
لانچ کے بعد، معمول کے مطابق "کچھ قسم کا ایڈیٹر" کھل جائے گا؛ اگر کوئی ٹیکسٹ فیلڈ نہیں ہے، تو آپ ہمیشہ "فائل - نیا بنائیں" پر کلک کر سکتے ہیں۔

آئیے پاورشیل کے ورژن کو دیکھتے ہیں - ٹیکسٹ فیلڈ میں لکھیں:

get-host 

اور F5 دبائیں۔

پاورشیل محفوظ کرنے کی پیشکش کرے گا - "جس اسکرپٹ کو آپ چلانے والے ہیں اسے محفوظ کر لیا جائے گا۔"، ہم اتفاق کرتے ہیں، اور پاورشیل سے فائل کو C: poshtranslate میں نام کے ساتھ محفوظ کرتے ہیں۔ myfirstbotBT100.

لانچ کے بعد، نچلے ٹیکسٹ ونڈو میں ہمیں ڈیٹا ٹیبل ملتا ہے:

Name             : Windows PowerShell ISE Host
Version          : 5.1.(и так далее)

میرے پاس 5.1 کچھ ہے، یہ کافی ہے۔ اگر آپ کے پاس پرانا ونڈوز 7/8 ہے تو کوئی بڑی بات نہیں - حالانکہ PowerShell کو ورژن 5 میں اپ ڈیٹ کرنے کی ضرورت ہوگی - جیسے ہدایات.

نیچے کمانڈ لائن میں Get-Date ٹائپ کریں، Enter دبائیں، وقت دیکھیں، کمانڈ کے ساتھ روٹ فولڈر میں جائیں۔
cd
اور cls کمانڈ سے اسکرین کو صاف کریں (نہیں، آپ کو rm استعمال کرنے کی ضرورت نہیں ہے)

اب آئیے چیک کریں کہ کیا کام کرتا ہے اور کیسے - آئیے کوڈ بھی نہیں بلکہ دو لائنیں لکھتے ہیں اور یہ سمجھنے کی کوشش کرتے ہیں کہ وہ کیا کرتے ہیں۔ آئیے # علامت کے ساتھ get-host کے ساتھ لائن پر تبصرہ کریں اور تھوڑا سا اضافہ کریں۔

# Пример шаблона бота 
# get-host
<# это пример многострочного комментария #>
$TimeNow = Get-Date
$TimeNow

(دلچسپ بات یہ ہے کہ Habré پر کوڈ فارمیٹنگ ڈراپ ڈاؤن لسٹ میں دو درجن آپشنز ہیں - لیکن پاورشیل وہاں نہیں ہے۔ Dos وہاں ہے۔ پرل موجود ہے۔)

اور آئیے GUI سے F5 یا ">" دبا کر کوڈ کو چلائیں۔

ہمیں درج ذیل آؤٹ پٹ ملتا ہے:

Saturday, December 8, 2019 21:00:50 PM (или что-то типа)

آئیے اب ان دو سطروں اور کچھ دلچسپ نکات کو دیکھتے ہیں تاکہ آئندہ اس طرف واپس نہ جائیں۔

پاسکل (اور نہ صرف) کے برعکس، پاور شیل خود یہ طے کرنے کی کوشش کرتا ہے کہ متغیر کو کس قسم کو تفویض کرنا ہے؛ اس بارے میں مزید تفصیلات مضمون میں لکھی گئی ہیں۔ پروگرامنگ زبانوں میں ٹائپنگ پر تعلیمی پروگرام
لہذا، ایک $TimeNow متغیر بنا کر اور اسے موجودہ تاریخ اور وقت (Get-date) کی قدر تفویض کر کے، ہمیں اس بارے میں زیادہ فکر کرنے کی ضرورت نہیں ہے کہ وہاں کس قسم کا ڈیٹا ہوگا۔

سچ ہے، یہ لاعلمی بعد میں تکلیف دے سکتی ہے، لیکن یہ بعد میں ہے۔ ذیل میں متن میں ایک مثال ہوگی۔
آئیے دیکھتے ہیں کہ ہمیں کیا ملا۔ چلو عمل کرتے ہیں (کمانڈ لائن پر)

$TimeNow | Get-member

اور ناقابل فہم متن کا صفحہ حاصل کریں۔

ناقابل فہم متن نمبر 1 کی مثال

PS C:> $TimeNow | Get-member
   TypeName: System.DateTime
Name                 MemberType     Definition                                                                                                                                       
----                 ----------     ----------                                                                                                                                       
Add                  <b>Method         </b>datetime Add(timespan value)  
..
DisplayHint          NoteProperty   DisplayHintType DisplayHint=DateTime                                                                                                             
Date                 <b>Property       </b>datetime Date {get;}                                                                                                                             
Year                 Property       int Year {get;}   
..                                                                                                                               
DateTime             ScriptProperty System.Object DateTime {get=if ((& { Set-StrictMode -Version 1; $this.DisplayHint }) -ieq  "Date")...                                         

جیسا کہ آپ دیکھ سکتے ہیں، قسم کا ایک متغیر TypeName: System.DateTime طریقوں کے ایک گروپ کے ساتھ بنایا گیا ہے (اس معنی میں کہ ہم اس متغیر آبجیکٹ کے ساتھ کیا کر سکتے ہیں) اور خصوصیات۔

آئیے کال کرتے ہیں۔ $TimeNow.DayOfYear - ہمیں سال کے دن کا نمبر ملتا ہے۔
آئیے کال کرتے ہیں۔ $TimeNow.DayOfYear | Get-Member - ہم حاصل TypeName: System.Int32 اور طریقوں کا ایک گروپ۔
آئیے کال کرتے ہیں۔ $TimeNow.ToUniversalTime() - اور UTC میں وقت حاصل کریں۔

ڈیبگر

کبھی کبھی ایسا ہوتا ہے کہ کسی پروگرام کو ایک خاص لائن تک چلانا اور اس وقت پروگرام کی حالت دیکھنا ضروری ہوتا ہے۔ اس مقصد کے لیے، ISE میں ڈیبگ فنکشن ہے - ٹوگل بریک پوائنٹ
درمیان میں کہیں بریک پوائنٹ رکھیں، ان دو لائنوں کو چلائیں اور دیکھیں کہ بریک کیسا لگتا ہے۔

3. ٹیلیگرام بوٹ کے ساتھ تعامل کو سمجھنا

بلاشبہ بوٹ کے ساتھ تعامل پر اس سے بھی زیادہ ادب لکھا گیا ہے، تمام گیٹ پش وغیرہ کے ساتھ، لیکن تھیوری کے مسئلے کو اختیاری طور پر سمجھا جا سکتا ہے۔

ہمارے معاملے میں یہ ضروری ہے:

  • خط و کتابت میں کچھ بھیجنا سیکھیں۔
  • خط و کتابت سے کچھ حاصل کرنا سیکھیں۔

3.1 خط و کتابت میں کچھ بھیجنا اور اس سے وصول کرنا سیکھنا

ایک چھوٹا سا کوڈ - حصہ 3

Write-output "This is part 3"
$MyToken = "1234544311:AbcDefNNNNNNNNNNNNN"
$MyChatID = "123456789"
$MyProxy = "http://1.2.3.4:5678" 

$TimeNow = Get-Date
$TimeNow.ToUniversalTime()
$ScriptDir = Split-Path $script:MyInvocation.MyCommand.Path
$BotVersion = "BT102"

$MyText01 = "Life is directed motion - " + $TimeNow

$URL4SEND = "https://api.telegram.org/bot$MyToken/sendMessage?chat_id=$MyChatID&text=$MyText01"

Invoke-WebRequest -Uri $URL4SEND

اور اس وقت روسی فیڈریشن میں ہمیں ریموٹ سرور سے رابطہ قائم کرنے میں ناکامی کی خرابی ملتی ہے۔

یا ہمیں یہ موصول نہیں ہوتا ہے - ٹیلی کام آپریٹر پر منحصر ہے کہ آیا پراکسی کنفیگر اور کام کر رہی ہے
ٹھیک ہے، صرف ایک پراکسی شامل کرنا باقی ہے۔ براہ کرم نوٹ کریں کہ غیر خفیہ کردہ اور عام طور پر جعلی پراکسی کا استعمال آپ کی صحت کے لیے انتہائی خطرناک ہے۔

کام کرنے والی پراکسی تلاش کرنے کا کام بہت مشکل نہیں ہے - زیادہ تر شائع شدہ HTTP پراکسی کام کرتی ہیں۔ مجھے لگتا ہے کہ پانچویں نے میرے لئے کام کیا۔

پراکسی کا استعمال کرتے ہوئے نحو:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

اگر آپ کو بوٹ کے ساتھ اپنی چیٹ میں کوئی پیغام موصول ہوتا ہے، تو سب کچھ ٹھیک ہے، آپ آگے بڑھ سکتے ہیں۔ اگر نہیں، تو ڈیبگنگ جاری رکھیں۔

آپ دیکھ سکتے ہیں کہ آپ کی $URL4SEND سٹرنگ کس چیز میں تبدیل ہوتی ہے اور براؤزر میں اس کی درخواست کرنے کی کوشش کریں، اس طرح:

$URL4SEND2 = '"'+$URL4SEND+'"'
start chrome $URL4SEND2 

3.2 ہم نے چیٹ میں "کچھ" لکھنے کا طریقہ سیکھا، اب اسے پڑھنے کی کوشش کرتے ہیں۔

آئیے مزید 4 لائنیں شامل کریں اور دیکھیں کہ اندر کیا ہے | ممبر حاصل کرنا

$URLGET = "https://api.telegram.org/bot$MyToken/getUpdates"
$MyMessageGet = Invoke-WebRequest -Uri $URLGET -Method Get -Proxy $MyProxy
Write-Host "Get-Member"
$MyMessageGet | Get-Member

سب سے دلچسپ چیز ہمیں فراہم کی جاتی ہے۔

Content           Property   string Content {get;}  
ParsedHtml        Property   mshtml.IHTMLDocument2 ParsedHtml {get;}                                    
RawContent        Property   string RawContent {get;set;}

آئیے دیکھتے ہیں کہ ان میں کیا ہے:

Write-Host "ParsedHtml"
$MyMessageGet.ParsedHtml # тут интересное
Write-Host "RawContent"
$MyMessageGet.RawContent # и тут интересное, но еще к тому же и читаемое. 
Write-Host "Content"
$MyMessageGet.Content

اگر سب کچھ آپ کے لیے کام کرتا ہے، تو آپ کو ایک لمبی لائن ملے گی جیسے:

{"ok":true,"result":[{"update_id":12345678,
"message":{"message_id":3,"from":{"id"

خوش قسمتی سے، سسٹم ایڈمنسٹریٹر کے لیے پہلے شائع شدہ مضمون ٹیلیگرام بوٹ میں یہ سطر (ہاں، $MyMessageGet.RawContent | کے مطابق get-member ہے System.String) کو پہلے ہی جدا کر دیا گیا ہے۔

4. آپ جو کچھ وصول کرتے ہیں اس پر عمل کریں (ہم پہلے ہی جانتے ہیں کہ کچھ کیسے بھیجنا ہے)

جیسا کہ پہلے ہی لکھا ہے۔ یہاں، سب سے زیادہ ضروری چیزیں مواد میں موجود ہیں۔ آئیے اس پر گہری نظر ڈالتے ہیں۔

سب سے پہلے، ہم ویب انٹرفیس یا فون سے بوٹ پر کچھ مزید جملے لکھیں گے۔

/message1
/message2
/message3

اور براؤزر کے ذریعے اس پتے پر دیکھیں جو $URLGET متغیر میں بنایا گیا تھا۔

ہم کچھ اس طرح دیکھیں گے:

{"ok":true,"result":[{"update_id":NNNNNNN,
"message":{"message_id":10, .. "text":"/message1"
"message":{"message_id":11, .. "text":"/message2 
"message":{"message_id":12, .. "text":"/message3 

یہ کیا ہے؟ اشیاء کی صفوں میں سے کچھ پیچیدہ آبجیکٹ جس میں اینڈ ٹو اینڈ میسج شناخت کنندہ، چیٹ شناخت کنندہ، بھیجنے والا شناخت کنندہ اور بہت سی دوسری معلومات شامل ہیں۔

تاہم، ہمیں یہ جاننے کی ضرورت نہیں ہے کہ "یہ کس قسم کی چیز ہے" - ہمارے لیے کام کا حصہ پہلے ہی ہو چکا ہے۔ آئیے دیکھتے ہیں کہ اندر کیا ہے:

موصولہ پیغامات یا حصہ 4 پڑھنا

Write-Host "This is part 4" <# конечно эта строка нам не нужна в итоговом тексте, но по ней удобно искать. #> 

$Content4Pars01 = ConvertFrom-Json $MyMessageGet.Content
$Content4Pars01 | Get-Member
$Content4Pars01.result
$Content4Pars01.result[0]
$Content4Pars01.result[0] | Get-Member
$Content4Pars01.result[0].update_id
$Content4Pars01.result[0].message
$Content4Pars01.result[0].message.text
$Content4Pars01.result[1].message.text
$Content4Pars01.result[2].message.text

5. اب ہمیں اس کے بارے میں کیا کرنا چاہیے؟

آئیے نتیجے میں آنے والی فائل کو myfirstbotBT105 کے نام سے محفوظ کریں یا جو بھی آپ کو سب سے زیادہ پسند ہو، عنوان کو تبدیل کریں اور پہلے سے لکھے گئے تمام کوڈ کے ذریعے تبصرہ کریں۔

<#start comment 105 end comment 105#>

اب ہمیں یہ فیصلہ کرنے کی ضرورت ہے کہ لغت کہاں سے حاصل کی جائے (اچھی طرح سے، کہاں - فائل میں ڈسک پر) اور یہ کیسا نظر آئے گا۔

بلاشبہ، آپ اسکرپٹ کے متن میں ایک بہت بڑی لغت لکھ سکتے ہیں، لیکن یہ مکمل طور پر نقطہ نظر سے باہر ہے۔
تو آئیے دیکھتے ہیں کہ پاورشیل عام طور پر کس چیز کے ساتھ کام کر سکتی ہے۔
عام طور پر، وہ اس بات کی پرواہ نہیں کرتا کہ کس فائل کے ساتھ کام کرنا ہے، اس سے ہمیں کوئی فرق نہیں پڑتا۔
ہمارے پاس ایک انتخاب ہے: txt (آپ کر سکتے ہیں، لیکن کیوں)، csv، xml۔
کیا ہم سب کو دیکھ سکتے ہیں؟
آئیے ایک کلاس بنائیں MyVocabClassExample1 اور ایک متغیر $MyVocabExample1
میں نوٹ کرتا ہوں کہ کلاس $ کے بغیر لکھی گئی ہے۔

کچھ کوڈ نمبر 5

write-host "This is part 5"
class MyVocabClassExample1 {
    [string]$Original  # слово
    [string]$Transcript
    [string]$Translate
    [string]$Example
    [int]$VocWordID # очень интересный момент. Использование int с его ограничениями может порой приводить к диким последствиям, для примера - недавний случай с SSD HPE. Изначально я не стал добавлять этот элемент, потом все же дописал и закомментировал.
    }

$MyVocabExample1 = [MyVocabClassExample1]::new()
$MyVocabExample1.Original = "Apple"
$MyVocabExample1.Transcript = "[ ˈapəl ]"
$MyVocabExample1.Translate = "Яблоко"
$MyVocabExample1.Example = "An apple is a sweet, edible fruit produced by an apple tree (Malus domestica)"
# $MyVocabExample1.$VocWordID = 1

$MyVocabExample2 = [MyVocabClassExample1]::new()
$MyVocabExample2.Original = "Pear"
$MyVocabExample2.Transcript = "[ pe(ə)r ]"
$MyVocabExample2.Translate = "Груша"
$MyVocabExample2.Example = "The pear (/ˈpɛər/) tree and shrub are a species of genus Pyrus"
# $MyVocabExample1.$VocWordID = 2

آئیے اسے فائلوں میں استعمال کرتے ہوئے لکھنے کی کوشش کرتے ہیں۔ نمونہ.

کچھ کوڈ #5.1

Write-Host $ScriptDir # надеюсь $ScriptDir вы не закомментировали 
$MyFilenameExample01 = $ScriptDir + "Example01.txt"
$MyFilenameExample02 = $ScriptDir + "Example02.txt"
Write-Host $MyFilenameExample01
Out-File  -FilePath $MyFilenameExample01 -InputObject $MyVocabExample1

Out-File  -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2
notepad $MyFilenameExample01

- اور ہمیں لائن Out-File -FilePath $MyFilenameExample01 -InputObject -Append$MyVocabExample2 پر ایک خرابی ملتی ہے۔

وہ شامل نہیں کرنا چاہتا، آہ، کتنی شرم کی بات ہے۔

$MyVocabExample3AsArray = @($MyVocabExample1,$MyVocabExample2)
Out-File  -FilePath $MyFilenameExample02 -InputObject $MyVocabExample3AsArray
notepad $MyFilenameExample02

آئیے دیکھیں کیا ہوتا ہے. زبردست ٹیکسٹ ویو - لیکن اسے واپس کیسے ایکسپورٹ کیا جائے؟ کیا مجھے کسی قسم کے ٹیکسٹ سیپریٹرز متعارف کرانا چاہیے، جیسے کوما؟

اور آخر میں آپ کو "کوما سے الگ کردہ اقدار (CSV) فائل A ملے گی۔ انتظار کرو.
#

$MyFilenameExample03 = $ScriptDir + "Example03.csv"
$MyFilenameExample04 = $ScriptDir + "Example04.csv"
Export-Csv  -Path $MyFilenameExample03 -InputObject $MyVocabExample1 
Export-Csv  -Path $MyFilenameExample03 -InputObject $MyVocabExample2 -Append 
Export-Csv  -Path $MyFilenameExample04 -InputObject $MyVocabExample3AsArray 

جیسا کہ دیکھنا آسان ہے، MS کو اس کی منطق سے خاص طور پر ممتاز نہیں کیا جاتا ہے؛ اسی طرح کے طریقہ کار کے لیے، ایک کیس میں -FilePath استعمال کیا جاتا ہے، دوسرے میں -Path۔

اس کے علاوہ، تیسری فائل میں روسی زبان غائب ہوگئی، چوتھی فائل میں یہ نکلا ... ٹھیک ہے، کچھ ہوا. #TYPE System.Object[] 00
# "گنتی"،"لمبائی"،"طویل لمبائی"،"رینک"،"SyncRoot"،"IsReadonly","IsFixedSize","IsSynchronized"
#
آئیے اسے تھوڑا سا دوبارہ لکھتے ہیں:

Export-Csv  -Path $MyFilenameExample03 -InputObject $MyVocabExample1 -Encoding Unicode
Export-Csv  -Path $MyFilenameExample03 -InputObject $MyVocabExample2 -Append -Encoding Unicode
notepad $MyFilenameExample03
notepad $MyFilenameExample04

ایسا لگتا ہے کہ اس نے مدد کی ہے، لیکن مجھے اب بھی فارمیٹ پسند نہیں ہے۔

مجھے خاص طور پر یہ پسند نہیں ہے کہ میں کسی شے سے براہ راست فائل میں لائنیں نہیں ڈال سکتا ہوں۔
ویسے، جب سے ہم نے فائلوں کو لکھنا شروع کیا ہے، کیا ہم اسٹارٹ اپ لاگ رکھنا شروع کر سکتے ہیں؟ ہمارے پاس ایک متغیر کے طور پر وقت ہے، ہم فائل کا نام سیٹ کر سکتے ہیں۔

یہ سچ ہے کہ ابھی لکھنے کے لیے کچھ نہیں ہے، لیکن آپ سوچ سکتے ہیں کہ لاگز کو کس طرح گھمایا جائے۔
آئیے ابھی کے لیے ایکس ایم ایل کو آزماتے ہیں۔

کچھ ایکس ایم ایل

$MyFilenameExample05 = $ScriptDir + "Example05.xml"
$MyFilenameExample06 = $ScriptDir + "Example06.xml"
Export-Clixml  -Path $MyFilenameExample05 -InputObject $MyVocabExample1 
Export-Clixml  -Path $MyFilenameExample05 -InputObject $MyVocabExample2 -Append -Encoding Unicode
Export-Clixml  -Path $MyFilenameExample06 -InputObject $MyVocabExample3AsArray
notepad $MyFilenameExample05
notepad $MyFilenameExample06

ایکس ایم ایل میں ایکسپورٹ کرنے کے بہت سے فوائد ہیں - پڑھنے کی اہلیت، پوری آبجیکٹ کی ایکسپورٹ، اور اپینڈ انجام دینے کی ضرورت نہیں۔

آئیے کوشش کریں۔ xml فائل کو پڑھیں.

xml سے تھوڑا سا پڑھنا

$MyFilenameExample06 = $ScriptDir + "Example06.xml"
$MyVocabExample4AsArray = Import-Clixml -Path $MyFilenameExample06
# $MyVocabExample4AsArray 
# $MyVocabExample4AsArray[0]
# и немного о совершенно неочевидных нюансах. Powershell время от времени ведет себя не так, как вроде бы как бы стоило бы ожидать бы.
# например у меня эти два вывода отличаются
# Write-Output $MyVocabExample4AsArray 
# write-host $MyVocabExample4AsArray 

آئیے کام کی طرف واپس آتے ہیں۔ ہم نے ایک ٹیسٹ فائل لکھی، اسے پڑھیں، سٹوریج کی شکل واضح ہے، اگر ضروری ہو تو، آپ لائنوں کو شامل کرنے اور حذف کرنے کے لیے ایک الگ چھوٹا فائل ایڈیٹر لکھ سکتے ہیں۔

میں آپ کو یاد دلاتا ہوں کہ کام ایک چھوٹا ٹریننگ بوٹ بنانا تھا۔

کام کی شکل: میں بوٹ کو "مثال" کمانڈ بھیجتا ہوں، بوٹ مجھے تصادفی طور پر منتخب کردہ لفظ اور نقل بھیجتا ہے، اور 10 سیکنڈ کے بعد مجھے ترجمہ اور تبصرہ بھیجتا ہے۔ ہم جانتے ہیں کہ کمانڈز کو کیسے پڑھنا ہے، ہم یہ بھی سیکھنا چاہیں گے کہ پراکسیز کو خود بخود کیسے منتخب کریں اور چیک کریں، اور میسج کاؤنٹرز کو فراموش کرنے کے لیے دوبارہ ترتیب دیں۔

آئیے پہلے تبصرہ کی گئی ہر چیز کو غیر ضروری قرار دیتے ہیں، txt اور csv کے ساتھ اب غیر ضروری مثالوں پر تبصرہ کریں، اور فائل کو B106 ورژن کے طور پر محفوظ کریں۔

جی ہاں. آئیے بوٹ کو دوبارہ کچھ بھیجیں۔

6. فنکشنز اور مزید سے ڈسپیچ

استقبالیہ پر کارروائی کرنے سے پہلے، آپ کو ٹیسٹ پیغام کے علاوہ "کم از کم کچھ" بھیجنے کے لیے ایک فنکشن بنانا ہوگا۔

بلاشبہ، مثال میں ہمارے پاس صرف ایک بھیجنا اور صرف ایک پروسیسنگ ہوگی، لیکن اگر ہمیں ایک ہی چیز کو کئی بار کرنے کی ضرورت ہو تو کیا ہوگا؟

فنکشن لکھنا آسان ہے۔ لہذا، ہمارے پاس $MyVocabExample4AsArray قسم کی آبجیکٹ کا ایک متغیر ہے، جسے فائل سے پڑھا جائے، زیادہ سے زیادہ دو عناصر کی ایک صف کی شکل میں۔
چلیں پڑھتے ہیں۔

ایک ہی وقت میں، ہم گھڑی سے نمٹ لیں گے؛ ہمیں بعد میں اس کی ضرورت ہوگی (دراصل، اس مثال میں ہمیں اس کی ضرورت نہیں ہوگی :)

کچھ کوڈ #6.1

Write-Output "This is Part 6"
$Timezone = (Get-TimeZone)
IF($Timezone.SupportsDaylightSavingTime -eq $True){
    $TimeAdjust =  ($Timezone.BaseUtcOffset.TotalSeconds + 3600) } # приведенное время
    ELSE{$TimeAdjust = ($Timezone.BaseUtcOffset.TotalSeconds) 
    }
    
function MyFirstFunction($SomeExampleForFunction1){
$TimeNow = Get-Date
$TimeNow.ToUniversalTime()
# $MyText02 = $TimeNow + " " + $SomeExampleForFunction1 # и вот тут мы получим ошибку
$MyText02 = $SomeExampleForFunction1 + " " + $TimeNow # а тут не получим, кто догадается почему - тот молодец.

$URL4SendFromFunction = "https://api.telegram.org/bot$MyToken/sendMessage?chat_id=$MyChatID&text=$MyText02"
Invoke-WebRequest -Uri $URL4SendFromFunction -Proxy $MyProxy
}

جیسا کہ آپ آسانی سے دیکھ سکتے ہیں، فنکشن $MyToken اور $MyChatID کو کال کرتا ہے، جو پہلے سخت کوڈ شدہ تھے۔

ایسا کرنے کی ضرورت نہیں ہے، اور اگر $MyToken ہر بوٹ کے لیے ایک ہے، تو $MyChatID چیٹ کے لحاظ سے بدل جائے گا۔

تاہم، چونکہ یہ ایک مثال ہے، اس لیے ہم اسے فی الحال نظر انداز کر دیں گے۔

چونکہ $MyVocabExample4AsArray ایک صف نہیں ہے، حالانکہ یہ ایک سے بہت ملتی جلتی ہے، پھر آپ اسے صرف نہیں لے سکتے اس کی لمبائی کی درخواست کریں.

ایک بار پھر ہمیں کچھ کرنا پڑے گا جو نہیں کیا جا سکتا - پیراشوٹ کوڈ کے مطابق نہیں - اسے لے لو اور شمار کرو

کچھ کوڈ #6.2

$MaxRandomExample = 0 
foreach ($Obj in $MyVocabExample4AsArray) {
$MaxRandomExample ++
}
Write-Output $MaxRandomExample
$RandomExample = Get-Random -Minimum 0 -Maximum ($MaxRandomExample)
$TextForExample1 = $MyVocabExample4AsArray[$RandomExample].Original
# MyFirstFunction($TextForExample1)
# или в одну строку
# MyFirstFunction($MyVocabExample4AsArray[Get-Random -Minimum 0 -Maximum ($MaxRandomExample -1)].Example)
# Угадайте сами, какой пример легче читается посторонними людьми.

رینڈم دلچسپ خصوصیت. ہم کہتے ہیں کہ ہم 0 یا 1 وصول کرنا چاہتے ہیں (ہمارے پاس صف میں صرف دو عناصر ہیں)۔ جب باؤنڈریز 0..1 سیٹ کریں تو کیا ہمیں "1" ملے گا؟
نہیں - ہمیں یہ نہیں ملے گا، ہمارے پاس ایک خاص مثال ہے مثال 2: 0 اور 99 کے درمیان ایک بے ترتیب عدد حاصل کریں Get-Random -Maximum 100
لہذا، 0..1 کے لیے ہمیں زیادہ سے زیادہ عنصر نمبر = 0 کے ساتھ سائز 2..1 سیٹ کرنا ہوگا۔

7. آنے والے پیغامات کی پروسیسنگ اور زیادہ سے زیادہ قطار کی لمبائی

ہم پہلے کہاں رکے تھے؟ ہمارے پاس موصول شدہ متغیر $MyMessageGet ہے۔
اور اس سے حاصل کردہ $Content4Pars01، جس میں سے ہمیں Content4Pars01.result سرنی کے عناصر میں دلچسپی ہے۔

$Content4Pars01.result[0].update_id
$Content4Pars01.result[0].message
$Content4Pars01.result[0].message.text

آئیے بوٹ /message10, /message11, /message12, /word اور دوبارہ /word اور /hello بھیجیں۔
آئیے دیکھتے ہیں کہ ہمیں کیا ملا:

$Content4Pars01.result[0].message.text
$Content4Pars01.result[2].message.text

آئیے موصول ہونے والی ہر چیز کا جائزہ لیں اور اگر پیغام / لفظ تھا تو جواب بھیجیں۔
تعمیر کا معاملہ، جسے کچھ لوگ if-elseif کے طور پر بیان کرتے ہیں، اسے پاور شیل میں کہا جاتا ہے۔ سوئچ کے ذریعے. اسی وقت، نیچے کا کوڈ -wildcard کلید استعمال کرتا ہے، جو کہ مکمل طور پر غیر ضروری اور نقصان دہ بھی ہے۔

کچھ کوڈ #7.1

Write-Output "This is part 7"
Foreach ($Result in $Content4Pars01.result) # Да, можно сделать быстрее 
 { 
    switch -wildcard ($Result.message.text) 
            {
            "/word" {MyFirstFunction($TextForExample1)}
            }
}

آئیے اسکرپٹ کو ایک دو بار چلائیں۔ ہمیں پھانسی کی ہر کوشش کے لیے ایک ہی لفظ دو بار ملے گا، خاص طور پر اگر ہم نے بے ترتیب کے نفاذ میں کوئی غلطی کی ہو۔

لیکن رک جاؤ۔ ہم نے دوبارہ / لفظ نہیں بھیجا، تو پیغام پر دوبارہ کارروائی کیوں کی جا رہی ہے؟

بوٹ کو پیغامات بھیجنے کی قطار کی لمبائی ایک محدود ہے (میرے خیال میں 100 یا 200 پیغامات) اور اسے دستی طور پر صاف کیا جانا چاہیے۔

یہ یقیناً دستاویزات میں بیان کیا گیا ہے، لیکن آپ کو اسے پڑھنا ہوگا!

اس صورت میں، ہمیں ?chat_id پیرامیٹر کی ضرورت ہے، اور &timeout، &limit، &parse_mode=HTML اور &disable_web_page_preview=true کی ابھی ضرورت نہیں ہے۔

کے لئے دستاویزی ٹیلیگرام API یہاں ہے۔
یہ سفید اور انگریزی میں کہتا ہے:
واپس کی جانے والی پہلی اپ ڈیٹ کا شناخت کنندہ۔ پہلے موصول ہونے والی تازہ کاریوں کے شناخت کنندگان میں سے ایک سے زیادہ ہونا چاہیے۔ بذریعہ ڈیفالٹ، اپ ڈیٹس جلد سے جلد شروع ہوتے ہیں۔
غیر مصدقہ اپ ڈیٹ واپس آ گئے ہیں. جیسے ہی getUpdates کے ساتھ کال کی جاتی ہے ایک اپ ڈیٹ کی تصدیق کی جاتی ہے۔ آفسیٹ اعلی اس کی update_id کے مقابلے میں. منفی آفسیٹ کو اپ ڈیٹس کی قطار کے اختتام سے -offset اپ ڈیٹ سے شروع ہونے والی اپ ڈیٹس کو بازیافت کرنے کے لیے مخصوص کیا جا سکتا ہے۔ تمام پچھلی اپڈیٹس بھول جائیں گی۔

آئیے دیکھتے ہیں:

$Content4Pars01.result[0].update_id
$Content4Pars01.result[1].update_id 
$Content4Pars01.result | select -last 1
($Content4Pars01.result | select -last 1).update_id

ہاں، اور ہم اسے دوبارہ ترتیب دیں گے اور فنکشن کو تھوڑا سا دوبارہ لکھیں گے۔ ہمارے پاس دو اختیارات ہیں - پورے پیغام کو فنکشن میں منتقل کریں اور اسے مکمل طور پر فنکشن میں پروسیس کریں، یا صرف میسج آئی ڈی دیں اور اسے دوبارہ ترتیب دیں۔ مثال کے طور پر، دوسرا آسان لگتا ہے۔

اس سے پہلے، ہمارے "تمام پیغامات" کے استفسار کی تار اس طرح دکھائی دیتی تھی۔

$URLGET = "https://api.telegram.org/bot$MyToken/getUpdates"

اور یہ نظر آئے گا

$LastMessageId = ($Content4Pars01.result | select -last 1).update_id
$URLGET1 = "https://api.telegram.org/bot$mytoken/getUpdates?offset=$LastMessageId&limit=100" 
$MyMessageGet = Invoke-WebRequest -Uri $URLGET1 -Method Get -Proxy $MyProxy 

کوئی بھی آپ کو سب سے پہلے تمام پیغامات وصول کرنے، ان پر کارروائی کرنے، اور کامیاب پروسیسنگ درخواست کی غیر تصدیق شدہ --> تصدیق کے بعد ہی منع کرتا ہے۔

تمام پروسیسنگ مکمل ہونے کے بعد تصدیق کو کال کرنا کیوں سمجھ میں آتا ہے؟ عمل درآمد کے درمیان میں ناکامی ممکن ہے، اور اگر مفت چیٹ بوٹ کی مثال کے طور پر، ایک پیغام غائب ہونا کوئی خاص بات نہیں ہے، پھر اگر آپ کسی کی تنخواہ یا کارڈ کے لین دین پر کارروائی کر رہے ہیں، تو نتیجہ بدتر ہو سکتا ہے۔

کوڈ کی ایک دو مزید لائنیں۔

$LastMessageId = ($Content4Pars01.result | select -last 1).update_id  #ошибку в этом месте предполагается исправить самостоятельно. 
$URLGET1 = "https://api.telegram.org/bot$mytoken/getUpdates?offset=$LastMessageId&limit=100" 
Invoke-WebRequest -Uri $URLGET1 -Method Get -Proxy $MyProxy

8. کسی نتیجے کے بجائے

بنیادی افعال - پیغامات کو پڑھنا، قطار کو دوبارہ ترتیب دینا، فائل سے پڑھنا اور فائل میں لکھنا مکمل اور دکھایا جاتا ہے۔

اب صرف چار کام باقی ہیں:

  • چیٹ میں درخواست کا صحیح جواب بھیجنا
  • کسی بھی چیٹ کا جواب بھیجنا جس میں بوٹ شامل کیا گیا تھا۔
  • کوڈ کو ایک لوپ میں چلانا
  • ونڈوز شیڈیولر سے بوٹ لانچ کرنا۔

یہ تمام کام آسان ہیں اور پیرامیٹرز کے بارے میں دستاویزات کو پڑھ کر آسانی سے پورا کیا جا سکتا ہے جیسے
سیٹ-ExecutionPolicy غیر محدود اور -ExecutionPolicy بائی پاس
فارم کا سائیکل

$TimeToSleep = 3 # опрос каждые 3 секунды
$TimeToWork = 10 # минут
$HowManyTimes = $TimeToWork*60/$TimeToSleep # счетчик для цикла
$MainCounter = 0
for ($MainCounter=0; $MainCounter -le $HowManyTimes) {
sleep $TimeToSleep
$MainCounter ++

پڑھنے والے سب کا شکریہ۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں