Powershell erabiliz 7-9 mailetako eskola-umeentzako telegram bot soil baterako txantiloia

Lagun batekin elkarrizketetan, bat-batean jakin nuen beren ikastetxeko 8.-10. mailetako haurrei ez zaiela programatzen batere irakasten. Word, Excel eta guzti. Ez logotiporik, ezta Pascal ere, ezta Excel-erako VBA ere.

Oso harrituta geratu nintzen, Internet ireki eta irakurtzen hasi nintzen -
Eskola espezializatu baten eginkizunetako bat da informazioaren gizartearen garapen mailan eta bizimoduan dituen baldintzak betetzen dituen belaunaldi berri baten heziketa sustatzea.
Ikastaro honek Pascal programazio-lengoaiaren oinarrizko konstruktuei buruzko ezagutzak praktikan finkatzeko aukera emango die ikasleei. (2017rako gimnasio batzuen programatik)

Azkenean, ordu pare bat pasatzea eta "eskola-umeentzako bot sinple bat nola sortu" adibide bat zirriborratzea erabaki nuen.

Ebakiaren azpian Powershell-en beste bot soil bat nola idatzi eta webhook, IP zuririk, zerbitzari dedikaturik, hodeian zabaldutako makina birtualak eta abar gabe funtziona dezan, Windows ohikoa duen etxeko ordenagailu arrunt batean.

TLDR: Beste artikulu aspergarri bat akats gramatikal eta faktikoekin, ezer irakurtzeko, umorerik, irudirik gabe.

Artikuluan ez dago berritasunik, aurretik idatzitako ia guztia HabrΓ©-n dago jada, artikuluetan adibidez Argibideak: nola sortu bot-ak Telegram-en ΠΈ Telegram bot sistema administratzailearentzat.
Gainera, artikulua nahita erredundantea da, aldi bakoitzean hezkuntza-literatura ez aipatzeko. Testuan ez dago Gang 4, PowerShell Deep Dives edo, esate baterako, The 5 Pillars of the XNUMX Pillars of the AWS Well-Architected Framework.

Hitzaurrearen ordez, salta dezakezu

Ez zaitez saltatzeko2006an, Microsoft-ek PowerShell 1.0 kaleratu zuen orduan Windows XP, Vista eta Server 2003rako. Nolabait, cmdbat scriptak, vb scripts, Windows Script Host eta JScript bezalako gauzak ordezkatu zituen.

Orain ere, PowerShell Logotipoaren aukeren ondorengo hurrengo urrats gisa soilik har daiteke, seguruenik oraindik erabiltzen den Delphiren ordez (edo zaharragoa den zerbait), begiztak, klaseak, funtzioak, MS GUI deiak egon arren, Git integrazioa eta abar.

Powershell nahiko gutxitan erabiltzen da; PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Desired State Configuration moduan bakarrik topa dezakezu. PowerShell Web Sarbidea eta gutxitan erabiltzen diren dozena bat programa eta funtzio gehiago. Agian bigarren haizea aterako du askatzearekin WSL2, baina ez da zehazki.

Powershell-ek ere hiru abantaila handi ditu:

  1. Nahiko sinplea da, literatura eta adibide asko dago horri buruz, eta errusieraz ere, adibidez, Foreach-i buruzko artikulu bat - liburutik PowerShell sakonean - () eta {} diferentziari buruz
  2. Editorearekin doa ISE, Windows-ekin barne. Arazte moduko bat ere badago hor.
  3. Bertatik deitzea erraza da interfaze grafikoa eraikitzeko osagaiak.

0. Prestaketa.

Beharko dugu:

  • Windows PC (Windows 10 dut)
  • Gutxienez, Interneteko sarbideren bat (NAT bidez adibidez)
  • Telegramerako sarbide mugatua dutenentzat - arakatzailean freegate instalatuta eta konfiguratuta, kasu zail batzuetan, Symple DNS Crypt-ekin batera
  • Telegram bezero bat zure telefonoan lan egitea
  • Oinarrizkoak ulertzea: zer den aldagaia, array, begizta.

Artikuluak ireki eta irakurri - Argibideak: nola sortu bot-ak Telegram-en ΠΈ Telegram bot sistema administratzailearentzat

1. Sor dezagun beste test bot bat.

Guztiek jadanik ezagutzen dutenez, eta dagoeneko gertatu denez, salta dezakezuGoiko artikuluan esan bezala - Lehenik eta behin, Telegramentzako bot bat - oraindik zure alboan exekutatzen ari den eta Telegram Bot APIari eskaerak egiten dizkion aplikazio bat da. Gainera, APIa argia da: bot-ak URL zehatz batera sartzen du parametroekin, eta Telegramek JSON objektu batekin erantzuten du.

Lotutako arazoak: modu ezezagun batean JSON objektu batetik kode bat hartzen baduzu eta nolabait exekutatzeko bidaltzen baduzu (ez nahita), kodea exekutatuko zaizu.

Sortze-prozesua goiko bi artikulutan azaltzen da, baina errepikatzen dut: telegrama batean kontaktuak irekitzen ditugu, @botfather bilatzen dugu, /newbot esan, Botfortest12344321 bot bat sortu, Mynext1234bot deitu eta mezu bat jasotzen dugu. 1234544311 inprimakia:AbcDefNNNNNNNNNNNNNN

Zaindu giltza eta ez eman!

Ondoren, bot-a konfiguratu dezakezu, adibidez, taldeetan gehitzea debekatu, baina lehen urratsetan ez da beharrezkoa.

Eskatu diezaiogun BotFatherri β€œ/mybot” eta doi diezaiogun ezarpenak zerbait gustatzen ez bazaigu.

Ireki ditzagun berriro kontaktuak, aurkitu han @Botfortest12344321 (nahitaezkoa da bilaketa @-rekin hastea), egin klik "hasi" eta idatzi bot-ari "/ Glory to the robots". / ikurra beharrezkoa da, komatxoak ez dira behar.
Botak, noski, ez du ezer erantzungo.

Egiaztatu bot-a sortu dela eta ireki dezagun.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNN/getMe
non 1234544311:AbcDefNNNNNNNNNNNNNN den aldez aurretik jasotako gakoa,
eta lortu bezalako lerro bat
{"ok":true,"result":{""}}

Lehen esaldi sekretua (token) dugu. Orain bigarren zenbaki sekretua aurkitu behar dugu: bot-arekin txataren IDa. Txat, talde eta abar bakoitza banakakoa da eta bere zenbakia du (batzuetan minus batekin - talde irekietarako). Zenbaki hau ezagutzeko, nabigatzailean eskatu behar dugu (hain zuzen ere, nabigatzailean ez da batere beharrezkoa, baina hobeto ulertzeko berarekin has zaitezke) helbidea (non 1234544311:NNNNNNNNNN den zure tokena).

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

eta jaso bezalako erantzuna

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

Chat_id behar dugu.

Egiaztatu dezagun txatean eskuz idatz dezakegula: deitu helbidera nabigatzailetik

https://api.telegram.org/botΠ²Π°ΡˆΡ‚ΠΎΠΊΠ΅Π½/sendMessage?chat_id=123456789&text="Life is directed motion"

Zure txatean bot baten mezu bat jasotzen baduzu, ados, hurrengo fasera pasatuko zara.

Horrela (nabigatzailearen bidez) beti egiaztatu ahal izango duzu esteken sorreran arazoak dauden ala ez, edo zerbait nonbait ezkutatuta dagoen eta funtzionatzen ez duen.

Irakurtzen jarraitu aurretik jakin behar duzuna

Telegramek hainbat talde-txat mota ditu (irekiak, itxiak). Txat hauetarako, funtzio batzuk (adibidez, id) desberdinak dira, eta horrek zenbaitetan arazo batzuk eragiten ditu.

Demagun 2019 amaiera dela, eta baita gure garaiko heroia ere, Man-Orchestra ezaguna (administratzailea, abokatua, informazioaren segurtasuneko espezialista, programatzailea eta ia MVP) Evgeniy V.-k $i aldagaia array batetik bereizten du, begiztak menderatu ditu, begiratu hurrengo bi urteetan Chocolatey menderatuko du, eta gero PowerShell-ekin prozesatzea paraleloan ΠΈ Objektu Bakoitzerako Paraleloa etorriko da.

1. Gure bot-ak zer egingo duen pentsatzen dugu

Ez nuen ideiarik, pentsatu behar nuen. Dagoeneko idatzi dut bot-koaderno bat. Ez nuen "zerbait norabait bidaltzen duen" bot bat egin nahi. Azurera konektatzeko kreditu-txartel bat behar duzu, baina nondik lortzen du ikasleak? Kontuan izan behar da dena ez dagoela hain gaizki: hodei nagusiek nolabaiteko proba-epea ematen dute doan (baina hala ere kreditu-txartelaren zenbakia behar duzu - eta badirudi dolar bat zordunduko dela. Ez dut gogoratzen ala ez. geroago itzuli zen.)

AI ML gabe ez da hain interesgarria bot-pobre-poeta-ehule bat egitea.

Hiztegiko ingelesezko hitzak gogoraraziko dizkidan (edo ez niri) bot bat egitea erabaki nuen.
Datu-basearekin nahastea saihesteko, hiztegia testu-fitxategi batean gordeko da eta eskuz eguneratuko da.
Kasu honetan, lanaren oinarriak erakustea da zeregina, eta ez gutxienez partzialki amaitutako produktu bat egitea.

2. Zer eta nola probatzen lehen aldiz

Sortu dezagun C:poshtranslate karpeta bat
Lehenik eta behin, ikus dezagun zer nolako powershell dugun, abiarazi dezagun ISE start-run bidez
powershell ise
edo aurkitu Powershell ISE instalatutako programetan.
Abiarazi ondoren, ohiko "editore motaren bat" irekiko da; testu-eremurik ez badago, beti egin dezakezu klik "Fitxategia - sortu berria".

Ikus dezagun powershell-en bertsioa - idatzi testu eremuan:

get-host 

eta sakatu F5.

Powershell-ek gordetzea eskainiko du - "Exekutatu behar duzun script-a gordeko da.", onartzen dugu eta gorde fitxategia powershell-etik C-en izenarekin: poshtranslate myfirstbotBT100.

Abiarazi ondoren, beheko testu-leihoan datu-taula bat jasoko dugu:

Name             : Windows PowerShell ISE Host
Version          : 5.1.(ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅)

5.1 zerbait daukat, nahikoa da. Windows 7/8 zaharra baduzu, ez da gauza handirik - PowerShell 5 bertsiora eguneratu beharko den arren - adibidez. argibideak.

Idatzi Get-Date beheko komando lerroan, sakatu Sartu, begiratu ordua, joan erroko karpetara komandoarekin
cd
eta garbitu pantaila cls komandoarekin (ez, ez duzu rm erabili behar)

Orain egiazta dezagun zer funtzionatzen duen eta nola - idatzi ez kodea ere, bi lerro baizik, eta saiatu zer egiten duten ulertzen. Iruzkin dezagun get-host-ekin # ikurra duen lerroa eta gehitu apur bat.

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ шаблона Π±ΠΎΡ‚Π° 
# get-host
<# это ΠΏΡ€ΠΈΠΌΠ΅Ρ€ многострочного коммСнтария #>
$TimeNow = Get-Date
$TimeNow

(Interesgarria da HabrΓ©-ko kodea formateatzeko goitibeherako zerrendan bi dozena aukera daudela, baina Powershell ez dago. Dos dago. Perl dago.)

Eta exekutatu dezagun kodea GUItik F5 edo ">" sakatuz.

Irteera hau lortzen dugu:

Saturday, December 8, 2019 21:00:50 PM (ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‚ΠΈΠΏΠ°)

Ikus ditzagun orain bi lerro hauek eta puntu interesgarri batzuk, etorkizunean horretara itzuli ez gaitezen.

Pascal ez bezala (eta ez bakarrik), PowerShell bera aldagai bati zer mota esleitu zehazten saiatzen da; honi buruzko xehetasun gehiago artikuluan idatzita daude. Programazio-lengoaietan idazteari buruzko hezkuntza-programa
Horregatik, $TimeNow aldagai bat sortuz eta uneko data eta orduaren balioa (Get-Date) esleituz, ez dugu gehiegi kezkatu behar zer datu mota egongo den.

Egia da, ezjakintasun horrek gero min egin dezake, baina hori gerorako da. Behean testuan adibide bat egongo da.
Ea zer lortu dugun. Exekutatu dezagun (komando-lerroan)

$TimeNow | Get-member

eta lortu testu ulertezinaren orrialde bat

1 zenbakiko testu ulertezinaren adibidea

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")...                                         

Ikus dezakezunez, TypeName motako aldagai bat sortu da: System.DateTime metodo eta propietate mordo batekin (objektu aldagai honekin egin dezakegunaren zentzuan).

Deitu dezagun $TimeNow.DayOfYear β€” urteko egunaren zenbakia lortzen dugu.
Deitu dezagun $TimeNow.DayOfYear | Get-Member - lortzen dugu TypeName: System.Int32 eta metodo talde bat.
Deitu dezagun $TimeNow.ToUniversalTime() - eta lortu ordua UTCn

Arazketa

Batzuetan gertatzen da programa bat lerro jakin batera exekutatu behar dela eta une horretan programaren egoera ikustea. Horretarako, ISEk Debug funtzioa du - eten-puntua txandakatu
Jarri eten puntu bat erdian nonbait, exekutatu bi lerro hauek eta ikusi etenaldia nolakoa den.

3. Telegram bot-arekin duen interakzioa ulertzea

Jakina, oraindik literatura gehiago idatzi da bot-arekin elkarrekintzan, getpush guztiekin eta abarrekin, baina teoriaren gaia aukeran har daiteke.

Gure kasuan beharrezkoa da:

  • Ikasi korrespondentzian zerbait bidaltzen
  • Ikasi korrespondentziatik zerbait lortzen

3.1 Korrespondentzian zerbait bidaltzen eta bertatik jasotzen ikastea

Kode txiki bat - 3. zatia

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

eta Errusiako Federazioan une honetan errorea jasoko dugu Ezin da urruneko zerbitzariarekin konektatu.

Edo ez dugu jasotzen - telekomunikazio-operadorearen araberakoa da eta proxya konfiguratuta eta funtzionatzen duen ala ez
Beno, proxy bat gehitzea besterik ez da geratzen. Kontuan izan zifratu gabeko eta, oro har, iruzurrezko proxy bat erabiltzea oso arriskutsua dela zure osasunerako.

Laneko proxy bat aurkitzeko zeregina ez da oso zaila - argitaratutako http proxy gehienek funtzionatzen dute. Uste dut bosgarrena funtzionatu zidala.

Sintaxia proxy erabiliz:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

Bot batekin txatean mezu bat jasotzen baduzu, dena ondo dago, aurrera egin dezakezu. Hala ez bada, jarraitu arazketan.

Zure $URL4SEND katea zertan bihurtzen den ikus dezakezu eta saiatu arakatzailean eskatzen, honela:

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

3.2. Txatean β€œzerbait” idazten ikasi genuen, orain saia gaitezen irakurtzen

Gehitu ditzagun beste 4 lerro eta ikus dezagun zer dagoen barruan | lortu-kide

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

Interesgarriena eskaintzen zaigu

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

Ikus dezagun zer dagoen haietan:

Write-Host "ParsedHtml"
$MyMessageGet.ParsedHtml # Ρ‚ΡƒΡ‚ интСрСсноС
Write-Host "RawContent"
$MyMessageGet.RawContent # ΠΈ Ρ‚ΡƒΡ‚ интСрСсноС, Π½ΠΎ Π΅Ρ‰Π΅ ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΈ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠ΅. 
Write-Host "Content"
$MyMessageGet.Content

Dena zuretzat funtzionatzen baduzu, honelako lerro luze bat jasoko duzu:

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

Zorionez, aurretik argitaratutako Telegram bot-en sistema-administratzaileentzako lerro hau (bai, $MyMessageGet.RawContent |-ren arabera get-member System.String da), dagoeneko desmuntatu da.

4. Jasotzen duzuna prozesatu (dagoeneko badakigu zerbait nola bidali)

Dagoeneko idatzita dagoen bezala Hemen, gauzarik beharrezkoenak edukietan daude. Ikus dezagun hurbilagotik.

Lehenik eta behin, esaldi pare bat gehiago idatziko dizkiogu bot-ari web interfazetik edo telefonotik

/message1
/message2
/message3

eta begiratu arakatzailean $URLGET aldagaian eratutako helbidean.

Horrelako zerbait ikusiko dugu:

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

Zer da hau? Mezu-identifikatzailea, txat-identifikatzailea, bidalketa-identifikatzailea eta beste informazio asko dituzten objektu-matrizetako objektu konplexu batzuk.

Hala ere, ez dugu asmatu behar "zer motatako objektua den hau" - lanaren zati bat dagoeneko egin zaigu. Ikus dezagun zer dagoen barruan:

Jasotako mezuak edo 4. zatia irakurtzea

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. Zer egin beharko genuke orain?

Gorde dezagun lortutako fitxategia myfirstbotBT105 izenarekin edo nahi duzuna, aldatu izenburua eta iruzkin ezazu dagoeneko idatzitako kode guztia bidez.

<#start comment 105 end comment 105#>

Orain hiztegia non lortu (beno, non - fitxategi batean diskoan) eta nolakoa izango den erabaki behar dugu.

Noski, hiztegi handi bat idatz dezakezu gidoiaren testuan bertan, baina hori guztiz alboan dago.
Beraz, ikus dezagun zerekin lan egin dezakeen Powershell-ek normalean.
Orokorrean, berdin dio zein fitxategirekin lan egin, berdin zaigu.
Aukera dugu: txt (ahal duzu, baina zergatik), csv, xml.
Denak ikus ditzakegu?Ikus ditzagun denak.
Sortu dezagun MyVocabClassExample1 klase bat eta $MyVocabExample1 aldagai bat
Klasea $ gabe idatzita dagoela ohartzen naiz

#5 kode batzuk

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

Saia gaitezen hau fitxategietan idazten erabiliz lagina.

Kode batzuk #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

- eta errore bat jasoko dugu Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2 lerroan.

Ez du gehitu nahi, ah-ah, zer pena.

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

Ea zer gertatzen den. Testu ikuspegi bikaina, baina nola esportatu berriro? Testu-bereizle mota batzuk sartu behar al ditut, komak adibidez?

Eta azkenean "komaz bereizitako balioak (CSV) A fitxategia lortzen duzu GELDITU Itxaron.
#

$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 

Erraz ikusten denez, MS ez da bere logikagatik bereizten; antzeko prozedura baterako, kasu batean -FilePath erabiltzen da, beste batean -Path.

Gainera, hirugarren fitxategian errusiar hizkuntza desagertu zen, laugarren fitxategian... ba, zerbait gertatu zen. #TYPE Sistema.Objektua[] 00
# "Zenbaketa", "Luzera", "Luzera Luzea", "Halakuntza", "SyncRoot", "Irakurtzeko bakarrik dago", "Tamaina finkoa da", "Sinkronizatuta dago"
#
Berridatzi dezagun pixka bat:

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

Badirudi lagundu duela, baina oraindik ez zait formatua gustatzen.

Batez ere ez zait gustatzen objektu batetik lerroak fitxategi batean zuzenean jarri ezin ditudala.
Bide batez, fitxategietan idazten hasi ginenetik, has al gaitezke abiarazteen erregistroa mantentzen? Denbora aldagai gisa dugu, fitxategiaren izena ezarri dezakegu.

Egia da, oraindik ez dago ezer idazteko, baina erregistroak nola biratu hobekien pentsatu dezakezu.
Saia gaitezen xml oraingoz.

xml batzuk

$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-ra esportatzeak abantaila asko ditu: irakurgarritasuna, objektu osoa esportatzea eta ez dago aldaketarik egin beharrik.

Saia gaitezen irakurri xml fitxategia.

Irakurketa txiki bat xml-tik

$MyFilenameExample06 = $ScriptDir + "Example06.xml"
$MyVocabExample4AsArray = Import-Clixml -Path $MyFilenameExample06
# $MyVocabExample4AsArray 
# $MyVocabExample4AsArray[0]
# ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… Π½ΡŽΠ°Π½ΡΠ°Ρ…. Powershell врСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π²Π΅Π΄Π΅Ρ‚ сСбя Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ ΠΊΠ°ΠΊ Π±Ρ‹ стоило Π±Ρ‹ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π±Ρ‹.
# Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρƒ мСня эти Π΄Π²Π° Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ
# Write-Output $MyVocabExample4AsArray 
# write-host $MyVocabExample4AsArray 

Itzuli gaitezen zereginera. Proba-fitxategi bat idatzi dugu, irakurri, biltegiratze formatua argia da, beharrezkoa izanez gero, aparteko fitxategi-editore txiki bat idatzi dezakezu lerroak gehitzeko eta ezabatzeko.

Gogorarazten dizut zeregina prestakuntza-bot txiki bat egitea zela.

Lan-formatua: "adibidea" komandoa bidaltzen diot bot-ari, bot-ak ausaz hautatutako hitza eta transkripzioa bidaltzen dizkit, eta 10 segundoren buruan itzulpena eta iruzkina bidaltzen dizkit. Komandoak irakurtzen badakigu, proxyak automatikoki hautatzen eta egiaztatzen eta mezuen kontagailuak ahanzturara berrezartzen ere ikasi nahiko genuke.

Utzi iruzkindu aldez aurretik komentatu zen guztia, iruzkin ditzagun orain beharrezkoak ez diren adibideak txt eta csv-ekin eta gorde fitxategia B106 bertsio gisa.

O bai. Bidal diezaiogun zerbait berriro bot-ari.

6. Funtzioetatik eta gehiago bidaltzea

Harrera prozesatu aurretik, proba mezu bat ez den "gutxienez zerbait" bidaltzeko funtzio bat sortu behar duzu.

Jakina, adibidean bidalketa bakarra eta prozesamendu bakarra izango dugu, baina gauza bera hainbat aldiz egin behar badugu?

Funtzio bat idaztea errazagoa da. Beraz, $MyVocabExample4AsArray objektu motako aldagai bat dugu, fitxategitik irakurrita, bi elementuko array moduan.
Goazen irakurtzera.

Aldi berean, erlojuarekin arituko gara; geroago beharko dugu (hain zuzen ere, adibide honetan ez dugu beharko :)

Kode batzuk #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
}

Erraz ikusten duzunez, funtzioak $MyToken eta $MyChatID deitzen ditu, lehenago kodetuta zeudenak.

Ez dago hori egin beharrik, eta $MyToken bot bakoitzeko bat bada, $MyChatID txataren arabera aldatuko da.

Hala ere, adibide bat denez, oraingoz ez dugu aintzat hartuko.

$MyVocabExample4AsArray ez denez array bat, nahiz eta baten oso antzekoa den, orduan ezin duzu bakarrik hartu eskatu bere luzera.

Berriro ere egin ezin den zerbait egin beharko dugu - paraxuta ez kodearen arabera - hartu eta zenbatu

Kode batzuk #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 ezaugarri interesgarria. Demagun 0 edo 1 jaso nahi dugula (matrizean bi elementu baino ez ditugu). 0..1 mugak ezartzean, β€œ1” lortuko dugu?
ez - ez dugu lortuko, adibide berezi bat dugu 2. adibidea: Lortu ausazko zenbaki oso bat 0 eta 99 artean Lortu-Ausazko -Gehienez 100
Beraz, 0..1-rako 0..2 tamaina ezarri behar dugu, elementu-zenbaki maximoa = 1 izanik.

7. Jasotzen diren mezuen tratamendua eta ilararen gehienezko luzera

Non gelditu ginen lehenago? jasotako $MyMessageGet aldagaia dugu
eta hortik lortutako $Content4Pars01, eta horietatik Content4Pars01.result array-aren elementuak interesatzen zaizkigu

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

Bidal ditzagun bot /message10, /message11, /message12, /word eta berriro /word eta /kaixo.
Ea zer lortu dugun:

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

Ikus dezagun jasotako guztia eta bidali erantzuna mezua /hitza bada
konstrukzioaren kasua, batzuek if-elseif bezala deskribatzen dutena, powershell-en deitzen da etengailu bidez. Aldi berean, beheko kodeak -komodina gakoa erabiltzen du, guztiz beharrezkoa ez dena eta baita kaltegarria ere.

Kode batzuk #7.1

Write-Output "This is part 7"
Foreach ($Result in $Content4Pars01.result) # Π”Π°, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ быстрСС 
 { 
    switch -wildcard ($Result.message.text) 
            {
            "/word" {MyFirstFunction($TextForExample1)}
            }
}

Exekutatu dezagun gidoia pare bat aldiz. Exekuzio saiakera bakoitzeko hitz bera bi aldiz lortuko dugu, batez ere ausazko ezarpenean akatsen bat egin badugu.

Baina gelditu. Ez dugu /word berriro bidali, beraz, zergatik prozesatzen ari da mezua berriro?

Botari mezuak bidaltzeko ilarak luzera mugatua du (100 edo 200 mezu, nire ustez) eta eskuz garbitu behar da.

Hori dokumentazioan azaltzen da noski, baina irakurri egin behar duzu!

Kasu honetan, ?chat_id parametroa behar dugu, eta &timeout, &limit, &parse_mode=HTML eta &disable_web_page_preview=true ez dira behar oraindik.

Horretarako dokumentazioa telegram APIa hemen dago
Zuriz eta ingelesez dio:
Itzuli beharreko lehen eguneraketaren identifikatzailea. Aurretik jasotako eguneratzeen identifikatzaileen artean altuena baino bat handiagoa izan behar du. Lehenespenez, eguneraketak goiztiarrenetik hasten dira
baieztatu gabe eguneratzea itzultzen dira. Eguneratze bat berretsitzat jotzen da getUpdates deitzen den bezain laster konpentsatzeko handiagoa bere update_id baino. Desplazamendu negatiboa zehaztu daiteke eguneraketak -offset eguneratzetik hasita eguneratze-ilararen amaieratik berreskuratzeko. Aurreko eguneratze guztiak ahaztuko dira.

Ikus ditzagun:

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

Bai, eta berrezarri eta funtzioa pixka bat berridatziko dugu. Bi aukera ditugu: mezu osoa funtziora pasa eta guztiz prozesatu funtzioan, edo mezuaren IDa bakarrik eman eta berrezarri. Adibidez, bigarrenak sinpleagoa dirudi.

Aurretik, gure "mezu guztiak" kontsulta-kateak itxura zuen

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

eta itxura izango du

$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 

Inork ez dizu debekatzen lehenik mezu guztiak jasotzea, prozesatzea eta prozesatzeko eskaera berretsi gabe -> berretsi ondoren soilik.

Zergatik du zentzuzkoa prozesamendu guztia amaitu ondoren berrespena deitzea? Exekuzioaren erdian hutsegite bat posible da, eta doako chatbot baten adibiderako, mezu bakar bat galtzea ez bada ezer berezirik, norbaiten soldata edo txartelaren transakzioa prozesatzen ari bazara, emaitza okerragoa izan daiteke.

Kode lerro pare bat gehiago

$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. Ondorio baten ordez

Oinarrizko funtzioak: mezuak irakurtzea, ilara berrezartzea, fitxategitik irakurtzea eta fitxategira idaztea egin eta erakusten dira.

Lau gauza baino ez dira geratzen egiteko:

  • txatean eskaera bati erantzun zuzena bidaltzea
  • erantzun bat bidaltzea bot-a gehitu zaion EDOZEIN txatetara
  • kodea begizta batean exekutatzen
  • bot bat abiarazi Windows-en programatzailetik.

Zeregin hauek guztiak sinpleak dira eta erraz bete daitezke parametroei buruzko dokumentazioa irakurriz
Set-ExecutionPolicy Unrestricted eta -ExecutionPolicy Bypass
formaren zikloa

$TimeToSleep = 3 # опрос ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 3 сСкунды
$TimeToWork = 10 # ΠΌΠΈΠ½ΡƒΡ‚
$HowManyTimes = $TimeToWork*60/$TimeToSleep # счСтчик для Ρ†ΠΈΠΊΠ»Π°
$MainCounter = 0
for ($MainCounter=0; $MainCounter -le $HowManyTimes) {
sleep $TimeToSleep
$MainCounter ++

Eskerrik asko irakurri duzuen guztioi.

Iturria: www.habr.com

Gehitu iruzkin berria