Vestluste kÀigus sÔbraga sain Àkki teada, et nende koolis ei Ôpetata 8.-10. klassi lapsi programmeerimisse. Ainult Word, Excel ja kÔik. Ei logo, isegi mitte Pascalit ega VBA-d Excelis.
Olin vĂ€ga ĂŒllatunud, avasin interneti ja hakkasin lugema â
Ăks erikooli eesmĂ€rke on harida uut pĂ”lvkonda, kes vastab oma arengu tasemelt ja eluviisilt infoĂŒhiskonna nĂ”udmistele.
See kursus aitab Ă”pilastel kinnistada oma teadmisi Pascal programmeerimiskeele peamistest struktuuridest. (mĂ”ne gĂŒmnaasiumi 2017. aasta programmist)
LĂ”puks otsustasin kulutada paar tundi ja koostada nĂ€ite «kuidas luua lihtsat boti â koolinoortele».
Allpool on juttu sellest, kuidas kirjutada jĂ€rjekordne lihtne bot Powershellis ja sundida seda tööle ilma webhookita, valgete IP-de ja eraldatud serveriteta, pilveteenustes juurutatavate virtuaalide ja muu sellisega â lihtsalt tavalises kodu PC-s tavalise Windowsiga.
TLDR: Veel ĂŒks igav artikkel grammatiliste ja faktipĂ”histe vigadega, ei ole, mida lugeda, nalja ei ole, pilte ei ole.
Artiklis ei ole midagi uut, peaaegu kÔik varem kirjutatud on juba olnud Habril, nÀiteks artiklites. ja .
Lisaks on artikkel spetsiaalselt liialdatud, et mitte viidata iga kord Ôpikutele. Tekst ei sisalda mingeid viiteid nagu bÀnd 4, PowerShell Deep Dives vÔi nÀiteks The 5 Pillars of the AWS Well-Architected Framework.
Sissejuhatusest vÔib julgelt mööda minna.
Julgesti mööda magama.2006. aastal kÀivitas Microsoft PowerShell 1.0, mis oli mÔeldud tolleaegsele Windows XP, Vista ja 2003 serverile. Osaliselt asendas see selliseid asju nagu cmdbat skriptid, vb skriptid, Windows Script Host ja JScript.
Isegi tĂ€na vĂ”ib PowerShelli vaadelda ainult kui jĂ€rgmist sammu pĂ€rast Logo variante, kuigi kuskil vĂ”ib-olla kasutatakse endiselt Delphi't (vĂ”i midagi vanemat), vaatamata selle tsĂŒklite, klasside, funktsioonide, MS GUI vĂ€ljakutsete olemasolule. ja nii edasi.
PowerShelli kasutatakse suhteliselt harva; sellega vĂ”ib kokku puutuda enamasti PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Desired State Configuration kujul. ja veel kĂŒmne teise harva kasutatava programmi ja funktsiooni kujul. VĂ”ib-olla saab tal teine elu, kui vĂ€lja tuleb , aga see ei ole kindel.
PowerShelli on kolm suurt eelist:
- See on suhteliselt lihtne, selle kohta on palju kirjandust ja nĂ€iteid, ka vene keeles, nĂ€iteks artikkel Foreach â raamatust â erinevus () ja {}
- See tuleb koos redaktoriga , Windowsi komplektiga. Seal on isegi mÔni silur.
- Selle kaudu on lihtne kutsuda .
0. Valmistamine.
Meile on vaja:
- Windowsi arvutit (mul on Windows 10)
- Mingit internetiĂŒhendust (nĂ€iteks NAT-i kaudu)
- 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Ă”hitĂ”dede mĂ”istmine â mis on muutuja, massiiv, tsĂŒkkel.
Avatud ja loetud artiklid â ja
1. Loome jÀrgmise katse boti.
Kuna seda teavad kĂ”ik ja seda on juba tehtud, vĂ”ib selle ka vahele jĂ€ttaNagu ĂŒlaltoodud artiklis öeldud â Esiteks, Telegrami bot â on endiselt rakendus, mis töötab teie poolel ja esitab pĂ€ringuid Telegram Bot API-le. Ja API on selge â bot pöördub kindla URL-i poole parameetritega, Telegram vastab JSON objektiga.
Sellega seotud probleemid: kui te mingil mĂŒstiliselt moel vĂ”tate teatud koodi JSON objektist ja saadate selle tĂ€itmiseks (ilma eesmĂ€rgita) â kood tĂ€idetakse teie juures.
Protsess loomine on kirjeldatud kahes ĂŒlaltoodud artiklis, kuid kordame: Telegramis avame kontaktid, otsime @botfather'it, ĂŒtleme talle /newbot, loome boti Botfortest12344321, nimetame selle Mynext1234bot'iks ja saame sĂ”numi unikaalse vĂ”tmega kujul 1234544311:AbcDefNNNNNNNNNNNNN.
Hoidke vÔti alles ja Àrge jagage seda!
Edasi saab bot'i seadistada, nÀiteks keelata selle lisamise gruppidesse, kuid esimestel sammudel ei ole see vajalik.
KĂŒsimine BotFather'ilt «/mybot» ja saame seadeid korrigeerida, kui midagi ei meeldi.
Avame taas kontaktid, leiame sealt @Botfortest12344321 (otsing peab olema alustatud @-st), vajutame «alusta» ja kirjutame botile «/SлаĐČа ŃĐŸĐ±ĐŸŃĐ°ĐŒÂ». SĂŒmbool / on kohustuslik, jutumĂ€rgid ei ole vajalikud.
Bot ei vasta midagi, loomulikult.
Kontrollime, et bot on loodud â avame.
:AbcDefNNNNNNNNNNNNN/getMe
kus 1234544311:AbcDefNNNNNNNNNNNNN â eelnevalt saadud vĂ”ti,
ja saame rea kujul
{«ok»:true,«result»:{«»}}
Esimene salajane fraas (token) on meil olemas. NĂŒĂŒd peame leidma teise salajase numbri â vestluse ID boti jaoks. Iga vestlus, grupp jne on individuaalsed ja neil on oma number (mĂ”nikord miinusmĂ€rk â avatud gruppide jaoks). Selle numbri leidmiseks peame veebibrauseris (kuigi tĂ”eliselt ei pea tingimata brauseris olema, kuid arusaamise huvides on hea alustada sealt) kĂŒsima aadressi (kus 1234544311:NNNNNNNNN on teie token).
https://api.telegram.org/bot1234544311:NNNNNNNNN/getUpdates
ja saama vastuse kujul
{«ok»:true,«result»:[{«update_id»:âŠ,⊠chat«:{«id»:123456789
Me vajame just chat_id-d.
Kontrollime, kas saame vestlusesse kĂ€sitsi kirjutada: kutsume veebibrauseris ĂŒles aadressi
https://api.telegram.org/botteietoken/sendMessage?chat_id=123456789&text="Life is directed motion"Kui botilt tuleb teie vestlusse sĂ”num â okei, liigute jĂ€rgmise sammu juurde.
Seega saate (brauseri kaudu) alati kontrollida, kus on probleem â kas teie lingi genereerimisel vĂ”i midagi on kuskil varjatud ja ei tööta.
Mida tuleks teada enne lugemise jÀtkamist
Telegramis on mitu tĂŒĂŒpi grupivestlusi (avatud, suletud). Nende vestluste puhul erinevad teatud funktsioonid (nĂ€iteks ID), mis tekitab vahel teatud probleeme.
Kujutame ette, et 2019. aasta lĂ”pus on meie ajastu kangelane, kĂ”igile tuntud Ăksik-Muusik (administraator, jurist, infotehnoloogia spetsialist, programmeerija ja sisuliselt MVP) Jevgeni V. suudab eristada muutujat $i massiivist, omandanud tsĂŒklid, ja ehk paari aasta pĂ€rast Ă”pib ta ka Chocolatey ja siis jĂ”uab ja kuni.
1. MÔtleme, mida meie bot teeb
Mul ei olnud mingeid ideid, tuli mĂ”elda. Olen juba kirjutanud botiga, mis toimib mĂ€rkmete tegemiseks. Ei soovinud teha botâi, âmis saadab midagi kuhugiâ. Azure'i ĂŒhendamiseks on vajalik krediitkaart, aga kust see koolipoisil on? Pean mainima, et asi pole nii hull: peamised pilveteenused pakuvad mingit katseaega tasuta (aga krediitkaardi number on ikkagi vajalik â ja sealt vĂ”etakse, nĂ€ib, dollar. Ei mĂ€leta, kas see hiljem tagasi tuli.)
Ilma AI ML-ita pole botist, kes on ĂŒlekaaluline luuletaja, nii huvitav.
Otsustasin teha boti, mis meenutaks mulle (vÔi mitte mulle) ingliskeelseid sÔnu sÔnastikust.
SÔnastik, et vÀltida andmebaasiga mÀssamist, asub tekstifailis ja tÀiendatakse kÀsitsi.
Antud juhul on ĂŒlesanne nĂ€idata pĂ”hialuseid, mitte luua isegi osaliselt valmid toode.
2. Proovime esmakordselt, kuidas ja mida teha
Loo kaust C:poshtranslate
Alustuseks vaatame, mis meil on PowerShellis, kĂ€ivitame ISE lĂ€bi kĂ€ivita menĂŒĂŒ.
powershell ise
vÔi leiame PowerShell ISE installitud programmide seast.
PĂ€rast kĂ€ivitamist avaneb tavaline tuttav «mingi redaktor», kui tekstivĂ€lja ei ole, siis vĂ”ib alati vajutada «File â create new».
Vaadake PowerShelli versiooni â kirjuta tekstivĂ€ljale:
get-host
ja vajuta F5.
PowerShell pakub salvestamist â «The script you are about to run will be saved.», nĂ”ustume ja salvestame C:poshtranslate faili nimega myfirstbotBT100.
PÀrast kÀivitamist saame alumises tekstivÀljas andmete tabeli:
Nimi : Windows PowerShell ISE Host
Versioon : 5.1.(ja nii edasi)
Mul on 5.1 koos millegagi, seda on piisavalt. Kui sul on vana Windows 7/8, pole hullu â kuigi PowerShell tuleb uuendada versioonile 5 â nĂ€iteks, .
KĂŒsi kĂ€surealt allpool Get-Date, vajuta Enter, vaata kellaaega, mine juurkausta kĂ€suga
cd
ja puhasta ekraan kÀsuga cls (ei, rm ei ole vajalik)
NĂŒĂŒd vaatame, kuidas see töötab â kirjutame isegi mitte koodi, vaid paar rida ja proovime aru saada, mida need teevad. Kommenteerime vĂ€lja # get-host sĂŒmboliga rea ja lisame natuke juurde.
# ĐŃĐžĐŒĐ”Ń ŃĐ°Đ±Đ»ĐŸĐœĐ° Đ±ĐŸŃа
# get-host
<# ŃŃĐŸ ĐżŃĐžĐŒĐ”Ń ĐŒĐœĐŸĐłĐŸŃŃŃĐŸŃĐœĐŸĐłĐŸ ĐșĐŸĐŒĐŒĐ”ĐœŃаŃĐžŃ #>
$TimeNow = Get-Date
$TimeNow
(Huvitaval kombel. HĂŒperlinkide koodide vormindamise loendis on paar tosina varianti â aga powershelli seal ei ole. Dos on olemas. Perl on olemas.)
Ja kĂ€ivitame koodi, vajutades F5 vĂ”i â>â GUI-st.
Saame vÀljundi:
LaupÀev, 8. detsember 2019 21:00:50 (vÔi midagi sarnast)
NĂŒĂŒd uurime, mis need kaks rida teevad ja mĂ”ningaid huvitavaid asju, et hiljem tagasi ei peaks tulema.
Erinevalt Pascalist (ja mitte ainult) proovib PowerShell ise kindlaks teha, millist tĂŒĂŒpi andmetĂŒĂŒbile muutuja mÀÀrata, sellest on rohkem kirjutatud artiklis
SeetĂ”ttu, kui loome muutuja $TimeNow ja mÀÀrame sellele vÀÀrtuseks praeguse kuupĂ€eva ja kellaaja (Get-Date), ei pea me eriti muretsema, milline andmetĂŒĂŒp seal olema hakkab.
TÔsi, sellest teadmatusest vÔib hiljem valus olla, aga see on siis. Allpool tekstis tuleb nÀide.
Vaadake, mis meil on. TÀidame (kÀskluste ridadega)
$TimeNow | Get-memberja saame mittetÔlgitava teksti lehe
Mittearusaadava teksti nÀide nr 1
PS C:> $TimeNow | Get-member
Tüüp: System.DateTime
Nimi Liik Määratlus
---- ------ ----------
Lisa <b>Meetod </b>datetime Lisa(timespan väärtus)
..
Kuvamisviis NoteProperty KuvamisviisTüüp Kuvamisviis=DateTime
Kuupäev <b>Omadus </b>datetime Kuupäev {get;}
Aasta Omistamine int Aasta {get;}
..
KuupäevAeg SkriptOmistamine System.Object KuupäevAeg {get=if ((& { Set-StrictMode -Version 1; $this.Kuvamisviis }) -ieq "Kuupäev")...
Nagu nĂ€ha, on loodud muutuja tĂŒĂŒbi TypeName: System.DateTime, millel on palju meetodeid (mĂ”ttes, et me saame selle objektimuutuja kohta teha) ja omadusi.
Kutsume vĂ€lja $TimeNow.DayOfYear â saame aasta pĂ€eva numbri.
Kutsume vĂ€lja $TimeNow.DayOfYear | Get-Member â saame TypeName: System.Int32 ja grupp meetodeid.
Kutsume vĂ€lja $TimeNow.ToUniversalTime() â ja saame UTC aja
Silumine
MĂ”nikord on vajalik tĂ€ita programm kuni mingisse ritta ja vaadata programmi seisundit sel hetkel. Selleks on ISE-s funktsioon Debug â toggle break point.
Asetage peatuspunkt kuskil keskel, kÀivitage need kaks rida ja vaadake, milline on peatus.
3. Tegeleme Telegrami botiga suhtlemisega
Loomulikult on botiga suhtlemise kohta, kĂ”ikide getpushide jms kohta kirjutatud veel rohkem kirjandust, kuid teooria kĂŒsimusi saab arutada valikuliselt.
Meie puhul on vajalik:
- Ăppida mĂ”nda saatma vestlusesse
- Ăppida midagi vestlusest saama
3.1 Ăpime midagi vestlusesse saatma ja sealt vastu saama
Veidi koodi â osa 3
Kirjutage vÀljund "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 sel kohal vea Unable to connect to the remote server.
VĂ”i ei saa â see oleneb sideoperaatorist ja sellest, kas proxy on seadistatud ja töötab.
Noh â jÀÀb ĂŒle lisada proxy. Pange tĂ€hele â krĂŒpteerimata ja ĂŒldiselt kahtlase proxy kasutamine on teie tervisele ÀÀrmiselt ohtlik.
Töötava proxy leidmise ĂŒlesanne pole vĂ€ga keeruline â enamik avaldatud http proxy'dest töötab. Minu puhul töötas viies jĂ€rele proovitud.
Proxy kasutamise sĂŒntaks:
Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy
Kui olete saanud sĂ”numi oma chat'i botiga â siis on kĂ”ik suurepĂ€rane, saab edasi minna. Kui ei â jĂ€tkake tĂ”rkeotsingut.
VÔite vaadata, kuidas teie string $URL4SEND muutub ja proovida seda brauseris, nÀiteks nii:
$URL4SEND2 = '"'+$URL4SEND+'"'
start chrome $URL4SEND2
3.2. Oleme Ă”ppinud kirjutama "midagi" chatti, nĂŒĂŒd proovime lugeda.
Lisame veel 4 rida ja vaatame, mis seal sees on ŃĐ”ŃДз | 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 pakub meile
Sisu Omand string Content {get;}
ParandatudHtml Omand mshtml.IHTMLDocument2 ParsedHtml {get;}
TooresSisu Omand string RawContent {get;set;}Vaatame, mis neis on:
Write-Host "ParandatudHtml"
$MyMessageGet.ParsedHtml # siin on huvitav
Write-Host "TooresSisu"
$MyMessageGet.RawContent # ja siin on samuti huvitav, peale selle veel ka loetav.
Write-Host "Sisu"
$MyMessageGet.Content
Kui kÔik töötab, peaksite saama pika rea kujul:
{"ok":true,"result":[{"update_id":12345678,
"message":{"message_id":3,"from":{"id"Kahjuks, varem ilmunud artiklis Telegram-bot sĂŒsteemi administraatorile oli see rida (jah, vastavalt $MyMessageGet.RawContent | get-member â see on System.String), juba analĂŒĂŒside all.
4. Töötle saadud (me juba oskame midagi saata)
Nagu juba öeldud , kÔige vajalik on sisus. Vaatame seda tÀhelepanelikumalt.
Esiteks kirjutame botile veel paar lauset veebiliidesest vÔi telefonist
/message1
/message2
/message3ja vaatame brauseris aadressi, mis on saadud muutuja $URLGET.
KĂŒsimine nĂ€eb vĂ€lja 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? Kuidagi keeruline objekt, mis koosneb objektide massiivist, sisaldades sÔnumi globaalset identifikaatorit, vestluse identifikaatorit, saatmise identifikaatorit ja palju muud teavet.
Kuid me ei pea uurima, «mis see objekt on» â osa tööst on juba meie eest Ă€ra tehtud. Vaatame, mis seal sees on:
Lugedes saadud sÔnumeid vÔi osa 4
Write-Host "See on osa 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. Mida me nĂŒĂŒd sellega teeme
Salvestame saadud faili nimega myfirstbotBT105 vÔi milleks iganes teile rohkem meeldib, muudame pealkirja ja kommentaariks kogu senise kirjutatud koodi:
<#start comment 105 end comment 105#>
NĂŒĂŒd peame otsustama, kust sĂ”nastikku saada (noh, kuidas â kettal failis) ja kuidas see vĂ€lja nĂ€eb.
Muidugi, vÔid tÀita tohutu sÔnastiku otse skriptitekstis, kuid see ei ole just Ôige lÀhenemine.
SeetÔttu vaatame, milliste failidega powershell tavaliselt hakkama saab.
Tegelikult ei ole talle oluline, millise failiga töötada, kuid meie jaoks on see tÀhtis.
Valikuks on meil: txt (vĂ”ib kĂŒll, aga milleks), csv, xml.
VÔime vaadata kÔiki. Vaatame kÔiki.
Loome klassi MyVocabClassExample1 ja muutuja $MyVocabExample1.
TÀnan, et mÀrkisite, klassi kirjutatakse ilma $-ta.
veidi koodi #5.
write-host "This is part 5"
class MyVocabClassExample1 {
[string]$Original # sÔna
[string]$Transcript
[string]$Translate
[string]$Example
[int]$VocWordID # vÀga huvitav punkt. int kasutamine oma piirangutega vÔib vahel viia kummaliste tagajÀrgedeni, nÀiteks - hiljuti juhtunud juhtum SSD HPE-ga. Alguses ei lisanud ma seda elementi, kuid hiljem siiski lisasin ja kommenteerisin vÀlja.
}
$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 = "Pruun"
$MyVocabExample2.Example = "Pruun (/ËpÉÉr/) puu ja pÔÔsas kuuluvad Pyrus sugu"
# $MyVocabExample1.$VocWordID = 2
Proovime selle salvestada failidesse. .
Veidi koodi #5.1
Write-Host $ScriptDir # loodetavasti te ei ole $ScriptDir 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 real Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2.
Ei taha lisada, oh ei, kui kahju.
$MyVocabExample3AsArray = @($MyVocabExample1,$MyVocabExample2)
Out-File -FilePath $MyFilenameExample02 -InputObject $MyVocabExample3AsArray
notepad $MyFilenameExample02
Vaadakem, mis vĂ€lja tuli. VĂ€ga hea tekstivorm â aga kuidas seda tagasi eksportida? Tekkima mingid tekstieraldajad, nĂ€iteks komad?
Ja lĂ”puks saada âfail eraldajatega â komadega, comma-separated values (CSV) A .
#
$MyFilenameExample03 = $ScriptDir + "Example03.csv"
$MyFilenameExample04 = $ScriptDir + "Example04.csv"
Export-Csv -Path $MyFilenameExample03 -InputObject $MyVocabExample1
Export-Csv -Path $MyFilenameExample03 -InputObject $MyVocabExample2 -Append
Export-Csv -Path $MyFilenameExample04 -InputObject $MyVocabExample3AsArray
Kuidas on lihtne nĂ€ha, et MS ei erinenud mĂ”tlemises palju, sarnase protseduuri jaoks kasutatakse ĂŒhes kohas -FilePath, teises -Path.
Lisaks sellele kadus kolmandas failis vene keel, neljandas failis tuli vÀlja... noh, midagi tuli vÀlja. #TYPE System.Object[] 00
# âCountâ,»Length»,«LongLength»,«Rank»,«SyncRoot»,«IsReadOnly»,«IsFixedSize»,«IsSynchronized»
#
Veidi ĂŒmber kirjutame:
Export-Csv -Path $MyFilenameExample03 -InputObject $MyVocabExample1 -Encoding Unicode
Export-Csv -Path $MyFilenameExample03 -InputObject $MyVocabExample2 -Append -Encoding Unicode
notepad $MyFilenameExample03
notepad $MyFilenameExample04
Tundub, et see aitas â kuid formaat ei meeldi mulle ikka veel.
Eriti ei meeldi mulle, et ma ei saa objekti ridu otse faili panna.
Muide, kui me juba faile kirjutama hakkasime â kas peaksime ka kĂ€ivitamise logi pidama? Aeg on meil muutuja, faili nime oskame mÀÀrata.
Kirjutada, tÔsi, praegu ei ole midagi, kuid vÔime mÔelda, kuidas logide rotatsiooni paremini teha.
Proovime xml-i.
Veidi 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 ainult plussid â loetavus, kogu objekti ekspordivĂ”ime ja uppend'i tĂ€itma ei pea.
Proovime .
Veidi lugemist xml-ist
$MyFilenameExample06 = $ScriptDir + "Example06.xml"
$MyVocabExample4AsArray = Import-Clixml -Path $MyFilenameExample06
# $MyVocabExample4AsArray
# $MyVocabExample4AsArray[0]
# ja veidi tĂ€iesti ootamatute nĂŒansside kohta. Powershell kĂ€itub aeg-ajalt nii, nagu vĂ”iks eeldada.
# nÀiteks minul need kaks vÀljundit erinevad
# Write-Output $MyVocabExample4AsArray
# write-host $MyVocabExample4AsArray
Naaseme ĂŒlesande juurde. Proovifaili oleme loonud, lugenud, salvestusformaat on selge, vajadusel saab kirjutada eraldi vĂ€ikese failiredaktori ridade lisamiseks ja eemaldamiseks.
Tuletan meelde, et ĂŒlesanne oli luua vĂ€ike koolitusbot.
Töö formaat: saadan botile kĂ€su ânĂ€ideâ, bot saadab mulle juhuslikult valitud sĂ”na ja transkriptsiooni, ning 10 sekundi pĂ€rast saadab tĂ”lke ja kommentaari. KĂ€sklusi oskame lugeda, veel tuleks muidugi Ă”ppida automaatselt valima ja kontrolima proksisid ning kustutama sĂ”numite loendamise.
Kunstime kÔik varem kommenteeritud asjad uuesti vÀlja, kommenteerime vÀlja enam mittehÀdavajalikud nÀited txt ja csv failidest, ja salvestame faili kui versiooni B106.
Ah, jah. Saame midagi botile veel kord saata.
6. Saatmine funktsioonidest ja muust
Enne andmete töötlemist peab olema mÀÀratud funktsioon, mis saadab «mida iganes», peale test-sÔnumi.
Muidugi, meie nĂ€ites on ainult ĂŒks saatmine ja ainult ĂŒks töötlemine, kuid mis juhtub, kui tuleb sama asja teha mitu korda?
Lihtsam on kirjutada funktsioon. Meil on objektitĂŒĂŒp $MyVocabExample4AsArray, mis loetakse failist kaheelemendilisena massiivina.
Samas kĂ€sitleme kellaaegu, sellega on meil hiljem tööd (kuigi selles nĂ€ites ei ole see vajalik đ
Veidi 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 # siin me saame vea
$MyText02 = $SomeExampleForFunction1 + " " + $TimeNow # siin me ei saa, kes arvab miks - on tubli.
$URL4SendFromFunction = "https://api.telegram.org/bot$MyToken/sendMessage?chat_id=$MyChatID&text=$MyText02"
Invoke-WebRequest -Uri $URL4SendFromFunction -Proxy $MyProxy
}
Kergesti vÔib nÀha, et funktsioonis kasutatakse $MyToken ja $MyChatID, mis on eelnevalt kindlalt mÀÀratud.
Nii teha ei tohi, ja kui $MyToken on iga boti jaoks ĂŒhesugune, siis $MyChatID muutub vastavalt vestlusele.
Kuid kuna see on nÀide, ignoreerime seda seni.
Kuna $MyVocabExample4AsArray ei ole massiiv, kuigi see nĂ€eb vĂ€lja nagu massiiv, siis ei saa lihtsalt vĂ”tta ja kĂŒsida selle pikkust.
Peame uuesti tegema midagi, mida ei tohiks â hĂŒppama mitte koodeksi jĂ€rgi â vĂ”tma ja arvutama
Natuke 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 reas
# MyFirstFunction($MyVocabExample4AsArray[Get-Random -Minimum 0 -Maximum ($MaxRandomExample -1)].Example)
# Arvake ise, milline nÀide on vÀljastpoolt kergemini loetav.
Juhuslik . Oletame, et soovime saada 0 vĂ”i 1 (meil on massiivis kokku kaks elementi). Kui mÀÀrame piirid 0..1 â kas saame â1â?
ei â ei saa, meil on spetsiaalselt toodud nĂ€ide Example 2: Get a random integer between 0 and 99 Get-Random -Maximum 100
SeetÔttu peame 0..1 jaoks mÀÀrama suuruse 0..2, sel juhul on maksimaalne element = 1.
7. Saadetud sÔnumite töötlemine ja jÀrjekorra maksimaalne pikkus
Kuidas me eelnevalt lÔpetasime? 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 /tervitus.
Vaadakem, mida oleme saanud:
$Content4Pars01.result[0].message.text
$Content4Pars01.result[2].message.text KÀime lÀbi kÔik saadud ja saadame vastuse, kui sÔnum oli /word
struktuur case of, mida mĂ”ned kirjeldavad kui if-elseif, powershellis kutsutakse . Samal ajal on allolevas koodis kasutatud vĂ”tit -wildcard, mis pole ĂŒldse vajalik ja isegi kahjulik.
Natuke koodi #7.1
Write-Output "This is part 7"
Foreach ($Result in $Content4Pars01.result) # Jah, saab teha kiiremini
{
switch -wildcard ($Result.message.text)
{
"/word" {MyFirstFunction($TextForExample1)}
}
}
KÀivitage skript paar korda. Saame kaks korda sama sÔna iga kord, eriti kui oleme juhuslikku rakendamises eksinud.
Aga stopp. Me ei saatnud /word veel kord, miks siis sÔnum töödeldakse uuesti?
Botile saadetavate sÔnumite jÀrjekorrale on piiratud pikkus (tundub, et 100 vÔi 200 sÔnumit), ja see tuleb kÀsitsi puhastada.
Dokumendist on see loomulikult kirjas, aga seda peab lugema!
Antud juhul on meil vajalik parameeter ?chat_id, samas &timeout, &limit, &parse_mode=HTML ja &disable_web_page_preview=true ei ole hetkel vajalikud.
Dokumentatsioon Inglise keeles on seal kirjas:
Esimese uuenduse identifikaator, mida tagastatakse. Peab olema suurem kui ĂŒks kĂ”rgemas identifikaatorite seas, mida eelnevalt saadud uuendustest leiti. VaikesĂ€tete kohaselt tagastatakse uuendused, alustades esimesest.
kinnitamata uuendust tagastatakse. Uuendus loetakse kinnitatuks, kui getUpdates on kutsutud ĂŒles kĂ”rgema. offset kui tema update_id. . Negatiivne offset vĂ”ib olla mÀÀratud, et tagastada uuendusi, alustades -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_id
Ja kirjutame ĂŒmber â veidi muudame funktsiooni. Meil on kaks varianti â edastada funktsioonile kogu sĂ”num ja töödelda see kogu ulatuses funktsioonis, vĂ”i anda ainult sĂ”numi ID ja seejĂ€rel see ka tĂŒhistada. NĂ€iteks nĂ€eb teine variant lihtsam vĂ€lja.Varem nĂ€gi meie pĂ€ring «kĂ”ikide sĂ”numite» kohta vĂ€lja nagu
$URLGET = "https://api.telegram.org/bot$MyToken/getUpdates"
aga 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
$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 alguses kĂ”iki sĂ”numeid saada, neid töödelda ja ainult pĂ€rast eduka töötlemise lĂ”petamist kĂŒsida unconfirmed -> confirmed.
Miks on mĂ”ttekas kutsuda ĂŒles kinnitama pĂ€rast kĂ”igi töötlemiste lĂ”petamist? VĂ”imalik on tĂ”rge keskel, ja kui nĂ€iteks tasuta vestlusroboti jaoks on ĂŒhe sĂ”numi vahelejĂ€tmine veel millekski erilist, siis kui töötlete kellegi palka vĂ”i kaarditehingut, siis vĂ”ib lĂ”pp olla hullem.
Veel paar rida koodi
$LastMessageId = ($Content4Pars01.result | select -last 1).update_id # ebatÀpsus siin eeldatakse, et parandate iseseisvalt.
$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Ă”hiomadused â sĂ”numite lugemine, jĂ€rjekorra lĂ€htestamine, failist lugemine ja faili kirjutamine on teostatud ja nĂ€idatud.
On jÀÀnud teha vaid neli asja:
- Ôige vastuse saatmine vestluse pÀringule
- vastuse saatmine IGA vestlusse, kuhu bot lisati
- koodi tĂ€itmine tsĂŒklis
- boti kÀivitamine Windowsi ajakavale.
KĂ”ik need ĂŒlesanded on lihtsad ja kergesti teostatavad dokumentatsiooni lugemise abil, nĂ€iteks parameetrite kohta, nagu
Set-ExecutionPolicy Unrestricted ja -ExecutionPolicy Bypass
taolise tsĂŒkli puhul
$TimeToSleep = 3 # kĂŒsitlus iga 3 sekundi tagant
$TimeToWork = 10 # minutit
$HowManyTimes = $TimeToWork*60/$TimeToSleep # loendur tsĂŒkli jaoks
$MainCounter = 0
for ($MainCounter=0; $MainCounter -le $HowManyTimes) {
sleep $TimeToSleep
$MainCounter ++
AitÀh kÔigile, kes lÔpuni lugesid.
Allikas: habr.com
