د پاورشیل په کارولو سره د 7-9 ټولګي د ښوونځي زده کونکو لپاره د ساده ټیلیګرام بوټ لپاره نمونه

د یو ملګري سره د خبرو اترو په جریان کې، ما ناڅاپه پوهیدلي چې د دوی په ښوونځي کې د 8-10 ټولګیو ماشومانو ته د پروګرام کولو درس نه ورکول کیږي. کلمه، ایکسل او هرڅه. نه لوګو، نه پاسکل، نه حتی VBA د Excel لپاره.

ډېر حیران شوم، انټرنیټ مې خلاص کړ او لوستل مې پیل کړل
د تخصصي ښوونځي یوه دنده د نوي نسل تعلیم ته وده ورکول دي چې د معلوماتو ټولنې شرایط د هغې د پراختیا او ژوند طرزالعمل سره پوره کوي.
دا کورس به زده کونکو ته اجازه ورکړي چې د پاسکال برنامې ژبې لومړني جوړښتونو په اړه خپله پوهه په عمل کې پیاوړې کړي. (د 2017 لپاره د ځینې جمنازیم پروګرام څخه)

په نهایت کې ، ما پریکړه وکړه چې یو څو ساعته تیر کړم او د "د ښوونځي د ماشومانو لپاره د ساده بوټو رامینځته کولو څرنګوالی" مثال جوړ کړم.

د کټ لاندې دا دی چې څنګه په پاورشیل کې یو بل ساده بوټ ولیکئ او دا د ویب هک پرته کار وکړئ ، سپینې IPs ، وقف شوي سرورونه ، په کلاوډ کې ځای پرځای شوي مجازی ماشینونه ، او داسې نور - په منظم کور کمپیوټر کې د منظم وینډوز سره.

TLDR: د ګرامري او حقیقتي غلطیو سره یو بل ستړی کوونکی مقاله ، د لوستلو لپاره هیڅ نه ، نه طنز ، نه عکسونه.

په مقاله کې هیڅ نوي ندي، نږدې هرڅه چې مخکې لیکل شوي دي دمخه په هابري کې وو، د بیلګې په توګه په مقالو کې لارښوونې: په ټیلیګرام کې د بوټونو رامینځته کولو څرنګوالی и د سیسټم مدیر لپاره د ټیلیګرام بوټ.
سربیره پردې ، مقاله په قصدي ډول بې ځایه ده ترڅو هرځل تعلیمي ادب ته مراجعه ونه کړي. په متن کې د Gang 4، PowerShell Deep Dives یا، ووایه، د AWS ښه جوړ شوي چوکاټ 5 ستنې ته هیڅ اشاره نشته.

د وړاندیز پر ځای، تاسو کولی شئ پریږدئ

د پریښودلو لپاره وړیا احساس وکړئپه 2006 کې، مایکروسافټ د هغه وخت د وینډوز ایکس پی، ویسټا، او سرور 1.0 لپاره PowerShell 2003 خپور کړ. په ځینو لارو کې، دا د cmdbat سکریپټونو، vb سکریپټونو، وینډوز سکریپټ کوربه او JScript په څیر شیان بدل کړي.

حتی اوس هم، PowerShell یوازې د لوګو اختیارونو وروسته د بل ګام په توګه ګڼل کیدی شي، د دې پرځای چې شاید لاهم کارول شوي Delphi (یا یو څه زاړه)، سره له دې چې د لوپونو، ټولګیو، فعالیتونو، MS GUI کالونو شتون سره سره، د ګیټ ادغام او داسې نور.

پاورشیل په ندرت سره کارول کیږي؛ تاسو کولی شئ دا یوازې د PowerShell Core، VMware vSphere PowerCLI، Azure PowerShell، MS ایکسچینج، د مطلوب حالت ترتیب په بڼه ورسره مخ شئ. PowerShell ویب لاسرسی او یو درجن یا ډیر لږ کارول شوي پروګرامونه او افعال. شاید هغه به د خوشې کیدو سره دوهم باد ترلاسه کړي WSL2، مګر دا دقیقا نه ده.

پاورشیل هم درې لویې ګټې لري:

  1. دا نسبتا ساده ده، د دې په اړه ډیر ادب او مثالونه شتون لري، او حتی په روسیه کې، د بیلګې په توګه، د فاریچ په اړه یوه مقاله - د کتاب څخه PowerShell په ژوره توګه - د توپیر په اړه () او {}
  2. هغه د مدیر سره ځي ISEد وینډوز سره شامل دي. دلته حتی یو ډول ډیبګر شتون لري.
  3. له هغې څخه تلیفون کول اسانه دي د ګرافیکي انٹرفیس جوړولو لپاره اجزا.

0. تیاری.

موږ ته اړتیا لرو:

  • وینډوز کمپیوټر (زه وینډوز 10 لرم)
  • لږترلږه یو ډول انټرنیټ لاسرسی (د مثال په توګه د NAT له لارې)
  • د هغو کسانو لپاره چې ټیلیګرام ته محدود لاسرسی لري - په براوزر کې فریګیټ نصب او تنظیم شوی ، په ځینو سختو قضیو کې ، د سمپل DNS کریپټ سره یوځای
  • ستاسو په تلیفون کې د کاري ټیلیګرام پیرودونکي درلودل
  • په خورا اساساتو پوهیدل - یو متغیر، صف، لوپ څه شی دی.

مقالې خلاصې او ولولئ - لارښوونې: په ټیلیګرام کې د بوټونو رامینځته کولو څرنګوالی и د سیسټم مدیر لپاره د ټیلیګرام بوټ

1. راځئ چې یو بل ټیسټ بوټ جوړ کړو.

څنګه چې هرڅوک دمخه پدې پوهیږي ، او دمخه پیښ شوي ، تاسو کولی شئ دا هم پریږدئلکه څنګه چې پورته مقاله کې ویل شوي - له هرڅه دمخه ، د ټیلیګرام لپاره بوټ - دا لاهم یو غوښتنلیک دی چې ستاسو په خوا کې روان دی او د ټیلیګرام بوټ API ته غوښتنې کوي. سربیره پردې، API روښانه دی - بوټ د پیرامیټونو سره یو ځانګړي URL ته لاسرسی لري، او ټیلیګرام د JSON اعتراض سره ځواب ورکوي.

اړوندې ستونزې: که په نامعلومه طریقه تاسو د JSON څیز څخه یو څه کوډ واخلئ او په یو ډول یې د اجرا کولو لپاره واستوئ (په هدف نه)، کوډ به ستاسو لپاره اجرا شي.

د جوړولو پروسه په پورته دوه مقالو کې بیان شوې، مګر زه تکراروم: په ټیلیګرام کې موږ اړیکې خلاصوو، د @botfather په لټه کې شو، هغه ته ووایه / newbot، یو بوټ Botfortest12344321 جوړ کړئ، ورته Mynext1234bot ووایاست، او د یو ځانګړي کیلي سره یو پیغام ترلاسه کړئ. فورمه 1234544311:AbcDefNNNNNNNNNNNNNN

کیلي ته پام وکړئ او مه یې ورکوئ!

بیا تاسو کولی شئ بوټ تنظیم کړئ، د بیلګې په توګه، په ډلو کې د دې اضافه کول منع کړئ، مګر په لومړیو ګامونو کې دا اړین ندي.

راځئ چې د "/ mybot" لپاره د بوټ فادر څخه وپوښتو او تنظیمات تنظیم کړئ که موږ یو څه خوښ نه کړو.

راځئ چې اړیکې بیا خلاص کړو، هلته @Botfortest12344321 ومومئ (د @ سره لټون پیل کول لازمي دي)، "پیل" کلیک وکړئ او بوټ ته ولیکئ "/روبوټونو ته ویاړ." / نښه اړینه ده، نرخونو ته اړتیا نشته.
بوټ، البته، به هیڅ ځواب ورنکړي.

راځئ وګورو چې بوټ جوړ شوی او خلاص یې کړئ.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNN/getMe
چیرته چې 1234544311:AbcDefNNNNNNNNNNNNNN مخکې ترلاسه شوی کیلي ده،
او لکه تار ترلاسه کړئ
{"ښه":رښتیا"نتیجتا":{""}}

موږ لومړی پټ جمله لرو (نښه). اوس موږ اړتیا لرو چې دوهم پټ نمبر ومومئ - د بوټ سره د چیٹ ID. هر چیٹ، ګروپ او نور انفرادي دي او خپل شمیر لري (کله ناکله د منفي سره - د خلاص ګروپونو لپاره). د دې شمیرې موندلو لپاره، موږ باید په براوزر کې غوښتنه وکړو (په حقیقت کې، دا په براوزر کې هیڅ اړتیا نلري، مګر د ښه پوهیدو لپاره تاسو کولی شئ له دې سره پیل کړئ) پته (چیرې چې 1234544311: NNNNNNNNNN ستاسو نښه ده.

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

او ځواب ترلاسه کړئ لکه

{"OK":true,"result":[{"update_id":...,... chat":{"id":123456789

موږ chat_id ته اړتیا لرو.

راځئ وګورو چې موږ کولی شو چیټ ته په لاسي ډول ولیکئ: د براوزر څخه ادرس ته زنګ ووهئ

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

Если к вам в чат пришло сообщение от бота — окей, вы переходите на следующий этап.

پدې توګه (د براوزر له لارې) تاسو کولی شئ تل وګورئ چې ایا د لینک تولید سره ستونزې شتون لري ، یا که یو څه چیرې پټ وي او کار نه کوي.

هغه څه چې تاسو اړتیا لرئ د لوستلو دوام دمخه پوه شئ

ټیلیګرام ډیری ډوله ګروپ چیټونه لري (خلاص، تړل شوي). د دې چیټونو لپاره، ځینې دندې (د بیلګې په توګه، id) توپیر لري، چې ځینې وختونه د ځینو ستونزو لامل کیږي.

راځئ چې فرض کړو چې دا د 2019 پای دی، او حتی زموږ د وخت اتل، مشهور مین آرکسټرا (مدیر، وکیل، د معلوماتو امنیت متخصص، پروګرامر او په عملي توګه MVP) Evgeniy V. د $i متغیر له یو صف څخه توپیر کوي، د لوپونو مهارت لري، وګورئ چې په راتلونکو څو کلونو کې به په چاکلیټ کې ماسټر شي، او بیا د PowerShell سره موازي پروسس کول и د هر څیز موازي لپاره دا به راشي.

1. موږ فکر کوو چې زموږ بوټ به څه وکړي

ما هیڅ نظر نه درلود، زه باید فکر وکړم. ما دمخه د بوټ نوټ بوک لیکلی دی. زه نه غواړم یو بوټ جوړ کړم "چې یو څه بل ځای ته لیږي." د Azure سره وصل کیدو لپاره تاسو کریډیټ کارت ته اړتیا لرئ ، مګر زده کونکی له کوم ځای څخه ترلاسه کوي؟ دا باید په پام کې ونیول شي چې هرڅه دومره خراب ندي: اصلي بادل یو ډول د ازموینې موده وړیا ورکوي (مګر تاسو لاهم د کریډیټ کارت شمیرې ته اړتیا لرئ - او داسې ښکاري چې یو ډالر به له دې څخه ډیبیټ شي. زه په یاد نه یم که وروسته بیرته راستانه شو.)

د AI ML پرته دا دومره په زړه پوري نده چې د بوټ - غریب - شاعر - اوبدل جوړ کړئ.

ما پریکړه وکړه چې یو بوټ جوړ کړم چې د قاموس څخه د انګلیسي کلمو یادونه وکړي (یا ما نه).
د ډیټابیس سره د ګډوډۍ مخنیوي لپاره ، قاموس به په متن فایل کې زیرمه شي او په لاسي ډول به تازه شي.
په دې حالت کې، دنده دا ده چې د کار اساسات وښيي، او نه لږ تر لږه یو څه بشپړ شوي محصول جوړ کړي.

2. د لومړي ځل لپاره څه او څنګه هڅه وکړئ

راځئ چې یو فولډر C: poshtranslate جوړ کړو
لومړی، راځئ چې وګورو چې کوم ډول پاورشیل لرو، راځئ چې ISE د start-run له لارې پیل کړو
powershell 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

(څه په زړه پوري دي چې په هابري کې د کوډ فارمیټینګ ډراپ ډاون لیست کې دوه درجن اختیارونه شتون لري - مګر پاورشیل شتون نلري. Dos شتون لري. پرل شتون لري.)

او راځئ چې د GUI څخه د F5 یا ">" په فشارولو سره کوډ چلوو.

موږ لاندې محصول ترلاسه کوو:

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

اوس راځئ چې دا دوه کرښې او ځینې په زړه پورې ټکي وګورو ترڅو موږ په راتلونکي کې دې ته بیرته نه راګرځو.

د پاسکل (او نه یوازې) برخلاف ، پاور شیل پخپله هڅه کوي چې متغیر ته کوم ډول وټاکي؛ پدې اړه نور توضیحات په مقاله کې لیکل شوي د پروګرام کولو ژبو کې د ټایپ کولو په اړه تعلیمي پروګرام
له همدې امله، د $TimeNow متغیر په جوړولو او د اوسني نیټې او وخت ارزښت (د ترلاسه کولو نیټه) په ټاکلو سره، موږ د دې په اړه ډیره اندیښنه نلرو چې کوم ډول ډاټا به وي.

ریښتیا، دا ناپوهي ممکن وروسته درد وکړي، مګر دا د وروسته لپاره دی. لاندې به په متن کې یو مثال وي.
راځئ وګورو چې موږ څه ترلاسه کړل. راځئ چې اجرا کړو (د کمانډ لاین کې)

$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")...                                         

لکه څنګه چې تاسو لیدلی شئ، د ډول ډول ډول ډول ډول ډول ډول ډول ډول: System.DateTime د میتودونو یو ګروپ سره رامینځته شوی (په دې معنی چې موږ د دې متغیر څیز سره څه کولی شو) او ملکیتونه.

راځئ چې غږ وکړو $TimeNow.DayOfYear - موږ د کال د ورځې شمیر ترلاسه کوو.
راځئ چې غږ وکړو $TimeNow.DayOfYear | Get-Member - موږ ترلاسه کوو TypeName: System.Int32 او د میتودونو یوه ډله.
راځئ چې غږ وکړو $TimeNow.ToUniversalTime() - او وخت په UTC کې ترلاسه کړئ

Debugger

ځینې ​​​​وختونه داسې پیښیږي چې دا اړینه ده چې یو برنامه تر یوې ټاکلې کرښې پورې اجرا کړئ او په هغه وخت کې د برنامې حالت وګورئ. د دې هدف لپاره، ISE د ډیبګ فعالیت لري - د تودوخې وقفې نقطه
د وقفې نقطه په مینځ کې ځای په ځای کړئ، دا دوه کرښې پرمخ وړئ او وګورئ چې وقفه څه ډول ښکاري.

3. د ټیلیګرام بوټ سره د متقابل عمل پوهیدل

البته، حتی ډیر ادب د بوټ سره د تعامل په اړه لیکل شوی، د ټولو ګیټپش او داسې نورو سره، مګر د تیوري مسله په اختیاري توګه په پام کې نیول کیدی شي.

زموږ په قضیه کې دا اړینه ده:

  • په لیک کې د یو څه لیږلو زده کړئ
  • د لیکونو څخه یو څه ترلاسه کول زده کړئ

3.1 په مکتوب کې د یو څه لیږلو او له هغې څخه ترلاسه کول زده کړئ

یو کوچنی کوډ - دریمه برخه

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 

دا څه شی دی؟ د شیانو له لړۍ څخه ځینې پیچلي توکي چې د پای څخه تر پای پورې پیغام پیژندونکی ، د چیټ پیژندونکی ، لیږلو پیژندونکی او ډیری نور معلومات لري.

په هرصورت، موږ اړتیا نلرو چې معلومه کړو "دا کوم ډول څیز دی" - د کار یوه برخه لا دمخه زموږ لپاره ترسره شوې. راځئ وګورو چې دننه څه دي:

د ترلاسه شوي پیغامونو لوستل یا څلورمه برخه

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 -$MyVocabExample2 ضمیمه کې یوه تېروتنه ترلاسه کوو.

هغه نه غواړي اضافه کړي، ah-ah، څه شرم دی.

$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"، "یوازې لوستل کیږي"، "Is Fixed Size"، "Synchronized"
#
راځئ چې یو څه بیا لیکو:

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

داسې ښکاري چې مرسته کړې، مګر زه لاهم بڼه نه خوښوم.

زه په ځانګړي توګه دا نه خوښوم چې زه نشم کولی د یو څیز څخه لینونه مستقیم فایل ته واچوم.
په لاره کې، له هغه وخته چې موږ فایلونو ته لیکل پیل کړل، ایا موږ کولی شو د پیل کولو لاګ ساتل پیل کړو؟ موږ د متغیر په توګه وخت لرو، موږ کولی شو د فایل نوم ترتیب کړو.

ریښتیا، تر اوسه د لیکلو لپاره هیڅ شی نشته، مګر تاسو کولی شئ په دې اړه فکر وکړئ چې څنګه د لاګونو څرخولو لپاره غوره وي.
راځئ چې د اوس لپاره xml هڅه وکړو.

ځینې ​​​​xml

$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 فایل ولولئ.

د 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 تر مینځ یو تصادفي عدد ترلاسه کړئ ترلاسه کړئ - تصادفي - اعظمي 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 تر اوسه اړتیا نشته.

لپاره اسناد د ټیلیګرام اپی دلته دی
په سپین او انګلیسي کې وايي:
د بیرته راستنیدو لپاره د لومړي تازه کولو پیژندونکی. باید د مخکینیو ترلاسه شوي تازه معلوماتو پیژندونکو په مینځ کې ترټولو لوړ وي. د ډیفالټ په واسطه، تازه معلومات د لومړي سره پیل کیږي
نا تصدیق شوی تازه بیرته راستانه شوي. یو اوسمهال تایید شوی ګڼل کیږي کله چې د 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

هو، او موږ به یې بیا تنظیم کړو او فنکشن به یو څه بیا ولیکو. موږ دوه اختیارونه لرو - ټول پیغام فنکشن ته انتقال کړئ او په بشپړ ډول یې په فنکشن کې پروسس کړئ، یا یوازې د پیغام 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. د یوې پایلې پر ځای

اساسي دندې - د پیغامونو لوستل، د کتار بیا تنظیمول، له فایل څخه لوستل او فایل ته لیکل ترسره شوي او ښودل شوي.

د ترسره کولو لپاره یوازې څلور شیان پاتې دي:

  • په چیٹ کې غوښتنې ته سم ځواب لیږل
  • هرې خبرې ته د ځواب لیږل چې بوټ پکې اضافه شوی و
  • په لوپ کې کوډ اجرا کول
  • د وینډوز مهالویش څخه د بوټ پیل کول.

دا ټولې دندې ساده دي او د پیرامیټونو په اړه د اسنادو په لوستلو سره په اسانۍ سره ترسره کیدی شي لکه
د اجرا کولو پالیسي غیر محدوده او - د اجرا کولو پالیسي بای پاس
د فورمې دوره

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

د هرچا څخه مننه چې لوستل.

سرچینه: www.habr.com

Add a comment