Template per un bot di telegramma simplice per i scolari in i gradi 7-9 cù Powershell

Durante e cunversazione cù un amicu, aghju amparatu di colpu chì i zitelli in i gradi 8-10 in a so scola ùn sò micca insignati di prugrammazione. Word, Excel è tuttu. Nisun logu, nè Pascal, nè VBA per Excel.

Eru assai sorpresu, hà apertu l'Internet è hà cuminciatu à leghje -
Unu di i compiti di una scola specializata hè di prumove l'educazione di una nova generazione chì risponde à e cundizioni di a sucetà di l'infurmazione in u so livellu di sviluppu è di modu di vita.
Stu corsu permetterà à i studienti di cunsulidà in pratica a so cunniscenza di i custrutti basi di u linguaghju di prugrammazione Pascal. (da u prugramma di qualchi gimnasia per 2017)

À a fine, aghju decisu di passà un paru d'ore è sketch un esempiu di "cumu creà un bot simplice per i scolari".

Sottu u tagliu hè cumu scrive un altru bot simplice in Powershell è fà u travagliu senza webhook, IP bianchi, servitori dedicati, macchine virtuali implementate in u nuvulu, è cusì - in un PC di casa regulare cù Windows regulare.

TLDR: Un altru articulu noioso cù errori grammaticali è fattuali, nunda di leghje, senza umore, senza ritratti.

Ùn ci hè nunda di novu in l'articulu, quasi tuttu ciò chì hè scrittu prima hè digià statu nantu à Habré, per esempiu in articuli Instructions: Cumu creà bots in Telegram и Telegram bot per amministratore di sistema.
Inoltre, l'articulu hè deliberatamente redundante per ùn fà micca riferite à a literatura educativa ogni volta. Ùn ci sò micca riferimenti à Gang 4, PowerShell Deep Dives o, per dì, I 5 Pilastri di u Framework AWS Well-Architected in u testu.

Invece di una prefazione, pudete saltà

Sentite liberu di saltàIn u 2006, Microsoft hà liberatu PowerShell 1.0 per Windows XP, Vista è Server 2003. In certi modi, hà rimpiazzatu cose cum'è cmdbat scripts, vb scripts, Windows Script Host è JScript.

Ancu avà, PowerShell pò esse cunsideratu solu cum'è u prossimu passu dopu à l 'opzioni Logo, invece di u prubabilmente ancora usatu Delphi (o qualcosa di più vechje), nunustanti la prisenza di loops, classi, funzioni, MS GUI chiama, Integrazione di Git e accussì on.

Powershell hè utilizatu relativamente raramente; pudete scuntrà solu in a forma di PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Configurazione di u Statu Desiratu, Accessu Web PowerShell è una decina di prugrammi è funzioni più raramenti utilizati. Forse averà un secondu ventu cù a liberazione WSL2, ma ùn hè micca esattamente.

Powershell hà ancu trè grandi vantaghji:

  1. Hè relativamente simplice, ci hè assai letteratura è esempii nantu à questu, è ancu in russo, per esempiu, un articulu nantu à Foreach - da u libru PowerShell in prufundità - circa a diffarenza () è {}
  2. Va cun l'editore ISE, inclusu cù Windows. Ci hè ancu un tipu di debugger quì.
  3. Hè facilitu chjamà da ellu cumpunenti per custruisce una interfaccia grafica.

0. Preparazione.

Avemu bisognu:

  • PC Windows (aghju Windows 10)
  • Almenu qualchì tipu di accessu à Internet (via NAT per esempiu)
  • Per quelli chì anu accessu limitatu à u telegramma - stallatu è cunfiguratu freegate in u navigatore, in certi casi difficili, inseme cù Symple DNS Crypt
  • Avè un cliente di telegramma chì funziona in u vostru telefunu
  • Capisce i principii fundamentali - ciò chì hè una variabile, array, loop.

Apertu è leghje articuli - Instructions: Cumu creà bots in Telegram и Telegram bot per amministratore di sistema

1. Creemu un altru bot di teste.

Siccomu ognunu sapi digià questu, è hè digià accadutu, pudete ancu saltàCum'è dichjaratu in l'articulu sopra - Prima di tuttu, un bot per Telegram - hè sempre una applicazione chì funziona da u vostru latu è face richieste à l'API Telegram Bot. Inoltre, l'API hè chjaru - u bot accede à un URL specificu cù parametri, è Telegram risponde cù un oggettu JSON.

Problemi cunnessi: se in qualchì manera scunnisciuta pigliate un codice da un ughjettu JSON è in qualchì manera u mandate per l'esekzione (micca apposta), u codice serà eseguitu per voi.

U prucessu di creazione hè descrittu in dui articuli sopra, ma ripetu: in un telegramma avemu apertu cuntatti, cercate @botfather, dite à /newbot, creanu un bot Botfortest12344321, chjamate Mynext1234bot, è riceve un missaghju cù una chjave unica di u furmulariu 1234544311:AbcDefNNNNNNNNNNNNNN

Pigliate a chjave è ùn la dà micca!

Allora pudete cunfigurà u bot, per esempiu, pruibisce l'aghjunghje à i gruppi, ma in i primi passi ùn hè micca necessariu.

Dumandimu à BotFather per "/mybot" è aghjustate i paràmetri si ùn ci piace micca qualcosa.

Apermu di novu i cuntatti, truvate @Botfortest12344321 quì (hè ubligatoriu per inizià a ricerca cù @), cliccate "inizià" è scrivite à u bot "/ Gloria à i robots". U signu / hè necessariu, ùn ci hè micca bisognu di quote.
U bot, sicuru, ùn risponde micca nunda.

Cuntrollamu chì u bot hè statu creatu è apre.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNN/getMe
induve 1234544311:AbcDefNNNNNNNNNNNNNN hè a chjave ricevuta prima,
è uttene una linea cum'è
{"ok":true,"result":{""}}

Avemu a prima frasa secreta (token). Avà avemu bisognu di truvà u sicondu numeru sicretu - l'ID di u chat cù u bot. Ogni chat, gruppu, etc. hè individuale è hà u so propiu numeru (a volte cù un minus - per i gruppi aperti). Per sapè stu numeru, avemu bisognu di dumandà in u navigatore (in fatti, ùn hè micca necessariu in u navigatore, ma per un megliu capiscenu pudete principià cù ellu) l'indirizzu (induve 1234544311: NNNNNNNNNN hè u vostru token).

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

è uttene una risposta cum'è

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

Avemu bisognu di chat_id.

Cuntrollamu chì pudemu scrive à u chat manualmente: chjamate l'indirizzu da u navigatore

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

Se ricevi un missaghju da un bot in u vostru chat, va bè, andate à a tappa successiva.

Questu modu (via u navigatore) pudete sempre verificà s'ellu ci sò prublemi cù a generazione di ligami, o se qualcosa hè ammucciatu in un locu è ùn funziona micca.

Ciò chì avete bisognu di sapè prima di cuntinuà a lettura

Telegram hà parechji tippi di chat di gruppu (apertu, chjusu). Per questi chats, alcune di e funzioni (per esempiu, id) sò diverse, chì à volte causanu qualchì problema.

Assumimu chì hè a fine di l'annu 2019, è ancu l'eroi di u nostru tempu, a famosa Man-Orchestra (amministratore, avvucatu, specialista in securità di l'infurmazioni, programatore è praticamenti MVP) Evgeniy V. distingue a variàbile $i da un array. hà ammaistratu loops, fighjate in i prossimi dui anni hà maestru Chocolatey, è dopu Trattamentu parallelu cù PowerShell и Per ogni ughjettu parallelu venerà.

1. Pensemu à ciò chì u nostru bot farà

Ùn aghju micca idee, aghju avutu à pensà. Aghju digià scrittu un bot-notebook. Ùn vulia micca fà un bot "chì manda qualcosa in qualchì locu". Per cunnette à Azure avete bisognu di una carta di creditu, ma da induve u studiente l'avete? Ci hè da nutà chì tuttu ùn hè micca cusì male: i nuvuli principali dannu un tipu di periodu di prova per liberu (ma avete sempre bisognu di un numeru di carta di creditu - è pare chì un dollaru serà debitu da ellu. Ùn mi ricordu se hè stata restituita dopu.)

Senza AI ML ùn hè micca cusì interessante per fà un bot-pover-poet-weaver.

Aghju decisu di fà un bot chì mi ricurdarà (o micca) di e parolle inglesi di u dizziunariu.
Per evitari di fiddle cù a basa di dati, u dizziunariu serà guardatu in un schedariu di testu è aghjurnatu manualmente.
In questu casu, u compitu hè di mustrà i principii di u travagliu, è micca di fà almenu un pruduttu parzialmente finitu.

2. Pruvate ciò chì è cumu per a prima volta

Creemu un cartulare C:poshtranslate
Prima, vedemu chì tipu di powershell avemu, lancemu ISE via start-run
powershell ise
o truvate Powershell ISE in i prugrammi installati.
Dopu à u lanciu, u solitu familiar "qualche tipu di editore" si apre; se ùn ci hè micca un campu di testu, pudete sempre cliccà "File - creà novu".

Fighjemu a versione di powershell - scrivite in u campu di testu:

get-host 

è appughjà F5.

Powershell offre à salvà - "U script chì site per eseguisce serà salvatu.", accunsemu, è salvà u schedariu da powershell cù u nome in C: poshtranslate myfirstbotBT100.

Dopu à u lanciamentu, in a finestra di testu più bassa avemu un tavulu di dati:

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

Aghju 5.1 qualcosa, hè abbastanza. Sè vo avete un vechju Windows 7/8 allora ùn hè micca grande affare - ancu se PowerShell hà da esse aghjurnatu à a versione 5 - per esempiu. instructions.

Type Get-Date in a linea di cumanda sottu, appughjà Enter, fighjate à u tempu, andate à u cartulare radicali cù u cumandimu
cd
è sguassate u screnu cù u cumandamentu cls (no, ùn avete micca bisognu di utilizà rm)

Avà verificate ciò chì travaglia è cumu - scrivemu micca ancu u codice, ma duie linee, è pruvate à capisce ciò chì facenu. Cummentemu a linea cù get-host cù u simbulu # è aghjunghje un pocu.

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

(Ciò chì hè interessante hè chì in a lista di furmazioni di codice in Habré ci sò duie duzina d'opzioni - ma Powershell ùn hè micca. Dos hè quì. Perl hè quì.)

È corremu u codice premendu F5 o ">" da a GUI.

Avemu a seguente output:

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

Avà guardemu à sti dui linii è certi punti interessanti per ùn vultà micca in questu in u futuru.

A cuntrariu di Pascal (è micca solu), PowerShell stessu prova di determinà quale tipu d'assignà à una variabile; più dettagli nantu à questu sò scritti in l'articulu. Prugramma educativu nantu à scrive in linguaggi di prugrammazione
Dunque, creendu una variàbile $TimeNow è assignendu u valore di a data è l'ora attuale (Get-Date), ùn ci vole micca troppu preoccupatu di quale tipu di dati seranu quì.

True, sta ignuranza pò fà male dopu, ma hè per più tardi. Sottu in u testu ci sarà un esempiu.
Videmu ciò chì avemu. Eseguimu (nantu à a linea di cummanda)

$TimeNow | Get-member

è uttene una pagina di testu incomprensibile

Esempiu di testu incomprensibile numeru 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")...                                         

Comu pudete vede, una variàbile di tipu TypeName: System.DateTime hè stata creata cù una mansa di metudi (in u sensu di ciò chì pudemu fà cù questu ughjettu variabile) è pruprietà.

Chjamemu $TimeNow.DayOfYear - avemu u numeru di u ghjornu di l'annu.
Chjamemu $TimeNow.DayOfYear | Get-Member - avemu TypeName: System.Int32 è un gruppu di metudi.
Chjamemu $TimeNow.ToUniversalTime() - è uttene l'ora in UTC

Debugger

A volte succede chì hè necessariu eseguisce un prugramma finu à una certa linea è vede u statu di u prugramma in quellu mumentu. Per questu scopu, ISE hà una funzione Debug - toggle break point
Mettite un puntu di rottura in un locu à mezu à mezu, eseguite queste duie linee è vede ciò chì pare a pausa.

3. Capisce l'interazzione cù u bot Telegram

Di sicuru, ancu più letteratura hè stata scritta nantu à l'interazzione cù u bot, cù tutti i getpush è cusì, ma u prublema di a teoria pò esse cunsideratu opzione.

In u nostru casu hè necessariu:

  • Amparate à mandà qualcosa in currispundenza
  • Amparate à ottene qualcosa da a corrispondenza

3.1 Amparate à mandà qualcosa in currispundenza è riceve da ellu

Un pocu codice - parte 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

è in a Federazione Russa à questu puntu avemu l'errore Unable to connect to the remote server.

O ùn avemu micca ricevutu - dipende di l'operatore di telecomunicazione è se u proxy hè cunfiguratu è funziona
Ebbè, tuttu ciò chì resta hè di aghjunghje un proxy. Per piacè nutate chì l'usu di un proxy non criptatu è generalmente fraudulente hè estremamente periculosu per a vostra salute.

U compitu di truvà un proxy di travagliu ùn hè micca assai difficiule - a maiò parte di i proxy http publicati funzionanu. Pensu chì u quintu hà travagliatu per mè.

Sintaxi cù proxy:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

Se ricevi un missaghju in u vostru chat cun un bot, allora tuttu hè bè, pudete passà. Se no, cuntinuà a debugging.

Pudete vede ciò chì a vostra stringa $URL4SEND diventa è pruvate à dumandà in u navigatore, cum'è questu:

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

3.2. Avemu amparatu à scrive "qualcosa" in u chat, avà pruvemu di leghje

Aghjunghjemu 4 linee più è vede ciò chì ci hè à traversu | uttene un membru

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

A cosa più interessante hè furnita à noi

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

Videmu ciò chì ci hè in elli:

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

Se tuttu funziona per voi, uttene una longa linea cum'è:

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

Fortunatamente, in l'articulu publicatu prima Telegram bot per l'amministratore di sistema sta linea (iè, sicondu $MyMessageGet.RawContent | get-member hè System.String), hè digià statu disassemblatu.

4. Prucessa ciò chì riceve (sapemu digià cumu mandà qualcosa)

Cum'è digià scrittu ccà, e cose più necessarie si trovanu in u cuntenutu. Fighjemu un ochju più vicinu.

Prima, scriveremu un paru di frasi più à u bot da l'interfaccia web o da u telefunu

/message1
/message2
/message3

è fighjate à traversu u navigatore à l'indirizzu chì hè statu furmatu in a variabile $URLGET.

Videremu qualcosa cum'è:

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

Chì ghjè ? Qualchì ughjettu cumplessu da arrays di oggetti chì cuntenenu un identificatore di messagiu end-to-end, identificatore di chat, identificatore di mandatu è assai altre informazioni.

Tuttavia, ùn avemu micca bisognu di capisce "chì tipu d'ughjettu hè questu" - una parte di u travagliu hè digià fattu per noi. Videmu ciò chì ci hè dentru:

Leghje i missaghji ricevuti o parte 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. Chì duvemu fà avà ?

Salvemu u schedariu resultanti sottu u nome myfirstbotBT105 o ciò chì ti piace di più, cambiate u titulu è cummentate tuttu u codice digià scrittu via

<#start comment 105 end comment 105#>

Avà avemu bisognu di decide induve uttene u dizziunariu (bene, induve - nantu à u discu in un schedariu) è ciò chì parerà.

Di sicuru, pudete scrive un dizziunariu enormu ghjustu in u testu di u script, ma questu hè cumplettamente fora di u puntu.
Allora vedemu ciò chì Powershell pò travaglià nurmale.
In generale, ùn importa micca u schedariu per travaglià, ùn ci importa micca.
Avemu una scelta: txt (pudete, ma perchè), csv, xml.
Pudemu guardà tutti ?
Creemu una classa MyVocabClassExample1 è una variabile $MyVocabExample1
Aghju nutatu chì a classa hè scritta senza $

qualchì codice #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

Pruvemu di scrive questu in i schedari usendu campione.

Qualchì codice #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

- è avemu un errore nantu à a linea Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2.

Ùn vole micca aghjunghje, ah-ah, chì vergogna.

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

Videmu ciò chì succede. Ottima vista di testu - ma cumu si esporta torna? Deve intruduce qualchì tipu di separatori di testu, cum'è virgule?

È à a fine uttene un "file di valori separati da virgola (CSV) A STOP WAIT.
#

$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 

Comu hè faciule di vede, MS ùn hè micca particularmente distintu da a so logica; per una prucedura simili, in un casu -FilePath hè utilizatu, in un altru -Path.

Inoltre, in u terzu schedariu, a lingua russa hè sparita, in u quartu schedariu hè risultatu ... bè, qualcosa hè accadutu. #TYPE System.Object[] 00
# "Count", "Length", "LongLength", "Rank", "SyncRoot", "IsReadOnly", "IsFixedSize", "IsSynchronized"
#
Riscrivimu un pocu:

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

Sembra avè aiutatu, ma ùn mi piace ancu u furmatu.

In particulare ùn mi piace micca chì ùn possu micca mette linee da un ughjettu in un schedariu direttamente.
A propositu, postu chì avemu cuminciatu à scrive à i schedari, pudemu cumincià à mantene un logu di startup? Avemu u tempu cum'è una variabile, pudemu stabilisce u nome di u schedariu.

True, ùn ci hè nunda di scrive ancu, ma pudete pensà à cumu megliu per rotà i logs.
Pruvemu xml per avà.

Certi 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

L'esportazione in xml hà assai vantaghji - leghjibilità, esportazione di l'ughjettu sanu, è ùn hè micca bisognu di fà un uppend.

Pruvate leghje u schedariu xml.

Un pocu di lettura da xml

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

Riturnemu à u compitu. Avemu scrittu un schedariu di teste, leghjite, u formatu di almacenamentu hè chjaru, se ne necessariu, pudete scrive un editore di fugliale separatu per aghjunghje è sguassà e linee.

Lasciami ricurdà chì u compitu era di fà un picculu bot di furmazione.

Formatu di travagliu: Mandu u cumandamentu "esempiu" à u bot, u bot mi manda una parolla è una trascrizzione aleatoriamente selezziunate, è dopu à 10 seconde mi manda una traduzzione è un cumentu. Sapemu cumu leghje cumandamenti, ci piacerebbe ancu amparà à selezziunà automaticamente è cuntrollà i proxy, è resettanu i contatori di messagi à l'obliu.

Scommentemu tuttu ciò chì hà cummentatu prima cum'è innecessariu, cummentate l'esempii avà innecessarii cù txt è csv, è salvà u schedariu cum'è versione B106

Oh iè. Mandemu qualcosa à u bot di novu.

6. Dispatch da e funzioni è più

Prima di trasfurmà a ricezione, avete bisognu di creà una funzione per mandà "almenu qualcosa" altru ch'è un missaghju di prova.

Di sicuru, in l'esempiu averemu solu un mandatu è un solu trasfurmazioni, ma chì s'ellu ci vole à fà a stessa cosa parechje volte?

Hè più faciule per scrive una funzione. Cusì, avemu una variàbbili di tipu oggettu $MyVocabExample4AsArray, lettu da u schedariu, in a forma di un array di quant'è dui elementi.
Andemu à leghje.

À u listessu tempu, avemu da trattà cù u clock; avemu bisognu dopu (in fattu, in questu esempiu ùn avemu micca bisognu :)

Qualchì codice #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
}

Comu pudete vede facilmente, a funzione chjama $MyToken è $MyChatID, chì eranu codificati prima.

Ùn ci hè bisognu di fà questu, è se $MyToken hè unu per ogni bot, allora $MyChatID cambierà secondu u chat.

Tuttavia, postu chì questu hè un esempiu, l'ignoreremu per avà.

Siccomu $MyVocabExample4AsArray ùn hè micca un array, ancu s'ellu hè assai simili à unu, allora ùn pudete micca solu piglià dumandà a so durata.

Una volta avemu da fà qualcosa chì ùn si pò fà - parachute micca secondu u codice - pigliate è cuntate

Qualchì codice #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 caratteristica interessante. Diciamu chì vulemu riceve 0 o 1 (avemu solu dui elementi in l'array). Quandu stabilisce e fruntiere 0..1, averemu "1"?
no - ùn l'avemu micca, avemu un esempiu speciale Esempiu 2: Ottene un interu aleatoriu trà 0 è 99 Get-Random -Maximu 100
Dunque, per 0..1 avemu bisognu di stabilisce a dimensione 0..2, cù u numeru massimu di elementi = 1.

7. Trattamentu di i missaghji ricevuti è a lunghezza massima di a fila

Induve avemu firmatu prima ? avemu a variabile ricevuta $MyMessageGet
è $Content4Pars01 ottenutu da ellu, di quale avemu interessatu in l'elementi di l'array Content4Pars01.result.

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

Mandemu u bot /message10, /message11, /message12, /word è dinò /word è /hello.
Videmu ciò chì avemu:

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

Andemu per tuttu ciò chì hè ricevutu è mandà una risposta se u messagiu era /parola
u casu di custruzzione, ciò chì certi descrive cum'è if-elseif, hè chjamatu in powershell via l'interruttore. À u listessu tempu, u codice sottu usa a chjave -wildcard, chì hè cumplettamente inutile è ancu dannusu.

Qualchì codice #7.1

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

Eseguimu u script un paru di volte. Averemu a stessa parolla duie volte per ogni tentativu di esecutivu, soprattuttu se avemu fattu un sbagliu in l'implementazione di casuale.

Ma ferma. Ùn avemu micca mandatu / parola di novu, allora perchè u missaghju hè trattatu di novu?

A fila per mandà missaghji à u bot hà una durata finita (100 o 200 missaghji, pensu) è deve esse sbulicatu manualmente.

Questu hè di sicuru descrittu in a ducumentazione, ma avete da leghje!

In questu casu, avemu bisognu di u paràmetru ?chat_id, è &timeout, &limit, &parse_mode=HTML è &disable_web_page_preview=true ùn sò micca bisognu.

Documentazione per Telegram api hè quì
Si dice in biancu è in inglese:
Identificatore di a prima aghjurnazione da esse restituita. Deve esse più grande di unu di u più altu trà l'identificatori di l'aghjurnamenti ricevuti prima. Per automaticamente, l'aghjurnamenti cumincianu cù i primi
micca cunfirmata l'aghjurnamentu sò tornati. Un aghjurnamentu hè cunsideratu cunfirmatu appena getUpdates hè chjamatu cù un offset Lingua cà u so update_id. L'offset negativu pò esse specificatu per ricuperà l'aghjurnamenti partendu da -offset update da a fine di a fila di l'aghjurnamenti. Tutte l'aghjurnamenti precedenti saranu scurdati.

Fighjemu:

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

Iè, è l'avemu resettatu è riscrive a funzione un pocu. Avemu duie opzioni - passà u missaghju tutale à a funzione è u processà sanu sanu in a funzione, o dà solu l'ID di missaghju è resettate. Per esempiu, u sicondu pare più simplice.

Prima, a nostra stringa di dumanda "tutti i missaghji" pareva

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

è parerà

$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 

Nimu ùn vi pruibisce di riceve prima tutti i missaghji, li processà, è solu dopu a dumanda di trasfurmazioni successu unconfirmed -> cunfirmata.

Perchè hè sensu di chjamà a cunferma dopu chì tuttu u prucessu hè finitu? Un fallimentu hè pussibule in u mità di l'esekzione, è se per l'esempiu di un chatbot gratuitu, manca un missaghju unicu ùn hè nunda di spiciale, allora si tratta di u salariu o di a transazzione di carta di qualcunu, u risultatu pò esse peghju.

Un paru di più linee di codice

$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. Invece di una cunclusione

Funzioni basi - lettura di missaghji, resetting fila, lettura da u schedariu è scrive à u schedariu sò fatti è mostra.

Ci sò solu quattru cose da fà:

  • mandendu a risposta curretta à una dumanda in chat
  • mandendu una risposta à ANY chat à quale u bot hè statu aghjuntu
  • esecutà codice in un ciclu
  • lanciari un bot da u pianificatore di Windows.

Tutti issi compiti sò sèmplice è ponu esse facirmenti rializatu da leghje a ducumentazione circa paràmetri cum'è
Set-ExecutionPolicy Unrestricted è -ExecutionPolicy Bypass
ciclu di a forma

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

Grazie à tutti quelli chì leghje.

Source: www.habr.com

Add a comment