Template para sa simple nga telegram bot para sa mga estudyante sa grade 7-9 gamit ang Powershell

Atol sa panag-istoryahanay uban sa usa ka higala, sa kalit akong nahibal-an nga ang mga bata sa grade 8-10 sa ilang eskwelahan wala gayud tudloi ug programming. Word, Excel ug tanan. Walay logo, bisan Pascal, bisan VBA alang sa Excel.

Natingala kaayo ko, giablihan ang Internet ug nagsugod sa pagbasa -
Usa sa mga tahas sa usa ka espesyal nga eskwelahan mao ang pagpalambo sa edukasyon sa usa ka bag-ong henerasyon nga nagtagbo sa mga kondisyon sa katilingban sa impormasyon sa lebel sa kalamboan ug estilo sa kinabuhi niini.
Kini nga kurso magtugot sa mga estudyante sa pagkonsolida sa praktis sa ilang kahibalo sa mga batakang pagtukod sa Pascal programming language. (gikan sa programa sa pipila ka gymnasium alang sa 2017)

Sa katapusan, nakahukom ko nga mogahin og pipila ka oras ug mag-sketch sa usa ka pananglitan sa "unsaon paghimo og usa ka yano nga bot alang sa mga estudyante."

Ubos sa pagputol mao ang pagsulat sa laing yano nga bot sa Powershell ug himoon kini nga magtrabaho nga walay webhook, puti nga mga IP, dedikado nga mga server, gipakatap nga mga virtual machine sa panganod, ug uban pa - sa usa ka regular nga PC sa balay nga adunay regular nga Windows.

TLDR: Laing makalaay nga artikulo nga adunay mga sayop sa gramatika ug tinuod, walay mabasa, walay humor, walay mga hulagway.

Wala’y bag-o sa artikulo, hapit tanan nga gisulat kaniadto naa na sa HabrΓ©, pananglitan sa mga artikulo Mga Panudlo: Giunsa paghimo ang mga bot sa Telegram ΠΈ Telegram bot alang sa system administrator.
Dugang pa, ang artikulo tinuyo nga sobra aron dili maghisgot sa literatura sa edukasyon sa matag higayon. Walay mga pakisayran sa Gang 4, PowerShell Deep Dives o, ingnon ta, Ang 5 Pillars sa AWS Well-Architected Framework sa teksto.

Imbes nga pasiuna, mahimo nimong laktawan

Mobati nga gawasnon sa paglaktawNiadtong 2006, gipagawas sa Microsoft ang PowerShell 1.0 para sa Windows XP, Vista, ug Server 2003 kaniadto. Sa pila ka paagi, gipulihan niini ang mga butang sama sa cmdbat script, vb script, Windows Script Host ug JScript.

Bisan karon, ang PowerShell maisip lamang nga sunod nga lakang human sa mga kapilian sa Logo, imbes nga lagmit gigamit gihapon nga Delphi (o mas karaan pa), bisan pa sa presensya sa mga loop, mga klase, mga gimbuhaton, mga tawag sa MS GUI, Git integration ug sa ingon sa.

Ang Powershell kay panagsa ra nga gigamit; mahimo ra nimo kini masugatan sa porma sa PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Desired State Configuration, PowerShell Web Access ug usa ka dosena o labaw pa nga panagsa ra nga gigamit nga mga programa ug mga gimbuhaton. Tingali makakuha siya usa ka ikaduhang hangin sa pagpagawas WSL2, apan dili kini eksakto.

Ang Powershell usab adunay tulo ka dagkong bentaha:

  1. Kini mao ang medyo yano, adunay usa ka daghan sa mga literatura ug mga panig-ingnan mahitungod niini, ug bisan sa Russian, pananglitan, usa ka artikulo mahitungod sa Foreach - gikan sa libro. PowerShell sa giladmon - mahitungod sa kalainan () ug {}
  2. Mouban siya sa editor ISE, gilakip sa Windows. Adunay bisan usa ka matang sa debugger didto.
  3. Sayon ra ang pagtawag gikan niini mga sangkap alang sa pagtukod sa usa ka graphical interface.

0. Pagpangandam.

Kinahanglan nato:

  • Windows PC (naa koy Windows 10)
  • Labing menos usa ka matang sa pag-access sa Internet (pinaagi sa NAT pananglitan)
  • Alang sa mga adunay limitado nga pag-access sa telegrama - gi-install ug gi-configure ang freegate sa browser, sa pipila ka lisud nga mga kaso, kauban ang Symple DNS Crypt
  • Adunay usa ka nagtrabaho nga kliyente sa telegrama sa imong telepono
  • Ang pagsabut sa mga sukaranan - unsa ang usa ka variable, array, loop.

Gibuksan ug gibasa ang mga artikulo - Mga Panudlo: Giunsa paghimo ang mga bot sa Telegram ΠΈ Telegram bot alang sa system administrator

1. Magbuhat ta ug laing test bot.

Tungod kay nahibal-an na kini sa tanan, ug nahitabo na, mahimo usab nimo kini laktawanIngon sa gipahayag sa artikulo sa ibabaw - Una sa tanan, usa ka bot alang sa Telegram - kini usa pa ka aplikasyon nga nagdagan sa imong kiliran ug naghangyo sa Telegram Bot API. Dugang pa, klaro ang API - ang bot nag-access sa usa ka piho nga URL nga adunay mga parameter, ug ang Telegram nagtubag sa usa ka butang nga JSON.

May kalabutan nga mga problema: kung sa usa ka wala mailhi nga paagi nagkuha ka usa ka code gikan sa usa ka butang nga JSON ug sa usa ka paagi ipadala kini alang sa pagpatay (dili sa katuyoan), ang code ipatuman alang kanimo.

Ang proseso sa paglalang gihulagway sa duha ka mga artikulo sa ibabaw, apan akong gisubli: sa usa ka telegrama among giablihan ang mga kontak, pangitaon si @botfather, sultihi siya /newbot, paghimo og bot Botfortest12344321, tawga kini Mynext1234bot, ug makadawat og mensahe nga adunay talagsaong yawe sa porma 1234544311:AbcDefNNNNNNNNNNNNNNNN

Ampingi ang yawe ug ayaw ihatag!

Unya mahimo nimong i-configure ang bot, pananglitan, idili ang pagdugang niini sa mga grupo, apan sa una nga mga lakang dili kini kinahanglan.

Atong pangutan-on ang BotFather alang sa "/mybot" ug i-adjust ang mga setting kung dili ta ganahan.

Atong ablihan pag-usab ang mga kontak, pangitaa ang @Botfortest12344321 didto (kinahanglan nga sugdan ang pagpangita gamit ang @), i-klik ang "pagsugod" ug isulat sa bot "/Himaya sa mga robot." Kinahanglan ang / sign, dili kinahanglan ang mga kinutlo.
Ang bot, siyempre, dili motubag bisan unsa.

Atong susihon nga ang bot nahimo ug ablihan kini.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNN/getMe
diin ang 1234544311:AbcDefNNNNNNNNNNNNNN mao ang nadawat nga yawe kaniadto,
ug pagkuha sa usa ka string sama
{"ok":tinuod,"result":{""}}

Kita adunay unang sekreto nga hugpong sa mga pulong (timaan). Karon kinahanglan naton mahibal-an ang ikaduha nga sekreto nga numero - ang ID sa chat sa bot. Ang matag chat, grupo, ug uban pa indibidwal ug adunay kaugalingon nga numero (usahay adunay minus - alang sa bukas nga mga grupo). Aron mahibal-an kini nga numero, kinahanglan namon nga mohangyo sa browser (sa tinuud, dili gyud kinahanglan sa browser, apan alang sa usa ka mas maayo nga pagsabut mahimo ka magsugod niini) ang adres (diin 1234544311:NNNNNNNNNN ang imong timaan

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

ug makadawat ug tubag sama

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

Kinahanglan namon ang chat_id.

Atong susihon nga kita makasulat sa chat nga mano-mano: tawagan ang adres gikan sa browser

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

Kung makadawat ka usa ka mensahe gikan sa usa ka bot sa imong chat, okay, magpadayon ka sa sunod nga yugto.

Niining paagiha (pinaagi sa browser) mahimo nimong susihon kanunay kung adunay mga problema sa henerasyon sa link, o kung adunay usa ka butang nga gitago sa usa ka lugar ug wala molihok.

Unsa ang kinahanglan nimong masayran sa dili pa magpadayon sa pagbasa

Ang Telegram adunay daghang mga klase sa mga chat sa grupo (bukas, sirado). Alang niini nga mga chat, ang pipila sa mga gimbuhaton (pananglitan, id) lahi, nga usahay hinungdan sa pipila ka mga problema.

Atong isipon nga kini ang katapusan sa 2019, ug bisan ang bayani sa atong panahon, ang iladong Man-Orchestra (administrator, abogado, espesyalista sa seguridad sa impormasyon, programmer ug halos MVP) nga si Evgeniy V. nagpalahi sa $i variable gikan sa array, adunay mastered galong, tan-awa sa sunod nga magtiayon nga sa mga tuig master Chocolatey, ug unya Parallel nga pagproseso sa PowerShell ΠΈ Alang sa Matag-Buhat Parallel moabot kini.

1. Naghunahuna kami kung unsa ang buhaton sa among bot

Wala koy ideya, kinahanglan kong maghunahuna. Nakasulat na ko ug bot-notebook. Dili ko gusto nga maghimo usa ka bot "nga nagpadala usa ka butang bisan diin." Aron makonektar sa Azure kinahanglan nimo ang usa ka credit card, apan diin kini makuha sa estudyante? Kinahanglan nga matikdan nga ang tanan dili kaayo daotan: ang mga nag-unang panganod naghatag usa ka matang sa panahon sa pagsulay nga libre (apan kinahanglan nimo ang numero sa credit card - ug ingon og usa ka dolyar ang ma-debit gikan niini. Wala ko mahinumdom kung gibalik kini sa ulahi.)

Kung wala ang AI ML dili kaayo makapaikag ang paghimo sa usa ka bot-poor-poet-weaver.

Nakahukom ko nga maghimo ug bot nga magpahinumdom nako (o dili nako) sa English nga mga pulong gikan sa diksyonaryo.
Aron malikayan ang paglibak sa database, ang diksyonaryo itago sa usa ka text file ug gi-update sa mano-mano.
Sa kini nga kaso, ang tahas mao ang pagpakita sa mga sukaranan sa trabaho, ug dili paghimo labing menos usa ka bahin nga nahuman nga produkto.

2. Pagsulay sa unsa ug sa unsang paagi sa unang higayon

Magbuhat ta ug folder nga C:poshtranslate
Una, tan-awon nato kung unsa nga klase sa powershell ang naa nato, atong ilunsad ang ISE pinaagi sa start-run
powershell kay
o pangitaa ang Powershell ISE sa mga na-install nga programa.
Pagkahuman sa paglansad, ang naandan nga pamilyar nga "usa ka matang sa editor" magbukas; kung wala’y natad sa teksto, mahimo nimo kanunay i-klik ang "File - paghimo bag-o".

Atong tan-awon ang bersyon sa powershell - isulat sa text field:

get-host 

ug pindota ang F5.

Motanyag ang Powershell nga i-save - "Ang script nga imong pagdagan maluwas.", miuyon kami, ug i-save ang file gikan sa powershell nga adunay ngalan sa C: poshtranslate myfirstbotBT100.

Pagkahuman sa paglansad, sa ubos nga bintana sa teksto makakuha kami usa ka lamesa sa datos:

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

Naa koy 5.1 nga butang, igo na. Kung naa kay daan nga Windows 7/8 unya wala’y hinungdan - bisan kung kinahanglan nga i-update ang PowerShell sa bersyon 5 - pananglitan. mga instruksyon.

Type Get-Date sa command line sa ubos, pindota ang Enter, tan-awa ang oras, adto sa root folder gamit ang command
cd
ug hawanan ang screen gamit ang cls command (dili, dili nimo kinahanglan gamiton ang rm)

Karon atong susihon kung unsa ang molihok ug kung giunsa - dili naton isulat bisan ang code, apan duha ka linya, ug sulayan nga masabtan kung unsa ang ilang gibuhat. Atong i-comment ang linya nga adunay get-host nga adunay simbolo nga # ug dugangan ug gamay.

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

(Unsa ang makapaikag mao nga sa code formatting drop-down list sa HabrΓ© adunay duha ka dosena nga mga kapilian - apan Powershell wala didto. Dos anaa. Perl anaa.)

Ug atong padaganon ang code pinaagi sa pagpindot sa F5 o ">" gikan sa GUI.

Atong makuha ang mosunod nga output:

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

Karon atong tan-awon kining duha ka linya ug pipila ka makaiikag nga mga punto aron dili na kita mobalik niini sa umaabot.

Dili sama sa Pascal (ug dili lamang), ang PowerShell mismo misulay sa pagtino kung unsang klase ang i-assign sa usa ka variable; daghang mga detalye bahin niini gisulat sa artikulo Programa sa edukasyon sa pag-type sa mga programming language
Busa, pinaagi sa pagmugna ug $TimeNow nga variable ug paghatag niini sa bili sa kasamtangang petsa ug oras (Get-Date), dili na kita kinahanglang mabalaka pag-ayo kon unsa nga matang sa datos ang anaa didto.

Tinuod, kini nga pagkawalay alamag mahimong masakit sa ulahi, apan kana alang sa ulahi. Sa ubos sa teksto adunay usa ka pananglitan.
Atong tan-awon kon unsay atong nakuha. Atong i-execute (sa command line)

$TimeNow | Get-member

ug pagkuha usa ka panid sa dili masabtan nga teksto

Pananglitan sa dili masabtan nga teksto nga numero 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")...                                         

Sama sa imong makita, usa ka baryable sa tipo TypeName: System.DateTime nahimo nga adunay daghang mga pamaagi (sa diwa kung unsa ang mahimo naton sa kini nga variable nga butang) ug mga kabtangan.

Tawagan ta $TimeNow.DayOfYear β€” makuha nato ang numero sa adlaw sa tuig.
Tawagan ta $TimeNow.DayOfYear | Get-Member - atong makuha TypeName: System.Int32 ug usa ka grupo sa mga pamaagi.
Tawagan ta $TimeNow.ToUniversalTime() - ug kuhaa ang oras sa UTC

Debugger

Usahay mahitabo nga kinahanglan nga ipatuman ang usa ka programa hangtod sa usa ka linya ug tan-awa ang kahimtang sa programa nianang higayona. Alang niini nga katuyoan, ang ISE adunay function sa Debug - toggle break point
Pagbutang og breakpoint sa tunga-tunga, padagana kining duha ka linya ug tan-awa kung unsa ang hitsura sa break.

3. Pagsabot sa interaksyon sa Telegram bot

Siyempre, mas daghang literatura ang nasulat sa interaksyon sa bot, uban ang tanan nga getpush ug uban pa, apan ang isyu sa teorya mahimong isipon nga opsyonal.

Sa among kaso kini gikinahanglan:

  • Pagkat-on sa pagpadala sa usa ka butang sa sulat
  • Pagkat-on sa pagkuha sa usa ka butang gikan sa sulat

3.1 Pagkat-on sa pagpadala sa usa ka butang sa sulat ug pagdawat gikan niini

Usa ka gamay nga code - bahin 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

ug sa Russian Federation niining puntoha atong makuha ang sayup Dili makonektar sa hilit nga server.

O wala kami makadawat niini - depende sa operator sa telecom ug kung ang proxy gi-configure ug nagtrabaho
Aw, ang nahabilin mao ang pagdugang usa ka proxy. Palihug timan-i nga ang paggamit ug unencrypted ug kasagarang malimbungon nga proxy delikado kaayo sa imong panglawas.

Ang tahas sa pagpangita sa usa ka nagtrabaho nga proxy dili kaayo lisud - kadaghanan sa gipatik nga mga proxy nga http nagtrabaho. Sa akong hunahuna ang ikalima nagtrabaho alang kanako.

Syntax gamit ang proxy:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

Kung makadawat ka usa ka mensahe sa imong chat sa usa ka bot, unya maayo ang tanan, mahimo ka magpadayon. Kung dili, ipadayon ang pag-debug.

Makita nimo kung unsa ang nahimo sa imong $URL4SEND string ug sulayi ang paghangyo niini sa browser, sama niini:

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

3.2. Kami nakakat-on unsaon pagsulat "usa ka butang" sa chat, karon atong sulayan nga basahon kini

Magdugang ta ug 4 pa ka linya ug tan-awon kung unsa ang sulod pinaagi sa | pagkuha-membro

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

Ang labing makapaikag nga butang gihatag kanamo

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

Atong tan-awon kon unsa ang anaa kanila:

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

Kung ang tanan molihok alang kanimo, makakuha ka usa ka taas nga linya sama sa:

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

Maayo na lang, sa una nga gipatik nga artikulo Telegram bot alang sa system administrator kini nga linya (oo, sumala sa $MyMessageGet.RawContent | get-member mao ang System.String), na-disassemble na.

4. Iproseso ang imong nadawat (kahibalo na mi unsaon pagpadala)

Ingon sa nahisulat na dinhi, ang labing gikinahanglan nga mga butang anaa sa sulod. Atong tan-awon pag-ayo kini.

Una, magsulat kami og dugang nga mga hugpong sa mga pulong ngadto sa bot gikan sa web interface o gikan sa telepono

/message1
/message2
/message3

ug tan-awa pinaagi sa browser sa adres nga naporma sa $URLGET variable.

Atong makita ang usa ka butang sama sa:

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

Unsa ni? Pipila ka komplikado nga butang gikan sa mga han-ay sa mga butang nga adunay sulud nga end-to-end message identifier, chat identifier, pagpadala identifier ug daghang uban pang impormasyon.

Bisan pa, dili na naton kinahanglan nga mahibal-an kung unsa kini nga butang - bahin sa trabaho nahimo na alang kanato. Atong tan-awon kung unsa ang naa sa sulod:

Pagbasa sa nadawat nga mga mensahe o bahin 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. Unsay angay natong buhaton bahin niini karon?

Atong i-save ang resulta nga file ubos sa ngalan nga myfirstbotBT105 o bisan unsa nga gusto nimo, usba ang titulo ug ikomento ang tanan nga gisulat na nga code pinaagi sa

<#start comment 105 end comment 105#>

Karon kinahanglan namong magdesisyon kung asa makuha ang diksyonaryo (maayo, diin - sa disk sa usa ka file) ug kung unsa ang hitsura niini.

Siyempre, mahimo nimong isulat ang usa ka dako nga diksyonaryo diha mismo sa teksto sa script, apan kini hingpit nga tupad sa punto.
Mao nga tan-awon naton kung unsa ang normal nga magamit sa powershell.
Sa tinuud, wala niya igsapayan kung unsang file ang iyang gigamit, ug wala kami magtagad.
Naa miy pilion: txt (mahimo nimo, pero ngano), csv, xml.
Mahimo ba natong tan-awon ang tanan? Tan-awon nato ang tanan.
Magbuhat ta ug klase nga MyVocabClassExample1 ug variable $MyVocabExample1
Akong namatikdan nga ang klase gisulat nga walay $

pipila ka code #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

Atong sulayan ang pagsulat niini sa mga file gamit sample.

Pipila ka code #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

- ug nakakuha kami usa ka sayup sa linya nga Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2.

Dili siya gusto nga modugang, ah-ah, unsa nga kaulaw.

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

Tan-awon nato unsay mahitabo. Nindot nga pagtan-aw sa teksto - apan unsaon kini pag-eksport balik? Kinahanglan ba nako nga ipaila ang usa ka matang sa mga separator sa teksto, sama sa mga koma?

Ug sa katapusan makakuha ka usa ka "comma-separated values ​​​​(CSV) file A HUNTONG PAGHULAT.
#

$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 

Sama sa dali nga makita, ang MS dili labi nga mailhan sa lohika niini; alang sa parehas nga pamaagi, sa usa ka kaso -FilePath gigamit, sa lain nga -Path.

Dugang pa, sa ikatulo nga file nawala ang pinulongang Ruso, sa ikaupat nga file kini nahimo ... maayo, adunay nahitabo. #TYPE System.Object[] 00
# "Ihap","Gitas-on", "LongLength", "Ranggo", "SyncRoot",,"ReadOnly", "IsFixedSize","IsSynchronized"
#
Atong isulat pag-usab kini og gamay:

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

Morag nakatabang kini, apan dili gihapon ko ganahan sa format.

Dili ko ganahan nga dili nako mabutang ang mga linya gikan sa usa ka butang ngadto sa usa ka file direkta.
Pinaagi sa dalan, sukad nagsugod kami sa pagsulat sa mga file, mahimo ba namon nga magsugod sa pagtipig sa usa ka log sa pagsugod? Kami adunay panahon ingon usa ka variable, mahimo namon nga itakda ang ngalan sa file.

Tinuod, wala pa'y ikasulat, apan mahimo nimong hunahunaon kung giunsa ang labing maayo nga pag-rotate sa mga troso.
Atong sulayan ang xml sa pagkakaron.

Pipila ka 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

Ang pag-export sa xml adunay daghang mga bentaha - pagkabasa, pag-export sa tibuuk nga butang, ug dili kinahanglan nga maghimo usa ka uppend.

Atong sulayan basaha ang xml file.

Usa ka gamay nga pagbasa gikan sa xml

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

Balik ta sa buluhaton. Gisulat namon ang usa ka test file, gibasa kini, ang format sa pagtipig klaro, kung gikinahanglan, mahimo ka magsulat og usa ka bulag nga gamay nga editor sa file aron idugang ug tangtangon ang mga linya.

Pahinumdumi ko nimo nga ang buluhaton mao ang paghimo og gamay nga bot sa pagbansay.

Format sa trabaho: Gipadala nako ang "ehemplo" nga sugo sa bot, ang bot nagpadala kanako og usa ka random nga gipili nga pulong ug transkripsyon, ug human sa 10 ka segundo nagpadala kanako og usa ka paghubad ug komento. Nahibal-an namon kung unsaon pagbasa ang mga sugo, gusto usab namon nga mahibal-an kung giunsa ang awtomatikong pagpili ug pagsusi sa mga proxy, ug pag-reset sa mga counter sa mensahe aron makalimtan.

Atong i-uncomment ang tanan nga gikomentaryo kaniadto nga dili kinahanglan, ikomento ang dili kinahanglan nga mga pananglitan nga adunay txt ug csv, ug i-save ang file ingon nga bersyon B106

Aw oo. Magpadala kita og usa ka butang sa bot pag-usab.

6. Pagpadala gikan sa mga gimbuhaton ug uban pa

Sa wala pa iproseso ang pagdawat, kinahanglan nimo nga maghimo usa ka function alang sa pagpadala "labing menos usa ka butang" gawas sa usa ka mensahe sa pagsulay.

Siyempre, sa pananglitan adunay usa ra ka pagpadala ug usa ra ang pagproseso, apan unsa man kung kinahanglan naton buhaton ang parehas nga butang sa daghang mga higayon?

Mas sayon ​​ang pagsulat sa usa ka function. Busa, kita adunay usa ka variable sa matang butang $MyVocabExample4AsArray, basaha gikan sa file, sa porma sa usa ka han-ay sa ingon ka daghan sa duha ka mga elemento.
Magbasa ta.

Sa parehas nga oras, hisgutan namon ang orasan; kinahanglan namon kini sa ulahi (sa tinuud, sa kini nga pananglitan dili namon kinahanglan kini :)

Pipila ka code #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
}

Ingon sa dali nimong makita, ang function nagtawag sa $MyToken ug $MyChatID, nga gi-hard-code kaniadto.

Dili kinahanglan nga buhaton kini, ug kung ang $MyToken usa alang sa matag bot, nan ang $MyChatID mausab depende sa chat.

Bisan pa, tungod kay kini usa ka pananglitan, ato kining ibaliwala sa pagkakaron.

Tungod kay ang $MyVocabExample4AsArray dili usa ka laray, bisan kung kini parehas kaayo sa usa, nan dili lang nimo madala hangyoa ang gitas-on niini.

Sa makausa pa kinahanglan natong buhaton ang usa ka butang nga dili mahimo - parachute dili sumala sa code - kuhaa kini ug ihap

Pipila ka code #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 makapaikag nga bahin. Ingnon ta nga gusto namong makadawat og 0 o 1 (kami adunay duha ra ka elemento sa array). Kung magbutang ug mga utlanan 0..1, makuha ba nato ang β€œ1”?
dili - dili namo kini makuha, kami adunay usa ka espesyal nga pananglitan Panig-ingnan 2: Pagkuha og random integer tali sa 0 ug 99 Get-Random -Maximum 100
Busa, alang sa 0..1 kinahanglan natong itakda ang gidak-on nga 0..2, nga adunay maximum nga numero sa elemento = 1.

7. Pagproseso sa umaabot nga mga mensahe ug pinakataas nga gitas-on sa pila

Asa ta mihunong kanina? kami adunay nadawat nga variable nga $MyMessageGet
ug $Content4Pars01 nakuha gikan niini, diin kami interesado sa mga elemento sa Content4Pars01.result array

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

Atong ipadala ang bot /message10, /message11, /message12, /word and again /word ug /hello.
Atong tan-awon kon unsay atong nakuha:

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

Atong susihon ang tanan nga nadawat ug ipadala ang tubag kung ang mensahe mao ang / pulong
ang kaso sa pagtukod, kung unsa ang gihulagway sa uban nga kung-elseif, gitawag sa powershell pinaagi sa switch. Sa samang higayon, ang code sa ubos naggamit sa -wildcard key, nga hingpit nga wala kinahanglana ug makadaot pa.

Pipila ka code #7.1

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

Atong padaganon ang script sa makaduha. Makuha namon ang parehas nga pulong kaduha alang sa matag pagsulay sa pagpatay, labi na kung nasayop kami sa pagpatuman sa random.

Apan hunong. Wala na kami nagpadala / pulong pag-usab, busa nganong giproseso pag-usab ang mensahe?

Ang pila alang sa pagpadala sa mga mensahe sa bot adunay usa ka limitado nga gitas-on (100 o 200 nga mga mensahe, sa akong hunahuna) ug kinahanglan nga i-clear sa mano-mano.

Kini siyempre gihulagway sa dokumentasyon, apan kinahanglan nimo nga basahon kini!

Niini nga kaso, kinahanglan namo ang ?chat_id parameter, ug &timeout, &limit, &parse_mode=HTML ug &disable_web_page_preview=true wala pa gikinahanglan.

Dokumentasyon para sa ania na ang telegram api
Kini nag-ingon sa puti ug Ingles:
Identifier sa unang update nga ibalik. Kinahanglan nga mas dako sa usa kay sa pinakataas taliwala sa mga identifier sa nadawat na nga mga updates. Sa kasagaran, ang mga update nagsugod sa pinakauna
dili kumpirmado gibalik ang update. Ang usa ka update gikonsiderar nga nakumpirma sa diha nga ang getUpdates gitawag nga adunay usa ka gibug-aton mas taas nga kay sa update_id niini. Ang negatibo nga offset mahimong itakda aron makuha ang mga update sugod sa -offset update gikan sa katapusan sa mga update queue. Ang tanan nga nangaging mga update makalimtan.

Atong tan-awon ang:

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

Oo, ug among i-reset kini ug isulat pag-usab ang function sa gamay. Adunay kami duha ka kapilian - ipasa ang tibuuk nga mensahe sa function ug iproseso kini sa hingpit sa function, o ihatag lamang ang ID sa mensahe ug i-reset kini. Pananglitan, ang ikaduha nga tan-awon mas simple.

Kaniadto, ang among "tanan nga mensahe" nga string sa pangutana ingon

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

ug kini tan-awon sama sa

$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 

Wala’y nagdili kanimo nga una nga makadawat sa tanan nga mga mensahe, iproseso kini, ug pagkahuman sa malampuson nga pagproseso nga hangyo nga wala makumpirma -> gikumpirma.

Ngano nga makatarunganon ang pagtawag sa kumpirmasyon pagkahuman sa tanan nga pagproseso? Posible ang usa ka kapakyasan sa tunga-tunga sa pagpatay, ug kung alang sa panig-ingnan sa usa ka libre nga chatbot, ang pagkawala sa usa ka mensahe dili espesyal, nan kung giproseso nimo ang suweldo o transaksyon sa kard sa usa ka tawo, ang sangputanan mahimong labi ka grabe.

Pipila pa ka linya sa code

$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. Imbes nga konklusyon

Panguna nga mga gimbuhaton - pagbasa sa mga mensahe, pag-reset sa pila, pagbasa gikan sa file ug pagsulat sa file nahimo ug gipakita.

Adunay upat na lang ka butang ang nahabilin nga buhaton:

  • pagpadala sa saktong tubag sa usa ka hangyo sa chat
  • pagpadala og tubag sa BISAN unsa nga chat diin ang bot gidugang
  • pagpatuman sa code sa usa ka loop
  • paglansad sa usa ka bot gikan sa windows scheduler.

Ang tanan nga kini nga mga buluhaton yano ug dali nga mahimo pinaagi sa pagbasa sa dokumentasyon bahin sa mga parameter sama sa
Set-ExecutionPolicy Unrestricted ug -ExecutionPolicy Bypass
siklo sa porma

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

Salamat sa tanan nga nagbasa.

Source: www.habr.com

Idugang sa usa ka comment