Lihtsaim Telegrami boti mall 7.-9. klassi Ôpilastele Powershellis

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 Juhend: Kuidas luua bote Telegramis ja Telegrami bot sĂŒsteemiadministraatorile.
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, integreerimist Gitiga 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, PowerShell Web Access ja veel poole tosinaga harva kasutatavaid programme ja funktsioone. VÔib-olla saab tal teine tuul oma loomisega WSL2, aga see pole kindel.

PowerShell'il on ka kolm suurt plussi:

  1. See on suhteliselt lihtne, selle kohta on tohutult kirjandust ja nĂ€iteid, isegi vene keeles, nĂ€iteks artikkel Foreach — raamatust PowerShell sĂŒvitsi — erinevuste kohta () ja {}
  2. See tuleb koos redigerijaga ISE, koos Windowsiga. Seal on isegi mingi siluri olemas.
  3. Seda saab hÔlpsasti kutsuda komponente kasutajaliidese loomiseks.

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 — Juhend: Kuidas luua bote Telegramis ja Telegrami bot sĂŒsteemiadministraatorile

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.

api.telegram.org/bot1234544311: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 Parallel processing with PowerShell ja ForEach-Object Parallel 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 juhendis.

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 Algtuntus tĂŒpiseerimisest programmeerimiskeeltes
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-member

ja saame segase teksti lehe

Segase teksti nÀide number 1

PS C:&gt; $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 ((&amp; { 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 siit, kÔige olulisem on sisus. Vaatame seda lÀhemalt.

Esiteks kirjutame botile veel paar lauset veebiliidese vÔi telefoni kaudu

/message1
/message2
/message3

ja 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 nÀidise pÔhjal.

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)." STOP, OOTAGE.
#

$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. lÀbi lugeda xml-fail..

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.
Hakkame lugema.

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 huvitav funktsioon. 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 lÀbi switch. 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 telegram api kohta asub siin
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_id

Ja 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

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster