Template para sa isang simpleng telegram bot para sa mga mag-aaral sa grade 7-9 gamit ang Powershell

Sa pakikipag-usap sa isang kaibigan, bigla kong nalaman na ang mga bata sa grade 8-10 sa kanilang paaralan ay hindi tinuturuan ng programming. Word, Excel at lahat. Walang logo, kahit Pascal, kahit VBA para sa Excel.

Laking gulat ko, binuksan ang Internet at nagsimulang magbasa -
Ang isa sa mga gawain ng isang dalubhasang paaralan ay upang itaguyod ang edukasyon ng isang bagong henerasyon na nakakatugon sa mga kondisyon ng lipunan ng impormasyon sa antas ng pag-unlad at pamumuhay nito.
Ang kursong ito ay magbibigay-daan sa mga mag-aaral na pagsamahin sa pagsasanay ang kanilang kaalaman sa mga pangunahing konstruksyon ng wikang programming ng Pascal. (mula sa programa ng ilang gymnasium para sa 2017)

Sa huli, nagpasya akong gumugol ng ilang oras at mag-sketch ng isang halimbawa ng "kung paano lumikha ng isang simpleng bot para sa mga mag-aaral."

Sa ibaba ng cut ay kung paano magsulat ng isa pang simpleng bot sa Powershell at gawin itong gumana nang walang webhook, mga puting IP, mga dedikadong server, naka-deploy na mga virtual machine sa cloud, at iba pa - sa isang regular na home PC na may regular na Windows.

TLDR: Isa pang nakakainip na artikulo na may mga grammatical at factual errors, walang basahin, walang katatawanan, walang mga larawan.

Walang bago sa artikulo, halos lahat ng nakasulat noon ay nasa Habré na, halimbawa sa mga artikulo Mga Tagubilin: Paano lumikha ng mga bot sa Telegram и Telegram bot para sa system administrator.
Bukod dito, ang artikulo ay sadyang redundant upang hindi sumangguni sa literatura pang-edukasyon sa bawat oras. Walang mga reference sa Gang 4, PowerShell Deep Dives o, sabihin nating, The 5 Pillars of the AWS Well-Architected Framework sa text.

Sa halip na paunang salita, maaari mong laktawan

Huwag mag-atubiling laktawanNoong 2006, inilabas ng Microsoft ang PowerShell 1.0 para sa Windows XP, Vista, at Server 2003 noon. Sa ilang mga paraan, pinalitan nito ang mga bagay tulad ng cmdbat script, vb script, Windows Script Host at JScript.

Kahit ngayon, ang PowerShell ay maaari lamang isaalang-alang bilang susunod na hakbang pagkatapos ng mga pagpipilian sa Logo, sa halip na ang malamang na ginagamit pa rin Delphi (o mas luma), sa kabila ng pagkakaroon ng mga loop, klase, function, MS GUI na tawag, Pagsasama ng Git at iba pa.

Ang Powershell ay bihirang ginagamit; maaari mo lamang itong makatagpo sa anyo ng PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Desired State Configuration, PowerShell Web Access at isang dosenang o higit pang bihirang ginagamit na mga programa at function. Marahil ay makakakuha siya ng pangalawang hangin sa paglaya WSL2, ngunit hindi ito eksakto.

Ang Powershell ay mayroon ding tatlong malalaking pakinabang:

  1. Ito ay medyo simple, mayroong maraming panitikan at mga halimbawa tungkol dito, at kahit na sa Russian, halimbawa, isang artikulo tungkol sa Foreach - mula sa libro Malalim ang PowerShell - tungkol sa pagkakaiba () at {}
  2. Sumama siya sa editor Ise, kasama sa Windows. Mayroong kahit ilang uri ng debugger doon.
  3. Madali itong tumawag mula dito mga bahagi para sa pagbuo ng isang graphical na interface.

0. Paghahanda.

Kakailanganin namin ang:

  • Windows PC (Mayroon akong Windows 10)
  • Hindi bababa sa ilang uri ng pag-access sa Internet (sa pamamagitan ng NAT halimbawa)
  • Para sa mga may limitadong pag-access sa telegrama - naka-install at na-configure ang freegate sa browser, sa ilang mahihirap na kaso, kasama ang Symple DNS Crypt
  • Ang pagkakaroon ng gumaganang telegram client sa iyong telepono
  • Pag-unawa sa mga pangunahing kaalaman - kung ano ang variable, array, loop.

Binuksan at binasa ang mga artikulo - Mga Tagubilin: Paano lumikha ng mga bot sa Telegram и Telegram bot para sa system administrator

1. Gumawa tayo ng isa pang pagsubok na bot.

Dahil alam na ito ng lahat, at nangyari na, maaari mo ring laktawan itoTulad ng nakasaad sa artikulo sa itaas - Una sa lahat, isang bot para sa Telegram - isa pa rin itong application na tumatakbo sa iyong panig at gumagawa ng mga kahilingan sa Telegram Bot API. Bukod dito, malinaw ang API - ina-access ng bot ang isang partikular na URL na may mga parameter, at tumugon ang Telegram gamit ang isang object ng JSON.

Mga kaugnay na problema: kung sa ilang hindi kilalang paraan ay kukuha ka ng ilang code mula sa isang JSON object at kahit papaano ay ipadala ito para sa pagpapatupad (hindi sinasadya), ang code ay isasagawa para sa iyo.

Ang proseso ng paglikha ay inilarawan sa dalawang artikulo sa itaas, ngunit inuulit ko: sa isang telegrama nagbubukas kami ng mga contact, hanapin si @botfather, sabihin sa kanya /newbot, lumikha ng bot Botfortest12344321, tawagan itong Mynext1234bot, at tumanggap ng mensahe na may natatanging key ng form 1234544311:AbcDefNNNNNNNNNNNNNNNN

Alagaan ang susi at huwag ibigay!

Pagkatapos ay maaari mong i-configure ang bot, halimbawa, ipagbawal ang pagdaragdag nito sa mga grupo, ngunit sa mga unang hakbang hindi ito kinakailangan.

Hilingin natin sa BotFather ang “/mybot” at ayusin ang mga setting kung may hindi tayo gusto.

Buksan natin muli ang mga contact, hanapin ang @Botfortest12344321 doon (kailangan na simulan ang paghahanap gamit ang @), i-click ang "simulan" at isulat sa bot ang "/Glory to the robots." Ang / sign ay kailangan, quotes ay hindi kailangan.
Ang bot, siyempre, ay hindi sasagot ng anuman.

Suriin natin na ang bot ay nilikha at buksan ito.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNN/getMe
kung saan ang 1234544311:AbcDefNNNNNNNNNNNNNN ay ang dating natanggap na susi,
at makakuha ng isang linya tulad ng
{"ok":true,"result":{""}}

Mayroon kaming unang lihim na parirala (token). Ngayon kailangan nating malaman ang pangalawang lihim na numero - ang ID ng chat sa bot. Ang bawat chat, grupo, atbp. ay indibidwal at may sariling numero (minsan may minus - para sa mga bukas na grupo). Upang malaman ang numerong ito, kailangan naming humiling sa browser (sa katunayan, hindi ito kinakailangan sa browser, ngunit para sa isang mas mahusay na pag-unawa maaari kang magsimula dito) ang address (kung saan 1234544311:NNNNNNNNNN ang iyong token

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

at makakuha ng tugon tulad ng

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

Kailangan namin ng chat_id.

Tingnan natin kung maaari tayong sumulat sa chat nang manu-mano: tawagan ang address mula sa browser

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

Kung nakatanggap ka ng mensahe mula sa isang bot sa iyong chat, okay, magpatuloy ka sa susunod na yugto.

Sa ganitong paraan (sa pamamagitan ng browser) maaari mong palaging suriin kung may mga problema sa pagbuo ng link, o kung may nakatago sa isang lugar at hindi gumagana.

Ano ang kailangan mong malaman bago magpatuloy sa pagbabasa

Ang Telegram ay may ilang uri ng mga panggrupong chat (bukas, sarado). Para sa mga chat na ito, ang ilan sa mga function (halimbawa, id) ay iba, na kung minsan ay nagdudulot ng ilang problema.

Ipagpalagay natin na katapusan na ng 2019, at maging ang bayani ng ating panahon, ang kilalang Man-Orchestra (administrator, abogado, espesyalista sa seguridad ng impormasyon, programmer at halos MVP) na si Evgeniy V. ay nakikilala ang $i variable mula sa isang array, ay pinagkadalubhasaan loop, tumingin sa susunod na dalawang taon ay master Chocolatey, at pagkatapos Parallel processing gamit ang PowerShell и ForEach-Object Parallel darating ito.

1. Iniisip namin kung ano ang gagawin ng aming bot

Wala akong ideya, kailangan kong mag-isip. Nakasulat na ako ng bot-notebook. Hindi ko gustong gumawa ng bot "na nagpapadala ng isang bagay sa isang lugar." Para kumonekta sa Azure kailangan mo ng credit card, ngunit saan ito nakukuha ng estudyante? Dapat pansinin na ang lahat ay hindi masyadong masama: ang pangunahing ulap ay nagbibigay ng ilang uri ng panahon ng pagsubok nang libre (ngunit kailangan mo pa rin ng numero ng credit card - at tila isang dolyar ang ma-debit mula dito. Hindi ko maalala kung ibinalik ito mamaya.)

Kung walang AI ML, hindi kawili-wiling gumawa ng bot-poorist.

Nagpasya akong gumawa ng bot na magpapaalala sa akin (o hindi sa akin) ng mga salitang Ingles mula sa diksyunaryo.
Upang maiwasan ang kalikot sa database, ang diksyunaryo ay maiimbak sa isang text file at manu-manong ia-update.
Sa kasong ito, ang gawain ay upang ipakita ang mga pangunahing kaalaman ng trabaho, at hindi gumawa ng hindi bababa sa isang bahagyang tapos na produkto.

2. Sinusubukan kung ano at paano sa unang pagkakataon

Gumawa tayo ng folder C:poshtranslate
Una, tingnan natin kung anong uri ng powershell ang mayroon tayo, ilunsad natin ang ISE sa pamamagitan ng start-run
powershell ise
o hanapin ang Powershell ISE sa mga naka-install na program.
Pagkatapos ng paglunsad, ang karaniwang pamilyar na "ilang uri ng editor" ay magbubukas; kung walang field ng teksto, maaari mong palaging i-click ang "File - lumikha ng bago".

Tingnan natin ang bersyon ng powershell - isulat sa field ng text:

get-host 

at pindutin ang F5.

Mag-aalok ang Powershell na i-save - "Mase-save ang script na iyong tatakbo.", sumasang-ayon kami, at i-save ang file mula sa powershell na may pangalan sa C: poshtranslate myfirstbotBT100.

Pagkatapos ng paglunsad, sa ibabang window ng teksto ay nakakakuha kami ng talahanayan ng data:

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

Mayroon akong 5.1, sapat na. Kung mayroon kang lumang Windows 7/8 kung gayon walang malaking problema - kahit na ang PowerShell ay kailangang i-update sa bersyon 5 - hal. tagubilin.

I-type ang Get-Date sa command line sa ibaba, pindutin ang Enter, tingnan ang oras, pumunta sa root folder gamit ang command
cd
at i-clear ang screen gamit ang cls command (hindi, hindi mo kailangang gumamit ng rm)

Ngayon suriin natin kung ano ang gumagana at kung paano - isulat natin hindi kahit ang code, ngunit dalawang linya, at subukang maunawaan kung ano ang ginagawa nila. Magkomento tayo sa linya na may get-host na may simbolo na # at magdagdag ng kaunti.

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

(Ang kawili-wili ay sa drop-down list ng pag-format ng code sa Habré mayroong dalawang dosenang mga opsyon - ngunit wala doon ang Powershell. Dos ay naroroon. Perl ay naroroon.)

At patakbuhin natin ang code sa pamamagitan ng pagpindot sa F5 o ">" mula sa GUI.

Nakukuha namin ang sumusunod na output:

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

Ngayon tingnan natin ang dalawang linyang ito at ilang mga kawili-wiling punto para hindi na tayo bumalik dito sa hinaharap.

Hindi tulad ng Pascal (at hindi lamang), ang PowerShell mismo ay sumusubok na tukuyin kung anong uri ang itatalaga sa isang variable; higit pang mga detalye tungkol dito ay nakasulat sa artikulo Programang pang-edukasyon sa pag-type sa mga programming language
Samakatuwid, sa pamamagitan ng paglikha ng variable na $TimeNow at pagtatalaga dito ng halaga ng kasalukuyang petsa at oras (Get-Date), hindi namin kailangang mag-alala nang labis tungkol sa kung anong uri ng data ang naroroon.

Totoo, ang kamangmangan na ito ay maaaring masaktan sa ibang pagkakataon, ngunit iyon ay para sa ibang pagkakataon. Sa ibaba ng teksto ay magkakaroon ng isang halimbawa.
Tingnan natin kung ano ang nakuha natin. I-execute natin (sa command line)

$TimeNow | Get-member

at makakuha ng isang pahina ng hindi maintindihang teksto

Halimbawa ng hindi maintindihang text number 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")...                                         

Tulad ng nakikita mo, ang isang variable ng uri TypeName: System.DateTime ay nilikha na may isang grupo ng mga pamamaraan (sa kahulugan ng kung ano ang maaari naming gawin sa variable na bagay na ito) at mga katangian.

Tawagin natin $TimeNow.DayOfYear — nakukuha namin ang bilang ng araw ng taon.
Tawagin natin $TimeNow.DayOfYear | Get-Member - nakukuha namin TypeName: System.Int32 at isang pangkat ng mga pamamaraan.
Tawagin natin $TimeNow.ToUniversalTime() - at kunin ang oras sa UTC

Debugger

Minsan nangyayari na kinakailangan na magsagawa ng isang programa hanggang sa isang tiyak na linya at makita ang estado ng programa sa sandaling iyon. Para sa layuning ito, ang ISE ay may Debug function - toggle break point
Maglagay ng breakpoint sa isang lugar sa gitna, patakbuhin ang dalawang linyang ito at tingnan kung ano ang hitsura ng break.

3. Pag-unawa sa pakikipag-ugnayan sa Telegram bot

Siyempre, mas maraming literatura ang naisulat sa pakikipag-ugnayan sa bot, kasama ang lahat ng getpush at iba pa, ngunit ang isyu ng teorya ay maaaring isaalang-alang na opsyonal.

Sa aming kaso ito ay kinakailangan:

  • Matutong magpadala ng isang bagay sa sulat
  • Matutong kumuha ng isang bagay mula sa sulat

3.1 Pag-aaral na magpadala ng isang bagay sa sulat at tumanggap mula dito

Isang maliit na code - bahagi 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

at sa Russian Federation sa puntong ito nakukuha namin ang error Hindi makakonekta sa remote server.

O hindi namin ito natatanggap - depende sa operator ng telecom at kung naka-configure at gumagana ang proxy
Well, ang natitira na lang ay magdagdag ng proxy. Pakitandaan na ang paggamit ng hindi naka-encrypt at sa pangkalahatan ay mapanlinlang na proxy ay lubhang mapanganib para sa iyong kalusugan.

Ang gawain ng paghahanap ng gumaganang proxy ay hindi napakahirap - karamihan sa mga nai-publish na http proxy ay gumagana. Sa tingin ko ang panglima ay nagtrabaho para sa akin.

Syntax gamit ang proxy:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

Kung nakatanggap ka ng isang mensahe sa iyong chat na may isang bot, pagkatapos ay maayos ang lahat, maaari kang magpatuloy. Kung hindi, magpatuloy sa pag-debug.

Makikita mo kung ano ang nagiging string ng iyong $URL4SEND at subukang hilingin ito sa browser, tulad nito:

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

3.2. Natutunan namin kung paano magsulat ng "isang bagay" sa chat, ngayon subukan nating basahin ito

Magdagdag tayo ng 4 pang linya at tingnan kung ano ang nasa loob sa pamamagitan ng | makakuha ng-miyembro

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

Ang pinaka-kagiliw-giliw na bagay ay ibinigay sa amin

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

Tingnan natin kung ano ang nasa kanila:

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

Kung gumagana ang lahat para sa iyo, makakakuha ka ng mahabang linya tulad ng:

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

Sa kabutihang palad, sa naunang nai-publish na artikulo Telegram bot para sa system administrator ang linyang ito (oo, ayon sa $MyMessageGet.RawContent | get-member ay System.String), ay na-disassemble na.

4. Iproseso ang iyong natatanggap (alam na namin kung paano magpadala ng isang bagay)

Tulad ng nakasulat na dito, ang pinakakailangang mga bagay ay nasa nilalaman. Tingnan natin ito nang maigi.

Una, magsusulat kami ng dalawa pang parirala sa bot mula sa web interface o mula sa telepono

/message1
/message2
/message3

at tingnan sa browser ang address na nabuo sa $URLGET variable.

Makakakita tayo ng isang bagay tulad ng:

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

Ano ito? Ilang kumplikadong bagay mula sa mga hanay ng mga bagay na naglalaman ng isang end-to-end na identifier ng mensahe, identifier ng chat, pagpapadala ng identifier at maraming iba pang impormasyon.

Gayunpaman, hindi namin kailangang malaman kung "anong uri ng bagay ito" - bahagi ng gawain ay nagawa na para sa amin. Tingnan natin kung ano ang nasa loob:

Pagbasa ng mga natanggap na mensahe o bahagi 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. Ano ang dapat nating gawin ngayon?

I-save natin ang resultang file sa ilalim ng pangalang myfirstbotBT105 o anumang gusto mo, baguhin ang pamagat at ikomento ang lahat ng nakasulat na code sa pamamagitan ng

<#start comment 105 end comment 105#>

Ngayon kailangan nating magpasya kung saan kukunin ang diksyunaryo (well, kung saan - sa disk sa isang file) at kung ano ang magiging hitsura nito.

Siyempre, maaari kang magsulat ng isang malaking diksyunaryo sa mismong teksto ng script, ngunit ito ay ganap na nasa tabi ng punto.
Kaya tingnan natin kung ano ang normal na gumagana sa powershell.
Sa pangkalahatan, wala siyang pakialam kung aling file ang gagawin, hindi ito mahalaga sa amin.
Mayroon kaming pagpipilian: txt (maaari mo, ngunit bakit), csv, xml.
Maaari ba nating panoorin ang lahat? Tingnan natin ang lahat.
Gumawa tayo ng isang klase na MyVocabClassExample1 at isang variable na $MyVocabExample1
Pansinin ko na ang klase ay nakasulat nang walang $

ilang code #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

Subukan nating isulat ito sa mga file gamit ang huwaran.

Ilang code #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

- at nakakakuha kami ng error sa linyang Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2.

Ayaw niyang dagdagan, ah-ah, nakakahiya.

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

Tignan natin kung ano ang mangyayari. Mahusay na view ng teksto - ngunit paano i-export ito pabalik? Dapat ba akong magpakilala ng ilang uri ng mga text separator, gaya ng mga kuwit?

At sa huli makakakuha ka ng "comma-separated values ​​​​(CSV) file A TUMIGIL MAGHINTAY.
#

$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 

Tulad ng madaling makita, ang MS ay hindi partikular na nakikilala sa pamamagitan ng lohika nito; para sa isang katulad na pamamaraan, sa isang kaso -FilePath ay ginagamit, sa isa pang -Path.

Bilang karagdagan, sa ikatlong file ay nawala ang wikang Ruso, sa ika-apat na file ay lumabas ito ... mabuti, may nangyari. #TYPE System.Object[] 00
# “Bilang”,”Haba”,”LongLength”,”Ranggo”,”SyncRoot”,”IsReadOnly”,”IsFixedSize”,”IsSynchronized”
#
Isulat muli natin ito ng kaunti:

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

Mukhang nakatulong ito, ngunit hindi ko pa rin gusto ang format.

Lalo na hindi ko gusto na hindi ako maaaring maglagay ng mga linya mula sa isang bagay sa isang file nang direkta.
Oo nga pala, mula nang magsimula kaming magsulat sa mga file, maaari ba kaming magsimulang magpanatili ng isang log ng startup? Mayroon kaming oras bilang isang variable, maaari naming itakda ang pangalan ng file.

Totoo, wala pang maisusulat, ngunit maaari mong isipin kung paano pinakamahusay na paikutin ang mga log.
Subukan natin ang xml sa ngayon.

Ilang 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

Ang pag-export sa xml ay may maraming mga pakinabang - pagiging madaling mabasa, pag-export ng buong bagay, at hindi na kailangang magsagawa ng uppend.

Subukan natin basahin ang xml file.

Isang maliit na pagbabasa mula sa xml

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

Balik tayo sa gawain. Sumulat kami ng isang pagsubok na file, basahin ito, ang format ng imbakan ay malinaw, kung kinakailangan, maaari kang magsulat ng isang hiwalay na maliit na editor ng file para sa pagdaragdag at pagtanggal ng mga linya.

Hayaan mong ipaalala ko sa iyo na ang gawain ay gumawa ng isang maliit na bot ng pagsasanay.

Format ng trabaho: Ipinapadala ko ang command na "halimbawa" sa bot, pinadalhan ako ng bot ng random na piniling salita at transkripsyon, at pagkatapos ng 10 segundo ay pinadalhan ako ng pagsasalin at komento. Alam namin kung paano magbasa ng mga utos, gusto rin naming matutunan kung paano awtomatikong pumili at suriin ang mga proxy, at i-reset ang mga counter ng mensahe sa limot.

Alisin natin sa komento ang lahat ng naunang nagkomento bilang hindi kailangan, ikomento ang mga hindi na kailangang halimbawa na may txt at csv, at i-save ang file bilang bersyon B106

Ay, oo. Muli tayong magpadala ng isang bagay sa bot.

6. Pagpapadala mula sa mga function at higit pa

Bago iproseso ang reception, kailangan mong lumikha ng isang function para sa pagpapadala ng "kahit isang bagay" maliban sa isang pagsubok na mensahe.

Siyempre, sa halimbawa ay magkakaroon lamang tayo ng isang pagpapadala at isang pagproseso lamang, ngunit paano kung kailangan nating gawin ang parehong bagay nang maraming beses?

Mas madaling magsulat ng isang function. Kaya, mayroon kaming variable ng uri ng object na $MyVocabExample4AsArray, basahin mula sa file, sa anyo ng array ng kasing dami ng dalawang elemento.
Tara magbasa tayo.

Kasabay nito, haharapin natin ang orasan; kakailanganin natin ito sa ibang pagkakataon (sa katunayan, sa halimbawang ito ay hindi natin ito kakailanganin :)

Ilang code #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
}

Gaya ng madali mong nakikita, ang function ay tumatawag sa $MyToken at $MyChatID, na mas maagang na-hard-code.

Hindi na kailangang gawin ito, at kung ang $MyToken ay isa para sa bawat bot, magbabago ang $MyChatID depende sa chat.

Gayunpaman, dahil ito ay isang halimbawa, hindi namin ito papansinin sa ngayon.

Dahil ang $MyVocabExample4AsArray ay hindi isang array, bagama't ito ay halos kapareho sa isa, kung gayon hindi mo basta-basta makukuha hilingin ang haba nito.

Muli ay kailangan nating gawin ang isang bagay na hindi maaaring gawin - parachute hindi ayon sa code - kunin ito at bilangin

Ilang code #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)
# Угадайте сами, какой пример легче читается посторонними людьми.

random kawili-wiling tampok. Sabihin nating gusto nating makatanggap ng 0 o 1 (mayroon lang tayong dalawang elemento sa array). Kapag nagtatakda ng mga hangganan 0..1, makakakuha ba tayo ng "1"?
hindi - hindi namin makukuha, mayroon kaming espesyal na halimbawa Halimbawa 2: Kumuha ng random na integer sa pagitan ng 0 at 99 Get-Random -Maximum 100
Samakatuwid, para sa 0..1 kailangan naming itakda ang laki na 0..2, na may pinakamataas na numero ng elemento = 1.

7. Pagproseso ng mga papasok na mensahe at maximum na haba ng pila

Saan tayo tumigil kanina? mayroon kaming natanggap na variable na $MyMessageGet
at $Content4Pars01 na nakuha mula rito, kung saan kami ay interesado sa mga elemento ng Content4Pars01.result array

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

Ipadala natin ang bot /message10, /message11, /message12, /word at muli /word at /hello.
Tingnan natin kung ano ang nakuha natin:

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

Suriin natin ang lahat ng natanggap at magpadala ng tugon kung ang mensahe ay /salita
ang kaso ng construct, kung ano ang inilalarawan ng ilan bilang if-elseif, ay tinatawag sa powershell sa pamamagitan ng switch. Kasabay nito, ginagamit ng code sa ibaba ang -wildcard key, na ganap na hindi kailangan at nakakapinsala pa nga.

Ilang code #7.1

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

Patakbuhin natin ang script ng ilang beses. Makakakuha kami ng parehong salita nang dalawang beses para sa bawat pagtatangka sa pagpapatupad, lalo na kung nagkamali kami sa pagpapatupad ng random.

Ngunit huminto. Hindi na kami nagpadala ulit ng /salita, kaya bakit pinoproseso muli ang mensahe?

Ang pila para sa pagpapadala ng mga mensahe sa bot ay may hangganang haba (100 o 200 na mensahe, sa tingin ko) at dapat na i-clear nang manu-mano.

Siyempre, inilarawan ito sa dokumentasyon, ngunit kailangan mong basahin ito!

Sa kasong ito, kailangan namin ang parameter na ?chat_id, at hindi pa kailangan ang &timeout, &limit, &parse_mode=HTML at &disable_web_page_preview=true.

Dokumentasyon para sa Narito ang telegram api
Sinasabi nito sa puti at Ingles:
Identifier ng unang update na ibabalik. Dapat na mas malaki ng isa kaysa sa pinakamataas sa mga identifier ng mga naunang natanggap na update. Bilang default, ang mga update na nagsisimula sa pinakamaagang
hindi nakumpirma ibinalik ang update. Ang isang update ay itinuturing na nakumpirma sa sandaling ang getUpdates ay tinawag na may isang ginalaw mas mataas kaysa sa update_id nito. Maaaring tukuyin ang negatibong offset upang mabawi ang mga update simula sa -offset na update mula sa dulo ng queue ng mga update. Ang lahat ng mga nakaraang update ay malilimutan.

Tignan natin:

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

Oo, at ire-reset namin ito at muling isusulat ang function nang kaunti. Mayroon kaming dalawang pagpipilian - ipasa ang buong mensahe sa function at iproseso ito nang buo sa function, o ibigay lamang ang message ID at i-reset ito. Halimbawa, ang pangalawa ay mukhang mas simple.

Dati, ang aming string ng query na "lahat ng mensahe" ay kamukha

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

at magiging ganito

$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 

Walang sinuman ang nagbabawal sa iyo na tanggapin muna ang lahat ng mga mensahe, iproseso ang mga ito, at pagkatapos lamang ng matagumpay na pagproseso ng kahilingan na hindi nakumpirma -> nakumpirma.

Bakit makatuwirang tawagan ang kumpirmasyon pagkatapos makumpleto ang lahat ng pagproseso? Posible ang isang pagkabigo sa gitna ng pagpapatupad, at kung para sa halimbawa ng isang libreng chatbot, ang pagkawala ng isang mensahe ay walang espesyal, kung gayon kung pinoproseso mo ang suweldo o transaksyon sa card ng isang tao, maaaring mas malala ang resulta.

Ilang linya pa ng code

$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. Sa halip na isang konklusyon

Mga pangunahing function - ang pagbabasa ng mga mensahe, pag-reset ng queue, pagbabasa mula sa file at pagsulat sa file ay tapos na at ipinapakita.

Mayroon na lamang apat na bagay na dapat gawin:

  • pagpapadala ng tamang sagot sa isang kahilingan sa chat
  • pagpapadala ng tugon sa ANUMANG chat kung saan idinagdag ang bot
  • pagpapatupad ng code sa isang loop
  • paglulunsad ng bot mula sa windows scheduler.

Ang lahat ng mga gawaing ito ay simple at madaling magawa sa pamamagitan ng pagbabasa ng dokumentasyon tungkol sa mga parameter tulad ng
Set-ExecutionPolicy Unrestricted at -ExecutionPolicy Bypass
cycle ng form

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

Salamat sa lahat ng nagbasa.

Pinagmulan: www.habr.com

Magdagdag ng komento