Kiolezo cha roboti rahisi ya telegramu kwa watoto wa shule katika darasa la 7-9 kwa kutumia Powershell

Wakati wa mazungumzo na rafiki, ghafla nilijifunza kwamba watoto katika darasa la 8-10 shuleni mwao hawafundishwi programu hata kidogo. Neno, Excel na kila kitu. Hakuna nembo, hata Pascal, hata VBA ya Excel.

Nilishangaa sana, nikafungua mtandao na kuanza kusoma -
Moja ya kazi za shule maalum ni kukuza elimu ya kizazi kipya ambayo inakidhi masharti ya jamii ya habari katika kiwango chake cha maendeleo na mtindo wa maisha.
Kozi hii itawaruhusu wanafunzi kujumuisha kwa vitendo ujuzi wao wa miundo msingi ya lugha ya programu ya Pascal. (kutoka kwa mpango wa uwanja wa mazoezi wa 2017)

Mwishowe, niliamua kutumia masaa kadhaa na kuchora mfano wa "jinsi ya kuunda roboti rahisi kwa watoto wa shule."

Chini ya kukata ni jinsi ya kuandika bot nyingine rahisi katika Powershell na kuifanya kazi bila webhook, IPs nyeupe, seva zilizojitolea, mashine zilizotumiwa kwenye wingu, na kadhalika - kwenye PC ya kawaida ya nyumbani na Windows ya kawaida.

TLDR: Nakala nyingine ya kuchosha yenye makosa ya kisarufi na ukweli, hakuna cha kusoma, hakuna ucheshi, hakuna picha.

Hakuna kitu kipya katika makala, karibu kila kitu kilichoandikwa hapo awali tayari kimekuwa kwenye Habre, kwa mfano katika makala Maagizo: Jinsi ya kuunda bots kwenye Telegraph и Telegraph bot kwa msimamizi wa mfumo.
Isitoshe, kifungu hicho hakitumiki tena kwa makusudi ili kutorejelea fasihi ya elimu kila wakati. Hakuna marejeleo ya Gang 4, PowerShell Deep Dives au, tuseme, Nguzo 5 za Mfumo Uliobuniwa Vizuri wa AWS kwenye maandishi.

Badala ya utangulizi, unaweza kuruka

Jisikie huru kurukaMnamo 2006, Microsoft ilitoa PowerShell 1.0 kwa Windows XP, Vista, na Server 2003 ya wakati huo. Kwa njia fulani, ilibadilisha vitu kama hati za cmdbat, hati za vb, Windows Script Host na JScript.

Hata sasa, PowerShell inaweza kuzingatiwa tu kama hatua inayofuata baada ya chaguzi za Nembo, badala ya Delphi ambayo bado inatumika (au kitu cha zamani), licha ya uwepo wa vitanzi, madarasa, kazi, simu za MS GUI, Ujumuishaji wa Git na kadhalika.

Powershell hutumiwa mara chache; unaweza tu kukutana nayo katika mfumo wa PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Usanidi wa Jimbo Unaohitajika, Ufikiaji wa Wavuti wa PowerShell na dazeni au zaidi programu na vitendaji vinavyotumika mara chache sana. Labda atapata upepo wa pili na kutolewa WSL2, lakini sivyo hasa.

Powershell pia ina faida tatu kubwa:

  1. Ni rahisi, kuna fasihi nyingi na mifano juu yake, na hata kwa Kirusi, kwa mfano, nakala kuhusu Foreach - kutoka kwa kitabu. PowerShell kwa kina - kuhusu tofauti () na {}
  2. Anaenda na mhariri ISE, pamoja na Windows. Kuna hata aina fulani ya debugger huko.
  3. Ni rahisi kupiga simu kutoka kwake vipengele vya kujenga kiolesura cha picha.

0. Maandalizi.

Tutahitaji:

  • Windows PC (nina Windows 10)
  • Angalau aina fulani ya ufikiaji wa mtandao (kupitia NAT kwa mfano)
  • Kwa wale ambao wana ufikiaji mdogo wa telegraph - iliyosanikishwa na kusanidi freegate kwenye kivinjari, katika hali zingine ngumu, pamoja na Symple DNS Crypt.
  • Kuwa na mteja wa telegram anayefanya kazi kwenye simu yako
  • Kuelewa mambo ya msingi - ni tofauti gani, safu, kitanzi.

Kufungua na kusoma makala - Maagizo: Jinsi ya kuunda bots kwenye Telegraph и Telegraph bot kwa msimamizi wa mfumo

1. Hebu tuunde roboti nyingine ya majaribio.

Kwa kuwa kila mtu tayari anajua hili, na tayari limetokea, unaweza pia kurukaKama ilivyoonyeshwa kwenye kifungu hapo juu - Kwanza kabisa, bot ya Telegraph - bado ni programu inayoendeshwa kwa upande wako na kufanya maombi kwa API ya Telegram Bot. Zaidi ya hayo, API iko wazi - kijibu hupata URL maalum iliyo na vigezo, na Telegramu hujibu na kitu cha JSON.

Shida zinazohusiana: ikiwa kwa njia isiyojulikana unachukua nambari fulani kutoka kwa kitu cha JSON na kwa njia fulani kuituma kwa utekelezaji (sio kwa makusudi), nambari hiyo itatekelezwa kwa ajili yako.

Mchakato wa uundaji umeelezewa katika nakala mbili hapo juu, lakini narudia: kwenye telegramu tunafungua anwani, tafuta @botfather, mwambie /newbot, unda bot Botfortest12344321, iite Mynext1234bot, na upokee ujumbe na ufunguo wa kipekee. fomu 1234544311:AbcDefNNNNNNNNNNNNNNNN

Jihadharini na ufunguo na usiupe!

Kisha unaweza kusanidi bot, kwa mfano, kukataza kuiongeza kwa vikundi, lakini katika hatua za kwanza hii sio lazima.

Hebu tuulize BotFather "/mybot" na turekebishe mipangilio ikiwa hatupendi kitu.

Hebu tufungue anwani tena, pata @Botfortest12344321 hapo (ni lazima kuanza utafutaji na @), bofya "anza" na uandike kwenye roboti "/Glory to the robots." Ishara / inahitajika, nukuu hazihitajiki.
Bot, bila shaka, haitajibu chochote.

Hebu tuangalie ikiwa bot imeundwa na kuifungua.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNN/getMe
ambapo 1234544311:AbcDefNNNNNNNNNNNNNN ndio ufunguo uliopokelewa hapo awali,
na kupata mstari kama
{"ok":true,"matokeo":{""}}

Tunayo kifungu cha kwanza cha siri (ishara). Sasa tunahitaji kujua nambari ya pili ya siri - kitambulisho cha gumzo na bot. Kila gumzo, kikundi, nk ni ya mtu binafsi na ina nambari yake (wakati mwingine na minus - kwa vikundi vilivyo wazi). Ili kujua nambari hii, tunahitaji kuomba kwenye kivinjari (kwa kweli, sio lazima kabisa kwenye kivinjari, lakini kwa ufahamu bora unaweza kuanza nayo) anwani (ambapo 1234544311:NNNNNNNNNN ni ishara yako).

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

na kupata jibu kama

{"ok":true,"matokeo":[{"sasisho_id":...,... kuzungumza":{"kitambulisho":123456789

Tunahitaji chat_id.

Wacha tuangalie ikiwa tunaweza kuandika kwa gumzo kwa mikono: piga anwani kutoka kwa kivinjari

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

Ukipokea ujumbe kutoka kwa roboti kwenye gumzo lako, sawa, unaendelea hadi hatua inayofuata.

Kwa njia hii (kupitia kivinjari) unaweza kuangalia daima ikiwa kuna matatizo na kizazi cha kiungo, au ikiwa kitu kimefichwa mahali fulani na haifanyi kazi.

Unachohitaji kujua kabla ya kuendelea kusoma

Telegramu ina aina kadhaa za mazungumzo ya kikundi (wazi, kufungwa). Kwa mazungumzo haya, baadhi ya vipengele (kwa mfano, id) ni tofauti, ambayo wakati mwingine husababisha matatizo fulani.

Wacha tufikirie kuwa ni mwisho wa 2019, na hata shujaa wa wakati wetu, Man-Orchestra maarufu (msimamizi, mwanasheria, mtaalamu wa usalama wa habari, mpangaji programu na MVP) Evgeniy V. anatofautisha tofauti ya $i kutoka kwa safu, ina mastered loops, kuangalia katika miaka michache ijayo itakuwa bwana Chocolatey, na kisha Usindikaji sambamba na PowerShell и Sambamba ya Kila Kitu itakuja.

1. Tunafikiri juu ya nini bot yetu itafanya

Sikuwa na mawazo yoyote, ilibidi nifikirie. Tayari nimeandika bot-notebook. Sikutaka kutengeneza bot "ambayo hutuma kitu mahali fulani." Ili kuunganisha kwa Azure unahitaji kadi ya mkopo, lakini mwanafunzi anaipata kutoka wapi? Ikumbukwe kwamba kila kitu sio mbaya sana: mawingu kuu hutoa aina fulani ya kipindi cha mtihani bila malipo (lakini bado unahitaji nambari ya kadi ya mkopo - na inaonekana kama dola itatolewa kutoka kwake. Sikumbuki ikiwa ilirudishwa baadaye.)

Bila AI ML haipendezi sana kufanya bot-poor-poet-weaver.

Niliamua kutengeneza bot ambayo itanikumbusha (au sio mimi) ya maneno ya Kiingereza kutoka kwa kamusi.
Ili kuepuka kuharibu hifadhidata, kamusi itahifadhiwa katika faili ya maandishi na kusasishwa mwenyewe.
Katika kesi hii, kazi ni kuonyesha misingi ya kazi, na si kufanya angalau bidhaa ya kumaliza sehemu.

2. Kujaribu nini na jinsi kwa mara ya kwanza

Hebu tuunde folda C:poshtranslate
Kwanza, hebu tuone ni aina gani ya ganda la nguvu tulilo nalo, wacha tuzindue ISE kupitia start-run
powershell ise
au pata Powershell ISE katika programu zilizosakinishwa.
Baada ya uzinduzi, "aina fulani ya mhariri" inayojulikana itafungua; ikiwa hakuna sehemu ya maandishi, basi unaweza kubofya "Faili - Unda mpya".

Wacha tuangalie toleo la powershell - andika kwenye uwanja wa maandishi:

get-host 

na bonyeza F5.

Powershell itajitolea kuhifadhi - "Nakala unayokaribia kutekeleza itahifadhiwa.", tunakubali, na kuhifadhi faili kutoka kwa shell yenye jina katika C: poshtranslate. myfirstbotBT100.

Baada ya uzinduzi, katika dirisha la maandishi ya chini tunapata meza ya data:

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

Nina 5.1 kitu, hiyo inatosha. Ikiwa una Windows 7/8 ya zamani basi hakuna jambo kubwa - ingawa PowerShell itahitaji kusasishwa hadi toleo la 5 - k.m. maelekezo.

Andika Pata-Tarehe kwenye mstari wa amri hapa chini, bonyeza Enter, angalia saa, nenda kwenye folda ya mizizi na amri.
cd
na ufute skrini na amri ya cls (hapana, hauitaji kutumia rm)

Sasa hebu tuangalie kile kinachofanya kazi na jinsi gani - hebu tuandike hata kanuni, lakini mistari miwili, na jaribu kuelewa wanachofanya. Wacha tutoe maoni kwenye mstari na pata mwenyeji kwa ishara # na tuongeze kidogo.

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

(Kinachovutia ni kwamba katika orodha kunjuzi ya uumbizaji wa msimbo kwenye Habré kuna chaguo dazeni mbili - lakini Powershell haipo. Dos ipo. Perl yupo.)

Na wacha tuendeshe nambari kwa kubonyeza F5 au ">" kutoka kwa GUI.

Tunapata pato lifuatalo:

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

Sasa hebu tuangalie mistari hii miwili na baadhi ya pointi za kuvutia ili tusirudi kwa hili katika siku zijazo.

Tofauti na Pascal (na sio tu), PowerShell yenyewe inajaribu kuamua ni aina gani ya kugawa kutofautisha; maelezo zaidi juu ya hii yameandikwa kwenye kifungu. Mpango wa elimu juu ya kuandika katika lugha za programu
Kwa hivyo, kwa kuunda tofauti ya $TimeNow na kuipa thamani ya tarehe na wakati wa sasa (Pata-Tarehe), hatuhitaji kuwa na wasiwasi sana kuhusu aina gani ya data itakuwepo.

Kweli, ujinga huu unaweza kuumiza baadaye, lakini hiyo ni ya baadaye. Chini katika maandishi kutakuwa na mfano.
Hebu tuone kile tulichonacho. Wacha tutekeleze (kwenye mstari wa amri)

$TimeNow | Get-member

na upate ukurasa wa maandishi yasiyoeleweka

Mfano wa nambari ya maandishi isiyoeleweka 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")...                                         

Kama unavyoona, aina ya aina ya TypeName: System.DateTime imeundwa kwa rundo la mbinu (kwa maana ya kile tunachoweza kufanya na kitu hiki cha kutofautiana) na sifa.

Hebu piga simu $TimeNow.DayOfYear - tunapata idadi ya siku ya mwaka.
Hebu piga simu $TimeNow.DayOfYear | Get-Member - tunapata TypeName: System.Int32 na kundi la mbinu.
Hebu piga simu $TimeNow.ToUniversalTime() - na upate wakati katika UTC

Kitatuzi

Wakati mwingine hutokea kwamba ni muhimu kutekeleza programu hadi mstari fulani na kuona hali ya programu wakati huo. Kwa kusudi hili, ISE ina kazi ya Kutatua - kugeuza sehemu ya mapumziko
Weka sehemu ya kuvunja mahali fulani katikati, endesha mistari hii miwili na uone jinsi mapumziko yanavyoonekana.

3. Kuelewa mwingiliano na bot ya Telegram

Kwa kweli, fasihi zaidi imeandikwa juu ya mwingiliano na bot, na getpush zote na kadhalika, lakini suala la nadharia linaweza kuzingatiwa kwa hiari.

Kwa upande wetu ni muhimu:

  • Jifunze kutuma kitu kwa mawasiliano
  • Jifunze kupata kitu kutoka kwa mawasiliano

3.1 Kujifunza kutuma kitu kwa njia ya mawasiliano na kupokea kutoka kwake

Nambari ndogo - sehemu ya 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

na katika Shirikisho la Urusi katika hatua hii tunapata hitilafu Haiwezi kuunganisha kwenye seva ya mbali.

Au hatuipokei - inategemea opereta wa mawasiliano ya simu na ikiwa proksi imesanidiwa na inafanya kazi
Kweli, kilichobaki ni kuongeza proksi. Tafadhali kumbuka kuwa kutumia seva mbadala ambayo haijasimbwa na kwa ujumla ni ya ulaghai ni hatari sana kwa afya yako.

Kazi ya kutafuta wakala wa kufanya kazi si vigumu sana - wengi wa wawakilishi wa http waliochapishwa hufanya kazi. Nadhani ya tano ilinifanyia kazi.

Sintaksia kwa kutumia proksi:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

Ikiwa unapokea ujumbe kwenye gumzo lako na roboti, basi kila kitu kiko sawa, unaweza kuendelea. Ikiwa sivyo, endelea kutatua.

Unaweza kuona mfuatano wako wa $URL4SEND unabadilika kuwa nini na ujaribu kuuomba kwenye kivinjari, kama hii:

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

3.2. Tulijifunza jinsi ya kuandika "kitu" kwenye mazungumzo, sasa hebu tujaribu kuisoma

Hebu tuongeze mistari 4 zaidi na tuone kilicho ndani kupitia | kupata-mwanachama

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

Jambo la kuvutia zaidi hutolewa kwetu

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

Wacha tuone kilicho ndani yao:

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

Ikiwa kila kitu kitafanya kazi kwako, utapata mstari mrefu kama:

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

Kwa bahati nzuri, katika nakala iliyochapishwa hapo awali Telegraph bot kwa msimamizi wa mfumo laini hii (ndio, kulingana na $MyMessageGet.RawContent | kupata-mwanachama ni System.String), tayari imevunjwa.

4. Shiriki kile unachopokea (tayari tunajua jinsi ya kutuma kitu)

Kama ilivyoandikwa tayari hapa, mambo muhimu zaidi yamo katika maudhui. Hebu tuangalie kwa karibu zaidi.

Kwanza, tutaandika misemo michache zaidi kwa roboti kutoka kwa kiolesura cha wavuti au kutoka kwa simu

/message1
/message2
/message3

na uangalie kupitia kivinjari kwenye anwani ambayo iliundwa kwa tofauti ya $URLGET.

Tutaona kitu kama:

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

Ni nini? Baadhi ya kitu changamano kutoka kwa safu za vipengee vilivyo na kitambulishi cha ujumbe kutoka mwisho hadi mwisho, kitambulisho cha gumzo, kitambulisho cha kutuma na taarifa nyingine nyingi.

Walakini, hatuitaji kujua "hiki ni kitu cha aina gani" - sehemu ya kazi tayari imefanywa kwa ajili yetu. Wacha tuone kilicho ndani:

Kusoma ujumbe uliopokelewa au sehemu ya 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. Tunapaswa kufanya nini kuhusu hilo sasa?

Wacha tuhifadhi faili inayotokana chini ya jina myfirstbotBT105 au chochote unachopenda zaidi, badilisha kichwa na utoe maoni kwa nambari zote zilizoandikwa tayari kupitia

<#start comment 105 end comment 105#>

Sasa tunahitaji kuamua wapi kupata kamusi (vizuri, wapi - kwenye diski kwenye faili) na itakuwaje.

Bila shaka, unaweza kuandika kamusi kubwa moja kwa moja katika maandishi ya hati, lakini hii ni kando kabisa ya uhakika.
Basi hebu tuone ni powershell gani inaweza kufanya kazi nayo kawaida.
Kwa ujumla, hajali ni faili gani ya kufanya kazi nayo, haijalishi kwetu.
Tuna chaguo: txt (unaweza, lakini kwa nini), csv, xml.
Je, tunaweza kutazama kila mtu? Hebu tuone kila mtu.
Hebu tuunde darasa la MyVocabClassExample1 na toleo tofauti la $MyVocabExample1
Ninagundua kuwa darasa limeandikwa bila $

nambari fulani #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

Wacha tujaribu kuandika hii kuwa faili kwa kutumia sampuli.

Msimbo fulani #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

- na tunapata hitilafu kwenye mstari Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2.

Hataki kuongeza, ah-ah, ni aibu gani.

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

Hebu tuone kitakachotokea. Mtazamo mzuri wa maandishi - lakini jinsi ya kuisafirisha tena? Je! nitangulize aina fulani ya vitenganishi vya maandishi, kama vile koma?

Na mwishowe unapata "faili zilizotengwa kwa koma (CSV) A ACHA KUSUBIRI.
#

$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 

Kama ni rahisi kuona, MS haijatofautishwa sana na mantiki yake; kwa utaratibu kama huo, katika kesi moja -FilePath hutumiwa, kwa njia nyingine -Njia.

Kwa kuongeza, katika faili ya tatu lugha ya Kirusi ilipotea, katika faili ya nne iligeuka ... vizuri, kitu kilichotokea. Mfumo wa #TYPE.Kitu[] 00
# “Hesabu”,”Urefu”,”Urefu”,”Cheo”,”SyncRoot”,”IsReadOnly”,”IsFixedSize”,”Imesawazishwa”
#
Hebu tuandike upya kidogo:

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

Inaonekana imesaidia, lakini bado siipendi umbizo.

Sipendi haswa kwamba siwezi kuweka mistari kutoka kwa kitu hadi faili moja kwa moja.
Kwa njia, tangu tulianza kuandika faili, je, tunaweza kuanza kuweka logi ya kuanza? Tuna wakati kama kibadilishaji, tunaweza kuweka jina la faili.

Kweli, hakuna chochote cha kuandika bado, lakini unaweza kufikiri juu ya jinsi bora ya kuzunguka magogo.
Hebu tujaribu xml kwa sasa.

Baadhi ya 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

Kusafirisha kwa xml kuna faida nyingi - usomaji, usafirishaji wa kitu kizima, na hakuna haja ya kufanya nyongeza.

Wacha tujaribu soma faili ya xml.

Usomaji mdogo kutoka kwa xml

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

Turudi kwenye kazi. Tuliandika faili ya mtihani, tukaisoma, muundo wa hifadhi ni wazi, ikiwa ni lazima, unaweza kuandika mhariri wa faili ndogo tofauti ili kuongeza na kufuta mistari.

Acha nikukumbushe kwamba kazi ilikuwa kutengeneza boti ndogo ya mafunzo.

Muundo wa kazi: Ninatuma amri ya "mfano" kwa bot, roboti hunitumia neno na maandishi yaliyochaguliwa nasibu, na baada ya sekunde 10 hunitumia tafsiri na maoni. Tunajua jinsi ya kusoma amri, tungependa kujifunza jinsi ya kuchagua na kuangalia proksi kiotomatiki, na kuweka upya vihesabio vya ujumbe hadi kusahaulika.

Wacha tuachane na kila kitu kilichotolewa maoni hapo awali kama sio lazima, toa maoni juu ya mifano isiyo ya lazima na txt na csv, na uhifadhi faili kama toleo la B106.

Oh ndiyo. Hebu tutume kitu kwenye roboti tena.

6. Tuma kutoka kwa vitendaji na zaidi

Kabla ya kushughulikia mapokezi, unahitaji kuunda chaguo la kukokotoa kwa kutuma "angalau kitu" isipokuwa ujumbe wa jaribio.

Bila shaka, katika mfano tutakuwa na kutuma moja tu na usindikaji mmoja tu, lakini ni nini ikiwa tunahitaji kufanya kitu kimoja mara kadhaa?

Ni rahisi kuandika kipengele. Kwa hivyo, tuna kipengee cha aina tofauti $MyVocabExample4AsArray, iliyosomwa kutoka kwa faili, katika mfumo wa safu ya vitu vingi kama viwili.
Twende tukasome.

Wakati huo huo, tutashughulika na saa; tutaihitaji baadaye (kwa kweli, katika mfano huu hatutahitaji :)

Msimbo fulani #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
}

Kama unavyoona kwa urahisi, chaguo la kukokotoa linaita $MyToken na $MyChatID, ambazo zilikuwa na msimbo mgumu hapo awali.

Hakuna haja ya kufanya hivi, na ikiwa $MyToken ni moja kwa kila bot, basi $MyChatID itabadilika kulingana na gumzo.

Hata hivyo, kwa kuwa huu ni mfano, tutaupuuza kwa sasa.

Kwa kuwa $MyVocabExample4AsArray sio safu, ingawa inafanana sana na moja, basi. huwezi tu kuchukua omba urefu wake.

Kwa mara nyingine tena tutalazimika kufanya kitu ambacho hakiwezi kufanywa - parachute sio kulingana na nambari - ichukue na uhesabu

Msimbo fulani #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 kipengele cha kuvutia. Wacha tuseme tunataka kupokea 0 au 1 (tuna vitu viwili tu kwenye safu). Wakati wa kuweka mipaka 0..1, tutapata "1"?
hapana - hatutapata, tuna mfano maalum Mfano wa 2: Pata nambari kamili kati ya 0 na 99 Pata bila mpangilio -Upeo wa 100
Kwa hiyo, kwa 0..1 tunahitaji kuweka ukubwa 0..2, na nambari ya kipengele cha juu = 1.

7. Uchakataji wa ujumbe unaoingia na urefu wa juu zaidi wa foleni

Tuliishia wapi mapema? tumepokea toleo tofauti la $MyMessageGet
na $Content4Pars01 zilizopatikana kutoka kwayo, ambazo tunavutiwa na vipengele vya safu ya matokeo ya Content4Pars01.

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

Wacha tutume bot /message10, /message11, /message12, /neno na tena /neno na /hello.
Wacha tuone kile tulichonacho:

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

Wacha tupitie kila kitu kilichopokelewa na kutuma jibu ikiwa ujumbe ulikuwa /neno
kesi ya ujenzi, ambayo wengine wanaelezea kama-elseif, inaitwa katika powershell kupitia kubadili. Wakati huo huo, nambari iliyo hapa chini hutumia kitufe cha -wildcard, ambacho sio lazima kabisa na hata kinadhuru.

Msimbo fulani #7.1

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

Wacha tuendeshe hati mara kadhaa. Tutapata neno moja mara mbili kwa kila jaribio la utekelezaji, haswa ikiwa tulifanya makosa katika utekelezaji wa nasibu.

Lakini acha. Hatukutuma /neno tena, kwa hivyo kwa nini ujumbe unachakatwa tena?

Foleni ya kutuma ujumbe kwa roboti ina urefu wa kikomo (nadhani ujumbe 100 au 200) na ni lazima uiondoe mwenyewe.

Kwa kweli hii imeelezewa kwenye nyaraka, lakini lazima uisome!

Katika hali hii, tunahitaji kigezo cha ?chat_id, na &timeout, &limit, &parse_mode=HTML na &disable_web_page_preview=true bado hazihitajiki.

Nyaraka kwa telegram api iko hapa
Inasema kwa kizungu na Kiingereza:
Kitambulisho cha sasisho la kwanza litakalorejeshwa. Lazima ziwe kubwa zaidi kwa moja kuliko ya juu zaidi kati ya vitambulisho vya masasisho yaliyopokelewa hapo awali. Kwa chaguo-msingi, sasisho zinazoanza na za mapema zaidi
haijathibitisha sasisho zinarejeshwa. Sasisho linachukuliwa kuthibitishwa mara tu getUpdates inapoitwa na kukabiliana na juu kuliko update_id yake. Urekebishaji hasi unaweza kubainishwa ili kupata masasisho kuanzia -offset update kutoka mwisho wa foleni ya masasisho. Sasisho zote za awali zitasahaulika.

Hebu tuangalie:

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

Ndiyo, na tutaiweka upya na kuandika upya chaguo la kukokotoa kidogo. Tuna chaguo mbili - kupitisha ujumbe mzima kwa chaguo la kukokotoa na kuuchakata kabisa kwenye kitendakazi, au toa tu kitambulisho cha ujumbe na uweke upya. Kwa mfano, ya pili inaonekana rahisi zaidi.

Hapo awali, mfuatano wetu wa hoja wa "ujumbe wote" ulionekana kama

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

na itaonekana kama

$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 

Hakuna mtu anayekukataza kupokea kwanza jumbe zote, kuzichakata, na baada ya ombi la kuchakata bila kuthibitishwa -> kuthibitishwa.

Kwa nini ni jambo la maana kupiga uthibitisho baada ya usindikaji wote kukamilika? Kushindwa kunawezekana katikati ya utekelezaji, na ikiwa kwa mfano wa chatbot ya bure, kukosa ujumbe mmoja sio kitu maalum, basi ikiwa unashughulikia mshahara wa mtu au shughuli ya kadi, matokeo yanaweza kuwa mbaya zaidi.

Mistari michache zaidi ya msimbo

$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. Badala ya hitimisho

Kazi za msingi - kusoma ujumbe, kuweka upya foleni, kusoma kutoka kwa faili na kuandika hadi faili hufanywa na kuonyeshwa.

Kuna mambo manne tu yaliyosalia kufanya:

  • kutuma jibu sahihi kwa ombi kwenye gumzo
  • kutuma jibu kwa soga YOYOTE ambayo roboti iliongezwa
  • kutekeleza nambari kwenye kitanzi
  • kuzindua bot kutoka kwa mpangilio wa windows.

Kazi hizi zote ni rahisi na zinaweza kukamilishwa kwa urahisi kwa kusoma hati kuhusu vigezo kama vile
Set-ExecutionPolicy Haijazuiliwa na -ExecutionPolicy Bypass
mzunguko wa fomu

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

Asante kwa kila mtu aliyesoma.

Chanzo: mapenzi.com

Kuongeza maoni