Sõbrannaga vesteldes sain järsku teada, et nende koolis ei õpetata 8-10 klassi lastele programmeerimist üldse. Word, Excel ja kõik muu. Pole logo, isegi mitte Pascal, isegi mitte VBA for Excel.
Olin väga üllatunud, avasin Interneti ja hakkasin lugema -
Erikooli üheks ülesandeks on edendada oma arengutasemelt ja elustiililt infoühiskonna tingimustele vastava uue põlvkonna haridust.
See kursus võimaldab õpilastel praktikas kinnistada oma teadmisi Pascali programmeerimiskeele põhikonstruktsioonidest. (mõne gümnaasiumi 2017. aasta programmist)
Lõpuks otsustasin veeta paar tundi ja visandada näite, kuidas luua koolilastele lihtsat robotit.
Allpool on toodud analüüs selle kohta, kuidas kirjutada Powershellis veel üks lihtne robot ja panna see tavalisel koduarvutil tavalise internetiühendusega töötama ilma veebikonksude, valgete IP-de, spetsiaalserverite, pilves asuvate virtuaalsete masinate jmsta. Windows.
TLDR: järjekordne igav artikkel grammatika- ja faktivigadega, pole midagi lugeda, pole huumorit ega pilte.
Artiklis pole midagi uut, peaaegu kõik varem kirjutatu on juba Habré peal olnud, näiteks artiklites и .
Pealegi on artikkel teadlikult üleliigne, et mitte iga kord viidata õppekirjandusele. Tekstis ei ole viiteid Gang 4-le, PowerShell Deep Divesile ega näiteks AWS-i hästiarhitekteeritud raamistiku viiele sambale.
Eessõna asemel võite vahele jätta
Jäta julgelt vahele2006. aastal avaldas Microsoft tolleaegsele arvutile PowerShell 1.0. Windows XP, Vista ja 2003 serverid. Mõnes mõttes asendas see selliseid asju nagu cmdbat- ja vb-skriptid. Windows Skriptihost ja JScript.
Isegi praegu võib PowerShelli pidada alles järgmiseks sammuks pärast Logo suvandeid, ilmselt endiselt kasutatava Delphi (või millegi vanema) asemel, hoolimata silmuste, klasside, funktsioonide, MS GUI-kõnede olemasolust, ja nii edasi.
Powershelli kasutatakse suhteliselt harva; sellega saate kokku puutuda ainult PowerShell Core'i, VMware vSphere PowerCLI, Azure PowerShelli, MS Exchange'i, soovitud oleku konfiguratsiooni, ja kümmekond harvemini kasutatavat programmi ja funktsiooni. Võib-olla saab ta vabastamisega teise tuule , kuid see pole täpselt nii.
Powershellil on ka kolm suurt eelist:
- See on suhteliselt lihtne, selle kohta on palju kirjandust ja näiteid ning isegi vene keeles näiteks artikkel Foreachist - raamatust - erinevuse () ja {} kohta
- Ta läheb toimetajaga kaasa , koos WindowsSeal on isegi mingisugune silur.
- Sellest on lihtne helistada .
0. Ettevalmistus.
Me peame:
- Arvuti koos Windows (Mul on Windows 10)
- Vähemalt mingi Interneti-juurdepääs (näiteks NAT-i kaudu)
- Neile, kellel on piiratud juurdepääs telegrammile - brauserisse installitud ja konfigureeritud vabavärav, mõnel keerulisel juhul koos Symple DNS Cryptiga
- Telefonis töötav telegrammi klient
- Põhitõdede mõistmine – mis on muutuja, massiiv, silmus.
Avanud ja lugenud artikleid - и
1. Loome veel ühe testbotti.
Kuna kõik teavad seda juba ja on juba juhtunud, võite selle ka vahele jättaNagu ülaltoodud artiklis öeldud - Esiteks, bot Telegrami jaoks - see on endiselt teie poolel töötav rakendus, mis teeb taotlusi Telegram Boti API-le. Pealegi on API selge – bot pääseb parameetritega juurde konkreetsele URL-ile ja Telegram vastab JSON-objektiga.
Seotud probleemid: kui võtate mingil teadmata viisil JSON-objektilt koodi ja saadate selle kuidagi (mitte meelega) täitmiseks, siis käivitatakse kood teie eest.
Loomise protsessi kirjeldatakse kahes ülaltoodud artiklis, kuid kordan: telegrammis avame kontaktid, otsime @botfather, ütleme talle /newbot, loome roboti Botfortest12344321, nimetame seda Mynext1234botiks ja saame sõnumi unikaalse võtmega vorm 1234544311: AbcDefNNNNNNNNNNNNNN
Hoolitse võtme eest ja ära anna seda ära!
Seejärel saab boti konfigureerida, näiteks keelata selle gruppidesse lisamise, kuid esimestel sammudel pole see vajalik.
Küsige BotFatherilt "/mybot" ja kohandame seadeid, kui meile midagi ei meeldi.
Avame uuesti kontaktid, leiame sealt @Botfortest12344321 (otsingu alustamine on kohustuslik @-ga), vajuta "start" ja kirjuta robotile "/Glory to the robots." Märk / on kohustuslik, jutumärke pole vaja.
Bot muidugi ei vasta midagi.
Kontrollime, kas bot on loodud, ja avame selle.
:AbcDefNNNNNNNNNNNNNN/getMe
kus 1234544311:AbcDefNNNNNNNNNNNNNN on varem vastu võetud võti,
ja saada rida nagu
{"ok":true"result":{""}}
Meil on esimene salajane fraas (märk). Nüüd peame välja selgitama teise salanumbri - robotiga vestluse ID. Iga vestlus, grupp jne on individuaalne ja sellel on oma number (mõnikord miinusega - avatud gruppidele). Selle numbri väljaselgitamiseks peame brauseris küsima (tegelikult pole see brauseris üldse vajalik, kuid parema arusaamise huvides võite alustada) aadressi (kus 1234544311:NNNNNNNNNN on teie tunnus
https://api.telegram.org/bot1234544311:NNNNNNNNN/getUpdates
ja saad vastuse nagu
{"ok":true,"result":[{"update_id":...,... vestlus":{"id":123456789
Vajame chat_id.
Kontrollime, kas saame vestlusse käsitsi kirjutada: helistage brauserist aadressile
https://api.telegram.org/botваштокен/sendMessage?chat_id=123456789&text="Life is directed motion"Kui saate oma vestluses robotilt sõnumi, liigute edasi järgmisse etappi.
Nii saab (brauseri kaudu) alati kontrollida, kas linkide genereerimisel on probleeme või on midagi peidus ja ei tööta.
Mida peate teadma enne lugemise jätkamist
Telegramil on mitut tüüpi grupivestlusi (avatud, suletud). Nende vestluste puhul on mõned funktsioonid (näiteks id) erinevad, mis mõnikord põhjustab probleeme.
Oletame, et käes on 2019. aasta lõpp ja isegi meie aja kangelane, tuntud Man-Orchestra (administraator, jurist, infoturbespetsialist, programmeerija ja praktiliselt MVP) Jevgeni V. eristab muutujat $i massiivist, on õppinud silmuseid, vaata järgmise paari aasta jooksul on kapten Chocolatey ja siis и see tuleb.
1. Mõtleme, mida meie bot teeb
Mul polnud ideid, ma pidin mõtlema. Olen juba kirjutanud bot-märkmiku. Ma ei tahtnud teha robotit, "mis saadab midagi kuhugi". Azure'iga ühenduse loomiseks vajate krediitkaarti, kuid kust õpilane selle saab? Tuleb märkida, et kõik pole nii hull: põhipilved annavad mingisuguse testiperioodi tasuta (aga krediitkaardi numbrit on ikka vaja - ja tundub, et sellelt debiteeritakse dollar. Ei mäleta, kas see tagastati hiljem.)
Ilma AI ML-ita pole nii huvitav teha bot-vaeseks.
Otsustasin teha roboti, mis tuletaks mulle (või mitte) meelde sõnaraamatu ingliskeelseid sõnu.
Andmebaasiga askeldamise vältimiseks salvestatakse sõnastik tekstifaili ja uuendatakse käsitsi.
Sel juhul on ülesanne näidata töö põhitõdesid, mitte teha vähemalt osaliselt valmis toodet.
2. Esimest korda proovimine, mida ja kuidas
Loome kausta C:poshtranslate
Kõigepealt vaatame, milline powershell meil on, käivitame ISE käivitamise kaudu
powershell ise
või leidke installitud programmidest Powershell ISE.
Pärast käivitamist avaneb tavaline tuttav “mingisugune redaktor”, kui tekstivälja pole, saate alati klõpsata “Fail - loo uus”.
Vaatame powershelli versiooni - kirjutage tekstiväljale:
get-host
ja vajutage F5.
Powershell pakub salvestamist - "Skript, mida kavatsete käivitada, salvestatakse." nõustume ja salvestame faili powershellist nimega C: poshtranslate myfirstbotBT100.
Pärast käivitamist saame alumises tekstiaknas andmetabeli:
Name : Windows PowerShell ISE Host
Version : 5.1.(и так далее)
Mul on 5.1 ja midagi sellist, sellest piisab. Kui sul on vana... Windows 7/8, siis on kõik korras - kuigi PowerShelli tuleb versioonile 5 uuendada - näiteks .
Tippige allolevale käsureale Get-Date, vajutage Enter, vaadake kellaaega, minge käsuga juurkausta
cd
ja tühjendage ekraan käsuga cls (ei, te ei pea rm-i kasutama)
Nüüd kontrollime, mis ja kuidas töötab – kirjutagem mitte isegi koodi, vaid kaks rida ja proovime aru saada, mida nad teevad. Kommenteerime rida get-host sümboliga # ja lisame veidi.
# Пример шаблона бота
# get-host
<# это пример многострочного комментария #>
$TimeNow = Get-Date
$TimeNow
(Huvitav on see, et Habré koodivormingu rippmenüüs on kaks tosinat valikut, kuid Powershelli pole seal. Dos on olemas. Perl on olemas.)
Ja käivitame koodi, vajutades GUI-s klahvi F5 või ">".
Saame järgmise väljundi:
Saturday, December 8, 2019 21:00:50 PM (или что-то типа)
Vaatame nüüd neid kahte rida ja mõnda huvitavat punkti, et me tulevikus selle juurde tagasi ei pöörduks.
Erinevalt Pascalist (ja mitte ainult) proovib PowerShell ise määrata, millist tüüpi muutujale määrata; selle kohta on üksikasjalikumat teavet artiklis
Seega, luues muutuja $TimeNow ja määrates sellele praeguse kuupäeva ja kellaaja väärtuse (Get-Date), ei pea me liiga palju muretsema selle pärast, mis tüüpi andmed seal on.
Tõsi, see teadmatus võib hiljem haiget teha, kuid see on hilisemaks. Allpool tekstis on näide.
Vaatame, mis meil on. Käivitame (käsureal)
$TimeNow | Get-memberja saada lehekülg arusaamatut teksti
Näide arusaamatust tekstist 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")...
Nagu näete, on muutuja tüüpi TypeName: System.DateTime loodud hunniku meetodite (selles mõttes, mida me selle muutujaobjektiga teha saame) ja omadustega.
Helistame $TimeNow.DayOfYear — saame aasta päeva numbri.
Helistame $TimeNow.DayOfYear | Get-Member - saame TypeName: System.Int32 ja meetodite rühm.
Helistame $TimeNow.ToUniversalTime() - ja hankige aeg UTC-s
Silur
Vahel juhtub nii, et on vaja mingi reani mingi programm täita ja näha programmi seisu sel hetkel. Selleks on ISE-l funktsioon Silumine – lülita katkestuspunkt
Pange murdepunkt kuskile keskele, käivitage need kaks rida ja vaadake, kuidas katkestus välja näeb.
3. Telegrami robotiga suhtlemise mõistmine
Muidugi on kirjutatud veelgi rohkem kirjandust robotiga suhtlemise, kogu getpushi ja muu sellise kohta, kuid teooria küsimust võib kaaluda valikuliselt.
Meie puhul on vajalik:
- Õppige midagi kirjavahetuses saatma
- Õppige kirjavahetusest midagi saama
3.1 Õppige midagi kirja teel saatma ja sealt vastu võtma
Väike kood – 3. osa
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
ja Vene Föderatsioonis saame sel hetkel veateate Ei saa kaugserveriga ühendust luua.
Või me ei saa seda kätte – sõltub sideoperaatorist ja sellest, kas puhverserver on konfigureeritud ja töötab
Noh, jääb üle vaid puhverserver lisada. Pange tähele, et krüptimata ja üldiselt petturliku puhverserveri kasutamine on teie tervisele äärmiselt ohtlik.
Töötava puhverserveri leidmine pole kuigi keeruline – enamik avaldatud http-puhverserveritest töötab. Arvan, et viies töötas minu jaoks.
Süntaks puhverserveri abil:
Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy
Kui saate robotiga vestluses teate, on kõik korras, võite edasi liikuda. Kui ei, jätkake silumist.
Saate vaadata, milleks teie string $URL4SEND muutub, ja proovida seda brauseris taotleda järgmiselt:
$URL4SEND2 = '"'+$URL4SEND+'"'
start chrome $URL4SEND2
3.2. Õppisime vestluses "midagi" kirjutama, proovime nüüd seda lugeda
Lisame veel 4 rida ja vaatame läbi | saada liikmeks
$URLGET = "https://api.telegram.org/bot$MyToken/getUpdates"
$MyMessageGet = Invoke-WebRequest -Uri $URLGET -Method Get -Proxy $MyProxy
Write-Host "Get-Member"
$MyMessageGet | Get-Member
Meile pakutakse kõige huvitavamat
Content Property string Content {get;}
ParsedHtml Property mshtml.IHTMLDocument2 ParsedHtml {get;}
RawContent Property string RawContent {get;set;}Vaatame, mis neis on:
Write-Host "ParsedHtml"
$MyMessageGet.ParsedHtml # тут интересное
Write-Host "RawContent"
$MyMessageGet.RawContent # и тут интересное, но еще к тому же и читаемое.
Write-Host "Content"
$MyMessageGet.Content
Kui kõik töötab teie jaoks, saate pika rea, näiteks:
{"ok":true,"result":[{"update_id":12345678,
"message":{"message_id":3,"from":{"id"Õnneks on varem avaldatud artiklis Telegram bot süsteemiadministraatorile see rida (jah, vastavalt $MyMessageGet.RawContent | get-member on System.String), on juba lahti võetud.
4. Töötle saadu (me juba teame, kuidas midagi saata)
Nagu juba kirjutatud , kõige vajalikumad asjad peituvad sisus. Vaatame seda lähemalt.
Esiteks kirjutame veebiliidese või telefoni kaudu robotile veel paar fraasi
/message1
/message2
/message3ja vaadake brauseris aadressi, mis moodustati 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 keerukas objekt objektide massiividest, mis sisaldavad otsast lõpuni sõnumiidentifikaatorit, vestluse identifikaatorit, saatmisidentifikaatorit ja palju muud teavet.
Kuid me ei pea välja mõtlema, "mis tüüpi objekt see on" - osa tööst on meie eest juba tehtud. Vaatame, mis sees on:
Vastuvõetud sõnumite või 4. osa lugemine
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. Mida peaksime sellega nüüd tegema?
Salvestame saadud faili nimega myfirstbotBT105 või mis sulle kõige rohkem meeldib, muudame pealkirja ja kommenteerime kogu juba kirjutatud koodi kaudu
<#start comment 105 end comment 105#>
Nüüd peame otsustama, kust sõnaraamat hankida (noh, kust - failis kettal) ja milline see välja näeb.
Muidugi võite kirjutada tohutu sõnastiku otse skripti teksti, kuid see on täiesti asjatu.
Nii et vaatame, millega powershell tavaliselt töötab.
Üldiselt ei huvita ta, millise failiga töötada, see pole meie jaoks oluline.
Meil on valik: txt (võite, aga miks), csv, xml.
Kas me saame kõiki vaadata? Vaatame kõiki.
Loome klassi MyVocabClassExample1 ja muutuja $MyVocabExample1
Märgin, et klass on kirjutatud ilma $
mingi kood nr 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
Proovime seda failidesse kirjutada kasutades .
Mingi kood #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
- ja saame veateate real Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2.
Ta ei taha lisada, ah-ah, kui häbi.
$MyVocabExample3AsArray = @($MyVocabExample1,$MyVocabExample2)
Out-File -FilePath $MyFilenameExample02 -InputObject $MyVocabExample3AsArray
notepad $MyFilenameExample02
Vaatame mis juhtub. Suurepärane tekstivaade – aga kuidas seda tagasi eksportida? Kas peaksin kasutusele võtma mingisugused teksti eraldajad, näiteks komad?
Ja lõpuks saate "komadega eraldatud väärtuste (CSV) faili 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
Nagu on lihtne näha, ei eristu MS oma loogika poolest eriti, sarnase protseduuri puhul kasutatakse ühel juhul -FilePathi, teisel juhul -Pathi.
Lisaks kadus kolmandas failis vene keel, neljandas failis selgus... no midagi juhtus. #TYPE System.Object[] 00
# "Count","Length","LongLength","Rank","SyncRoot","IsReadOnly","IsFixedSize","IsSynchronized"
#
Kirjutame natuke ümber:
Export-Csv -Path $MyFilenameExample03 -InputObject $MyVocabExample1 -Encoding Unicode
Export-Csv -Path $MyFilenameExample03 -InputObject $MyVocabExample2 -Append -Encoding Unicode
notepad $MyFilenameExample03
notepad $MyFilenameExample04
Tundub, et see on aidanud, kuid mulle ikkagi ei meeldi see formaat.
Eriti ei meeldi mulle, et ma ei saa objektilt ridu otse faili panna.
Muide, kas siis, kui hakkasime failidesse kirjutama, kas saame hakata pidama käivituslogi? Meil on muutujana aeg, saame määrata failinime.
Tõsi, midagi pole veel kirjutada, aga võite mõelda, kuidas oleks kõige parem palke pöörata.
Proovime praegu xml-i.
Mingi 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
Eksportimisel xml-i on palju eeliseid – loetavus, kogu objekti eksportimine ja üleslaadimise puudumine.
Proovime .
Natuke lugemist xml-st
$MyFilenameExample06 = $ScriptDir + "Example06.xml"
$MyVocabExample4AsArray = Import-Clixml -Path $MyFilenameExample06
# $MyVocabExample4AsArray
# $MyVocabExample4AsArray[0]
# и немного о совершенно неочевидных нюансах. Powershell время от времени ведет себя не так, как вроде бы как бы стоило бы ожидать бы.
# например у меня эти два вывода отличаются
# Write-Output $MyVocabExample4AsArray
# write-host $MyVocabExample4AsArray
Tuleme tagasi ülesande juurde. Kirjutasime testfaili, lugesime läbi, salvestusformaat on selge, vajadusel saab kirjutada eraldi väikese failiredaktori ridade lisamiseks ja kustutamiseks.
Tuletan meelde, et ülesandeks oli teha väike treeningbot.
Töö formaat: saadan robotile käsu “example”, bot saadab mulle juhuslikult valitud sõna ja transkriptsiooni ning 10 sekundi pärast saadab tõlke ja kommentaari. Teame, kuidas lugeda käske, samuti tahaksime õppida, kuidas automaatselt valida ja kontrollida puhverservereid ning lähtestada sõnumiloendurid unustusse.
Tühistame kõik varem mittevajalikuks kommenteeritu, kommenteerime nüüd mittevajalikud näited txt ja csv-ga ning salvestame faili versioonina B106
Oh jah. Saadame jälle midagi botile.
6. Saatmine funktsioonidest ja muust
Enne vastuvõtu töötlemist peate looma funktsiooni "vähemalt millegi" saatmiseks peale testsõnumi.
Muidugi on näites ainult üks saatmine ja ainult üks töötlemine, aga mis siis, kui peame tegema sama asja mitu korda?
Funktsiooni kirjutamine on lihtsam. Niisiis, meil on failist loetud muutuja tüüpi objekt $MyVocabExample4AsArray kuni kahest elemendist koosneva massiivi kujul.
Samal ajal tegeleme kellaga, seda läheb meil hiljem vaja (tegelikult selles näites me seda ei vaja :)
Mingi kood #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
}
Nagu näete kergesti, kutsub funktsioon välja $MyToken ja $MyChatID, mis olid varem kõvasti kodeeritud.
Seda pole vaja teha ja kui $MyToken on iga boti jaoks üks, muutub $MyChatID olenevalt vestlusest.
Kuid kuna see on näide, jätame selle praegu tähelepanuta.
Kuna $MyVocabExample4AsArray ei ole massiiv, kuigi see on sellega väga sarnane, siis sa ei saa seda lihtsalt võtta küsi selle pikkust.
Taas peame tegema midagi, mida ei saa teha - langevarjuga mitte koodi järgi - võtke see ja loendage
Mingi kood #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)
# Угадайте сами, какой пример легче читается посторонними людьми.
juhuslik . Oletame, et tahame saada 0 või 1 (meil on massiivis ainult kaks elementi). Kas piiride 0..1 seadmisel saame “1”?
ei – me ei saa seda, meil on spetsiaalne näide Näide 2: Hankige juhuslik täisarv vahemikus 0 kuni 99 Get-Random -Maksimaalselt 100
Seetõttu peame 0..1 jaoks määrama suuruseks 0..2, kusjuures elemendi maksimaalne arv = 1.
7. Sissetulevate kirjade töötlemine ja järjekorra maksimaalne pikkus
Kus me varem peatusime? meil on vastu võetud muutuja $MyMessageGet
ja sellest saadud $Content4Pars01, millest meid huvitavad massiivi Content4Pars01.result elemendid
$Content4Pars01.result[0].update_id
$Content4Pars01.result[0].message
$Content4Pars01.result[0].message.text Saadame boti /sõnum10, /teade11, /teade12, /word ja uuesti /word ja /tere.
Vaatame, mis meil on:
$Content4Pars01.result[0].message.text
$Content4Pars01.result[2].message.text Vaatame kõik saadud ja saadame vastuse, kui sõnum oli /word
konstruktsiooni juhtumit, mida mõned kirjeldavad kui if-elseif, nimetatakse powershellis . Samal ajal kasutab allolev kood klahvi -wildcard, mis on täiesti tarbetu ja isegi kahjulik.
Mingi kood #7.1
Write-Output "This is part 7"
Foreach ($Result in $Content4Pars01.result) # Да, можно сделать быстрее
{
switch -wildcard ($Result.message.text)
{
"/word" {MyFirstFunction($TextForExample1)}
}
}
Käitame skripti paar korda. Iga täitmiskatse kohta saame sama sõna kaks korda, eriti kui tegime juhusliku rakendamisel vea.
Aga lõpeta. Me ei saatnud uuesti /word, miks siis sõnumit uuesti töödeldakse?
Botile sõnumite saatmise järjekord on piiratud pikkusega (ma arvan, et 100 või 200 sõnumit) ja see tuleb käsitsi tühjendada.
Seda on loomulikult dokumentatsioonis kirjeldatud, kuid peate seda lugema!
Sel juhul vajame parameetrit ?chat_id ning &timeout, &limit, &parse_mode=HTML ja &disable_web_page_preview=true pole veel vajalikud.
Dokumentatsioon jaoks See ütleb valges ja inglise keeles:
Esimese tagastatava värskenduse identifikaator. Peab olema ühe võrra suurem kui varem saadud värskenduste identifikaatorite suurim. Vaikimisi värskendused algavad kõige varasemast
kinnitamata värskendus tagastatakse. Värskendus loetakse kinnitatuks niipea, kui getUpdate kutsutakse koos a tasakaalustama rohkem kui selle update_id. Negatiivse nihke saab määrata värskenduste toomiseks alates -offset update värskendusjärjekorra lõpust. Kõik varasemad uuendused unustatakse.
Vaatame:
$Content4Pars01.result[0].update_id
$Content4Pars01.result[1].update_id
$Content4Pars01.result | select -last 1
($Content4Pars01.result | select -last 1).update_idJah, ja me lähtestame selle ja kirjutame funktsiooni veidi ümber. Meil on kaks võimalust – edastada kogu sõnum funktsioonile ja töödelda see täielikult funktsioonis või anda ainult sõnumi ID ja lähtestada see. Näiteks teine näeb lihtsam välja.
Varem nägi meie päringustring "kõik sõnumid" välja selline
$URLGET = "https://api.telegram.org/bot$MyToken/getUpdates"ja see hakkab välja nägema
$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 teil esmalt kõiki sõnumeid vastu võtta, neid töödelda ja alles pärast edukat töötlemistaotlust kinnitamata -> kinnitatud.
Miks on pärast kogu töötlemise lõpetamist mõttekas helistada kinnitusele? Ebaõnnestumine on võimalik keset teostamist ja kui tasuta vestlusroboti näitel pole ühest sõnumist ilmajäämine midagi erilist, siis kellegi palga või kaarditehingu töötlemisel võib tulemus kehvem olla.
Veel paar rida koodi
$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. Järelduse asemel
Põhifunktsioonid - sõnumite lugemine, järjekorra lähtestamine, failist lugemine ja faili kirjutamine on tehtud ja näidatud.
Teha on jäänud vaid neli asja:
- õige vastuse saatmine päringule vestluses
- vastuse saatmine IGALE vestlusele, kuhu robot lisati
- koodi käivitamine tsüklis
- boti käivitamine Windowsi planeerijast.
Kõik need ülesanded on lihtsad ja neid saab hõlpsasti täita, lugedes dokumentatsiooni selliste parameetrite kohta nagu
Set-ExecutionPolicy Unrestricted ja -ExecutionPolicy Bypass
vormi tsükkel
$TimeToSleep = 3 # опрос каждые 3 секунды
$TimeToWork = 10 # минут
$HowManyTimes = $TimeToWork*60/$TimeToSleep # счетчик для цикла
$MainCounter = 0
for ($MainCounter=0; $MainCounter -le $HowManyTimes) {
sleep $TimeToSleep
$MainCounter ++
Aitäh kõigile, kes lugesid.
Allikas: www.habr.com
