Дар зер буриши он аст, ки чӣ гуна боти дигари оддиро дар 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 инчунин се бартарии калон дорад:
Ин нисбатан содда аст, дар бораи он адабиёт ва мисолҳои зиёде мавҷуданд ва ҳатто ба забони русӣ, масалан, мақола дар бораи Foreach - аз китоб PowerShell дар амиқ - дар бораи фарқият () ва {}
Вай бо муҳаррир меравад ISE, бо Windows дохил карда шудааст. Дар он ҷо ҳатто як намуди ислоҳкунанда вуҷуд дорад.
Азбаски ҳама инро аллакай медонанд ва аллакай рӯй додаанд, шумо метавонед онро низ гузаредТавре ки дар мақолаи боло гуфта шудааст - Пеш аз ҳама, бот барои 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 нишонаи шумост.
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 Омӯзиши фиристодани чизе дар мукотиба ва аз он гирифтан
Write-Host "ParsedHtml"
$MyMessageGet.ParsedHtml # тут интересное
Write-Host "RawContent"
$MyMessageGet.RawContent # и тут интересное, но еще к тому же и читаемое.
Write-Host "Content"
$MyMessageGet.Content
Агар ҳама чиз барои шумо кор кунад, шумо як қатори дарозе хоҳед дошт, ба монанди:
Ин чист? Якчанд объекти мураккаб аз массивҳои объектҳое иборат аст, ки дорои идентификатори паёмҳо, идентификатори чат, идентификатори ирсолкунанда ва бисёр маълумоти дигар мебошанд.
Аммо, ба мо лозим нест, ки "ин чӣ гуна объект аст" - як қисми кор барои мо аллакай анҷом дода шудааст. Биёед бубинем, ки дар дохили он чӣ аст:
Хондани паёмҳои қабулшуда ё қисми 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
Биёед кӯшиш кунем, ки онро бо истифода аз файлҳо нависед барои намуна.
$MyFilenameExample06 = $ScriptDir + "Example06.xml"
$MyVocabExample4AsArray = Import-Clixml -Path $MyFilenameExample06
# $MyVocabExample4AsArray
# $MyVocabExample4AsArray[0]
# и немного о совершенно неочевидных нюансах. Powershell время от времени ведет себя не так, как вроде бы как бы стоило бы ожидать бы.
# например у меня эти два вывода отличаются
# Write-Output $MyVocabExample4AsArray
# write-host $MyVocabExample4AsArray
Биёед ҳама чизро аз назар гузаронем ва агар паём / калима бошад, ҷавоб фиристем
парвандаи сохтмон, он чизе ки баъзеҳо ҳамчун 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)}
}
}
Биёед скриптро якчанд маротиба иҷро кунем. Мо як калимаро барои ҳар як кӯшиши иҷро ду маротиба мегирем, хусусан агар мо дар татбиқи тасодуфӣ хато карда бошем.