Шаблон барои боти оддии телеграмма барои мактаббачагон дар синфҳои 7-9 бо истифода аз Powershell

Ҳангоми сӯҳбат бо як дӯстам ногаҳон фаҳмидам, ки ба кӯдакони синфҳои 8-10 дар мактабашон умуман барномасозӣ намеомӯзанд. Word, Excel ва ҳама чиз. Не логотип, ҳатто Паскал, ҳатто VBA барои Excel.

Ман хеле ҳайрон шудам, интернетро кушодам ва ба хондан шурӯъ кардам -
Яке аз вазифаҳои мактаби тахассусӣ мусоидат намудан ба тарбияи насли навест, ки ба шароити ҷомеаи иттилоотӣ дар сатҳи рушд ва тарзи зиндагӣ ҷавобгӯ бошад.
Ин курс ба донишҷӯён имкон медиҳад, ки донишҳои худро дар бораи сохторҳои асосии забони барномасозии Паскал дар амал мустаҳкам кунанд. (аз барномаи баъзе гимназия барои соли 2017)

Дар охир ман қарор додам, ки якчанд соат вақт сарф кунам ва намунаи «чӣ гуна сохтани боти оддӣ барои мактаббачагон»-ро нишон диҳам.

Дар зер буриши он аст, ки чӣ гуна боти дигари оддиро дар Powershell нависед ва онро бе вебхук, IP-ҳои сафед, серверҳои ҷудошуда, мошинҳои виртуалии ҷойгиршуда дар абр ва ғайра кор кунед - дар компютери муқаррарии хонагӣ бо Windows муқаррарӣ.

TLDR: Боз як мақолаи дилгиркунанда бо хатогиҳои грамматикӣ ва воқеӣ, чизе барои хондан, ҳазлу ҳазл ва тасвирҳо нест.

Дар мақола ҳеҷ чизи нав нест, қариб ҳама чизе, ки қаблан навишта шуда буд, аллакай дар Habré буд, масалан дар мақолаҳо Дастурҳо: Чӣ гуна ботҳоро дар Telegram эҷод кардан мумкин аст и Боти Telegram барои мудири система.
Гузашта аз ин, мақола дидаву дониста зиёдатист, то ҳар дафъа ба адабиёти таълимӣ муроҷиат накунад. Дар матн ба Gang 4, PowerShell Deep Dives ё масалан, 5 сутуни чаҳорчӯбаи хуб меъмории AWS истинод вуҷуд надорад.

Ба ҷои муқаддима, шумо метавонед гузаред

Озод ҳис кунед, ки гузаредДар соли 2006, Microsoft PowerShell 1.0-ро барои Windows XP, Vista ва Server 2003 баровард. Бо баъзе роҳҳо, он чизҳоро ба монанди скриптҳои cmdbat, скриптҳои vb, Windows Script Host ва JScript иваз кард.

Ҳатто ҳоло, PowerShell-ро танҳо ҳамчун қадами навбатӣ пас аз имконоти Logo баррасӣ кардан мумкин аст, ба ҷои Delphi (ё чизи кӯҳна), сарфи назар аз мавҷудияти ҳалқаҳо, синфҳо, функсияҳо, зангҳои MS GUI, Интегратсияи Git ва ғайра.

Powershell нисбатан кам истифода мешавад; шумо метавонед онро танҳо дар шакли PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Конфигуратсияи давлатии дилхоҳ, Дастрасии веб PowerShell ва даҳҳо барномаҳо ва функсияҳои кам истифодашаванда. Эҳтимол, ӯ бо озод шудан боди дуюмро ба даст орад WSL2, аммо он дақиқ нест.

Powershell инчунин се бартарии калон дорад:

  1. Ин нисбатан содда аст, дар бораи он адабиёт ва мисолҳои зиёде мавҷуданд ва ҳатто ба забони русӣ, масалан, мақола дар бораи Foreach - аз китоб PowerShell дар амиқ - дар бораи фарқият () ва {}
  2. Вай бо муҳаррир меравад ISE, бо Windows дохил карда шудааст. Дар он ҷо ҳатто як намуди ислоҳкунанда вуҷуд дорад.
  3. Аз он занг задан осон аст ҷузъҳо барои сохтани интерфейси графикӣ.

0. Тайёрӣ.

Мо бояд ба:

  • Windows PC (ман Windows 10 дорам)
  • Ҳадди ақал як намуди дастрасӣ ба Интернет (масалан, тавассути NAT)
  • Барои онҳое, ки дастрасии маҳдуд ба telegram доранд - фрегэйти дар браузер насбшуда ва танзимшуда, дар баъзе ҳолатҳои душвор, дар якҷоягӣ бо Symple DNS Crypt
  • Дар телефони шумо як муштарии телеграммаи корӣ
  • Фаҳмидани асосҳои асосӣ - тағирёбанда, массив, ҳалқа чӣ гуна аст.

Мақолаҳои кушода ва хондашуда - Дастурҳо: Чӣ гуна ботҳоро дар Telegram эҷод кардан мумкин аст и Боти Telegram барои мудири система

1. Биёед як боти санҷишии дигар эҷод кунем.

Азбаски ҳама инро аллакай медонанд ва аллакай рӯй додаанд, шумо метавонед онро низ гузаредТавре ки дар мақолаи боло гуфта шудааст - Пеш аз ҳама, бот барои Telegram - он то ҳол як барномаест, ки дар паҳлӯи шумо кор мекунад ва ба API Telegram Bot дархост пешниҳод мекунад. Ғайр аз он, API равшан аст - бот ба URL-и мушаххас бо параметрҳо дастрасӣ пайдо мекунад ва Telegram бо объекти JSON ҷавоб медиҳад.

Мушкилоти марбут: агар шумо бо ягон роҳи номаълум ягон кодро аз объекти JSON гиред ва бо ягон роҳ онро барои иҷро фиристед (на ба мақсад), код барои шумо иҷро карда мешавад.

Раванди эҷод дар ду мақолаи боло тавсиф шудааст, аммо такрор мекунам: дар телеграмма мо тамосҳоро мекушоем, @botfather-ро ҷустуҷӯ мекунем, ба ӯ бигӯед /newbot, боти Botfortest12344321 эҷод кунед, ба он Mynext1234bot занг занед ва паёмеро бо калиди беназири шакли 1234544311:AbcDefNNNNNNNNNNNNNNNN

Калидро эҳтиёт кунед ва онро ба даст надиҳед!

Пас шумо метавонед ботро танзим кунед, масалан, илова кардани онро ба гурӯҳҳо манъ кунед, аммо дар қадамҳои аввал ин шарт нест.

Биёед аз BotFather дархост кунем "/mybot" ва танзимотро танзим кунем, агар чизе ба мо маъқул набошад.

Биёед боз тамосҳоро кушоем, дар он ҷо @Botfortest12344321-ро пайдо кунем (ҷустуҷӯро бо @ оғоз кардан ҳатмӣ аст), "оғоз" -ро клик кунед ва ба бот "/Шараф ба роботҳо" нависед. Аломати / лозим аст, нохунак лозим нест.
Бот, албатта, ба ҳеҷ чиз ҷавоб намедиҳад.

Биёед тафтиш кунем, ки бот сохта шудааст ва онро кушоед.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNNNN/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"

Агар шумо аз бот дар сӯҳбати худ паём гиред, хуб, шумо ба марҳилаи навбатӣ мегузаред.

Бо ин роҳ (тавассути браузер) шумо ҳамеша метавонед тафтиш кунед, ки оё дар тавлиди пайванд мушкилот вуҷуд дорад ё чизе дар ҷое пинҳон аст ва кор намекунад.

Он чизе ки шумо бояд пеш аз идомаи хондан донед

Telegram дорои якчанд намуди чатҳои гурӯҳӣ (кушода, пӯшида). Барои ин чатҳо, баъзе аз вазифаҳо (масалан, id) гуногунанд, ки баъзан баъзе мушкилотро ба вуҷуд меорад.

Фарз мекунем, ки ин охири соли 2019 аст ва ҳатто қаҳрамони замони мо, ман-оркестри маъруф (администратор, ҳуқуқшинос, мутахассиси амнияти иттилоотӣ, барномасоз ва амалан MVP) Евгений В. тағирёбандаи $i-ро аз массив фарқ мекунад, ҳалқаҳоро азхуд кардааст, назар дар ду соли оянда хоҳад Chocolatey азхуд, ва он гоҳ Коркарди параллелӣ бо PowerShell и ForEach-Object Parallel меояд.

1. Мо дар бораи он фикр мекунем, ки боти мо чӣ кор хоҳад кард

Ман ягон идея надоштам, ман бояд фикр мекардам. Ман аллакай бот-лофтор навиштам. Ман намехостам бот созам, ки "ки чизе ба ҷое мефиристад". Барои пайваст шудан ба Azure ба шумо корти кредитӣ лозим аст, аммо донишҷӯ онро аз куҷо мегирад? Бояд қайд кард, ки ҳама чиз он қадар бад нест: абрҳои асосӣ як навъ давраи санҷишро ройгон медиҳанд (аммо ба шумо ҳоло ҳам рақами корти кредитӣ лозим аст - ва ба назар чунин мерасад, ки аз он доллар ҳисоб карда мешавад. Дар ёд надорам, ки оё баъдтар баргардонида шуд.)

Бе AI ML сохтани бот-камбағали шоир-бофанда он қадар ҷолиб нест.

Ман тасмим гирифтам, ки бот созам, ки ба ман (ё на) калимаҳои англисиро аз луғат хотиррасон кунад.
Барои роҳ надодан ба муомила бо пойгоҳи додаҳо, луғат дар файли матнӣ нигоҳ дошта мешавад ва дастӣ навсозӣ мешавад.
Дар ин сурат вазифа аз он иборат аст, ки асосхои корро нишон дода, акаллан кисман махсулоти тайёр тайёр накунем.

2. Кӯшиши чӣ ва чӣ тавр бори аввал

Биёед папкаи C:poshtranslate эҷод кунем
Аввалан, биёед бубинем, ки мо чӣ гуна Powershell дорем, биёед ISE-ро тавассути оғози кор оғоз кунем
powershell бошад
ё дар барномаҳои насбшуда Powershell ISE -ро пайдо кунед.
Пас аз оғозёбӣ, "як навъ муҳаррири" маъмулӣ кушода мешавад; агар майдони матн мавҷуд набошад, шумо ҳамеша метавонед "Файл - эҷоди нав" -ро клик кунед.

Биёед ба версияи powershell назар кунем - дар майдони матн нависед:

get-host 

ва F5-ро пахш кунед.

Powershell пешниҳод мекунад, ки захира кунед - "Скрипте, ки шумо иҷро кардан мехоҳед, захира карда мешавад.", мо розӣ мешавем ва файлро аз Powershell бо номи C: poshtranslate захира мекунем. myfirstbotBT100.

Пас аз оғоз, дар равзанаи матнии поёнӣ мо ҷадвали маълумотро мегирем:

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

Ман 5.1 чизе дорам, кифоя аст. Агар шумо Windows 7/8-и кӯҳна дошта бошед, пас ҳеҷ чизи бузурге нест - гарчанде ки PowerShell бояд ба версияи 5 навсозӣ шавад - масалан. дастурҳо.

Дар сатри фармони зер Get-Date -ро нависед, Enter-ро пахш кунед, вақтро бубинед, бо фармон ба ҷузвдони реша равед
cd
ва экранро бо фармони cls тоза кунед (не, ба шумо rm лозим нест)

Акнун биёед тафтиш кунем, ки чӣ кор мекунад ва чӣ тавр - биёед на ҳатто код, балки ду сатр нависед ва кӯшиш кунед, ки онҳо чӣ кор мекунанд. Биёед сатри бо get-hostро бо рамзи # шарҳ диҳем ва каме илова кунем.

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

(Ҷолиб он аст, ки дар рӯйхати афтанда форматкунии код дар Habré ду даҳҳо вариант вуҷуд дорад - аммо Powershell вуҷуд надорад. Dos вуҷуд дорад. Perl вуҷуд дорад.)

Ва биёед кодро тавассути пахшкунии F5 ё ">" аз GUI иҷро кунем.

Мо натиҷаи зеринро ба даст меорем:

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

Акнун биёед ба ин ду сатр ва чанд нуктаи ҷолиб назар андозем, то дар оянда ба он барнагардем.

Баръакси Паскал (ва на танҳо), PowerShell худ кӯшиш мекунад муайян кунад, ки кадом навъи тағирёбанда таъин карда шавад; тафсилоти бештар дар ин мақола дар мақола навишта шудааст. Барномаи таълимӣ оид ба чопкунӣ бо забонҳои барномасозӣ
Аз ин рӯ, бо эҷод кардани як тағирёбандаи $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 гиред

Debugger

Баъзан чунин мешавад, ки то сатри муайян ягон барномаро иҷро кардан ва ҳолати барномаро дар он лаҳза дидан лозим аст. Бо ин мақсад, ISE функсияи Debug дорад - гузариш нуқтаи шикаста
Нуқтаи танаффусро дар мобайн ҷойгир кунед, ин ду хатро иҷро кунед ва бубинед, ки танаффус чӣ гуна аст.

3. Фаҳмидани робита бо боти Telegram

Албатта, дар бораи ҳамкорӣ бо бот, бо ҳама getpush ва ғайра адабиёти бештар навишта шудааст, аммо масъалаи назарияро ихтиёрӣ баррасӣ кардан мумкин аст.

Дар ҳолати мо зарур аст:

  • Дар мукотиба фиристодани чизеро ёд гиред
  • Аз мукотиба гирифтани чизеро ёд гиред

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"

Хушбахтона, дар мақолаи қаблан нашршудаи Telegram bot барои мудири система ин сатр (ҳа, тибқи $MyMessageGet.RawContent | даст-узв 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#>

Акнун мо бояд муайян кунем, ки луғатро аз куҷо гирем (хуб, дар куҷо - дар диски файл) ва он чӣ гуна хоҳад буд.

Албатта, шумо метавонед дар матни скрипт як луғати азимро нависед, аммо ин комилан аз нуқтаи назар аст.
Пас биёед бубинем, ки бо кадом powershell маъмулан кор карда метавонад.
Умуман, вай парвое надорад, ки бо кадом файл кор кунад, барои мо фарқ надорад.
Мо интихоб дорем: 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 хато мегирем.

Вай илова кардан намехохад, а-а, чй шармандагист.

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

Биёед бубинем, ки чӣ мешавад. Намоиши хуби матн - аммо чӣ гуна онро баргардонидан мумкин аст? Оё ман бояд як навъ ҷудокунакҳои матн, ба монанди вергулро ҷорӣ кунам?

Ва дар ниҳоят шумо файли "арзишҳои бо вергул ҷудошуда (CSV) -ро мегиред ИНТИЗОР ШАВЕД.
#

$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","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 гиред 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 ва /салом фиристем.
Биёед бубинем, ки мо чӣ дорем:

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

Биёед ҳама чизро аз назар гузаронем ва агар паём / калима бошад, ҷавоб фиристем
парвандаи сохтмон, он чизе ки баъзеҳо ҳамчун if-elseif тавсиф мекунанд, дар powershell номида мешаванд тавассути гузариш. Ҳамзамон, рамзи дар поён овардашуда калиди -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 telegram дар ин ҷост
Он бо забони сафед ва англисӣ мегӯяд:
Идентификатори навсозии аввалине, ки баргардонида мешавад. Бояд як аз баландтарин дар байни идентификаторҳои навсозиҳои қаблан гирифташуда зиёд бошад. Бо нобаёнӣ, навсозиҳо аз пештара оғоз мешаванд
тасдиқнашуда навсозӣ баргардонида мешаванд. Вақте ки getUpdates бо занг занг мезанад, навсозӣ тасдиқшуда ҳисобида мешавад фарсуда олї нисбат ба update_id он. Ҷуброни манфиро метавон барои дарёфти навсозиҳо аз навсозии -офсет аз охири навбати навсозӣ муайян кард. Ҳама навсозиҳои қаблӣ фаромӯш карда мешаванд.

Биёед бубинем:

$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. Ба ҷои хулоса

Функсияҳои асосӣ - хондани паёмҳо, барқароркунии навбат, хондан аз файл ва навиштан ба файл иҷро ва нишон дода мешаванд.

Танҳо чаҳор кор боқӣ мондааст:

  • фиристодани ҷавоби дуруст ба дархост дар чат
  • фиристодани ҷавоб ба ЯГОН сӯҳбате, ки бот ба он илова карда шудааст
  • иҷро кардани код дар як давр
  • оғоз кардани бот аз ҷадвали Windows.

Ҳамаи ин вазифаҳо соддаанд ва онҳоро тавассути хондани ҳуҷҷатҳо дар бораи параметрҳо ба осонӣ иҷро кардан мумкин аст
Set-ExecutionPolicy бемаҳдуд ва гузариш -ExecutionPolicy
давраи шакл

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

Ташаккур ба ҳамаи онҳое, ки хондаанд.

Манбаъ: will.com

Илова Эзоҳ