Vestluskaaslasega rÀÀkides sain ĂŒllatuseks teada, et nende koolis ei Ă”petata 8.â10. klassis lapsi programmeerima. Ainult Word, Excel ja see on kĂ”ik. Ei logo, ei Pascalit, isegi mitte VBA Excelis.
Olin vĂ€ga ĂŒllatunud, avasin interneti ja hakkasin lugema â
Ăks profikooli eesmĂ€rke on toetada uue pĂ”lvkonna kasvatamist, kes vastab informatsioonilise ĂŒhiskonna tingimustele oma arengutaseme ja eluviisiga.
See kursus annab vĂ”imaluse kinnistada Ă”pilaste teadmisi programmeerimiskeele Pascal pĂ”histruktuuride osas praktikas. (mĂ”nest gĂŒmnaasiumi programmist 2017. aastast)
LĂ”puks otsustasin kulutada paar tundi ja visandada nĂ€ide 'kuidas luua lihtne bot â kooliĂ”pilastele'.
Allpool rÀÀgin, kuidas kirjutada veel ĂŒks lihtne bot Powershellis ja panna see tööle ilma webhookita, avalike IP-de, eraldatud serverite, pilve virtuaalmasinate loomise ja muude sÀÀraste asjadeta â tavalisel kodu PC-l tavalisel Windowsil.
TLDR: Veel ĂŒks igav artikkel grammatiliste ja faktivigadega, pole mida lugeda, nalja pole, pilte pole.
Artiklis pole midagi uut, peaaegu kÔik, mis on kirja pandud, on juba varem olnud Habras, nÀiteks artiklites ja .
Veelgi enam, artikkel on spetsiaalselt liialdatud, et mitte igal korral viidata Ôpikutele. Tekst ei sisalda mingeid viiteid neljandale bÀndile, PowerShell Deep Dives'ile vÔi nÀiteks AWS Well-Architected Framework'i viiele sambale.
Eelseisvas osas vÔib vahele jÀtta
KĂŒĂŒniliselt jĂ€tame vahele2006. aastal tĂ”i Microsoft vĂ€lja PowerShell 1.0 tol ajal veel Windows XP, Vista ja 2003 serveri jaoks. Mingil moel asendas see asjad nagu cmd.bat skriptid, vb skriptid, Windows Script Host ja JScript.
Isegi praegu vÔib PowerShelli kÀsitleda ainult jÀrgmise sammu eest variandi Logo jÀrel, kuigi kusagil, tÔenÀoliselt, kasutatakse ikka veel Delphi't (vÔi midagi vanemat), hoolimata asjaolust, et see sisaldab silmusid, klasse, funktsioone, MS GUI kÔnesid, ja nii edasi.
PowerShelli kasutatakse suhteliselt harva, sellega vÔib kokku puutuda ainult PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Desired State Configuration kaudu, ja veel poole tosinaga harva kasutatavaid programme ja funktsioone. VÔib-olla saab tal teine tuul oma loomisega , aga see pole kindel.
PowerShell'il on ka kolm suurt plussi:
- See on suhteliselt lihtne, selle kohta on tohutult kirjandust ja nĂ€iteid, isegi vene keeles, nĂ€iteks artikkel Foreach â raamatust â erinevuste kohta () ja {}
- See tuleb koos redigerijaga , koos Windowsiga. Seal on isegi mingi siluri olemas.
- Seda saab hÔlpsasti kutsuda .
0. Ettevalmistus.
Me vajadme:
- Arvutit Windowsiga (mul on Windows 10)
- Mingit internetiĂŒhendust (nĂ€iteks lĂ€bi NAT)
- Neile, kellel on piiratud juurdepÀÀs Telegramile â installitud ja seadistatud Freegate brauseris, mĂ”nel keerulisemal juhul koos Symple DNS Cryptiga
- Töötava Telegrami kliendi olemasolu telefonis
- PĂ”hiteadmised â mis on muutujad, massiivid, tsĂŒklid.
Avatud ja lĂ€bitud artiklid â ja
1. Loome jÀrgmise testboti.
Kuna seda teavad kĂ”ik ja see on juba olnud, vĂ”ib selle ka vahele jĂ€ttaNagu eelnevas artiklis öeldud â Esiteks, Telegrami bot â on see endiselt rakendus, mis töötab teie poolel ja saadab pĂ€ringud Telegram Bot API-le. Ja API on arusaadav â bot kutsub teatud URL-i parameetritega ja Telegram vastab JSON objekti.
Sellega seotud probleemid: kui mingil kummalisel viisil vĂ”tate mĂ”ne koodi JSON objektist ja saadate selle tĂ€itmiseks (ilma eriliste kavatsusteta) â kood tĂ€idetakse.
Loome boti kahe ĂŒlaltoodud artikli pĂ”hjal, kuid kordame: avame Telegramis kontaktid, otsime @botfather, ĂŒtleme talle /newbot, loome boti Botfortest12344321, nimetame selle Mynext1234bot ja saame sĂ”numi unikaalse vĂ”tmega 1234544311:AbcDefNNNNNNNNNNNNN
Hoia vÔtme turvaliselt ja Àra jaga seda!
Edasi saab boti seadistada, nĂ€iteks keelata selle lisamise rĂŒhmadesse, kuid esimestel sammudel pole see vajalik.
KĂŒsi BotFatherilt «/mybot» ja paranda seadeid, kui midagi ei meeldi.
Taaskord avame kontaktid, leiame @Botfortest12344321 sealt (otsing tuleb alustada @-st), vajutame «alusta» ja kirjutame botile «/Tere robotitele». SĂŒmbol / on kohustuslik, jutumĂ€rgid pole vajalikud.
Bot ei vasta loomulikult midagi.
Kontrollime, kas bot on loodud â avame.
:AbcDefNNNNNNNNNNNNN/getMe
kus 1234544311:AbcDefNNNNNNNNNNNNN â varasemalt saadud vĂ”ti,
ja saame rea nagu
{«ok»:true,«result»:{«»}}
Esimene salajane fraas (token) on meil olemas. NĂŒĂŒd peame saama teada teise salajase numbri - roboti vestluse ID. Iga vestlus, grupp jne on unikaalne ja tal on oma number (mĂ”nikord miinusmĂ€rgiga - avatud gruppide jaoks). Selle numbri leidmiseks peame brauseris (kuigi mitte tingimata brauseris, kuid parema arusaamise huvides vĂ”ib alustada sellest) kĂŒsima aadressi (kus 1234544311:NNNNNNNNN on teie token)
https://api.telegram.org/bot1234544311:NNNNNNNNN/getUpdates
ja saama vastuse vormis
{"ok":true,"result":[{"update_id":âŠ,⊠chat"{"id":123456789
Me vajame tÀpselt chat_id-d.
Kontrollime, et saame vestlusesse kÀsitsi kirjutada: kutsub brauserist aadressi
https://api.telegram.org/botteietoken/sendMessage?chat_id=123456789&text="Life is directed motion"Kui saate vestlusesse sÔnumi robotilt - ok, lÀheb edasi jÀrgmisse etappi.
Nii et (brauseri kaudu) saate alati kontrollida, kus on probleemid - kas te genereerisite lingi valesti, vÔi on midagi sulgemisega ja ei tööta.
Mida tuleb teada, enne kui jÀtkate lugemist
Telegrammis on mitu tĂŒĂŒpi grupivestlusi (avatud, suletud). Neid vestlusi osade funktsioonid (nt id) erinevad, mis mĂ”nikord pĂ”hjustab mĂ”ningaid probleeme.
Oletame, et on 2019. aasta lĂ”pp ja isegi meie aja kangelane, laialdaselt tuntud Inimorkester (administraator, jurist, infokaitse ekspert, programmeerija ja praktiliselt MVP) Jevgeni V. eristab muutujat $i massiivist, valdas tsĂŒklid, ja vaatame ehk jĂ€rgmise paari aastaga Ă”pib ta Chocolatey-t, ja siis jĂ”uab ja kuni.
1. MÔtleme, mida meie robot tegema hakkab
Mul ei olnud mingeid ideid, pidin mĂ”tlema. Oleme juba kirjutanud mĂ€rkmete roboti. Ei tahtnud teha robotit "millel on midagi edastada kuhugi". Azure'i ĂŒhendamiseks on vaja krediitkaarti, aga kust selle saab koolipoiss? Tuleb mĂ€rkida, et asi pole nii halb: suured pilved pakuvad mingit tasuta testperioodi (aga krediitkaardilt vĂ”etakse ikkagi dollarit. Ma ei mĂ€leta, kas see tuli hiljem tagasi.)
Ilma AI-ta on ML robotite tegemine vÀhem huvitav.
Otsustasin teha roboti, mis meenutab mulle (vÔi mitte mulle) inglise sÔnu sÔnastikust.
SÔnastik, et mitte andmebaasidega jÀnnata, asub tekstifailis ja tÀiendatakse kÀsitsi.
Antud juhul on ĂŒlesanne nĂ€idata töö pĂ”hitĂ”desid, mitte teha vĂ€hemalt osaliselt valmistoode.
2. Proovime esimest korda, kuidas ja mida teha
Loome kausta C:poshtranslate
Alustuseks vaatame, mis meil PowerShellis on, ja kÀivitame ISE'i lÀbi KÀivita
powershell ise
vÔi leiame Powershell ISE installitud programmide hulgast.
PĂ€rast kĂ€ivitamist avaneb tavaline «mingi redigeerija», kui tekstivĂ€lja ei ole, siis saab alati vajutada «Fail â loo uus».
Vaatame PowerShelli versiooni â kirjutame tekstivĂ€ljale:
get-host
ja vajutame F5.
PowerShell pakub salvestada â «Skripti, mida kavatsete kĂ€ivitada, salvestatakse.», nĂ”ustume ja salvestame C:poshtranslate faili PowerShellis nimega myfirstbotBT100.
PÀrast kÀivitamist saame alumises tekstivÀljas andmete tabeli:
Nimi : Windows PowerShell ISE Host
Versioon : 5.1.(jne)
Mul on 5.1 millegagi, seda on piisavalt. Kui sul on vana Windows 7/8, siis pole muret â tuleb ainult PowerShell uuendada versioonile 5 â nĂ€iteks, kirjutades .
Sisestame allolevas kÀsuviibas Get-Date, vajutame Enter, vaatame aega, ning liigume juurkausta kÀsuga
cd
ja puhastame ekraani kÀsuga cls (ei, rm-i ei ole vaja kasutada)
NĂŒĂŒd kontrollime, mis ja kuidas töötab â kirjutame mitte koodi, vaid kaks rida, ning pĂŒĂŒame aru saada, mida need teevad. Kommenteerime vĂ€lja get-host reakode # sĂŒmboliga ja lisame veidi juurde.
# ĐŃĐžĐŒĐ”Ń ŃĐ°Đ±Đ»ĐŸĐœĐ° Đ±ĐŸŃа
# get-host
<# ŃŃĐŸ ĐżŃĐžĐŒĐ”Ń ĐŒĐœĐŸĐłĐŸŃŃŃĐŸŃĐœĐŸĐłĐŸ ĐșĐŸĐŒĐŒĐ”ĐœŃаŃĐžŃ #>
$TimeNow = Get-Date
$TimeNow
(Huvitav. KoodiformaadipĂ€ringu langevas loendis on paar tosinat varianti â kuid PowerShell seal ei ole. Dos on olemas. Perl on olemas.)
Ja kÀivitame koodi, vajutades F5 vÔi «>» GUI's.
Saame vÀljundi:
LaupÀev, 8. detsember 2019 21:00:50 PM (vÔi midagi sarnast)
NĂŒĂŒd saame aru nende kahe rea ja mĂ”ningate huvitavate hetkede ĂŒle, et hiljem sellele tagasi ei tuleks.
Erinevalt Pascalist (ja mitte ainult) ĂŒritab PowerShell ise mÀÀrata, millist tĂŒĂŒpi andmed muutujatele anda, sellest kirjutatakse rohkem artiklis
Seega, muutuja $TimeNow loomisel ja sellele praeguse kuupĂ€eva ja kellaaja mÀÀramisel (Get-Date), ei pea me liiga palju muretsema, millist andmetĂŒĂŒpi seal olema hakata.
Kuid sellest teadmatuse tÔttu vÔib hiljem olla kahju, aga see on hiljem. Allpool tekstis on nÀide.
Vaatame, mida saime. KÀivitame (kÀsuviibas)
$TimeNow | Get-memberja saame segase teksti lehe
Segase teksti nÀide 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>Omadus </b>datetime Date {get;}
Year Property int Year {get;}
..
DateTime ScriptProperty System.Object DateTime {get=if ((& { Set-StrictMode -Version 1; $this.DisplayHint }) -ieq "Date")...
Nagu nĂ€ha, loodi muutuja tĂŒĂŒbi TĂŒĂŒp Nimi: System.DateTime koos hulga meetoditega (mille abil saame seda objekti muutuja kasutada) ja omadustega.
Kutsume vĂ€lja $TimeNow.DayOfYear â saame aasta pĂ€eva numbri.
Kutsume vĂ€lja $TimeNow.DayOfYear | Get-Member â saame TypeName: System.Int32 ja meetodite rĂŒhma.
Kutsume vĂ€lja $TimeNow.ToUniversalTime() â ja saame aja UTC jĂ€rgi
Silumine
MĂ”nikord on vajalik programmi kĂ€ivitamine teatud reani ja programmi seisundi vaatamine sel hetkel. Selleks on ISE-s funktsioon Debug â toggle break point
Asetage peatamispunkt kuskil keskel, kÀivitage need kaks rida ja vaadake, kuidas peatamine vÀlja nÀeb.
3. Teeme tutvust Telegrammi botiga
Loomulikult on botiga suhtlemise, getpush jne kohta kirjutatud veelgi rohkem kirjandust, kuid teooria kĂŒsimust saab kĂ€sitleda valikuliselt.
Meie puhul on vajalik:
- Ăppida saatma midagi vestlusesse
- Ăppida saama midagi vestlusest
3.1 Ăpime saatma midagi vestlusesse ja saama sealt tagasi
Veidi koodi â osa 3
Write-output "See on osa 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 = "Elu on suunatud liikumine - " + $TimeNow
$URL4SEND = "https://api.telegram.org/bot$MyToken/sendMessage?chat_id=$MyChatID&text=$MyText01"
Invoke-WebRequest -Uri $URL4SEND
ja Venemaal saame selle asemel vea Unable to connect to the remote server.
VĂ”i ei saa â see sĂ”ltub sideoperaatorist ja sellest, kas proxy on seadistatud ja töötab.
Noh â peab lisama proxy. Pidage meeles, et krĂŒpteerimata ja suvalise proxy kasutamine on teie tervisele ÀÀrmiselt ohtlik.
Töötava proxy leidmine ei ole eriti keeruline â suur osa avaldatud http proxy'dest töötab. Minu puhul töötas vist viies.
Syntax proxy kasutamiseks:
Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy
Kui saite sĂ”numi oma vestlusest botiga â siis kĂ”ik on hĂ€sti, saate edasi minna. Kui ei â jĂ€tkake silumist.
VĂ”ite vaadata, milleks teie string $URL4SEND muutub ja proovida seda brauseris kĂŒsida, nĂ€iteks nii:
$URL4SEND2 = '"'+$URL4SEND+'"'
start chrome $URL4SEND2
3.2 Oleme Ă”ppinud kirjutama «midagi» vestlusse, nĂŒĂŒd proovime lugeda
Lisame veel 4 rida ja vaatame, mis seal sees on, kasutades | get-member
$URLGET = "https://api.telegram.org/bot$MyToken/getUpdates"
$MyMessageGet = Invoke-WebRequest -Uri $URLGET -Method Get -Proxy $MyProxy
Write-Host "Get-Member"
$MyMessageGet | Get-Member
KÔige huvitavamat teavet pakub meile
Content Property string Content {get;}
ParsedHtml Property mshtml.IHTMLDocument2 ParsedHtml {get;}
RawContent Property string RawContent {get;set;}Vaadakem, mis seal on:
Write-Host "ParsedHtml"
$MyMessageGet.ParsedHtml # siin on huvitav
Write-Host "RawContent"
$MyMessageGet.RawContent # ja siin on huvitav, aga lisaks on see veel ka loetav.
Write-Host "Content"
$MyMessageGet.Content
Kui kÔik töötab, saate pika rea, nagu nÀiteks:
{"ok":true,"result":[{"update_id":12345678,
"message":{"message_id":3,"from":{"id":Kahjuks oli eelnevas artiklis Telegrami boti kohta see rida (jah, vastavalt $MyMessageGet.RawContent | get-member â see on System.String), juba kĂ€sitletud.
4. Töötle saadud (me oskame juba saata midagi)
Nagu juba öeldud , kÔige olulisem on sisus. Vaatame seda lÀhemalt.
Esiteks kirjutame botile veel paar lauset veebiliidese vÔi telefoni kaudu
/message1
/message2
/message3ja vaatame brauseris aadressi, mis on moodustatud muutujas $URLGET.
NĂ€eme midagi sellist:
{"ok":true,"result":[{"update_id":NNNNNNN,
"message":{"message_id":10, .. "text":"/message1"
"message":{"message_id":11, .. "text":"/message2
"message":{"message_id":12, .. "text":"/message3 Mis see on? MÔni keeruline objekt, mis koosneb objektide massiividest, sisaldades sÔnumi unikaalset identifikaatorit, vestluse identifikaatorit, saatmise identifikaatorit ja veel hulgaliselt teavet.
Kuid ei pea me âmida see objekt tĂ€hendabâ analĂŒĂŒsima - osa tööst on juba meie eest tehtud. Vaatame, mis seal sees on:
Lugege saadud sÔnumeid vÔi osa 4
Write-Host "See on osa 4" <# loomulikult ei ole see rida meile lÔplikus tekstis vajalik, aga selle jÀrgi on mugav otsida. #>
$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. Mis nĂŒĂŒd sellega teha
Salvestame saadud faili nimega myfirstbotBT105 vÔi mis iganes teile rohkem meeldib, muudame pealkirja ja kommenteerime kogu juba kirjutatud koodi lÀbi
<#start comment 105 end comment 105#>
NĂŒĂŒd peame otsustama, kust sĂ”nastikku saada (noh, kus - kettal failis) ja milline see vĂ€lja nĂ€eb.
Muidugi, on vÔimalik tÀita tohutu sÔnastik otse skripti tekstis, aga see pole ju tervislik.
Seega vaatame, millega PowerShell vaikimisi töötada oskab.
Tegelikult ei ole tal vahet, millise failiga töötada, aga meile on see oluline.
Valikuks on meil: txt (vÔib, aga milleks), csv, xml.
VÔime kÔik vaadata. Vaatame kÔiki.
Loome klassi MyVocabClassExample1 ja muutuja $MyVocabExample1
mÀrgin, et klass kirjutatakse ilma $
veidi koodi #5
write-host "See on osa 5"
class MyVocabClassExample1 {
[string]$Original # sÔna
[string]$Transcript
[string]$Translate
[string]$Example
[int]$VocWordID # vÀga huvitav punkt. int-i kasutamine koos selle piirangutega vÔib mÔnikord viia kummaliste tagajÀrgedeni, nÀiteks - hiljutine juhtum SSD HPE-ga. Algul ei pidanud ma seda elementi lisama, kuid lÔpuks ikkagi lisasin ja kommenteerisin.
}
$MyVocabExample1 = [MyVocabClassExample1]::new()
$MyVocabExample1.Original = "Apple"
$MyVocabExample1.Transcript = "[ ËapÉl ]"
$MyVocabExample1.Translate = "Ăun"
$MyVocabExample1.Example = "Ăun on magus, söödav puuvili, mida toodab Ă”unapuu (Malus domestica)"
# $MyVocabExample1.$VocWordID = 1
$MyVocabExample2 = [MyVocabClassExample1]::new()
$MyVocabExample2.Original = "Pear"
$MyVocabExample2.Transcript = "[ pe(É)r ]"
$MyVocabExample2.Translate = "Pirn"
$MyVocabExample2.Example = "Pirni (/{ËpÉÉr}/) puu ja pÔÔsas on Pyrus'e sugu"
# $MyVocabExample1.$VocWordID = 2
Proovime seda failidesse kirjutada .
Veidi koodi #5.1
Write-Host $ScriptDir # loodan, et $ScriptDir olete kommenteerinud
$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
â ja saame vea rea kohta Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2.
Ei taha juurde lisada, oh ei, kui kurb.
$MyVocabExample3AsArray = @($MyVocabExample1,$MyVocabExample2)
Out-File -FilePath $MyFilenameExample02 -InputObject $MyVocabExample3AsArray
notepad $MyFilenameExample02
Vaadakem, mis vĂ€lja tuli. Imeline tekstiformaat â kuid kuidas seda tagasi eksportida? Kas kasutada mingisuguseid tekstieraldajaid, nĂ€iteks komasid?
Ja lĂ”puks saada "fail eraldajatega â komadega, comma-separated values (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
Kergesti nĂ€ha, et MS ei erinenud loogikast, ĂŒhes olukorras kasutatakse -FilePath-i, teises aga -Path-i.
Lisaks on kolmandas failis kadunud vene keel, neljandas failis on⊠noh, midagi on vÀlja tulnud. #TYPE System.Object[] 00
# âCountâ,»Length»,«LongLength»,«Rank»,«SyncRoot»,«IsReadOnly»,«IsFixedSize»,«IsSynchronized»
#
Veidi kirjutame ĂŒmber:
Export-Csv -Path $MyFilenameExample03 -InputObject $MyVocabExample1 -Encoding Unicode
Export-Csv -Path $MyFilenameExample03 -InputObject $MyVocabExample2 -Append -Encoding Unicode
notepad $MyFilenameExample03
notepad $MyFilenameExample04
Tundub, et aitas â aga formaat ei meeldi mulle ikkagi.
Eriti ei meeldi mulle, et ma ei saa objekti ridu faili otse panna.
Ăldse, kui juba hakati faile kirjutama â Ă€kki vĂ”iks alustada ka logi pidamist? Meil on ju aeg kui muutuv ja faili nimi oskame me mÀÀrata.
Kirjutada, tĂ”si kĂŒll, hetkel pole veel millegi kohta, aga vĂ”ime mĂ”elda, kuidas logide rotatsiooni paremini teha.
Proovime esialgu xml-i.
Natuke xml-i.
$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-i ekspordil on puhtalt plussid â loetavus, kogu objekti eksportimine ja ei pea kasutama uppendi tĂ€itmist.
Proovime. .
Natuke lugemist xml-ist.
$MyFilenameExample06 = $ScriptDir + "Example06.xml"
$MyVocabExample4AsArray = Import-Clixml -Path $MyFilenameExample06
# $MyVocabExample4AsArray
# $MyVocabExample4AsArray[0]
# ja natuke tĂ€iesti mitteilmsete nĂŒansside kohta. Powershell kĂ€itub aeg-ajalt mitte nii, nagu vĂ”iks eeldada.
# nÀiteks on mul need kaks vÀljundit erinevad.
# Write-Output $MyVocabExample4AsArray
# write-host $MyVocabExample4AsArray
Naaseme ĂŒlesande juurde. Proovifail on kirjutatud, loetud, salvestamise formaat on arusaadav, vajadusel vĂ”ib kirjutada eraldi vĂ€ikese faili redaktori ridade lisamiseks ja kustutamiseks.
Tuletan meelde, et ĂŒlesanne oli teha vĂ€ike Ă”petav robot.
Töö formaat: ma saadan robotile kĂ€su ânĂ€ideâ, robot saadab mulle juhuslikult valitud sĂ”na ja transkriptsiooni ning 10 sekundi pĂ€rast saadab tĂ”lke ja kommentaari. Me oskame lugeda kĂ€sklusi, oleks vaid vaja Ă”ppida automaatselt sobivaid proksi leidma ja sĂ”numite loendurid unustusse viima.
De-commentime kĂ”ik varem kommenteeritud ĂŒleliigsena, kommenteerime kommenteeritud txt ja csv nĂ€ited ning salvestame faili kui versiooni B106.
Ah, jah. Saame botile midagi saata uuesti.
6. Saatmine funktsioonidest ja muust
Enne kui vastuvĂ”ttu töötlema asuda, peab olema funktsioon, mis saadab âmidagiâ, peale test sĂ”numi.
TĂ”esti, meie nĂ€ites on vaid ĂŒks saatmine ja ainult ĂŒks töötlemine, aga kui peaks olema vaja teha sama asja mitu korda?
Lihtsam on kirjutada funktsioon. Nii et meil on objekti tĂŒĂŒpi muutuja $MyVocabExample4AsArray, mis loeti failist, kahe elemendina massiivi kujul.
Samas lahendame kellade kĂŒsimuse, see tuleb meil hiljem Ă€ra kasutada (tegelikult ei ole see nĂ€ites vajalik đ.
Natuke koodi #6.1
Write-Output "See on osa 6"
$Timezone = (Get-TimeZone)
IF($Timezone.SupportsDaylightSavingTime -eq $True){
$TimeAdjust = ($Timezone.BaseUtcOffset.TotalSeconds + 3600) } # kohandatud aeg
ELSE{$TimeAdjust = ($Timezone.BaseUtcOffset.TotalSeconds)
}
function MyFirstFunction($SomeExampleForFunction1){
$TimeNow = Get-Date
$TimeNow.ToUniversalTime()
# $MyText02 = $TimeNow + " " + $SomeExampleForFunction1 # ja siin saame vea
$MyText02 = $SomeExampleForFunction1 + " " + $TimeNow # aga siin ei saa, kes arvas, miks - see on hea.
$URL4SendFromFunction = "https://api.telegram.org/bot$MyToken/sendMessage?chat_id=$MyChatID&text=$MyText02"
Invoke-WebRequest -Uri $URL4SendFromFunction -Proxy $MyProxy
}
Kuidas lihtsalt nÀha, et funktsioonis kutsutakse vÀlja $MyToken ja $MyChatID, mis on eelnevalt mÀÀratud.
Nii teha ei tohi ja kui $MyToken on iga boti jaoks sama, siis $MyChatID muutub sÔltuvalt vestlusest.
Kuid kuna see on nÀide, ignoreerime seda seni.
Kuna $MyVocabExample4AsArray ei ole massiiv, kuigi see nĂ€eb vĂ€lja nagu see, siis ei saa lihtsalt vĂ”tta ja kĂŒsida selle pikkust.
Peame taas tegema seda, mida ei tohiks - jahutama mitte reeglite jÀrgi - vÔtma ja arvestama
Veidi koodi #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)
# vĂ”i ĂŒhes arvutusliinis
# MyFirstFunction($MyVocabExample4AsArray[Get-Random -Minimum 0 -Maximum ($MaxRandomExample -1)].Example)
# Arva ise, milline nÀide on kergem lugeda vÀlistele inimestele.
Juhuslik . Oletame, et soovime saada 0 vĂ”i 1 (meil on kokku kaks elementi massiivis). Kas piirades 0..1 saame â1â?
ei - ei saa, meil on spetsiaalselt antud nÀide Example 2: Hangi juhuslik tÀisarv vahemikus 0 kuni 99 Get-Random -Maximum 100
SeetÔttu peame vahemikus 0..1 sÀttima suuruse 0..2, kusjuures maksimaalne number on 1.
7. Saadetud sÔnumite töötlemine ja maksimaalne jÀrjekorra pikkus
Kus me varem peatusime? meil on saadud muutuja $MyMessageGet
ja sellest saadud $Content4Pars01, millest meid huvitavad massiivi elemendid Content4Pars01.result
$Content4Pars01.result[0].update_id
$Content4Pars01.result[0].message
$Content4Pars01.result[0].message.text Saadame botile \/message10, \/message11, \/message12, \/word ja veel kord \/word ja \/tere.
Vaata, mida oleme saanud:
$Content4Pars01.result[0].message.text
$Content4Pars01.result[2].message.text KÀime kÔik saadud lÀbi ja saadame vastuse, kui sÔnum oli \/word
case of konstruktsioon, mida mÔned kirjeldavad kui if-elseif, powershellis kutsutakse vÀlja . Samas on allpool kirjutatud koodis kasutatud -wildcard vÔtme, mis ei ole kindlasti vajalik ja vÔib isegi olla kahjulik.
Veidi koodi #7.1
Write-Output "See on osa 7"
Foreach ($Result in $Content4Pars01.result) # Jah, seda saab kiiremini teha
{
switch -wildcard ($Result.message.text)
{
"\/word" {MyFirstFunction($TextForExample1)}
}
}
KÀivitame skripti paar korda. Saame kaks korda sama sÔna iga kord, eriti kui oleme randomi rakendamisel eksinud.
Aga pidage, me ei saatnud ju \/word uuesti, miks siis sÔnumit töödeldakse uuesti?
Boti sÔnumite saatmise jÀrjekorel on piiratud pikkus (nÀib, et 100 vÔi 200 sÔnumit), ja see tuleb kÀsitsi puhastada.
Dokumendis on see muidugi kirjas, aga seda tuleb lugeda!
Selles olukorras on meil vajalik parameeter ?chat_id, samas &timeout, &limit, &parse_mode=HTML ja &disable_web_page_preview=true pole veel vajalikud.
Dokumentatsioon Seal on inglise keeles selgelt kirjas:
Identifikaator esimese uuenduse jaoks, mis tagastatakse. Peab olema suurem kui eelnevalt saadud uuenduste kÔrgeim identifikaator. Vaikimisi tagastatakse uuendused, mis algavad varasematest
kinnitamata uuendusest. Uuendust peetakse kinnitatuks, kui getUpdates'it kutsutakse ĂŒles offset kĂ”rgem kui selle uuendus_id. Negatiivset offseti saab mÀÀrata, et saada uuendused -offset uuendusest uuenduste jĂ€rjekorra lĂ”pust. KĂ”ik eelnevad uuendused unustatakse.
Vaadakem:
$Content4Pars01.result[0].update_id
$Content4Pars01.result[1].update_id
$Content4Pars01.result | select -last 1
($Content4Pars01.result | select -last 1).update_idJa lasteme lahti â natuke ĂŒmber kirjutame funktsiooni. Meil on kaks vĂ”imalust â edastada funktsiooni kĂ”ik sĂ”num ja töödelda seda tĂ€ielikult funktsioonis vĂ”i anda edasi ainult sĂ”numi ID ja seda ka lasta. Teise nĂ€ide nĂ€eb vĂ€lja lihtsam.
Varem nÀgi meie pÀring "kÔigi sÔnumite" joon vÀlja
$URLGET = "https:\/\/api.telegram.org\/bot$MyToken\/getUpdates"aga see nÀeb vÀlja nagu
$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
Keegi ei keela kÔigepealt saada kÔik sÔnumid, need töödelda ja alles pÀrast eduka töötlemise taotleda unconfirmed -> confirmed.
Miks on mĂ”istlik kutsuda kinnitust pĂ€rast kĂ”igi töötlemiste lĂ”puleviimist? VĂ”ib juhtuda tĂ”rge töötlemise ajal ja kui nĂ€iteks tasuta juturobotis mingi ĂŒksiku sĂ”numi vahelejĂ€tmine pole veel midagi erilist, siis kui töötlete kellegi palka vĂ”i kaarditehingut, vĂ”ib tulemus olla hullem.
Veel paar rida koodi
$LastMessageId = ($Content4Pars01.result | select -last 1).update_id # ebatak ise peak sool peab ise parandama.
$URLGET1 = "https://api.telegram.org/bot$mytoken/getUpdates?offset=$LastMessageId&limit=100"
Invoke-WebRequest -Uri $URLGET1 -Method Get -Proxy $MyProxy
8. KokkuvÔtte asemel
PĂ”hifunktsioonid â sĂ”numite lugemine, jĂ€rjekorra lĂ€htestamine, faili lugemine ja faili kirjutamine on teostatud ja nĂ€idatud.
JÀÀnud on teha vaid neli asja:
- Ôige vastuse saatmine pÀringule vestluses
- vastuse saatmine KĂIKIDESSE vestlustesse, kuhu bot on lisatud
- koodi tĂ€itmine tsĂŒklis
- boti kĂ€ivitamine Windowsi ĂŒlesande planeerijast.
KĂ”ik need ĂŒlesanded on lihtsad ja neid on lihtne teostada, lugedes dokumentatsiooni selliste parameetrite kohta nagu
Set-ExecutionPolicy Unrestricted ja -ExecutionPolicy Bypass
sellise tsĂŒkli vorm
$TimeToSleep = 3 # kĂŒsitlemine iga 3 sekundi jĂ€rel
$TimeToWork = 10 # minutit
$HowManyTimes = $TimeToWork*60/$TimeToSleep # tsĂŒkli loendur
$MainCounter = 0
for ($MainCounter=0; $MainCounter -le $HowManyTimes) {
sleep $TimeToSleep
$MainCounter ++
AitÀh kÔigile, kes lugesid lÔpuni.
Allikas: habr.com
