Modèl pou yon robot telegram senp pou timoun lekòl nan klas 7yèm-9yèm ane ki sèvi ak Powershell

Pandan konvèsasyon ak yon zanmi, toudenkou mwen te aprann ke timoun nan klas 8-10 nan lekòl yo pa yo te anseye pwogram nan ditou. Word, Excel ak tout bagay. Pa gen logo, pa menm Pascal, pa menm VBA pou Excel.

Mwen te sezi anpil, mwen te louvri entènèt la epi mwen te kòmanse li -
Одна из задач профильной школы – содействовать воспитанию нового поколения, отвечающего по своему уровню развития и образу жизни условиям информационного общества.
Kou sa a pral pèmèt elèv yo konsolide an pratik konesans yo nan konstriksyon debaz langaj pwogramasyon Pascal la. (nan pwogram kèk jimnazyòm pou 2017)

Nan fen a, mwen deside pase yon koup de èdtan epi trase yon egzanp sou "ki jan yo kreye yon bot senp pou timoun lekòl."

Anba koupe a se ki jan yo ekri yon lòt bot senp nan Powershell epi fè li travay san yon webhook, IP blan, serveurs dedye, deplwaye machin vityèl nan nwaj la, ak sou sa - sou yon PC lakay regilye ak Windows regilye.

TLDR: Yon lòt atik raz ak erè gramatikal ak reyalite, pa gen anyen pou li, pa gen imè, pa gen foto.

Pa gen anyen nouvo nan atik la, prèske tout sa ki ekri anvan yo te deja sou Habré, pa egzanp nan atik Enstriksyon: Ki jan yo kreye bots nan Telegram и Telegram bot pou administratè sistèm.
Более того, статья специально избыточна, чтобы не ссылаться каждый раз на учебную литературу. Никаких отсылок на банду 4, PowerShell Deep Dives или скажем The 5 Pillars of the AWS Well-Architected Framework в тексте нет.

Olye de yon prefas, ou ka sote

Ou lib pou soteAn 2006, Microsoft te pibliye PowerShell 1.0 pou Windows XP, Vista, ak Server 2003. Nan kèk fason, li ranplase bagay tankou cmdbat scripts, vb scripts, Windows Script Host ak JScript.

Menm kounye a, PowerShell ka sèlman konsidere kòm pwochen etap la apre opsyon yo Logo, olye pou yo pwobableman toujou itilize Delphi a (oswa yon bagay ki pi gran), malgre prezans nan bouk, klas, fonksyon, rele MS GUI, Git entegrasyon ak sou sa.

Powershell yo itilize relativman raman; ou ka rankontre li sèlman nan fòm PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Desired State Configuration, Aksè Web PowerShell ak yon douzèn oswa plis raman itilize pwogram ak fonksyon. Petèt li pral jwenn yon dezyèm van ak lage a WSL2, men se pa egzakteman.

Powershell tou gen twa gwo avantaj:

  1. Li se relativman senp, gen yon anpil nan literati ak egzanp sou li, e menm nan Ris, pou egzanp, yon atik sou Foreach - soti nan liv la. PowerShell an pwofondè - sou diferans lan () ak {}
  2. Li ale ak editè a ISE, enkli ak Windows. Genyen menm kèk kalite debugger la.
  3. Li fasil pou rele soti nan li eleman pou bati yon koòdone grafik.

0. Preparasyon.

Nou pral bezwen:

  • Windows PC (mwen gen Windows 10)
  • Omwen kèk kalite aksè entènèt (via NAT pou egzanp)
  • Для тех, у кого ограничен доступ к телеграмму — установленный и настроенный freegate в браузере, в некоторых сложных случаях совместно с Symple DNS Crypt
  • Gen yon kliyan telegram k ap travay sou telefòn ou
  • Konprann Basics yo anpil - ki sa yon varyab, etalaj, bouk se.

Louvri ak li atik - Enstriksyon: Ki jan yo kreye bots nan Telegram и Telegram bot pou administratè sistèm

1. Ann kreye yon lòt bot tès.

Depi tout moun deja konnen sa a, epi li te deja rive, ou ka sote li touJan sa di nan atik ki anwo a - Premye a tout, yon bot pou Telegram - li se toujou yon aplikasyon ki kouri sou bò ou ak fè demann nan Telegram Bot API a. Anplis, API a klè - bot la jwenn aksè nan yon URL espesifik ak paramèt, ak Telegram reponn ak yon objè JSON.

Pwoblèm ki gen rapò: si nan kèk fason enkoni ou pran kèk kòd nan yon objè JSON epi yon jan kanmenm voye li pou ekzekisyon (pa fè espre), kòd la pral egzekite pou ou.

Pwosesis kreyasyon an dekri nan de atik pi wo a, men mwen repete: nan yon telegram nou louvri kontak, chèche @botfather, di li /newbot, kreye yon bot Botfortest12344321, rele li Mynext1234bot, epi resevwa yon mesaj ki gen yon kle inik nan fòm 1234544311:AbcDefNNNNNNNNNNNNNN

Pran swen kle a epi pa bay li ale!

Lè sa a, ou ka configured bot la, pou egzanp, entèdi ajoute li nan gwoup, men nan premye etap yo sa a pa nesesè.

Ann mande BotFather pou "/mybot" epi ajiste anviwònman yo si nou pa renmen yon bagay.

Ann ouvri kontak yo ankò, jwenn @Botfortest12344321 la (li obligatwa pou kòmanse rechèch la ak @), klike sou "kòmanse" epi ekri bot la "/Glory to the robots." Siy / a obligatwa, quotes pa bezwen.
Bot la, nan kou, pa pral reponn anyen.

Ann tcheke si bot la te kreye epi ouvri li.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNN/getMe
kote 1234544311:AbcDefNNNNNNNNNNNNNN se kle yo te resevwa anvan an,
и получим строку вида
{"ok":true,"result":{""}}

Nou gen premye fraz sekrè a (jeton). Koulye a, nou bezwen chèche konnen dezyèm nimewo sekrè a - ID chat la ak bot la. Chak chat, gwoup, elatriye se endividyèl epi li gen nimewo pwòp li yo (pafwa ak yon mwens - pou gwoup ouvè). Pou jwenn nimewo sa a, nou bezwen mande nan navigatè a (an reyalite, li pa nesesè ditou nan navigatè a, men pou yon pi bon konpreyansyon ou ka kòmanse avèk li) adrès la (kote 1234544311:NNNNNNNNNN se siy ou a).

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

epi jwenn yon repons like

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

Nou bezwen chat_id.

Ann tcheke ke nou ka ekri nan chat la manyèlman: rele adrès la nan navigatè a

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

Si ou resevwa yon mesaj nan men yon bot nan chat ou a, oke, ou ale nan pwochen etap la.

Nan fason sa a (via navigatè a) ou ka toujou tcheke si gen pwoblèm ak jenerasyon an lyen, oswa si yon bagay kache yon kote epi li pa travay.

Ki sa ou bezwen konnen anvan ou kontinye lekti

Telegram gen plizyè kalite gwoup chat (ouvè, fèmen). Pou chat sa yo, kèk nan fonksyon yo (pa egzanp, id) diferan, ki pafwa lakòz kèk pwoblèm.

Будем считать, что на дворе конец 2019 года, и даже герой нашего времени, широкоизвестный Человек-Оркестр (администратор, юрист, инфобезопасник, программист и практически MVP) Евгений В. отличает переменную $i от массива, освоил циклы, глядишь в следующие пару лет освоит Chocolatey, а там и до Pwosesis paralèl ak PowerShell и Pou Chak-Objè Paralèl li pral vini.

1. Думаем, чего же будет делать наш бот

Mwen pa t gen okenn lide, mwen te oblije panse. Mwen deja ekri yon kaye bot. Mwen pa t 'vle fè yon bot "ki voye yon bagay yon kote." Pou konekte ak Azure ou bezwen yon kat kredi, men ki kote elèv la jwenn li? Li ta dwe remake ke tout bagay se pa tèlman mal: nyaj prensipal yo bay kèk kalite peryòd tès pou gratis (men ou toujou bezwen yon nimewo kat kredi - epi li sanble tankou yon dola pral debite nan men li. Mwen pa sonje si li te retounen pita.)

San AI ML li pa tèlman enteresan fè yon bot-pòv-powèt-weaver.

Mwen deside fè yon bot ki pral raple m '(oswa pa mwen) nan mo angle ki soti nan diksyonè a.
Pou evite jwe ak baz done a, diksyonè a pral estoke nan yon dosye tèks epi mete ajou manyèlman.
Nan ka sa a, travay la se montre Basics yo nan travay la, epi yo pa fè omwen yon pwodwi ki pasyèlman fini.

2. Eseye ki sa ak ki jan pou premye fwa

Ann kreye yon katab C:poshtranslate
Premyèman, ann wè ki kalite powershell nou genyen, ann lanse ISE atravè start-run
powershell ise
или найдем Powershell ISE в установленных программах.
После запуска откроется обычный привычный «какой то там редактор», если текстового поля не будет, то всегда можно нажать «File — create new».

Ann gade nan vèsyon an nan powershell - ekri nan jaden an tèks:

get-host 

epi peze F5.

Powershell pral ofri pou konsève pou - "Script la ou pral kouri pral sove." Nou dakò, epi sove fichye a nan Powershell ak non an nan C: poshtranslate. myfirstbotBT100.

Apre lansman, nan fenèt tèks ki pi ba a nou jwenn yon tab done:

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

У меня 5.1 с чем-то, этого достаточно. Если у вас старый Windows 7/8, то ничего страшного — хотя PowerShell необходимо обновить до версии 5 — например, по enstriksyon.

Tape Get-Date nan liy kòmand ki anba a, peze Antre, gade lè a, ale nan katab la rasin ak lòd la.
cd
epi netwaye ekran an ak lòd cls la (non, ou pa bezwen sèvi ak rm)

Koulye a, kite a tcheke sa ki travay ak ki jan - se pou yo ekri pa menm kòd la, men de liy, epi eseye konprann sa yo fè. Ann fè kòmantè liy lan ak get-host ak senbòl # a epi ajoute yon ti kras.

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

(Ki sa ki enteresan se ke nan lis deroulant fòma kòd sou Habré gen de douzèn opsyon - men Powershell pa la. Dos la la. Perl la.)

Epi ann kouri kòd la pa peze F5 oswa ">" nan entèfas la.

Nou jwenn pwodiksyon sa a:

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

Koulye a, ann gade nan de liy sa yo ak kèk pwen enteresan pou nou pa retounen nan sa a nan lavni.

Kontrèman ak Pascal (e pa sèlman), PowerShell tèt li ap eseye detèmine ki kalite yo bay yon varyab; plis detay sou sa yo ekri nan atik la. Pwogram edikatif sou sezisman nan langaj pwogramasyon
Se poutèt sa, lè nou kreye yon varyab $TimeNow epi bay li valè dat ak lè aktyèl la (Get-Date), nou pa bezwen enkyete twòp sou ki kalite done yo pral la.

Se vre, inyorans sa a ka fè mal pita, men sa a pou pita. Anba a nan tèks la pral gen yon egzanp.
Ann wè sa nou jwenn. Ann egzekite (sou liy lòd la)

$TimeNow | Get-member

epi jwenn yon paj tèks enkonpreyansib

Egzanp tèks nimewo 1 enkonpreyansib

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

Kòm ou ka wè, yo te kreye yon varyab nan kalite TypeName: System.DateTime ak yon pakèt metòd (nan sans sa nou ka fè ak objè sa a varyab) ak pwopriyete.

Ann rele $TimeNow.DayOfYear - nou jwenn nimewo jou nan ane a.
Ann rele $TimeNow.DayOfYear | Get-Member - nou jwenn TypeName: System.Int32 ak yon gwoup metòd.
Ann rele $TimeNow.ToUniversalTime() - epi jwenn lè a nan UTC

Debugger

Pafwa li rive ke li nesesè pou egzekite yon pwogram jiska yon sèten liy epi wè eta a nan pwogram nan nan moman sa a. Pou rezon sa a, ISE gen yon fonksyon Debug - toggle break point
Mete yon pwen rupture yon kote nan mitan an, kouri de liy sa yo epi wè kisa repo a sanble.

3. Konprann entèraksyon ak bot Telegram la

Natirèlman, menm plis literati yo te ekri sou entèraksyon ak bot la, ak tout getpush ak sou sa, men pwoblèm nan nan teyori ka konsidere opsyonèlman.

Nan ka nou an li nesesè:

  • Aprann voye yon bagay nan korespondans
  • Aprann jwenn yon bagay nan korespondans

3.1 Aprann voye yon bagay nan korespondans epi resevwa nan men li

Yon ti kòd - pati 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

ak nan Federasyon Larisi la nan pwen sa a nou jwenn erè a Pa kapab konekte ak sèvè a aleka.

Oswa nou pa resevwa li - depann sou operatè telecom la ak si wi ou non proxy a se configuré ak travay
Oke, tout sa ki rete se ajoute yon prokurasyon. Tanpri sonje ke lè w sèvi ak yon prokurasyon ki pa ankode epi jeneralman fwod se trè danjere pou sante w.

Travay la pou jwenn yon proxy k ap travay pa trè difisil - pi fò nan piblikasyon http proxy yo travay. Mwen panse ke senkyèm lan te travay pou mwen.

Sentaks lè l sèvi avèk proxy:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

Si ou resevwa yon mesaj nan chat ou a ak yon bot, Lè sa a, tout bagay anfòm, ou ka kontinye. Si ou pa, kontinye debogaj.

Ou ka wè kisa kòd $URL4SEND ou a tounen epi eseye mande li nan navigatè a, tankou sa a:

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

3.2. Писать «что-то» в чат мы научились, теперь попробуем читать

Ann ajoute 4 lòt liy epi wè sa ki andedan nan | jwenn-manm

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

Bagay ki pi enteresan an bay nou

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

Ann wè sa ki nan yo:

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

Si tout bagay ap travay pou ou, w ap jwenn yon liy long tankou:

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

Erezman, nan atik ki te pibliye deja Telegram bot pou administratè sistèm liy sa a (wi, dapre $MyMessageGet.RawContent | get-manm se System.String), te deja demonte.

4. Pwosesis sa ou resevwa (nou deja konnen kijan pou voye yon bagay)

Kòm deja ekri isit la, bagay ki pi nesesè yo kouche nan kontni. Ann pran yon gade pi pre nan li.

Premyèman, nou pral ekri yon koup plis fraz sou bot la soti nan koòdone entènèt la oswa nan telefòn nan

/message1
/message2
/message3

epi gade nan navigatè a adrès ki te fòme nan varyab $URLGET la.

Nou pral wè yon bagay tankou:

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

Ki sa li ye? Gen kèk objè konplèks ki soti nan etalaj objè ki gen yon idantifyan mesaj fen-a-fen, idantifyan chat, idantifyan voye ak yon anpil lòt enfòmasyon.

Sepandan, nou pa bezwen konnen "ki kalite objè sa a" - yon pati nan travay la deja fèt pou nou. Ann wè sa ki anndan an:

Lekti mesaj ou resevwa oswa pati 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. Kisa nou ta dwe fè pou sa kounye a?

Ann sove fichye a ki ka lakòz anba non myfirstbotBT105 oswa kèlkeswa sa ou renmen pi byen, chanje tit la epi fè kòmantè sou tout kòd ki deja ekri a atravè

<#start comment 105 end comment 105#>

Koulye a, nou bezwen deside ki kote yo ka resevwa diksyonè a (byen, ki kote - sou disk nan yon dosye) ak ki sa li pral sanble.

Natirèlman, ou ka ekri yon diksyonè gwo dwa nan tèks la nan script la, men sa a se konplètman akote pwen an.
Se konsa, kite a wè ki sa Powershell ka travay ak nòmalman.
An jeneral, li pa pran swen ki fichye pou travay avèk, li pa enpòtan pou nou.
Nou gen yon chwa: txt (ou kapab, men poukisa), csv, xml.
Èske nou ka gade tout moun?Ann wè tout moun.
Ann kreye yon klas MyVocabClassExample1 ak yon varyab $MyVocabExample1
Mwen sonje ke klas la ekri san $

немного кода #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

Ann eseye ekri sa a nan dosye lè l sèvi avèk egzanplè.

Gen kèk kòd #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

- epi nou jwenn yon erè sou liy Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2.

Li pa vle ajoute, ah-ah, sa yon wont.

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

Ann wè sa k ap pase. Gwo gade tèks - men ki jan yo ekspòte li tounen? Èske mwen ta dwe prezante kèk kalite separasyon tèks, tankou vigil?

Epi nan fen a ou jwenn yon "valè separe vigil (CSV) fichye A SISPANN TANN.
#

$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 

Kòm se fasil wè, MS pa patikilyèman distenge pa lojik li yo; pou yon pwosedi menm jan an, nan yon ka -FilePath yo itilize, nan yon lòt -Path.

Anplis de sa, nan twazyèm dosye a lang Ris te disparèt, nan katriyèm dosye a li te tounen soti ... byen, yon bagay ki te pase. #TYPE System.Object[] 00
# "Konte", "Length", "LongLength", "Rank", "SyncRoot", "IsReadOnly", "IsFixedSize", "Issynchronized"
#
Ann reekri li yon ti kras:

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

Li sanble te ede, men mwen toujou pa renmen fòma a.

Mwen espesyalman pa renmen ke mwen pa ka mete liy ki soti nan yon objè nan yon dosye dirèkteman.
By wout la, depi nou te kòmanse ekri nan dosye, èske nou ka kòmanse kenbe yon boutèy demi lit demaraj? Nou gen tan kòm yon varyab, nou ka mete non an fichye.

Se vre, pa gen anyen yo ekri ankò, men ou ka panse sou ki jan pi bon Thorne mòso bwa yo.
Ann eseye xml pou kounye a.

Gen kèk 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

Ekspòte nan xml gen anpil avantaj - lizibilite, ekspòtasyon nan tout objè a, epi pa bezwen fè yon uppend.

Ann eseye li fichye xml.

Yon ti lekti soti nan xml

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

Ann retounen nan travay la. Nou te ekri yon dosye tès, li li, fòma depo a klè, si sa nesesè, ou ka ekri yon ti editè dosye separe pou ajoute ak efase liy.

Kite m raple w ke travay la se te fè yon ti bot fòmasyon.

Fòma travay: Mwen voye lòd "egzanp" nan bot la, bot la voye m 'yon mo chwazi owaza ak transkripsyon, epi apre 10 segonn voye m' yon tradiksyon ak kòmantè. Nou konnen ki jan yo li kòmandman, nou ta renmen tou aprann ki jan yo otomatikman chwazi ak tcheke proxy, ak reset kontè mesaj nan oubli.

Ann retire tout bagay ki te fè kòmantè yo pa nesesè, kòmante egzanp ki pa nesesè yo ak txt ak csv, epi sove fichye a kòm vèsyon B106.

Oh, wi. Ann voye yon bagay nan bot la ankò.

6. Dispatch soti nan fonksyon ak plis ankò

Anvan ou trete resepsyon an, ou bezwen kreye yon fonksyon pou voye "omwen yon bagay" ki pa yon mesaj tès.

Natirèlman, nan egzanp lan nou pral gen yon sèl voye ak yon sèl pwosesis, men e si nou bezwen fè menm bagay la plizyè fwa?

Li pi fasil pou ekri yon fonksyon. Se konsa, nou gen yon varyab nan kalite objè $MyVocabExample4AsArray, li nan fichye a, nan fòm lan nan yon etalaj de otan de eleman.
Ann ale li.

An menm tan an, nou pral fè fas ak revèy la; nou pral bezwen li pita (an reyalite, nan egzanp sa a nou pa pral bezwen li :)

Gen kèk kòd #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
}

Kòm ou ka fasilman wè, fonksyon an rele $MyToken ak $MyChatID, ki te difisil-kode pi bonè.

Pa gen okenn bezwen fè sa, epi si $MyToken se youn pou chak bot, Lè sa a, $MyChatID ap chanje depann sou chat la.

Sepandan, depi sa a se yon egzanp, nou pral inyore li pou kounye a.

Depi $MyVocabExample4AsArray se pa yon etalaj, byenke li sanble anpil ak youn, lè sa a ou pa ka jis pran li mande longè li.

Yon fwa ankò nou pral oblije fè yon bagay ki pa ka fè - parachit pa dapre kòd la - pran li epi konte

Gen kèk kòd #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 karakteristik enteresan. Ann di nou vle resevwa 0 oswa 1 (nou gen sèlman de eleman nan etalaj la). Lè nou fikse limit 0..1, èske n ap jwenn "1"?
non - nou pa pral jwenn li, nou gen yon egzanp espesyal Egzanp 2: Jwenn yon nonb antye relatif ant 0 ak 99 Jwenn-O aza -Maksimòm 100
Se poutèt sa, pou 0..1 nou bezwen mete gwosè a 0..2, ak nimewo a eleman maksimòm = 1.

7. Обработка пришедших сообщений и максимальная длина очереди

Ki kote nou te kanpe pi bonè? nou gen varyab resevwa $MyMessageGet
ak $Content4Pars01 jwenn nan li, nan ki nou enterese nan eleman yo nan Content4Pars01.result etalaj la

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

Ann voye bot la /message10, /message11, /message12, /word epi ankò /word ak /hello.
Ann wè sa nou jwenn:

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

Ann ale nan tout sa nou resevwa epi voye yon repons si mesaj la te / mo
ka a nan konstwi, sa kèk dekri kòm si-elseif, yo rele nan powershell atravè switch. An menm tan an, kòd ki anba a sèvi ak kle a -wildcard, ki se konplètman nesesè e menm danjere.

Gen kèk kòd #7.1

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

Выполним скрипт пару раз. Получим два раза одно и то же слово на каждую попытку выполнения, особенно если мы ошиблись в реализации random.

Men sispann. Nou pa t 'voye / mo ankò, kidonk poukisa mesaj la ap trete ankò?

Nat la pou voye mesaj nan bot la gen yon longè fini (100 oswa 200 mesaj, mwen panse) epi yo dwe otorize manyèlman.

Sa a se nan kou dekri nan dokiman an, men ou dwe li li!

Nan ka sa a, nou bezwen ?chat_id paramèt, ak &timeout, &limit, &parse_mode=HTML ak &disable_web_page_preview=true poko nesesè.

Dokimantasyon pou telegram api isit la
Li di an blan ak angle:
Idantifikasyon premye aktyalizasyon yo dwe retounen. Dwe pi gran pa youn pase pi wo a pami idantifyan yo nan mizajou te resevwa deja. Pa default, mizajou kòmanse ak pi bonè a
konfime aktyalizasyon yo retounen. Yon aktyalizasyon konsidere kòm konfime le pli vit ke yo rele getUpdates ak yon konpanse pi wo than its update_id. Yo ka espesifye konpanse negatif la pou rekipere mizajou apati de -offset update depi nan fen keu mizajou yo. Tout mizajou anvan yo pral bliye.

Ann gade nan:

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

Wi, epi nou pral reset li epi reekri fonksyon an yon ti kras. Nou gen de opsyon - pase mesaj la tout antye nan fonksyon an epi trete li antyèman nan fonksyon an, oswa bay sèlman ID mesaj la epi reset li. Pou egzanp, dezyèm lan sanble pi senp.

Précédemment, nou an "tout mesaj" chèn rechèch te sanble

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

epi li pral sanble

$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 

Pèsonn pa entèdi ou resevwa tout mesaj yo an premye, trete yo, epi sèlman apre demann pwosesis siksè san konfime -> konfime.

Poukisa li fè sans pou rele konfimasyon apre tout pwosesis fini? Yon echèk posib nan mitan ekzekisyon an, epi si pou egzanp lan nan yon chatbot gratis, manke yon sèl mesaj pa gen anyen espesyal, Lè sa a, si w ap trete salè yon moun oswa tranzaksyon kat, rezilta a ka vin pi mal.

Yon koup plis liy nan kòd

$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. Olye de yon konklizyon

Основные функции — чтение сообщений, сброс очереди, чтение из файла и запись в файл выполнены и показаны.

Gen sèlman kat bagay ki rete pou fè:

  • voye repons ki kòrèk la nan yon demann nan chat
  • voye yon repons pou nenpòt chat kote bot la te ajoute
  • egzekite kòd nan yon bouk
  • lanse yon bot soti nan pwogramasyon fenèt la.

Tout travay sa yo se senp epi yo ka fasil akonpli lè w li dokiman an sou paramèt tankou
Set-ExecutionPolicy Unrestricted ak -ExecutionPolicy Bypass
sik nan fòm lan

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

Mèsi a tout moun ki li.

Sous: www.habr.com

Add nouvo kòmantè