Die sjabloon van die eenvoudigste telegrambot vir skoolkinders in graad 7-9 op Powershell

Tydens gesprekke met ’n vriendin het ek skielik vir myself uitgevind dat kinders in graad 8-10 glad nie programmering in hul skool geleer word nie. Word, Excel en al. Geen logo nie, nie eers Pascal nie, nie eers VBA vir Excel nie.

Ek was baie verbaas, het die internet oopgemaak en geklim om te lees -
Een van die take van die profielskool is om by te dra tot die opvoeding van 'n nuwe generasie wat voldoen aan die voorwaardes van die inligtingsamelewing in terme van sy vlak van ontwikkeling en leefstyl.
Hierdie kursus sal dit moontlik maak om die kennis van studente oor die basiese konstruksies van die Pascal-programmeertaal in die praktyk te konsolideer. (uit die program van een of ander gimnasium vir 2017)

Gevolglik het ek besluit om 'n paar uur te spandeer en 'n voorbeeld te skets "hoe om 'n eenvoudige bot vir skoolkinders te skep".

Onder die snit, oor hoe om nog 'n eenvoudige bot in Powershell te skryf en dit te laat werk sonder webhooks, wit IP's, toegewyde bedieners, ontplooibare virtuele masjiene in die wolk, en ander dinge - op 'n gewone tuisrekenaar met gewone Windows.

TLDR: Nog 'n vervelige artikel met grammatikale en feitelike foute, niks om te lees nie, geen humor, geen foto's.

Daar is niks nuuts in die artikel nie, omtrent alles wat vroeër geskryf is, was reeds op Habré, byvoorbeeld in artikels Instruksies: Hoe om bots in Telegram te skep и Telegram-bot vir stelseladministrateur.
Die artikel is boonop doelbewus oorbodig om nie elke keer na opvoedkundige literatuur te verwys nie. Daar is geen verwysings na bende 4, PowerShell Deep Dives, of, sê maar, The 5 Pillars of the AWS Well-Architected Framework in die teks nie.

In plaas van 'n voorwoord, kan jy oorslaan

Slaan gerus oorIn 2006 het Microsoft PowerShell 1.0 vrygestel vir wat destyds Windows XP-, Vista- en 2003-bedieners was. Op sommige maniere het dit dinge soos cmdbat-skrifte, vb-skrifte, Windows Script Host en JScript vervang.

Selfs nou kan PowerShell slegs as die volgende stap na die Logo-opsies beskou word, in plaas van Delphi (of iets ouer), wat waarskynlik steeds iewers gebruik word, ten spyte van die teenwoordigheid van siklusse, klasse, funksies, MS GUI-oproepe, integrasie met Git en so aan.

Powershell word relatief selde gebruik, jy kan dit net teëkom in die vorm van PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Desired State Configured, PowerShell-webtoegang en 'n dosyn of wat selde gebruikte programme en funksies. Miskien kry hy 'n tweede wind met die vrylating WSL2, maar dit is nie presies nie.

Powershell het ook drie groot voordele:

  1. Dit is relatief eenvoudig, daar is baie literatuur en voorbeelde daaroor, en selfs in Russies, byvoorbeeld, is 'n artikel oor Foreach uit die boek PowerShell in diepte - oor die verskil () en {}
  2. Dit kom met 'n redakteur ISE, saam met Windows gebundel. Daar is selfs 'n soort ontfouter.
  3. Van dit word maklik genoem komponente vir die bou van 'n grafiese koppelvlak.

0. Voorbereiding.

Ons sal nodig hê:

  • Windows PC (ek het Windows 10)
  • Ten minste 'n soort internettoegang (deur byvoorbeeld NAT)
  • Vir diegene wat beperkte toegang tot die telegram het - geïnstalleerde en gekonfigureerde freegate in die blaaier, in sommige moeilike gevalle, saam met Symple DNS Crypt
  • Die teenwoordigheid van 'n werkende telegramkliënt op die telefoon
  • Om die basiese beginsels te verstaan ​​- wat is 'n veranderlike, skikking, siklus.

Oopgemaak en artikels gelees - Instruksies: Hoe om bots in Telegram te skep и Telegram-bot vir stelseladministrateur

1. Kom ons skep nog 'n toetsbot.

Aangesien almal dit reeds weet, en dit reeds gebeur het, kan jy ook oorslaanSoos in die artikel hierbo genoem - Eerstens, 'n bot vir Telegram - dit is steeds 'n toepassing wat aan jou kant loop en versoeke aan die Telegram Bot API maak. Boonop is die API verstaanbaar - die bot kry toegang tot 'n spesifieke URL met parameters, en Telegram reageer met 'n JSON-voorwerp.

Verwante probleme: as jy op 'n onbekende manier 'n kode van die JSON-voorwerp neem en dit op een of ander manier stuur vir uitvoering (nie doelbewus nie), sal die kode vir jou uitgevoer word.

Die skeppingsproses word in die twee artikels hierbo beskryf, maar ek herhaal: in die telegram, maak kontakte oop, soek @botfather, vertel hom / newbot, skep 'n Botfortest12344321 bot, kom ons noem dit Mynext1234bot, en kry 'n boodskap met 'n unieke sleutel soos 1234544311:AbcDefNNNNNNNNNNNN

Hou die sleutel en moenie dit weggee nie!

Dan kan jy die bot konfigureer, byvoorbeeld, verbied om dit by groepe te voeg, maar dit is nie nodig in die eerste stappe nie.

Kom ons vra BotFather "/mybot" en maak die instellings reg as ons nie van iets hou nie.

Maak die kontakte weer oop, vind @Botfortest12344321 daar (om die soektog met @ te begin is verpligtend), klik "begin" en skryf aan die bot "/Glory to the robots". Die / teken word vereis, kwotasies is nie nodig nie.
Die bot sal natuurlik niks antwoord nie.

Kom ons kyk of die bot geskep is - maak dit oop.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNN/getMe
waar 1234544311:AbcDefNNNNNNNNNNNN die voorheen verkryde sleutel is,
en kry 'n lyn soos
{"ok":true,"result":{""}}

Ons het die eerste geheime frase (token). Nou moet ons die tweede geheime nommer uitvind - die klets-ID met die bot. Elke klets, groep, ensovoorts is individueel en het sy eie nommer (soms met 'n minus vir oop groepe). Om hierdie nommer uit te vind, moet ons die adres (waar 1234544311:NNNNNNNN jou token is) in die blaaier (dit is eintlik glad nie nodig in die blaaier nie, maar vir 'n beter begrip kan jy daarmee begin) versoek

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

en kry 'n reaksie soos

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

Ons benodig presies chat_id.

Kom ons kyk of ons handmatig na die klets kan skryf: bel die adres vanaf die blaaier

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

As jy 'n boodskap van die bot in die klets ontvang het - goed, jy gaan na die volgende stap.

So (deur die blaaier) kan jy altyd kyk waar die probleme is - jy het wanneer jy 'n skakel genereer, of iets iewers is bedek en werk nie.

Wat jy moet weet voordat jy verder lees

Telegram het verskeie tipes groepkletse (oop, geslote). Vir hierdie kletse is sommige van die funksies (byvoorbeeld ID) anders, wat soms probleme veroorsaak.

Ons sal aanvaar dat dit die einde van 2019 is, en selfs die held van ons tyd, die bekende Man-Orkestra (administrateur, prokureur, inligtingsekuriteitsbeampte, programmeerder en feitlik MVP) Evgeny V. onderskei die $i-veranderlike van 'n skikking, siklusse bemeester het, kyk jy dat jy in die volgende paar jaar Chocolatey sal bemeester, en daar om Parallelle verwerking met PowerShell и Vir elke voorwerp parallel sal kom.

1. Ons dink wat ons bot sal doen

Ek het geen idees gehad nie, ek moes dink. Ek het reeds 'n bot-notaboek geskryf. Ek wou nie 'n bot maak "wat iets iewers heen stuur nie". Om Azure te koppel, benodig jy 'n kredietkaart, maar waar kry die student dit vandaan? Daar moet kennis geneem word dat alles nie so erg is nie: die hoofwolke gee 'n soort toetsperiode gratis (maar jy benodig steeds 'n kredietkaartnommer - en dit sal daarvan afgetrek word, dit lyk asof dit 'n dollar is. Ek onthou nie as hy later terugkom.)

Sonder AI ML is dit nie so interessant om 'n moroon-poësie-bot te maak nie.

Ek het besluit om 'n bot te maak wat my (of nie my nie) sal herinner aan Engelse woorde in 'n woordeboek.
Die woordeboek, om nie met die databasis te mors nie, sal in 'n tekslêer wees en met die hand aangevul word.
In hierdie geval is die taak om die basiese beginsels by die werk te wys, en nie om ten minste 'n gedeeltelik voltooide produk te maak nie.

2. Probeer wat en hoe vir die eerste keer

Skep gids C:poshtranslate
Eerstens, laat ons kyk watter soort powershell ons het, hardloop ISE deur begin-run
powershell ise
of vind Powershell ISE in geïnstalleerde programme.
Na die bekendstelling sal die gewone bekende "een of ander redigeerder" oopmaak, as daar geen teksveld is nie, kan u altyd op "Lêer - skep nuwe" klik.

Kom ons kyk na die powershell-weergawe - skryf in die teksveld:

get-host 

en druk F5.

Powershell sal aanbied om te stoor - "The script you are about to run will be saved." Ons stem in, en stoor die lêer vanaf powershell in C: poshtranslate met die naam myfirstbotBT100.

Nadat ons begin het, kry ons 'n dataplaat in die onderste tekskassie:

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

Ek het 5.1 met iets, dit is genoeg. As jy 'n ou Windows 7/8 het, is dit in orde - alhoewel PowerShell opgedateer moet word na weergawe 5 - byvoorbeeld, instruksies.

Tik Get-Date op die opdragreël hieronder, druk Enter, kyk na die tyd, gaan na die wortelgids met die opdrag
cd
en maak die skerm skoon met die cls-opdrag (nee, jy hoef nie rm te gebruik nie)

Kom ons kyk nou wat werk en hoe - kom ons skryf nie eers kode nie, maar twee reëls, en probeer verstaan ​​wat hulle doen. Kom ons lewer kommentaar op die reël met die kry-gasheer-simbool # en voeg 'n bietjie by.

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

(Interessant. Daar is twee dosyn opsies in die kode-ontwerp-aftreklys op Habré - maar powershell is nie daar nie. Dos is. Perl is.)

En voer die kode uit deur F5 of ">" van die GUI te druk.

Ons kry die uitset:

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

Kom ons behandel hierdie twee reëls, en 'n paar interessante punte, om nie in die toekoms hierna terug te keer nie.

Anders as Pascal (en nie net nie), probeer powershell self bepaal watter tipe om aan 'n veranderlike toe te ken, meer hieroor word in die artikel geskryf Opvoedkundige program oor tik in programmeertale
Daarom, deur die $TimeNow-veranderlike op te stel en die waarde van die huidige datum en tyd (Get-Date) daaraan toe te ken, hoef ons nie te veel bekommerd te wees oor watter tipe data daar sal wees nie.

Weliswaar kan hierdie onkunde dan seermaak, maar dis later. Hieronder is 'n voorbeeld in die teks.
Kom ons kyk wat ons gekry het. Voer uit (op die opdragreël)

$TimeNow | Get-member

en kry 'n bladsy met onverstaanbare teks

Voorbeeld van onverstaanbare teks nommer 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")...                                         

Soos jy kan sien, is 'n veranderlike van tipe TypeName: System.DateTime geskep met 'n klomp metodes (in die sin van wat ons met hierdie veranderlike voorwerp kan doen) en eienskappe.

Kom ons bel $TimeNow.DayOfYear - kry die nommer van die dag in die jaar.
Kom ons bel $TimeNow.DayOfYear | Get-Member - kry TypeName: System.Int32 en 'n groep metodes.
Kom ons bel $TimeNow.ToUniversalTime() - en kry die tyd in UTC

Ontfouter

Soms gebeur dit dat jy 'n program tot op 'n sekere lyn moet uitvoer en die toestand van die program op daardie oomblik moet sien. Om dit te doen, het ISE 'n Debug-funksie - wissel breekpunt
Plaas 'n breekpunt iewers in die middel, hardloop hierdie twee lyne en kyk hoe die breuk lyk.

3. Verstaan ​​die interaksie met die Telegram-bot

Natuurlik is nog meer literatuur geskryf oor interaksie met die bot, met alle getpush, ensovoorts, maar die vraag na teorie kan as opsioneel beskou word.

In ons geval het ons nodig:

  • Leer om iets na korrespondensie te stuur
  • Leer om iets uit korrespondensie te kry

3.1 Leer om iets na korrespondensie te stuur en daaruit te ontvang

Sommige kode - deel 3

Write-output "This is part 3"
$MyToken = "1234544311:AbcDefNNNNNNNNNNNNN"
$MyChatID = "123456789"
$MyProxy = "http://1.2.3.4:5678" 

$TimeNow = Get-Date
$TimeNow.ToUniversalTime()
$ScriptDir = Split-Path $script:MyInvocation.MyCommand.Path
$BotVersion = "BT102"

$MyText01 = "Life is directed motion - " + $TimeNow

$URL4SEND = "https://api.telegram.org/bot$MyToken/sendMessage?chat_id=$MyChatID&text=$MyText01"

Invoke-WebRequest -Uri $URL4SEND

en in RF op hierdie plek kry ons die fout Kan nie aan die afgeleë bediener koppel nie.

Of ons verstaan ​​dit nie - dit hang af van die telekommunikasie-operateur en of die instaanbediener opgestel en werk
Wel - dit bly om 'n proxy by te voeg. Neem asseblief kennis - die gebruik van 'n ongeënkripteerde en oor die algemeen links instaanbediener is uiters gevaarlik vir jou gesondheid.

Die taak om 'n werkende volmag te vind is nie baie moeilik nie - die meeste van die gepubliseerde http-volmagte werk. Dit lyk of dit vir my die vyfde in 'n ry werk.

Sintaksis met instaanbediener:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

As jy 'n boodskap in jou klets met die bot ontvang het, dan is alles in orde, jy kan aanbeweeg. Indien nie, gaan voort met ontfouting.

Jy kan sien wat jou $URL4SEND-string verander in en probeer om dit in die blaaier te versoek, soos volg:

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

3.2. Ons het geleer om "iets" in die chat te skryf, nou gaan ons probeer lees

Kom ons voeg nog 4 reëls by en kyk wat binne is deur | kry-lid

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

Die interessantste gee ons

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

Kom ons kyk wat in hulle is:

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

As alles vir jou werk, sal jy 'n lang lyn kry soos:

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

Gelukkig, in die voorheen gepubliseerde artikel Telegram bot vir die stelseladministrateur, hierdie reël (ja, volgens $MyMessageGet.RawContent | kry-lid is System.String) is reeds afgebreek.

4. Verwerk die ontvangs (ons weet reeds hoe om ten minste iets te stuur)

Soos reeds geskryf hier, die nodigste lê in inhoud. Kom ons kyk noukeuriger daarna.

Kom ons skryf eers nog 'n paar frases vir die bot vanaf die webkoppelvlak of vanaf die telefoon

/message1
/message2
/message3

en kyk deur die blaaier na die adres wat in die $URLGET veranderlike gegenereer is.

Ons sal iets sien soos:

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

Wat dit is? Een of ander komplekse voorwerp uit skikkings van voorwerpe wat 'n deurboodskap-identifiseerder, kletsidentifiseerder, versendingidentifiseerder en baie inligting bevat.

Ons hoef egter nie "watter soort voorwerp dit is" te ontleed nie - 'n deel van die werk is reeds vir ons gedoen. Kom ons kyk wat binne is:

Lees ontvangde boodskappe of deel 4

Write-Host "This is part 4" <# конечно эта строка нам не нужна в итоговом тексте, но по ней удобно искать. #> 

$Content4Pars01 = ConvertFrom-Json $MyMessageGet.Content
$Content4Pars01 | Get-Member
$Content4Pars01.result
$Content4Pars01.result[0]
$Content4Pars01.result[0] | Get-Member
$Content4Pars01.result[0].update_id
$Content4Pars01.result[0].message
$Content4Pars01.result[0].message.text
$Content4Pars01.result[1].message.text
$Content4Pars01.result[2].message.text

5. Wat maak ons ​​nou daarmee

Stoor die resulterende lêer onder die naam myfirstbotBT105 of wat jy ook al wil, verander die titel en lewer kommentaar op al die kode wat reeds geskryf is

<#start comment 105 end comment 105#>

Nou moet ons besluit waar om die woordeboek te kry (wel, waar - op skyf in 'n lêer) en hoe dit sal lyk.

Natuurlik kan jy 'n groot woordeboek reg in die teks van die skrif vul, maar dit is absoluut nie die geval nie.
Daarom, kom ons kyk waarmee powershell normaalweg kan werk.
Eintlik gee hy nie om met watter lêer om te werk nie, ons gee nie om nie.
Ons het 'n keuse: txt (dit is moontlik, maar hoekom), csv, xml.
En jy kan almal sien Kom ons sien almal.
Skep klas MyVocabClassExample1 en veranderlike $MyVocabExample1
Ek let daarop dat die klas sonder $ geskryf is

'n paar kode #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

Kom ons probeer om dit na die lêers te skryf deur voorbeeldig.

Sommige kode #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

- en kry 'n fout op die reël Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2.

Wil nie byvoeg nie, ag-ag wat 'n skande.

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

Kom ons kyk wat gebeur het. Pragtige teksaansig - maar hoe om daarvan terug te voer? Voer 'n soort teksskeiers in, soos kommas?

En as gevolg hiervan, kry 'n "lêer met skeiers - kommas, komma-geskeide waardes (CSV) A STOP WAG.
#

$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 

Soos u maklik kan sien, word MS nie besonder deur logika onderskei nie, vir 'n soortgelyke prosedure word -FilePath in een geval gebruik, en -Path vir die ander.

Daarbenewens het die Russiese taal in die derde lêer verdwyn, in die vierde lêer het dit geblyk ... wel, iets het gebeur. #TYPE System.Object[] 00
# "Tel","Length","LongLength","Rank","SyncRoot","IsReadOnly","IsFixedSize","IsSynchronized"
#
Kom ons skryf dit bietjie oor:

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

Dit lyk of dit gehelp het, maar ek hou steeds nie van die formaat nie.

Ek hou veral nie daarvan dat ek nie lyne van 'n voorwerp direk in 'n lêer kan plaas nie.
Terloops, sedert ons begin skryf het na lêers, kan ons begin om die bekendstelling aan te teken? Ons het tyd as 'n veranderlike, ons kan die lêernaam stel.

Dit is waar, daar is nog niks om te skryf nie, maar jy kan dink oor hoe om die rotasie van die stompe die beste te doen.
Kom ons probeer eers xml.

sommige 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

Uitvoer na xml het goeie voordele - leesbaarheid, uitvoer van die hele voorwerp, en geen behoefte om op te voer nie.

Kom ons probeer lees xml-lêer.

Bietjie lees uit xml

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

Kom ons keer terug na die taak. Ons het 'n toetslêer geskryf, lees dit, die stoorformaat is verstaanbaar, indien nodig, kan u 'n aparte klein lêerredigeerder skryf om reëls by te voeg en uit te vee.

Laat ek jou herinner dat die taak was om 'n klein opleidingsbot te maak.

Formaat van werk: Ek stuur die "voorbeeld" opdrag na die bot, die bot stuur vir my 'n ewekansige geselekteerde woord en transkripsie, en na 10 sekondes stuur dit 'n vertaling en kommentaar. Ons weet hoe om opdragte te lees, en leer natuurlik hoe om gevolmagtigdes outomaties te kies en na te gaan, en boodskaptellers na vergetelheid terug te stel.

Kom ons maak kommentaar op alles wat voorheen opgemerk is as onnodig, maak kommentaar op die voorbeelde met txt en csv wat onnodig geword het, en stoor die lêer as weergawe B106

Ag, ja. Kom ons stuur weer iets na die bot.

6. Stuur vanaf funksies en meer

Voordat u die ontvangs verwerk, moet u die funksie maak om "ten minste iets" te stuur, behalwe vir die toetsboodskap.

Natuurlik sal ons in die voorbeeld net een stuur en net een verwerking hê, maar wat as ons dieselfde ding verskeie kere moet doen?

Dit is makliker om 'n funksie te skryf. Dus, ons het 'n veranderlike van die $MyVocabExample4AsArray-objektipe, gelees uit die lêer, as 'n reeks van twee hele elemente.
Kom ons gaan lees.

Terselfdertyd sal ons die horlosie hanteer, ons sal dit later nodig hê (in werklikheid, in hierdie voorbeeld, sal ons dit nie nodig hê nie 🙂

Sommige kode #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
}

Soos u maklik kan sien, word $MyToken en $MyChatID in die funksie opgeroep, wat vroeër hardgekodeer is.

Jy hoef dit nie te doen nie, en as $MyToken een vir elke bot is, sal $MyChatID verander na gelang van die klets.

Aangesien dit egter 'n voorbeeld is, sal ons dit vir eers ignoreer.

Aangesien $MyVocabExample4AsArray nie 'n skikking is nie, alhoewel dit baie soortgelyk is jy kan nie net vat nie vra vir sy lengte.

Weereens sal ons moet doen wat nie gedoen kan word nie - om valskerm te spring nie volgens die kode nie - om te vat en te tel

Sommige kode #6.2

$MaxRandomExample = 0 
foreach ($Obj in $MyVocabExample4AsArray) {
$MaxRandomExample ++
}
Write-Output $MaxRandomExample
$RandomExample = Get-Random -Minimum 0 -Maximum ($MaxRandomExample)
$TextForExample1 = $MyVocabExample4AsArray[$RandomExample].Original
# MyFirstFunction($TextForExample1)
# или в одну строку
# MyFirstFunction($MyVocabExample4AsArray[Get-Random -Minimum 0 -Maximum ($MaxRandomExample -1)].Example)
# Угадайте сами, какой пример легче читается посторонними людьми.

Random interessante kenmerk. Kom ons sê ons wil 0 of 1 ontvang (ons het net twee elemente in die skikking). Wanneer ons grense 0..1 stel - sal ons "1" kry?
nee - ons sal dit nie kry nie, ons het spesiaal 'n voorbeeld gegee Voorbeeld 2: Kry 'n ewekansige heelgetal tussen 0 en 99 Kry-Random - Maksimum 100
Daarom, vir 0..1, moet ons die grootte na 0..2 stel, terwyl die maksimum elementgetal = 1.

7. Verwerking van inkomende boodskappe en die maksimum lengte van die tou

Waar het ons vroeër gestop? ons het 'n ontvangde veranderlike $MyMessageGet
en die $Content4Pars01 wat daaruit verkry is, waaruit ons belangstel in die elemente van die skikking Content4Pars01.result

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

Kom ons stuur die bot /boodskap10, /boodskap11, /boodskap12, /woord en weer /woord en /hallo.
Kom ons kyk wat ons gekry het:

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

Kom ons herhaal alles wat ontvang is en stuur 'n antwoord as die boodskap / woord was
die geval van konstruk, wat sommige beskryf as as-elseif, word in powershell genoem via skakelaar. Terselfdertyd word die -wildcard-sleutel in die kode hieronder gebruik, wat heeltemal onnodig en selfs skadelik is.

Sommige kode #7.1

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

Laat ons die draaiboek 'n paar keer laat loop. Ons sal dieselfde woord twee keer kry vir elke uitvoeringspoging, veral as ons 'n fout gemaak het in die implementering van ewekansige.

Maar stop. Ons het nie weer /woord gestuur nie, hoekom word die boodskap weer verwerk?

Die tou vir die stuur van boodskappe na die bot het 'n eindige lengte (ek dink 100 of 200 boodskappe), en dit moet met die hand skoongemaak word.

Dit word natuurlik in die dokumentasie beskryf, maar dit is nodig om dit te lees!

In hierdie geval het ons die ?chat_id parameter nodig, en &timeout, &limit, &parse_mode=HTML en &disable_web_page_preview=true is nog nie nodig nie.

Dokumentasie telegram api is hier
Dit sê in Engels en wit:
Identifiseerder van die eerste opdatering wat teruggestuur moet word. Moet een groter wees as die hoogste onder die identifiseerders van voorheen ontvangde opdaterings. By verstek, opdaterings wat met die vroegste begin
onbevestigde opdatering word teruggestuur. 'n Opdatering word as bevestig beskou sodra getUpdates geroep word met 'n verreken hoër as sy update_id. Die negatiewe offset kan gespesifiseer word om opdaterings te herwin vanaf -offset-opdatering vanaf die einde van die opdateringswaglys. Alle vorige opdaterings sal vergeet word.

Kom ons kyk na:

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

Ja, en kom ons herstel - ons sal die funksie 'n bietjie herskryf. Ons het twee opsies - gee die hele boodskap aan die funksie en verwerk dit heeltemal in die funksie, of gee slegs die boodskap-ID en gooi dit weg. Byvoorbeeld, die tweede een lyk eenvoudiger.

Voorheen het ons "alle boodskappe"-navraagstring gelyk

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

en dit sal lyk

$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 

Niemand verbied jou om eers alle boodskappe te ontvang, dit te verwerk, en slegs na suksesvolle verwerking versoek onbevestig -> bevestig.

Hoekom maak dit sin om bevestiging te bel nadat alle verwerking voltooi is? Dit kan misluk in die middel van die uitvoering, en as vir die voorbeeld van 'n gratis kletsbot om 'n enkele boodskap oor te slaan, steeds niks besonders is nie, dan as jy iemand se salaris of kaarttransaksie verwerk, dan kan die resultaat erger wees.

Nog 'n paar reëls kode

$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. In plaas van 'n gevolgtrekking

Die hooffunksies - lees boodskappe, spoel die tou, lees uit 'n lêer en skryf na 'n lêer word voltooi en gewys.

Daar is net vier dinge oor om te doen:

  • die korrekte antwoord op die versoek in die klets te stuur
  • stuur 'n antwoord op ENIGE klets waar 'n bot bygevoeg is
  • kode in 'n lus uit te voer
  • begin die bot vanaf die Windows skeduleerder.

Al hierdie take is eenvoudig en maklik geïmplementeer deur die dokumentasie te lees oor parameters soos
Stel-uitvoerbeleid onbeperk en -uitvoerbeleid omseil
siklus van die vorm

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

Dankie almal vir die lees.

Bron: will.com

Voeg 'n opmerking