Sniðmát fyrir einfaldan símskeyti botni fyrir skólabörn í 7-9 bekk með Powershell

Í samtölum við vinkonu mína komst ég allt í einu að því að börnum í 8.-10. bekk í skólanum þeirra er alls ekki kennt forritun. Word, Excel og allt. Ekkert lógó, ekki einu sinni Pascal, ekki einu sinni VBA fyrir Excel.

Ég var mjög hissa, opnaði netið og byrjaði að lesa -
Eitt af verkefnum sérskóla er að stuðla að menntun nýrrar kynslóðar sem uppfyllir skilyrði upplýsingasamfélagsins í þroskastigi og lífsstíl.
Þetta námskeið mun gera nemendum kleift að treysta í reynd þekkingu sína á grunnsmíðum Pascal forritunarmálsins. (úr dagskrá einhvers íþróttahúss 2017)

Að lokum ákvað ég að eyða nokkrum klukkustundum og skissa upp dæmi um „hvernig á að búa til einfaldan vélmenni fyrir skólabörn.

Fyrir neðan klippinguna er hvernig á að skrifa annan einfaldan vélmenni í Powershell og láta hann virka án vefhooks, hvítra IP-tölva, sérstaka netþjóna, sýndarvélar í skýinu og svo framvegis - á venjulegri heimatölvu með venjulegri Windows.

TLDR: Önnur leiðinleg grein með málfræði- og staðreyndavillum, ekkert að lesa, enginn húmor, engar myndir.

Það er ekkert nýtt í greininni, nánast allt skrifað áður hefur þegar verið á Habré, til dæmis í greinum Leiðbeiningar: Hvernig á að búa til vélmenni í Telegram и Telegram láni fyrir kerfisstjóra.
Þar að auki er greinin vísvitandi óþörf til að vísa ekki í fræðslubókmenntir í hvert skipti. Það eru engar tilvísanir í Gang 4, PowerShell Deep Dives eða, segjum, The 5 Pillars of the AWS Well-Architected Framework í textanum.

Í stað formála geturðu sleppt því

Ekki hika við að sleppaÁrið 2006 gaf Microsoft út PowerShell 1.0 fyrir þáverandi Windows XP, Vista og Server 2003. Að sumu leyti kom það í staðinn fyrir hluti eins og cmdbat forskriftir, vb forskriftir, Windows Script Host og JScript.

Jafnvel núna er aðeins hægt að líta á PowerShell sem næsta skref á eftir Logo valkostunum, í stað þess sem líklega er enn notað í Delphi (eða eitthvað eldra), þrátt fyrir að lykkjur, flokkar, aðgerðir, MS GUI símtöl séu til staðar, Git samþætting og svo framvegis.

Powershell er notað tiltölulega sjaldan; þú getur aðeins rekist á það í formi PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Desired State Configuration, PowerShell vefaðgangur og tugi eða svo fleiri sjaldan notuð forrit og aðgerðir. Kannski fær hann annan vind með útgáfunni WSL2, en það er ekki nákvæmlega.

Powershell hefur einnig þrjá stóra kosti:

  1. Það er tiltölulega einfalt, það er mikið af bókmenntum og dæmum um það, og jafnvel á rússnesku, til dæmis, grein um Foreach - úr bókinni PowerShell í dýpt - um muninn () og {}
  2. Hann fer með ritstjóranum ISE, fylgir með Windows. Það er meira að segja einhvers konar villuleit þarna.
  3. Það er auðvelt að hringja frá því íhlutir til að byggja upp grafískt viðmót.

0. Undirbúningur.

Við munum þurfa:

  • Windows PC (ég er með Windows 10)
  • Að minnsta kosti einhvers konar internetaðgangur (í gegnum NAT til dæmis)
  • Fyrir þá sem hafa takmarkaðan aðgang að símskeyti - uppsett og stillt freegate í vafranum, í sumum erfiðum tilfellum, ásamt Symple DNS Crypt
  • Að hafa virkan símskeyti viðskiptavin í símanum þínum
  • Að skilja grunnatriðin - hvað breyta, fylki, lykkja er.

Opnað og lesið greinar - Leiðbeiningar: Hvernig á að búa til vélmenni í Telegram и Telegram láni fyrir kerfisstjóra

1. Búum til annan prófunarbot.

Þar sem allir vita þetta nú þegar, og hafa þegar gerst, geturðu líka sleppt þvíEins og fram kemur í greininni hér að ofan - Fyrst af öllu, vélmenni fyrir Telegram - það er samt forrit sem keyrir hjá þér og gerir beiðnir til Telegram Bot API. Þar að auki er API skýrt - lánmaðurinn opnar ákveðna vefslóð með breytum og Telegram svarar með JSON hlut.

Tengd vandamál: ef þú á einhvern óþekktan hátt tekur einhvern kóða úr JSON hlut og sendir hann einhvern veginn til framkvæmdar (ekki viljandi), þá verður kóðinn keyrður fyrir þig.

Búunarferlinu er lýst í tveimur greinum hér að ofan, en ég endurtek: í símskeyti opnum við tengiliði, leitum að @botfather, segjum honum /newbot, búum til botn Botfortest12344321, köllum það Mynext1234bot og fáum skilaboð með einstökum lykli eyðublað 1234544311:AbcDefNNNNNNNNNNNNNN

Gættu að lyklinum og ekki gefa hann frá þér!

Síðan geturðu stillt botninn, til dæmis, bannað að bæta því við hópa, en í fyrstu skrefunum er það ekki nauðsynlegt.

Við skulum biðja BotFather um "/mybot" og stilla stillingarnar ef okkur líkar ekki eitthvað.

Við skulum opna tengiliðina aftur, finna @Botfortest12344321 þar (það er skylda að hefja leitina með @), smella á „byrja“ og skrifa til botnsins „/Glory to the robots. Táknið / er áskilið, tilvitnanir eru ekki nauðsynlegar.
Botninn svarar auðvitað engu.

Athugum hvort botninn hafi verið búinn til og opnum hann.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNN/getMe
þar sem 1234544311:AbcDefNNNNNNNNNNNNNN er áður móttekinn lykill,
og fáðu línu eins og
{"ok":true,"result":{""}}

Við höfum fyrstu leynilegu setninguna (tákn). Nú þurfum við að finna út annað leyninúmerið - auðkenni spjallsins við botninn. Hvert spjall, hópur o.s.frv. er einstaklingsbundið og hefur sitt eigið númer (stundum með mínus - fyrir opna hópa). Til þess að komast að þessu númeri þurfum við að biðja um í vafranum (reyndar er það alls ekki nauðsynlegt í vafranum, en til að fá betri skilning geturðu byrjað á því) heimilisfangið (þar sem 1234544311:NNNNNNNNNN er táknið þitt

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

og fá svar eins og

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

Við þurfum chat_id.

Athugum hvort við getum skrifað handvirkt á spjallið: hringdu í netfangið úr vafranum

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

Ef þú færð skilaboð frá botni í spjallinu þínu, allt í lagi, þú ferð á næsta stig.

Þannig (í gegnum vafrann) er alltaf hægt að athuga hvort það séu vandamál með tengimyndunina, eða hvort eitthvað sé falið einhvers staðar og virkar ekki.

Það sem þú þarft að vita áður en þú heldur áfram að lesa

Telegram hefur nokkrar tegundir af hópspjalli (opið, lokað). Fyrir þessi spjall eru sumar aðgerðir (til dæmis auðkenni) öðruvísi, sem veldur stundum einhverjum vandræðum.

Gerum ráð fyrir að það sé lok ársins 2019, og jafnvel hetja okkar tíma, hin þekkta Man-Orchestra (stjórnandi, lögfræðingur, sérfræðingur í upplýsingaöryggi, forritari og nánast MVP) Evgeniy V. greinir $i breytuna frá fylki, hefur náð tökum á lykkjum, líttu á næstu árum mun mastera Chocolatey, og þá Samhliða vinnsla með PowerShell и ForHver-Object Parallel það mun koma.

1. Við hugsum um hvað vélmenni okkar mun gera

Ég hafði engar hugmyndir, ég varð að hugsa. Ég hef þegar skrifað bot-glósubók. Ég vildi ekki búa til vélmenni "sem sendir eitthvað eitthvert." Til að tengjast Azure þarftu kreditkort, en hvaðan fær nemandinn það? Það skal tekið fram að allt er ekki svo slæmt: helstu skýin gefa einhvers konar prófunartíma ókeypis (en þú þarft samt kreditkortanúmer - og það virðist sem dollar verði skuldfærður af því. Ég man ekki hvort það var skilað síðar.)

Án AI ML er ekki svo áhugavert að búa til lélegan ljóðskáld.

Ég ákvað að búa til bot sem mun minna mig (eða ekki mig) á ensk orð úr orðabókinni.
Til að forðast að fikta í gagnagrunninum verður orðabókin geymd í textaskrá og uppfærð handvirkt.
Í þessu tilviki er verkefnið að sýna grunnatriði verksins, en ekki að gera að minnsta kosti að hluta fullunna vöru.

2. Að prófa hvað og hvernig í fyrsta skipti

Við skulum búa til möppu C:poshtranslate
Fyrst skulum við sjá hvers konar powershell við höfum, við skulum ræsa ISE með start-run
powerhell ise
eða finndu Powershell ISE í uppsettum forritum.
Eftir ræsingu opnast venjulegur „einhvers konar ritstjóri“; ef það er enginn textareit, þá geturðu alltaf smellt á „Skrá - búa til nýtt“.

Við skulum skoða útgáfuna af powershell - skrifaðu í textareitinn:

get-host 

og ýttu á F5.

Powershell mun bjóðast til að vista - "Skriftið sem þú ætlar að keyra verður vistað.", við erum sammála og vista skrána úr powershell með nafninu í C: poshtranslate myfirstbotBT100.

Eftir ræsingu fáum við gagnatöflu í neðri textaglugganum:

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

Ég er með 5.1 eitthvað, það er nóg. Ef þú ert með gamla Windows 7/8 þá er ekkert mál - þó að PowerShell þurfi að uppfæra í útgáfu 5 - t.d. leiðbeiningar.

Sláðu inn Get-Date í skipanalínunni fyrir neðan, ýttu á Enter, skoðaðu tímann, farðu í rótarmöppuna með skipuninni
cd
og hreinsaðu skjáinn með cls skipuninni (nei, þú þarft ekki að nota rm)

Nú skulum við athuga hvað virkar og hvernig - við skulum skrifa ekki einu sinni kóðann, heldur tvær línur, og reyna að skilja hvað þær gera. Við skulum gera athugasemdir við línuna með get-host með # tákninu og bæta smá við.

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

(Það sem er áhugavert er að í fellilistanum fyrir kóðasnið á Habré eru tveir tugir valkosta - en Powershell er ekki þar. Dos er til. Perl er þar.)

Og við skulum keyra kóðann með því að ýta á F5 eða ">" frá GUI.

Við fáum úttakið:

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

Nú skulum við líta á þessar tvær línur og nokkra áhugaverða punkta svo að við snúum ekki aftur að þessu í framtíðinni.

Ólíkt Pascal (og ekki aðeins), reynir PowerShell sjálft að ákvarða hvaða tegund á að úthluta breytu; frekari upplýsingar um þetta eru skrifaðar í greininni Fræðsluforrit um vélritun á forritunarmálum
Þess vegna, með því að búa til $TimeNow breytu og úthluta henni gildi núverandi dagsetningar og tíma (Get-Date), þurfum við ekki að hafa of miklar áhyggjur af hvers konar gögnum verður þar.

Að vísu getur þessi fáfræði skaðað seinna, en það er til seinna. Fyrir neðan í textanum verður dæmi.
Við skulum sjá hvað við fengum. Við skulum framkvæma (á skipanalínunni)

$TimeNow | Get-member

og fáðu síðu með óskiljanlegum texta

Dæmi um óskiljanlegan texta númer 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")...                                         

Eins og þú sérð hefur breyta af gerðinni TypeName: System.DateTime verið búin til með fullt af aðferðum (í þeim skilningi hvað við getum gert með þessum breytuhlut) og eiginleikum.

Við skulum hringja $TimeNow.DayOfYear — við fáum númer dags ársins.
Við skulum hringja $TimeNow.DayOfYear | Get-Member - við fáum TypeName: System.Int32 og hópur aðferða.
Við skulum hringja $TimeNow.ToUniversalTime() - og fáðu tímann í UTC

Aflúsara

Stundum gerist það að það þarf að keyra forrit upp að ákveðinni línu og sjá stöðu forritsins á því augnabliki. Í þessu skyni hefur ISE kembiforrit - skipta um brot
Settu brot einhvers staðar í miðjunni, keyrðu þessar tvær línur og sjáðu hvernig brotið lítur út.

3. Skilningur á samskiptum við Telegram vélmenni

Auðvitað hafa enn fleiri bókmenntir verið skrifaðar um samskipti við botmanninn, með öllum getpush og svo framvegis, en hægt er að íhuga fræðimálið valfrjálst.

Í okkar tilviki er nauðsynlegt:

  • Lærðu að senda eitthvað í bréfaskiptum
  • Lærðu að fá eitthvað úr bréfaskiptum

3.1 Að læra að senda eitthvað í bréfaskiptum og taka á móti frá því

Smá kóða - hluti 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

og í Rússlandi á þessum tímapunkti fáum við villuna Ekki hægt að tengjast ytri netþjóninum.

Eða við fáum það ekki - fer eftir símafyrirtækinu og hvort umboðið sé stillt og virkar
Jæja, allt sem er eftir er að bæta við umboði. Vinsamlegast athugaðu - að nota ódulkóðaðan og almennt sviksamlegan umboðsmann er afar hættulegt heilsunni þinni.

Verkefnið við að finna virka umboð er ekki mjög erfitt - flestir birtu http umboðin virka. Ég held að sú fimmta hafi virkað fyrir mig.

Setningafræði með proxy:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

Ef þú færð skilaboð í spjallinu þínu með botni, þá er allt í lagi, þú getur haldið áfram. Ef ekki, haltu áfram að kemba.

Þú getur séð hvað $URL4SEND strengurinn þinn breytist í og ​​prófað að biðja um það í vafranum, svona:

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

3.2. Við lærðum hvernig á að skrifa „eitthvað“ í spjalli, nú skulum við reyna að lesa það

Bætum við 4 línum í viðbót og sjáum hvað er inni í gegnum | fá-meðlimur

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

Það áhugaverðasta er okkur veitt

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

Við skulum sjá hvað er í þeim:

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

Ef allt virkar fyrir þig færðu langa línu eins og:

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

Sem betur fer, í áður birtri grein Telegram láni fyrir kerfisstjóra þessa línu (já, samkvæmt $MyMessageGet.RawContent | get-member er System.String), hefur þegar verið tekið í sundur.

4. Vinndu það sem þú færð (við vitum nú þegar hvernig á að senda eitthvað)

Eins og þegar skrifað hér, nauðsynlegustu hlutir liggja í innihaldi. Við skulum skoða það nánar.

Í fyrsta lagi skrifum við nokkrar setningar í viðbót í botninn úr vefviðmótinu eða úr símanum

/message1
/message2
/message3

og skoðaðu í gegnum vafrann á heimilisfangið sem var myndað í $URLGET breytunni.

Við munum sjá eitthvað eins og:

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

Hvað það er? Einhver flókinn hlutur úr arrays af hlutum sem innihalda enda-til-enda skilaboðaauðkenni, spjallauðkenni, sendiauðkenni og fullt af öðrum upplýsingum.

Hins vegar þurfum við ekki að reikna út „hvers konar hlutur þetta er“ - hluti af vinnunni hefur þegar verið unnin fyrir okkur. Við skulum sjá hvað er inni:

Að lesa móttekin skilaboð eða hluti 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. Hvað eigum við að gera í því núna?

Við skulum vista skrána sem myndast undir nafninu myfirstbotBT105 eða hvað sem þér líkar best, breyttu titlinum og skrifaðu athugasemd við allan kóðann sem þegar hefur verið skrifaður í gegnum

<#start comment 105 end comment 105#>

Nú þurfum við að ákveða hvar við fáum orðabókina (jæja, hvar - á diski í skrá) og hvernig hún mun líta út.

Auðvitað er hægt að skrifa risastóra orðabók beint inn í texta handritsins, en þetta er algjörlega fyrir utan málið.
Svo við skulum sjá hvað powershell getur unnið með venjulega.
Almennt er honum alveg sama hvaða skrá á að vinna með, það skiptir okkur ekki máli.
Við höfum val: txt (þú getur, en hvers vegna), csv, xml.
Getum við fylgst með öllum? Við skulum sjá alla.
Búum til bekkinn MyVocabClassExample1 og breytuna $MyVocabExample1
Ég tek fram að bekkurinn er skrifaður án $

einhver kóða #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

Við skulum reyna að skrifa þetta inn í skrár með því að nota til fyrirmyndar.

Einhver kóði #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

- og við fáum villu í línunni Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2.

Hann vill ekki bæta við, ah-ah, þvílík synd.

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

Við skulum sjá hvað gerist. Frábær textasýn - en hvernig á að flytja hann út aftur? Ætti ég að setja upp einhvers konar textaskil, eins og kommur?

Og á endanum færðu „kommuaðskilin gildi (CSV) skrá A HÆTTU BÍÐI.
#

$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 

Eins og auðvelt er að sjá, er MS ekki sérstaklega aðgreint af rökfræði sinni; fyrir svipaða aðferð er -FilePath notað í einu tilviki, í öðru -Path.

Að auki hvarf rússneska tungumálið í þriðju skránni, í fjórðu skránni kom í ljós... jæja, eitthvað gerðist. #TYPE System.Object[] 00
# “Count”,,”Length”,,”LongLength”,,”Rank”,,”SyncRoot”,,”IsReadOnly”,,”IsFixedSize”,,”IsSynchronized”
#
Við skulum endurskrifa það aðeins:

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

Það virðist hafa hjálpað, en mér líkar samt ekki sniðið.

Mér líkar sérstaklega ekki við að geta ekki sett línur úr hlut beint inn í skrá.
Við the vegur, síðan við byrjuðum að skrifa í skrár, getum við byrjað að halda ræsingarskrá? Við höfum tíma sem breytu, við getum stillt skráarnafnið.

Að vísu er ekkert að skrifa ennþá, en þú getur velt því fyrir þér hvernig best sé að snúa stokkunum.
Prófum xml í bili.

Sumt 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

Útflutningur yfir í xml hefur marga kosti - læsileika, útflutning á öllu hlutnum og engin þörf á að framkvæma uppfærslu.

Við skulum reyna lesa xml skrá.

Smá lestur úr xml

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

Snúum okkur aftur að verkefninu. Við skrifuðum prófunarskrá, lesum hana, geymslusniðið er skýrt, ef nauðsyn krefur geturðu skrifað sérstakan lítinn skráarritara til að bæta við og eyða línum.

Mig minnir að verkefnið hafi verið að búa til lítinn þjálfunarbot.

Vinnusnið: Ég sendi „dæmi“ skipunina á botninn, vélmaðurinn sendir mér valið orð og uppskrift af handahófi og eftir 10 sekúndur sendir mér þýðingu og athugasemd. Við kunnum að lesa skipanir, við viljum líka læra hvernig á að velja og athuga umboð sjálfkrafa og endurstilla skilaboðateljara í gleymsku.

Við skulum afskrifa allt sem áður hefur verið skrifað út sem óþarft, athugasemdum við núna óþarfa dæmi með txt og csv, og vistum skrána sem útgáfu B106

Ó já. Sendum eitthvað til botnsins aftur.

6. Sending frá aðgerðum og fleira

Áður en þú vinnur úr móttökunni þarftu að búa til aðgerð til að senda „að minnsta kosti eitthvað“ annað en prófskilaboð.

Auðvitað, í dæminu munum við hafa aðeins eina sendingu og aðeins eina vinnslu, en hvað ef við þurfum að gera það sama nokkrum sinnum?

Það er auðveldara að skrifa fall. Þannig að við höfum breytu af gerðinni hlut $MyVocabExample4AsArray, lesin úr skránni, í formi fylkis með allt að tveimur þáttum.
Förum að lesa.

Á sama tíma munum við takast á við klukkuna; við þurfum hana síðar (reyndar, í þessu dæmi munum við ekki þurfa hana :)

Einhver kóði #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
}

Eins og þú sérð auðveldlega kallar aðgerðin $MyToken og $MyChatID, sem voru harðkóða áður.

Það er engin þörf á að gera þetta, og ef $MyToken er einn fyrir hvern láni, þá mun $MyChatID breytast eftir spjallinu.

Hins vegar, þar sem þetta er dæmi, munum við hunsa það í bili.

Þar sem $MyVocabExample4AsArray er ekki fylki, þó það sé mjög líkt einu, þá þú getur ekki bara tekið því óska eftir lengd hennar.

Enn og aftur verðum við að gera eitthvað sem ekki er hægt að gera - stökkva í fallhlíf ekki samkvæmt kóðanum - taka það og telja

Einhver kóði #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)
# Угадайте сами, какой пример легче читается посторонними людьми.

Handahófi áhugaverður eiginleiki. Segjum að við viljum fá 0 eða 1 (við höfum aðeins tvo þætti í fylkinu). Þegar mörkin eru sett 0..1, fáum við „1“?
nei - við fáum það ekki, við höfum sérstakt dæmi. Dæmi 2: Fáðu handahófskennda heiltölu á milli 0 og 99 Get-Random - Hámark 100
Þess vegna, fyrir 0..1 þurfum við að stilla stærðina 0..2, með hámarksfjölda frumefnis = 1.

7. Afgreiðsla á innkomnum skilaboðum og hámarkslengd biðraðar

Hvar stoppuðum við áðan? við höfum móttekna breytu $MyMessageGet
og $Content4Pars01 fengin úr því, þar af höfum við áhuga á þáttum Content4Pars01.result fylkisins

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

Sendum lánardrottinn /message10, /message11, /message12, /word og aftur /orð og /halló.
Við skulum sjá hvað við fengum:

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

Förum í gegnum allt sem berast og sendum svar ef skilaboðin voru /orð
tilvikið um smíði, það sem sumir lýsa sem if-elseif, er kallað í powershell í gegnum rofa. Jafnframt notar kóðinn hér að neðan -wildcard lykilinn, sem er algjörlega óþarfi og jafnvel skaðlegur.

Einhver kóði #7.1

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

Við skulum keyra handritið nokkrum sinnum. Við munum fá sama orðið tvisvar fyrir hverja aftökutilraun, sérstaklega ef við gerðum mistök við útfærslu á handahófi.

En hættu. Við sendum /word ekki aftur, svo hvers vegna er verið að vinna úr skilaboðunum aftur?

Biðröðin til að senda skilaboð til botnsins hefur endanlega lengd (100 eða 200 skilaboð, held ég) og verður að hreinsa hana handvirkt.

Þessu er auðvitað lýst í skjölunum, en þú verður að lesa það!

Í þessu tilfelli þurfum við ?chat_id færibreytuna og &timeout, &limit, &parse_mode=HTML og &disable_web_page_preview=true eru ekki nauðsynlegar ennþá.

Skjöl fyrir Telegram API er hér
Það segir á hvítu og ensku:
Auðkenni fyrstu uppfærslu sem á að skila. Verður að vera einum hærra en það hæsta meðal auðkenna áður móttekinna uppfærslu. Sjálfgefið er að uppfærslur byrja með þeim fyrstu
óstaðfestur uppfærslu er skilað. Uppfærsla telst staðfest um leið og getUpdates er kallað með móti hærri en update_id þess. Hægt er að tilgreina neikvæða offset til að sækja uppfærslur sem byrja á -offset update frá lokum uppfærsluröðarinnar. Allar fyrri uppfærslur munu gleymast.

Við skulum skoða:

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

Já, og við endurstillum það og endurskrifum aðgerðina aðeins. Við höfum tvo valkosti - sendu öll skilaboðin til aðgerðarinnar og vinna þau að öllu leyti í aðgerðinni, eða gefðu aðeins upp auðkenni skilaboðanna og endurstilltu það. Til dæmis lítur sá seinni einfaldari út.

Áður leit „öll skilaboð“ fyrirspurnarstrengur okkar út eins og

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

og það mun líta út

$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 

Enginn bannar þér að taka við öllum skilaboðum fyrst, vinna úr þeim, og aðeins eftir árangursríka vinnslu beiðni óstaðfest -> staðfest.

Hvers vegna er skynsamlegt að hringja í staðfestingu eftir að allri vinnslu er lokið? Bilun er möguleg í miðri framkvæmd og ef til dæmis ókeypis spjallbotn er ekkert sérstakt að missa af einni skilaboðum, ef þú ert að vinna úr launum eða kortafærslu einhvers, getur niðurstaðan verið verri.

Nokkrar línur af kóða í viðbót

$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. Í stað niðurstöðu

Grunnaðgerðir - að lesa skilaboð, endurstilla biðröð, lesa úr skrá og skrifa í skrá eru gerðar og sýndar.

Það eru aðeins fjórir hlutir eftir:

  • að senda rétt svar við beiðni í spjalli
  • að senda svar við HVERJU spjalli sem botninum var bætt við
  • keyra kóða í lykkju
  • ræsir vélmenni frá Windows tímaáætlunarkerfinu.

Öll þessi verkefni eru einföld og auðvelt er að framkvæma þau með því að lesa skjölin um breytur eins og
Set-ExecutionPolicy Unrestricted og -ExecutionPolicy Bypass
hringrás formsins

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

Takk allir sem lesa.

Heimild: www.habr.com

Bæta við athugasemd