Template bot telegram sederhana untuk anak sekolah kelas 7-9 menggunakan Powershell

Saat berbincang dengan seorang teman, saya tiba-tiba mengetahui bahwa anak-anak kelas 8-10 di sekolahnya tidak diajarkan pemrograman sama sekali. Word, Excel, dan semuanya. Tidak ada logo, bahkan Pascal, bahkan VBA untuk Excel.

Saya sangat terkejut, membuka Internet dan mulai membaca -
Salah satu tugas sekolah khusus adalah memajukan pendidikan generasi baru yang memenuhi kondisi masyarakat informasi dalam tingkat perkembangan dan gaya hidup.
Kursus ini akan memungkinkan siswa untuk mengkonsolidasikan dalam praktik pengetahuan mereka tentang konstruksi dasar bahasa pemrograman Pascal. (dari program beberapa gimnasium tahun 2017)

Pada akhirnya, saya memutuskan untuk menghabiskan beberapa jam dan membuat sketsa contoh “cara membuat bot sederhana untuk anak sekolah.”

Di bawah ini adalah cara menulis bot sederhana lainnya di Powershell dan membuatnya berfungsi tanpa webhook, IP putih, server khusus, mesin virtual yang diterapkan di cloud, dan sebagainya - pada PC rumahan biasa dengan Windows biasa.

TLDR: Artikel membosankan lainnya dengan kesalahan tata bahasa dan faktual, tidak ada yang perlu dibaca, tidak ada humor, tidak ada gambar.

Tidak ada yang baru dalam artikel, hampir semua yang ditulis sebelumnya sudah ada di Habré, misalnya di artikel Petunjuk: Cara membuat bot di Telegram и Bot Telegram untuk administrator sistem.
Apalagi artikel tersebut sengaja dibuat mubazir agar tidak selalu mengacu pada literatur pendidikan. Tidak ada referensi ke Gang 4, PowerShell Deep Dives atau, katakanlah, 5 Pilar Kerangka Kerja AWS Well-Architected dalam teks.

Alih-alih kata pengantar, Anda bisa melewatinya

Silakan lewatiPada tahun 2006, Microsoft merilis PowerShell 1.0 untuk Windows XP, Vista, dan Server 2003. Dalam beberapa hal, ini menggantikan skrip cmdbat, skrip vb, Windows Script Host dan JScript.

Bahkan sekarang, PowerShell hanya dapat dianggap sebagai langkah berikutnya setelah opsi Logo, daripada Delphi yang mungkin masih digunakan (atau yang lebih lama), meskipun terdapat loop, kelas, fungsi, panggilan MS GUI, Integrasi Git dan sebagainya.

Powershell relatif jarang digunakan; Anda hanya dapat menemukannya dalam bentuk PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Desired State Configuration, Akses Web PowerShell dan selusin program dan fungsi yang lebih jarang digunakan. Mungkin dia akan mendapatkan angin kedua dengan rilisnya WSL2, tapi tidak persis.

Powershell juga memiliki tiga keunggulan besar:

  1. Ini relatif sederhana, ada banyak literatur dan contoh tentangnya, dan bahkan dalam bahasa Rusia, misalnya, artikel tentang Foreach - dari buku PowerShell secara mendalam - tentang perbedaan () dan {}
  2. Dia pergi bersama editor ISE, disertakan dengan Windows. Bahkan ada semacam debugger di sana.
  3. Sangat mudah untuk menelepon dari sana komponen untuk membangun antarmuka grafis.

0. Persiapan.

Kami akan membutuhkan:

  • PC Windows (Saya punya Windows 10)
  • Setidaknya beberapa jenis akses Internet (melalui NAT misalnya)
  • Bagi mereka yang memiliki akses terbatas ke telegram - menginstal dan mengkonfigurasi freegate di browser, dalam beberapa kasus sulit, bersama dengan Simple DNS Crypt
  • Memiliki klien telegram yang berfungsi di ponsel Anda
  • Memahami dasar-dasarnya - apa itu variabel, array, loop.

Membuka dan membaca artikel - Petunjuk: Cara membuat bot di Telegram и Bot Telegram untuk administrator sistem

1. Mari buat bot pengujian lainnya.

Karena semua orang sudah mengetahui hal ini, dan sudah terjadi, Anda juga dapat melewatkannyaSeperti yang dinyatakan dalam artikel di atas - Pertama-tama, bot untuk Telegram - itu masih merupakan aplikasi yang berjalan di pihak Anda dan membuat permintaan ke API Bot Telegram. Selain itu, API-nya jelas - bot mengakses URL tertentu dengan parameter, dan Telegram merespons dengan objek JSON.

Masalah terkait: jika dengan cara yang tidak diketahui Anda mengambil beberapa kode dari objek JSON dan entah bagaimana mengirimkannya untuk dieksekusi (tidak sengaja), kode tersebut akan dieksekusi untuk Anda.

Proses pembuatannya dijelaskan dalam dua artikel di atas, tapi saya ulangi: di telegram kita buka kontak, cari @botfather, beri tahu dia /newbot, buat bot Botfortest12344321, beri nama Mynext1234bot, dan terima pesan dengan kunci unik dari formulir 1234544311:AbcDefNNNNNNNNNNNNNN

Jaga kuncinya dan jangan berikan!

Kemudian Anda dapat mengonfigurasi bot, misalnya, melarang menambahkannya ke grup, tetapi pada langkah pertama hal ini tidak perlu.

Mari kita tanyakan “/mybot” pada Botfather dan sesuaikan pengaturannya jika kita tidak menyukai sesuatu.

Mari kita buka kembali kontaknya, temukan @Botfortest12344321 di sana (wajib memulai pencarian dengan @), klik "mulai" dan tulis ke bot "/Glory to the robots." Tanda / wajib diisi, tidak perlu tanda petik.
Bot tentu saja tidak akan menjawab apa pun.

Mari kita periksa apakah bot telah dibuat dan membukanya.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNN/getMe
dimana 1234544311:AbcDefNNNNNNNNNNNNNN adalah kunci yang diterima sebelumnya,
dan dapatkan garis seperti
{"ok":benar,"hasil":{""}}

Kami memiliki frase rahasia pertama (token). Sekarang kita perlu mengetahui nomor rahasia kedua - ID obrolan dengan bot. Setiap obrolan, grup, dll. bersifat individual dan memiliki nomornya sendiri (terkadang dengan minus - untuk grup terbuka). Untuk mengetahui nomor ini, kita perlu meminta di browser (sebenarnya, ini sama sekali tidak diperlukan di browser, tetapi untuk pemahaman yang lebih baik Anda dapat memulainya) alamat (di mana 1234544311:NNNNNNNNNN adalah token Anda

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

dan mendapat respons seperti

{"ok":benar,"hasil":[{"update_id":...,... mengobrol":{"pengenal":123456789

Kami membutuhkan chat_id.

Mari kita periksa apakah kita dapat menulis ke obrolan secara manual: panggil alamatnya dari browser

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

Jika Anda menerima pesan dari bot di chat Anda, oke, Anda melanjutkan ke tahap berikutnya.

Dengan cara ini (melalui browser) Anda selalu dapat memeriksa apakah ada masalah dengan pembuatan tautan, atau ada sesuatu yang tersembunyi di suatu tempat dan tidak berfungsi.

Apa yang perlu Anda ketahui sebelum melanjutkan membaca

Telegram memiliki beberapa jenis obrolan grup (terbuka, tertutup). Untuk chat ini, beberapa fungsinya (misalnya id) berbeda, sehingga terkadang menimbulkan beberapa masalah.

Mari kita asumsikan bahwa ini adalah akhir tahun 2019, dan bahkan pahlawan zaman kita, Man-Orchestra yang terkenal (administrator, pengacara, spesialis keamanan informasi, pemrogram, dan praktis MVP) Evgeniy V. membedakan variabel $i dari array, telah menguasai loop, lihat dalam beberapa tahun ke depan akan menguasai Chocolatey, dan kemudian Pemrosesan paralel dengan PowerShell и Untuk Setiap Objek Paralel itu akan datang.

1. Kami memikirkan apa yang akan dilakukan bot kami

Saya tidak punya ide, saya harus berpikir. Saya sudah menulis bot-notebook. Saya tidak ingin membuat bot “yang mengirimkan sesuatu ke suatu tempat”. Untuk terhubung ke Azure Anda memerlukan kartu kredit, tapi dari mana siswa mendapatkannya? Perlu dicatat bahwa semuanya tidak terlalu buruk: awan utama memberikan semacam periode tes gratis (tetapi Anda masih memerlukan nomor kartu kredit - dan sepertinya satu dolar akan didebit darinya. Saya tidak ingat apakah itu dikembalikan nanti.)

Tanpa AI ML, tidaklah menarik untuk membuat penenun bot-miskin-penyair.

Saya memutuskan untuk membuat bot yang akan mengingatkan saya (atau bukan saya) pada kata-kata bahasa Inggris dari kamus.
Untuk menghindari kekacauan dengan database, kamus akan disimpan dalam file teks dan diperbarui secara manual.
Dalam hal ini, tugasnya adalah menunjukkan dasar-dasar pekerjaan, dan bukan membuat setidaknya sebagian produk jadi.

2. Mencoba apa dan bagaimana untuk pertama kalinya

Mari buat folder C:poshtranslate
Pertama, mari kita lihat PowerShell seperti apa yang kita miliki, mari luncurkan ISE melalui start-run
ise PowerShell
atau temukan Powershell ISE di program yang diinstal.
Setelah peluncuran, "semacam editor" yang biasa kita kenal akan terbuka, jika tidak ada bidang teks, Anda selalu dapat mengklik "File - buat baru".

Mari kita lihat versi PowerShell - tulis di kolom teks:

get-host 

dan tekan F5.

Powershell akan menawarkan untuk menyimpan - "Skrip yang akan Anda jalankan akan disimpan.", kami setuju, dan simpan file dari PowerShell dengan nama di C: poshtranslate myfirstbotBT100.

Setelah peluncuran, di jendela teks bawah kita mendapatkan tabel data:

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

Saya punya 5.1 sesuatu, itu sudah cukup. Jika Anda memiliki Windows 7/8 lama maka bukan masalah besar - meskipun PowerShell perlu diperbarui ke versi 5 - mis. Instruksi.

Ketik Get-Date pada baris perintah di bawah ini, tekan Enter, lihat jamnya, masuk ke folder root dengan perintah
cd
dan bersihkan layar dengan perintah cls (tidak, Anda tidak perlu menggunakan rm)

Sekarang mari kita periksa apa yang berhasil dan bagaimana caranya - mari kita tulis bukan hanya kodenya, tetapi dua baris, dan coba pahami fungsinya. Mari beri komentar pada baris get-host dengan simbol # dan tambahkan sedikit.

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

(Yang menarik adalah bahwa dalam daftar drop-down pemformatan kode di Habré terdapat dua lusin opsi - namun Powershell tidak ada. Dos ada di sana. Perl ada di sana.)

Dan mari kita jalankan kodenya dengan menekan F5 atau ">" dari GUI.

Kami mendapatkan output berikut:

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

Sekarang mari kita lihat kedua garis ini dan beberapa poin menariknya agar kita tidak mengulanginya lagi di kemudian hari.

Tidak seperti Pascal (dan tidak hanya), PowerShell sendiri mencoba menentukan tipe apa yang akan ditetapkan ke suatu variabel; rincian lebih lanjut tentang ini ditulis dalam artikel Program pendidikan mengetik dalam bahasa pemrograman
Oleh karena itu, dengan membuat variabel $TimeNow dan menetapkannya nilai tanggal dan waktu saat ini (Get-Date), kita tidak perlu terlalu khawatir tentang tipe data apa yang akan ada di sana.

Benar, ketidaktahuan ini mungkin menyakitkan di kemudian hari, tapi itu untuk nanti. Di bawah teks akan ada contohnya.
Mari kita lihat apa yang kita punya. Mari kita jalankan (di baris perintah)

$TimeNow | Get-member

dan dapatkan halaman teks yang tidak dapat dipahami

Contoh teks yang tidak dapat dipahami nomor 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")...                                         

Seperti yang Anda lihat, variabel bertipe TypeName: System.DateTime telah dibuat dengan sekumpulan metode (dalam artian apa yang dapat kita lakukan dengan objek variabel ini) dan properti.

Mari kita menelepon $TimeNow.DayOfYear — kita mendapatkan nomor hari dalam setahun.
Mari kita menelepon $TimeNow.DayOfYear | Get-Member - kita mendapatkan TypeName: System.Int32 dan sekelompok metode.
Mari kita menelepon $TimeNow.ToUniversalTime() - dan dapatkan waktu dalam UTC

Debugger

Kadang-kadang diperlukan untuk menjalankan suatu program hingga baris tertentu dan melihat status program pada saat itu. Untuk tujuan ini, ISE memiliki fungsi Debug - beralih titik istirahat
Letakkan breakpoint di suatu tempat di tengah, jalankan dua garis ini dan lihat seperti apa breaknya.

3. Memahami interaksi dengan bot Telegram

Tentu saja, lebih banyak literatur telah ditulis tentang interaksi dengan bot, dengan semua getpush dan sebagainya, namun masalah teori dapat dianggap opsional.

Dalam kasus kami, ini diperlukan:

  • Belajar mengirim sesuatu melalui korespondensi
  • Belajar mendapatkan sesuatu dari korespondensi

3.1 Belajar mengirim sesuatu melalui korespondensi dan menerima darinya

Sedikit kode - bagian 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

dan di Federasi Rusia saat ini kami mendapatkan kesalahan Tidak dapat terhubung ke server jarak jauh.

Atau kami tidak menerimanya - tergantung pada operator telekomunikasi dan apakah proxy dikonfigurasi dan berfungsi
Nah, yang tersisa hanyalah menambahkan proxy. Harap dicatat bahwa menggunakan proxy yang tidak terenkripsi dan umumnya palsu sangat berbahaya bagi kesehatan Anda.

Tugas menemukan proxy yang berfungsi tidak terlalu sulit - sebagian besar proxy http yang dipublikasikan berfungsi. Saya pikir yang kelima berhasil untuk saya.

Sintaks menggunakan proxy:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

Jika Anda menerima pesan dalam obrolan Anda dengan bot, maka semuanya baik-baik saja, Anda dapat melanjutkan. Jika tidak, lanjutkan proses debug.

Anda dapat melihat apa yang menjadi string $URL4SEND Anda dan mencoba memintanya di browser, seperti ini:

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

3.2. Kita belajar bagaimana menulis “sesuatu” di chat, sekarang mari kita coba membacanya

Mari tambahkan 4 baris lagi dan lihat isinya melalui | dapatkan 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

Hal yang paling menarik diberikan kepada kami

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

Mari kita lihat apa isinya:

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

Jika semuanya berhasil untuk Anda, Anda akan mendapatkan antrean panjang seperti:

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

Untungnya, dalam artikel yang diterbitkan sebelumnya Telegram bot untuk administrator sistem baris ini (ya, menurut $MyMessageGet.RawContent | dapatkan-anggota adalah System.String), sudah dibongkar.

4. Memproses apa yang Anda terima (kita sudah tahu cara mengirim sesuatu)

Seperti yang sudah tertulis di sini, hal yang paling penting terletak pada konten. Mari kita lihat lebih dekat.

Pertama, kami akan menulis beberapa frasa lagi ke bot dari antarmuka web atau dari telepon

/message1
/message2
/message3

dan lihat melalui browser pada alamat yang dibentuk dalam variabel $URLGET.

Kita akan melihat sesuatu seperti:

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

Apa itu? Beberapa objek kompleks dari array objek yang berisi pengidentifikasi pesan ujung ke ujung, pengidentifikasi obrolan, pengidentifikasi pengiriman, dan banyak informasi lainnya.

Namun, kita tidak perlu memikirkan “objek macam apa ini” - sebagian pekerjaan telah selesai untuk kita. Mari kita lihat apa yang ada di dalamnya:

Membaca pesan yang diterima atau bagian 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 yang harus kita lakukan sekarang?

Mari kita simpan file yang dihasilkan dengan nama myfirstbotBT105 atau apa pun yang paling Anda suka, ubah judul dan komentari semua kode yang sudah ditulis melalui

<#start comment 105 end comment 105#>

Sekarang kita perlu memutuskan di mana mendapatkan kamus (yah, di mana - di disk dalam file) dan seperti apa tampilannya.

Tentu saja, Anda dapat menulis kamus besar langsung di teks naskah, tetapi ini sama sekali tidak penting.
Jadi mari kita lihat PowerShell mana yang dapat bekerja secara normal.
Secara umum, dia tidak peduli file mana yang akan digunakan, itu tidak masalah bagi kami.
Kami punya pilihan: txt (bisa, tapi kenapa), csv, xml.
Bisakah kita menonton semuanya? Mari kita lihat semuanya.
Mari kita buat kelas MyVocabClassExample1 dan variabel $MyVocabExample1
Saya perhatikan bahwa kelas ditulis tanpa $

beberapa 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

Mari kita coba menulis ini ke dalam file menggunakan teladan.

Beberapa 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

- dan kami mendapatkan kesalahan pada baris Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2.

Dia tidak mau menambahkan, ah-ah, sayang sekali.

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

Mari lihat apa yang terjadi. Tampilan teks bagus - tetapi bagaimana cara mengekspornya kembali? Haruskah saya memperkenalkan semacam pemisah teks, seperti koma?

Dan pada akhirnya Anda mendapatkan “file nilai yang dipisahkan koma (CSV) A BERHENTI TUNGGU.
#

$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 

Seperti yang mudah dilihat, MS tidak terlalu dibedakan berdasarkan logikanya; untuk prosedur serupa, dalam satu kasus -FilePath digunakan, dalam kasus lain -Path.

Selain itu, di file ketiga bahasa Rusianya hilang, di file keempat ternyata... nah, terjadi sesuatu. #TYPE Sistem.Objek[] 00
# “Hitungan”, “Panjang”, “Panjang Panjang”, “Peringkat”, “SyncRoot”, “IsReadOnly”, “IsFixedSize”, “IsSynchronized”
#
Mari kita tulis ulang sedikit:

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

Tampaknya membantu, tetapi saya masih tidak menyukai formatnya.

Saya terutama tidak suka karena saya tidak bisa memasukkan baris dari suatu objek ke dalam file secara langsung.
Ngomong-ngomong, sejak kita mulai menulis ke file, bisakah kita mulai menyimpan log startup? Kita punya waktu sebagai variabel, kita bisa mengatur nama file.

Benar, belum ada yang perlu ditulis, tetapi Anda dapat memikirkan cara terbaik untuk memutar log.
Mari kita coba xml untuk saat ini.

Beberapa 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

Mengekspor ke xml memiliki banyak keuntungan - keterbacaan, ekspor seluruh objek, dan tidak perlu melakukan uppend.

Ayo coba membaca file xml.

Sedikit membaca dari xml

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

Mari kita kembali ke tugas. Kami menulis file uji, membacanya, format penyimpanannya jelas, jika perlu, Anda dapat menulis editor file kecil terpisah untuk menambah dan menghapus baris.

Izinkan saya mengingatkan Anda bahwa tugasnya adalah membuat bot pelatihan kecil.

Format kerja: Saya mengirimkan perintah "contoh" ke bot, bot mengirimi saya kata dan transkripsi yang dipilih secara acak, dan setelah 10 detik mengirimi saya terjemahan dan komentar. Kami tahu cara membaca perintah, kami juga ingin mempelajari cara memilih dan memeriksa proxy secara otomatis, dan menyetel ulang penghitung pesan hingga terlupakan.

Mari hapus komentar pada semua komentar yang sebelumnya dianggap tidak perlu, beri komentar pada contoh yang sekarang tidak perlu dengan txt dan csv, dan simpan file sebagai versi B106

Oh ya. Ayo kirim sesuatu ke bot lagi.

6. Pengiriman dari fungsi dan lainnya

Sebelum memproses penerimaan, Anda perlu membuat fungsi untuk mengirim "setidaknya sesuatu" selain pesan percobaan.

Tentu saja, dalam contoh ini kita hanya akan memiliki satu pengiriman dan hanya satu pemrosesan, tapi bagaimana jika kita perlu melakukan hal yang sama beberapa kali?

Lebih mudah untuk menulis suatu fungsi. Jadi, kita mempunyai variabel bertipe objek $MyVocabExample4AsArray, dibaca dari file, berupa array sebanyak dua elemen.
Ayo membaca.

Pada saat yang sama, kita akan berurusan dengan jam; kita akan membutuhkannya nanti (sebenarnya, dalam contoh ini kita tidak membutuhkannya :)

Beberapa 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
}

Seperti yang dapat Anda lihat dengan mudah, fungsi tersebut memanggil $MyToken dan $MyChatID, yang telah di-hardcode sebelumnya.

Tidak perlu melakukan ini, dan jika $MyToken adalah satu untuk setiap bot, maka $MyChatID akan berubah tergantung pada obrolan.

Namun, karena ini adalah sebuah contoh, kami akan mengabaikannya untuk saat ini.

Karena $MyVocabExample4AsArray bukan sebuah array, meskipun sangat mirip dengan array, maka kamu tidak bisa menerimanya begitu saja minta panjangnya.

Sekali lagi kita harus melakukan sesuatu yang tidak bisa dilakukan - terjun payung tidak sesuai kode - ambil dan hitung

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

Acak fitur menarik. Katakanlah kita ingin menerima 0 atau 1 (kita hanya memiliki dua elemen dalam array). Saat menetapkan batas 0..1, apakah kita akan mendapatkan “1”?
tidak - kami tidak akan mendapatkannya, kami memiliki contoh khusus Contoh 2: Dapatkan bilangan bulat acak antara 0 dan 99 Dapatkan-Acak -Maksimum 100
Oleh karena itu, untuk 0..1 kita perlu mengatur ukurannya 0..2, dengan jumlah elemen maksimum = 1.

7. Pemrosesan pesan masuk dan panjang antrian maksimal

Dimana kita berhenti tadi? kita memiliki variabel yang diterima $MyMessageGet
dan $Content4Pars01 diperoleh darinya, yang mana kami tertarik pada elemen array Content4Pars01.result

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

Ayo kirim bot /message10, /message11, /message12, /word dan lagi /word dan /hello.
Mari kita lihat apa yang kita dapatkan:

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

Mari kita periksa semua yang diterima dan kirimkan respons jika pesannya adalah /word
kasus konstruksi, yang oleh beberapa orang digambarkan sebagai if-elseif, disebut dalam PowerShell melalui saklar. Pada saat yang sama, kode di bawah ini menggunakan kunci -wilcard, yang sama sekali tidak diperlukan dan bahkan berbahaya.

Beberapa kode #7.1

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

Mari kita jalankan skripnya beberapa kali. Kita akan mendapatkan kata yang sama dua kali untuk setiap upaya eksekusi, terutama jika kita melakukan kesalahan dalam implementasi secara acak.

Tapi berhenti. Kami tidak mengirimkan /word lagi, lalu mengapa pesan tersebut diproses lagi?

Antrian untuk mengirim pesan ke bot memiliki panjang yang terbatas (menurut saya 100 atau 200 pesan) dan harus dihapus secara manual.

Hal ini tentu saja dijelaskan dalam dokumentasi, tetapi Anda harus membacanya!

Dalam hal ini, kita memerlukan parameter ?chat_id, dan &timeout, &limit, &parse_mode=HTML dan &disable_web_page_preview=true belum diperlukan.

Dokumentasi untuk telegram api ada di sini
Dikatakan dalam bahasa putih dan bahasa Inggris:
Pengidentifikasi pembaruan pertama yang dikembalikan. Harus lebih besar satu daripada yang tertinggi di antara pengidentifikasi pembaruan yang diterima sebelumnya. Secara default, pembaruan dimulai dari yang paling awal
belum dikonfirmasi pembaruan dikembalikan. Pembaruan dianggap dikonfirmasi segera setelah getUpdates dipanggil dengan mengimbangi lebih tinggi daripada update_id-nya. Offset negatif dapat ditentukan untuk mengambil pembaruan mulai dari -offset update dari akhir antrian pembaruan. Semua pembaruan sebelumnya akan dilupakan.

Mari lihat:

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

Ya, dan kami akan mengatur ulang dan menulis ulang fungsinya sedikit. Kami memiliki dua pilihan - meneruskan seluruh pesan ke fungsi dan memprosesnya seluruhnya dalam fungsi, atau hanya memberikan ID pesan dan mengatur ulang. Misalnya, yang kedua terlihat lebih sederhana.

Sebelumnya, string kueri "semua pesan" kami terlihat seperti ini

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

dan itu akan terlihat seperti

$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 

Tidak ada yang melarang Anda untuk menerima semua pesan terlebih dahulu, memprosesnya, dan hanya setelah pemrosesan berhasil permintaan belum dikonfirmasi -> dikonfirmasi.

Mengapa masuk akal untuk menghubungi konfirmasi setelah semua pemrosesan selesai? Kegagalan mungkin terjadi di tengah eksekusi, dan jika misalnya chatbot gratis, kehilangan satu pesan bukanlah hal yang istimewa, maka jika Anda memproses transaksi gaji atau kartu seseorang, hasilnya mungkin lebih buruk.

Beberapa baris kode lagi

$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. Daripada membuat kesimpulan

Fungsi dasar - membaca pesan, mengatur ulang antrian, membaca dari file dan menulis ke file dilakukan dan ditampilkan.

Hanya ada empat hal yang harus dilakukan:

  • mengirimkan jawaban yang benar untuk permintaan dalam obrolan
  • mengirimkan respons ke obrolan APAPUN yang telah ditambahkan bot
  • mengeksekusi kode dalam satu lingkaran
  • meluncurkan bot dari penjadwal windows.

Semua tugas ini sederhana dan dapat diselesaikan dengan mudah dengan membaca dokumentasi tentang parameter seperti
Set-ExecutionPolicy Tidak Dibatasi dan -ExecutionPolicy Bypass
siklus formulir

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

Terima kasih kepada semua orang yang membaca.

Sumber: www.habr.com

Tambah komentar