Cithakan kanggo bot telegram prasaja kanggo bocah sekolah ing kelas 7-9 nggunakake Powershell

Nalika omong-omongan karo kanca, dumadakan aku ngerti yen bocah-bocah kelas 8-10 ing sekolahe ora diwulang program program. Word, Excel lan kabeh. Ora ana logo, ora Pascal, malah VBA kanggo Excel.

Aku kaget banget, mbukak Internet lan wiwit maca -
Salah sawijining tugas sekolah khusus yaiku ningkatake pendhidhikan generasi anyar sing nyukupi kahanan masyarakat informasi ing tingkat pangembangan lan gaya urip.
Kursus iki bakal ngidini siswa nggabungake kawruh babagan konstruksi dhasar basa pamrograman Pascal. (saka program sawetara gimnasium kanggo 2017)

Pungkasane, aku mutusake nglampahi sawetara jam lan nggawe sketsa conto "carane nggawe bot sing gampang kanggo bocah sekolah."

Ing ngisor potongan kasebut yaiku carane nulis bot liyane sing prasaja ing Powershell lan bisa digunakake tanpa webhook, IP putih, server darmabakti, mesin virtual sing dipasang ing awan, lan liya-liyane - ing PC omah biasa kanthi Windows biasa.

TLDR: Artikel liyane sing mboseni kanthi kesalahan gramatikal lan faktual, ora ana sing diwaca, ora ana humor, ora ana gambar.

Ora ana sing anyar ing artikel kasebut, meh kabeh sing ditulis sadurunge wis ana ing Habré, contone ing artikel Pandhuan: Cara nggawe bot ing Telegram и Telegram bot kanggo administrator sistem.
Menapa malih, artikel punika sengaja keluwih-luwih supados boten saben-saben ngrujuk dhateng sastra pendidikan. Ora ana referensi kanggo Gang 4, PowerShell Deep Dives utawa, ucapake, 5 Pilar saka AWS Well-Architected Framework ing teks kasebut.

Tinimbang pambuka, sampeyan bisa skip

Bebas bae kanggo skipIng taun 2006, Microsoft ngrilis PowerShell 1.0 kanggo Windows XP, Vista, lan Server 2003. Ing sawetara cara, iki ngganti skrip cmdbat, skrip vb, Host Script Windows lan JScript.

Malah saiki, PowerShell mung bisa dianggep minangka langkah sabanjure sawise opsi Logo, tinimbang Delphi sing mbokmenawa isih digunakake (utawa sing luwih lawas), senadyan ana puteran, kelas, fungsi, panggilan MS GUI, Integrasi Git lan ing.

Powershell digunakake relatif arang; sampeyan mung bisa nemoni ing wangun PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Konfigurasi Negara sing Dipengini, Akses Web PowerShell lan rolas utawa luwih jarang digunakake program lan fungsi. Mbok menawa dheweke bakal entuk angin kapindho kanthi rilis WSL2, nanging ora persis.

Powershell uga duwe telung kaluwihan gedhe:

  1. Iku cukup prasaja, ana akeh literatur lan conto babagan iki, lan malah ing basa Rusia, contone, artikel babagan Foreach - saka buku kasebut. PowerShell kanthi jero - bab prabédan () lan {}
  2. Dheweke lunga karo editor ISE, klebu karo Windows. Malah ana sawetara jinis debugger ing kana.
  3. Iku gampang kanggo nelpon saka iku komponen kanggo mbangun antarmuka grafis.

0. Persiapan.

Kita kudu:

  • Windows PC (Aku duwe Windows 10)
  • Paling ora sawetara jinis akses Internet (liwat NAT contone)
  • Kanggo sing duwe akses winates menyang telegram - nginstal lan ngatur freegate ing browser, ing sawetara kasus sing angel, bebarengan karo Symple DNS Crypt
  • Nduwe klien telegram sing bisa digunakake ing telpon sampeyan
  • Ngerteni dhasar banget - apa variabel, array, loop.

Mbukak lan maca artikel - Pandhuan: Cara nggawe bot ing Telegram и Telegram bot kanggo administrator sistem

1. Ayo nggawe bot test liyane.

Amarga kabeh wong wis ngerti iki, lan wis kedadeyan, sampeyan uga bisa ngliwatiKaya sing kasebut ing artikel ing ndhuwur - Kaping pisanan, bot kanggo Telegram - iku isih aplikasi mlaku ing sisih sampeyan lan nggawe panjalukan kanggo Telegram Bot API. Kajaba iku, API kasebut cetha - bot ngakses URL tartamtu kanthi paramèter, lan Telegram nanggapi karo obyek JSON.

Masalah sing gegandhengan: yen kanthi cara sing ora dingerteni sampeyan njupuk sawetara kode saka obyek JSON lan piye wae dikirim kanggo eksekusi (ora sengaja), kode kasebut bakal dieksekusi kanggo sampeyan.

Proses nggawe kasebut diterangake ing rong artikel ing ndhuwur, nanging aku mbaleni maneh: ing telegram kita mbukak kontak, goleki @botfather, marang dheweke / newbot, nggawe bot Botfortest12344321, nelpon Mynext1234bot, lan nampa pesen kanthi kunci unik saka wangun 1234544311: AbcDefNNNNNNNNNNNNNNNN

Jaga kunci lan aja menehi!

Banjur sampeyan bisa ngatur bot, contone, nglarang nambah menyang grup, nanging ing langkah pisanan iki ora perlu.

Ayo takon BotFather kanggo "/ mybot" lan atur setelan yen kita ora seneng.

Ayo mbukak kontak maneh, temokake @Botfortest12344321 ing kana (wajib miwiti telusuran nganggo @), klik "miwiti" lan nulis menyang bot "/ Kamulyan kanggo robot." Tandha / dibutuhake, kuotasi ora dibutuhake.
Bot, mesthi, ora bakal mangsuli apa-apa.

Ayo priksa manawa bot wis digawe lan mbukak.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNNNN/getMe
ngendi 1234544311:AbcDefNNNNNNNNNNNNNN minangka kunci sing ditampa sadurunge,
lan entuk garis kaya
{"ok":true,"hasil":{""}}

Kita duwe frasa rahasia pisanan (token). Saiki kita kudu nemokake nomer rahasia kapindho - ID chatting karo bot. Saben obrolan, grup, lan liya-liyane iku individu lan duwe nomer dhewe (kadhangkala ana minus - kanggo grup mbukak). Kanggo ngerteni nomer iki, kita kudu njaluk ing browser (nyatane, ora perlu ing browser, nanging kanggo pangerten sing luwih apik sampeyan bisa miwiti) alamat (ing ngendi 1234544311:NNNNNNNNNN minangka token sampeyan.

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

lan entuk respon kaya

{"ok":true,"hasil":[{"update_id":...,... ngobrol":{"id":123456789

We kudu chat_id.

Ayo priksa manawa kita bisa nulis menyang obrolan kanthi manual: nelpon alamat kasebut saka browser

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

Yen sampeyan nampa pesen saka bot ing obrolan sampeyan, oke, sampeyan pindhah menyang tahap sabanjure.

Kanthi cara iki (liwat browser) sampeyan bisa tansah mriksa apa ana masalah karo generasi link, utawa yen ana sing didhelikake nang endi wae lan ora bisa.

Apa sampeyan kudu ngerti sadurunge nerusake maca

Telegram duwe sawetara jinis obrolan grup (mbukak, ditutup). Kanggo obrolan iki, sawetara fungsi (contone, id) beda, sing kadhangkala nyebabake sawetara masalah.

Ayo dadi nganggep iku pungkasan 2019, lan malah pahlawan wektu kita, kondhang Man-Orchestra (administrator, pengacara, spesialis keamanan informasi, programmer lan praktis MVP) Evgeniy V. mbedakake variabel $i saka array, wis nguwasani puteran, katon ing saperangan sabanjuré taun bakal Master Chocolatey, lan banjur Pangolahan podo karo PowerShell и Kanggo Saben-Obyek Paralel iku bakal teka.

1. Kita mikir babagan apa sing bakal ditindakake bot kita

Aku ora duwe gagasan, aku kudu mikir. Aku wis nulis bot-notebook. Aku ora pengin nggawe bot "sing ngirim soko nang endi wae." Kanggo nyambung menyang Azure sampeyan butuh kertu kredit, nanging saka ngendi siswa entuk? Sampeyan kudu nyatet sing kabeh ora dadi ala: mega utama menehi sawetara jinis wektu test kanggo free (nanging sampeyan isih perlu nomer kertu kredit - lan misale jek kaya dollar bakal debited saka iku. Aku ora ngelingi yen mengko dibalekake.)

Tanpa AI ML ora dadi menarik kanggo nggawe bot-miskin-pujangga-penenun.

Aku mutusake kanggo nggawe bot sing bakal ngelingake aku (utawa dudu aku) tembung Inggris saka kamus.
Supaya ora ngutak-atik database, kamus bakal disimpen ing file teks lan dianyari kanthi manual.
Ing kasus iki, tugas kanggo nuduhake dhasar saka karya, lan ora kanggo nggawe paling sethithik produk rampung.

2. Nyoba apa lan carane pisanan

Ayo nggawe folder C:poshtranslate
Pisanan, ayo ndeleng apa jenis powershell sing kita duwe, ayo miwiti ISE liwat start-run
powershell iki
utawa golek Powershell ISE ing program diinstal.
Sawise diluncurake, biasanipun "sawetara jinis editor" bakal mbukak, yen ora ana kolom teks, sampeyan bisa tansah klik "File - nggawe anyar".

Ayo ndeleng versi powershell - tulis ing kolom teks:

get-host 

lan pencet F5.

Powershell bakal nawakake kanggo nyimpen - "Skrip sing arep sampeyan lakoni bakal disimpen.", kita setuju, lan nyimpen file saka powershell kanthi jeneng ing C: poshtranslate myfirstbotBT100.

Sawise diluncurake, ing jendela teks ngisor kita entuk tabel data:

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

Aku duwe 5.1 soko, iku cukup. Yen sampeyan duwe Windows 7/8 lawas, mula ora masalah - sanajan PowerShell kudu dianyari menyang versi 5 - contone. instruksi.

Ketik Get-Date ing baris printah ing ngisor iki, penet Enter, deleng wektu, pindhah menyang folder root kanthi printah
cd
lan mbusak layar nganggo perintah cls (ora, sampeyan ora perlu nggunakake rm)

Saiki ayo dipriksa apa sing dianggo lan carane - ayo nulis ora malah kode, nanging loro baris, lan nyoba kanggo ngerti apa padha nindakake. Ayo komentar metu baris karo njaluk-host karo simbol # lan nambah sethitik.

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

(Apa sing menarik yaiku ing dhaptar gulung mudhun format kode ing Habré ana rong rolas pilihan - nanging Powershell ora ana. Dos ana. Perl ana.)

Lan ayo mbukak kode kanthi mencet F5 utawa ">" saka GUI.

Kita entuk output ing ngisor iki:

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

Saiki ayo goleki rong garis kasebut lan sawetara poin sing menarik supaya ora bali maneh ing mangsa ngarep.

Ora kaya Pascal (lan ora mung), PowerShell dhewe nyoba nemtokake jinis apa sing bakal diwenehake menyang variabel; rincian liyane babagan iki ditulis ing artikel Program pendidikan ngetik ing basa pemrograman
Mula, kanthi nggawe variabel $TimeNow lan menehi nilai tanggal lan wektu saiki (Get-Date), kita ora perlu kuwatir babagan jinis data sing bakal ana.

Bener, ora ngerti iki bisa uga lara mengko, nanging mengko. Ing ngisor iki ing teks bakal ana conto.
Ayo ndeleng apa sing entuk. Ayo eksekusi (ing baris perintah)

$TimeNow | Get-member

lan entuk kaca teks sing ora bisa dingerteni

Tuladha teks sing ora dingerteni nomer 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")...                                         

Nalika sampeyan bisa ndeleng, variabel jinis TypeName: System.DateTime wis digawe karo Bunch saka cara (ing pangertèn apa kita bisa nindakake karo obyek variabel iki) lan sifat.

Ayo telpon $TimeNow.DayOfYear - kita entuk nomer dina taun.
Ayo telpon $TimeNow.DayOfYear | Get-Member - kita njaluk TypeName: System.Int32 lan klompok metode.
Ayo telpon $TimeNow.ToUniversalTime() - lan entuk wektu ing UTC

Debugger

Kadhangkala kedadeyan yen perlu nglakokake program nganti garis tartamtu lan ndeleng kahanan program kasebut ing wektu kasebut. Kanggo tujuan iki, ISE nduweni fungsi Debug - toggle break point
Sijine breakpoint nang endi wae ing tengah, mbukak loro garis iki lan ndeleng apa break katon kaya.

3. Ngerteni interaksi karo bot Telegram

Mesthine, luwih akeh literatur wis ditulis babagan interaksi karo bot, karo kabeh getpush lan liya-liyane, nanging masalah teori bisa dianggep opsional.

Ing kasus kita perlu:

  • Sinau ngirim soko ing korespondensi
  • Sinau kanggo njaluk soko saka korespondensi

3.1 Sinau ngirim soko ing korespondensi lan nampa saka iku

Kode cilik - bagean 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

lan ing Federasi Rusia ing wektu iki kita entuk kesalahan Ora bisa nyambung menyang server remot.

Utawa kita ora nampa - gumantung ing operator telekomunikasi lan apa proxy wis diatur lan bisa digunakake
Nah, sing isih ana yaiku nambah proxy. Elinga yen nggunakake proxy sing ora dienkripsi lan umume penipuan mbebayani banget kanggo kesehatan sampeyan.

Tugas nemokake proxy sing bisa digunakake ora angel banget - umume proxy http sing diterbitake bisa digunakake. Aku sing kaping lima makarya kanggo kula.

Sintaks nggunakake proxy:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

Yen sampeyan nampa pesen ing chatting karo bot, banjur kabeh iku nggoleki, sampeyan bisa nerusake. Yen ora, terusake debugging.

Sampeyan bisa ndeleng apa string $URL4SEND sampeyan dadi lan nyoba njaluk ing browser, kaya iki:

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

3.2. Kita sinau carane nulis "soko" ing obrolan, saiki ayo nyoba maca

Ayo dadi nambah 4 garis liyane lan ndeleng apa nang liwat | njaluk-anggota

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

Bab sing paling menarik diwenehake kanggo kita

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

Ayo ndeleng apa sing ana ing dheweke:

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

Yen kabeh bisa kanggo sampeyan, sampeyan bakal entuk garis dawa kaya:

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

Untunge, ing artikel sing diterbitake sadurunge Telegram bot kanggo administrator sistem baris iki (ya, miturut $ MyMessageGet.RawContent | njaluk-anggota punika System.String), wis dibongkar.

4. Proses apa sing ditampa (kita wis ngerti carane ngirim soko)

Kaya sing wis ditulis kene, bab sing paling perlu dumunung ing isi. Ayo dideleng kanthi cetha.

Kaping pisanan, kita bakal nulis sawetara frasa liyane menyang bot saka antarmuka web utawa saka telpon

/message1
/message2
/message3

lan goleki liwat browser ing alamat sing dibentuk ing variabel $URLGET.

Kita bakal weruh kaya:

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

Opo iki? Sawetara obyek kompleks saka susunan obyek sing ngemot pengenal pesen end-to-end, pengenal chatting, pengenal ngirim lan akeh informasi liyane.

Nanging, kita ora perlu ngerti "apa jenis obyek iki" - bagean saka karya wis rampung kanggo kita. Ayo ndeleng apa sing ana ing njero:

Maca pesen sing ditampa utawa bagean 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. Apa sing kudu ditindakké saiki?

Ayo simpen file sing diasilake kanthi jeneng myfirstbotBT105 utawa apa wae sing paling disenengi, ganti judhul lan komentar kabeh kode sing wis ditulis liwat

<#start comment 105 end comment 105#>

Saiki kita kudu mutusake ngendi entuk kamus (uga, ing ngendi - ing disk ing file) lan apa sing bakal katon.

Mesthi wae, sampeyan bisa nulis kamus gedhe ing teks naskah, nanging iki ora ana ing jejere.
Dadi ayo ndeleng apa powershell bisa digunakake kanthi normal.
Umumé, dheweke ora preduli karo file sing bakal digarap, ora masalah kanggo kita.
Kita duwe pilihan: txt (sampeyan bisa, nanging kok), csv, xml.
Apa kita bisa nonton kabeh? Ayo ndeleng kabeh.
Ayo nggawe kelas MyVocabClassExample1 lan variabel $MyVocabExample1
Aku Wigati sing kelas ditulis tanpa $

sawetara kode #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

Ayo dadi nyoba kanggo nulis iki menyang file nggunakake teladan.

Sawetara kode #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

- lan kita entuk kesalahan ing baris Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2.

Dheweke ora pengin nambah, ah-ah, apa isin.

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

Ayo ndeleng apa sing kedadeyan. Tampilan teks sing apik - nanging kepiye cara ngekspor maneh? Apa aku kudu ngenalake sawetara jinis pemisah teks, kayata koma?

Lan ing pungkasan sampeyan entuk file "nilai sing dipisahake koma (CSV) file A STOP NENG.
#

$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 

Kaya sing gampang dideleng, MS ora dibedakake kanthi logika; kanggo prosedur sing padha, ing siji kasus -FilePath digunakake, ing liyane -Path.

Kajaba iku, ing file katelu basa Rusia ilang, ing file kaping papat ternyata ... uga, ana kedadeyan. #TYPE System.Object[] 00
# "Count", "Length", "LongLength", "Rank", "SyncRoot", "IsReadOnly", "IsFixedSize", "IsSynchronized"
#
Ayo nulis maneh sethithik:

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

Iku misale jek wis mbantu, nanging aku isih ora kaya format.

Aku utamané ora kaya aku ora bisa sijine garis saka obyek menyang file langsung.
Miturut cara, wiwit kita miwiti nulis menyang file, kita bisa miwiti nyimpen log wiwitan? Kita duwe wektu minangka variabel, kita bisa nyetel jeneng file.

Bener, durung ana sing kudu ditulis, nanging sampeyan bisa mikir babagan cara paling apik kanggo muter log.
Ayo nyoba xml saiki.

Sawetara 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

Ngekspor menyang xml nduweni akeh kaluwihan - keterbacaan, ekspor kabeh obyek, lan ora perlu nindakake uppend.

Ayo coba maca file xml.

A maca sethitik saka xml

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

Ayo bali menyang tugas. Kita nulis file test, maca, format panyimpenan cetha, yen perlu, sampeyan bisa nulis editor file cilik kapisah kanggo nambah lan mbusak garis.

Ayo kula ngelingake yen tugase nggawe bot latihan cilik.

Format kerja: Aku ngirim printah "conto" menyang bot, bot ngirim tembung lan transkripsi sing dipilih kanthi acak, lan sawise 10 detik ngirim terjemahan lan komentar. Kita ngerti carane maca printah, kita uga seneng sinau carane milih lan mriksa proxy kanthi otomatis, lan ngreset counter pesen kanggo lalen.

Ayo mbusak komentar kabeh sing sadurunge dikomentari minangka ora perlu, menehi komentar conto sing saiki ora perlu nganggo txt lan csv, lan simpen file kasebut minangka versi B106

Oh ya. Ayo ngirim soko menyang bot maneh.

6. Dispatch saka fungsi lan liyane

Sadurunge ngolah resepsi, sampeyan kudu nggawe fungsi kanggo ngirim "paling ora soko" liyane saka pesen test.

Mesthi, ing conto, kita mung bakal ngirim siji lan mung siji pangolahan, nanging apa yen kita kudu nindakake perkara sing padha kaping pirang-pirang?

Iku luwih gampang kanggo nulis fungsi. Dadi, kita duwe variabel jinis obyek $MyVocabExample4AsArray, diwaca saka file kasebut, ing wangun array saka rong unsur.
Ayo padha maca.

Ing wektu sing padha, kita bakal ngatasi jam kasebut; kita bakal mbutuhake mengko (nyatane, ing conto iki kita ora butuh :)

Sawetara kode #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
}

Nalika sampeyan bisa ndeleng kanthi gampang, fungsi kasebut nelpon $MyToken lan $MyChatID, sing wis dikode kanthi hard.

Ora perlu kanggo nindakake iki, lan yen $ MyToken iku siji kanggo saben bot, banjur $ MyChatID bakal ngganti gumantung ing chatting.

Nanging, amarga iki minangka conto, kita bakal nglirwakake saiki.

Wiwit $MyVocabExample4AsArray dudu array, sanajan meh padha karo siji, mula sampeyan ora bisa mung njupuk njaluk dawa.

Sawise maneh, kita kudu nindakake apa wae sing ora bisa ditindakake - parasut ora miturut kode - njupuk lan ngitung

Sawetara kode #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 fitur menarik. Ayo dadi ngomong kita pengin nampa 0 utawa 1 (kita duwe mung loro unsur ing Uploaded). Nalika nyetel wates 0..1, bakal entuk "1"?
ora - kita ora bakal entuk, kita duwe conto khusus Conto 2: Entuk integer acak antarane 0 lan 99 Entuk-Acak -Maksimum 100
Mulane, kanggo 0..1 kita kudu nyetel ukuran 0..2, kanthi nomer unsur maksimum = 1.

7. Processing pesen mlebu lan dawa antrian maksimum

Ing ngendi kita mandheg sadurunge? kita duwe variabel sing ditampa $ MyMessageGet
lan $Content4Pars01 dijupuk saka iku, kang kita kasengsem ing unsur saka Content4Pars01.result array

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

Ayo ngirim bot / pesen10, / pesen11, / pesen12, / tembung lan maneh / tembung lan / halo.
Ayo ndeleng apa sing entuk:

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

Ayo kabeh sing ditampa lan ngirim respon yen pesen kasebut / tembung
kasus mbangun, apa sawetara njlèntrèhaké minangka if-elseif, disebut ing powershell liwat switch. Ing wektu sing padha, kode ing ngisor iki nggunakake tombol -wildcard, sing ora perlu lan malah mbebayani.

Sawetara kode #7.1

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

Ayo mbukak script kaping pindho. Kita bakal njaluk tembung sing padha kaping pindho kanggo saben nyoba eksekusi, utamané yen kita nggawe kesalahan ing implementasine saka acak.

Nanging mandheg. Kita ora ngirim / tembung maneh, dadi kenapa pesen kasebut diproses maneh?

Antrian kanggo ngirim pesen menyang bot nduweni dawa sing winates (100 utawa 200 pesen, aku mikir) lan kudu dibusak kanthi manual.

Iki mesthi diterangake ing dokumentasi, nanging sampeyan kudu maca!

Ing kasus iki, kita butuh parameter ?chat_id, lan &timeout, &limit, &parse_mode=HTML lan &disable_web_page_preview=true durung dibutuhake.

Dokumentasi kanggo telegram api ana ing kene
Ngandika ing putih lan Inggris:
Pengenal nganyari pisanan sing bakal bali. Kudu luwih gedhe tinimbang sing paling dhuwur ing antarane pengenal nganyari sing ditampa sadurunge. Kanthi gawan, nganyari diwiwiti kanthi paling awal
durung dikonfirmasi nganyari wis bali. Nganyari dianggep dikonfirmasi sanalika getUpdates diarani karo nutupi luwih dhuwur tinimbang update_id. Offset negatif bisa ditemtokake kanggo njupuk nganyari wiwit saka nganyari -offset saka mburi antrian nganyari. Kabeh nganyari sadurunge bakal dilalekake.

Ayo katon ing:

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

Ya, lan kita bakal ngreset lan nulis maneh fungsi kasebut sethithik. We duwe rong pilihan - pass kabeh pesen kanggo fungsi lan proses tanggung ing fungsi, utawa menehi mung ID pesen lan ngreset. Contone, sing kapindho katon luwih prasaja.

Sadurunge, senar pitakon "kabeh pesen" katon kaya

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

lan bakal katon kaya

$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 

Ora ana sing nglarang sampeyan nampa kabeh pesen, ngolah, lan mung sawise panjaluk pangolahan sing sukses ora dikonfirmasi -> dikonfirmasi.

Apa iku nggawe pangertèn kanggo nelpon konfirmasi sawise kabeh Processing wis rampung? Gagal bisa uga ana ing tengah eksekusi, lan yen conto chatbot gratis, ora ana pesen sing ora ana sing istimewa, mula yen sampeyan ngolah gaji utawa transaksi kertu, asil bisa uga luwih elek.

A saperangan liyane baris kode

$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. Tinimbang kesimpulan

Fungsi dhasar - maca pesen, ngreset antrian, maca saka file lan nulis menyang file wis rampung lan ditampilake.

Mung ana papat perkara sing kudu ditindakake:

  • ngirim jawaban sing bener kanggo panjalukan ing chatting
  • ngirim respon kanggo ANY chatting sing bot ditambahaké
  • ngeksekusi kode ing loop
  • ngluncurake bot saka panjadwal windows.

Kabeh tugas iki prasaja lan bisa gampang ditindakake kanthi maca dokumentasi babagan paramèter kayata
Set-ExecutionPolicy Unrestricted and -ExecutionPolicy Bypass
siklus saka wangun

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

Matur nuwun kanggo kabeh sing maca.

Source: www.habr.com

Add a comment