Templat untuk bot telegram mudah untuk pelajar sekolah dalam gred 7-9 menggunakan Powershell

Semasa berbual dengan seorang rakan, saya tiba-tiba mendapat tahu bahawa kanak-kanak dalam darjah 8-10 di sekolah mereka tidak diajar pengaturcaraan langsung. Word, Excel dan segala-galanya. Tiada logo, malah Pascal, malah VBA untuk Excel.

Saya sangat terkejut, membuka Internet dan mula membaca -
Salah satu tugas sekolah khusus adalah untuk mempromosikan pendidikan generasi baru yang memenuhi syarat masyarakat maklumat dalam tahap pembangunan dan gaya hidup.
Kursus ini akan membolehkan pelajar untuk menyatukan dalam amalan pengetahuan mereka tentang pembinaan asas bahasa pengaturcaraan Pascal. (dari program beberapa gimnasium untuk 2017)

Akhirnya, saya memutuskan untuk meluangkan masa beberapa jam dan melakar contoh "cara membuat bot mudah untuk murid sekolah."

Di bawah potongan ialah cara menulis bot ringkas lain dalam Powershell dan menjadikannya berfungsi tanpa webhook, IP putih, pelayan khusus, mesin maya yang digunakan dalam awan dan sebagainya - pada PC rumah biasa dengan Windows biasa.

TLDR: Satu lagi artikel yang membosankan dengan kesilapan tatabahasa dan fakta, tiada untuk dibaca, tiada jenaka, tiada gambar.

Tiada apa-apa yang baru dalam artikel, hampir semua yang ditulis sebelum ini telah pun mengenai HabrΓ©, contohnya dalam artikel Arahan: Cara membuat bot dalam Telegram ΠΈ Bot Telegram untuk pentadbir sistem.
Lebih-lebih lagi, artikel itu sengaja berlebihan supaya tidak merujuk kepada sastera pendidikan setiap masa. Tiada rujukan kepada Gang 4, PowerShell Deep Dives atau, katakan, The 5 Pillars of the AWS Well-Architected Framework dalam teks.

Daripada mukadimah, anda boleh langkau

Jangan ragu untuk melangkauPada tahun 2006, Microsoft mengeluarkan PowerShell 1.0 untuk Windows XP, Vista dan Server 2003 pada masa itu. Dalam beberapa cara, ia menggantikan perkara seperti skrip cmdbat, skrip vb, Hos Skrip Windows dan JScript.

Malah sekarang, PowerShell hanya boleh dianggap sebagai langkah seterusnya selepas pilihan Logo, bukannya Delphi yang mungkin masih digunakan (atau sesuatu yang lebih lama), walaupun terdapat gelung, kelas, fungsi, panggilan MS GUI, Penyepaduan Git dan sebagainya.

Powershell digunakan agak jarang; anda hanya boleh menemuinya dalam bentuk PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Konfigurasi Negeri yang Diingini, Akses Web PowerShell dan sedozen atau lebih program dan fungsi yang jarang digunakan. Mungkin dia akan mendapat angin kedua dengan pembebasan itu WSL2, tetapi ia tidak betul-betul.

Powershell juga mempunyai tiga kelebihan besar:

  1. Ia agak mudah, terdapat banyak kesusasteraan dan contoh mengenainya, malah dalam bahasa Rusia, sebagai contoh, artikel tentang Foreach - dari buku PowerShell secara mendalam - tentang perbezaan () dan {}
  2. Dia pergi dengan editor ISE, disertakan dengan Windows. Malah terdapat beberapa jenis penyahpepijat di sana.
  3. Ia mudah untuk memanggil daripadanya komponen untuk membina antara muka grafik.

0. Persediaan.

Kita perlukan:

  • Windows PC (saya mempunyai Windows 10)
  • Sekurang-kurangnya beberapa jenis akses Internet (contohnya melalui NAT)
  • Bagi mereka yang mempunyai akses terhad kepada telegram - memasang dan mengkonfigurasi freegate dalam penyemak imbas, dalam beberapa kes yang sukar, bersama-sama dengan Symple DNS Crypt
  • Mempunyai pelanggan telegram yang bekerja pada telefon anda
  • Memahami perkara asas - apa itu pembolehubah, tatasusunan, gelung.

Membuka dan membaca artikel - Arahan: Cara membuat bot dalam Telegram ΠΈ Bot Telegram untuk pentadbir sistem

1. Mari buat bot ujian lain.

Memandangkan semua orang sudah mengetahui perkara ini, dan telah pun berlaku, anda juga boleh melangkaunyaSeperti yang dinyatakan dalam artikel di atas - Pertama sekali, bot untuk Telegram - ia masih merupakan aplikasi yang berjalan di sebelah anda dan membuat permintaan kepada Telegram Bot API. Selain itu, API adalah jelas - bot mengakses URL tertentu dengan parameter, dan Telegram bertindak balas dengan objek JSON.

Masalah berkaitan: jika dalam beberapa cara yang tidak diketahui anda mengambil beberapa kod daripada objek JSON dan entah bagaimana menghantarnya untuk pelaksanaan (bukan sengaja), kod itu akan dilaksanakan untuk anda.

Proses penciptaan diterangkan dalam dua artikel di atas, tetapi saya ulangi: dalam telegram kami membuka kenalan, cari @botfather, beritahu dia /newbot, buat bot Botfortest12344321, panggilnya Mynext1234bot, dan terima mesej dengan kunci unik borang 1234544311:AbcDefNNNNNNNNNNNNNNNN

Jaga kunci dan jangan berikannya!

Kemudian anda boleh mengkonfigurasi bot, sebagai contoh, melarang menambahkannya ke kumpulan, tetapi dalam langkah pertama ini tidak perlu.

Mari kita minta BotFather untuk β€œ/mybot” dan laraskan tetapan jika kita tidak menyukai sesuatu.

Mari buka kenalan sekali lagi, cari @Botfortest12344321 di sana (wajib untuk memulakan carian dengan @), klik "mulakan" dan tulis pada bot "/Kemuliaan kepada robot." Tanda / diperlukan, sebut harga tidak diperlukan.
Bot itu, sudah tentu, tidak akan menjawab apa-apa.

Mari semak sama ada bot telah dibuat dan bukanya.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNN/getMe
di mana 1234544311:AbcDefNNNNNNNNNNNNNN ialah kunci yang diterima sebelum ini,
dan dapatkan baris seperti
{"ok":true,"result":{""}}

Kami mempunyai frasa rahsia pertama (token). Sekarang kita perlu mengetahui nombor rahsia kedua - ID sembang dengan bot. Setiap sembang, kumpulan, dsb. adalah individu dan mempunyai nombor sendiri (kadangkala dengan tolak - untuk kumpulan terbuka). Untuk mengetahui nombor ini, kami perlu meminta dalam penyemak imbas (sebenarnya, ia sama sekali tidak diperlukan dalam penyemak imbas, tetapi untuk pemahaman yang lebih baik anda boleh mulakan dengannya) alamat (di mana 1234544311:NNNNNNNNNN ialah token anda

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

dan mendapat respons seperti

{"ok":true,"result":[{"update_id":...,... berbual":{"ID":123456789

Kami memerlukan chat_id.

Mari semak sama ada kita boleh menulis ke sembang secara manual: hubungi alamat dari penyemak imbas

https://api.telegram.org/botΠ²Π°ΡˆΡ‚ΠΎΠΊΠ΅Π½/sendMessage?chat_id=123456789&text="Life is directed motion"

Jika anda menerima mesej daripada bot dalam sembang anda, okey, anda teruskan ke peringkat seterusnya.

Dengan cara ini (melalui penyemak imbas) anda sentiasa boleh menyemak sama ada terdapat masalah dengan penjanaan pautan, atau jika sesuatu disembunyikan di suatu tempat dan tidak berfungsi.

Apa yang anda perlu tahu sebelum meneruskan pembacaan

Telegram mempunyai beberapa jenis sembang kumpulan (terbuka, tertutup). Untuk sembang ini, beberapa fungsi (contohnya, id) adalah berbeza, yang kadangkala menyebabkan beberapa masalah.

Anggaplah sudah penghujung 2019, malah wira zaman kita, Man-Orchestra (pentadbir, peguam, pakar keselamatan maklumat, pengaturcara dan boleh dikatakan MVP) Evgeniy V. membezakan pembolehubah $i daripada tatasusunan, telah menguasai gelung, lihat dalam beberapa tahun akan datang akan menguasai Chocolatey, dan kemudian Pemprosesan selari dengan PowerShell ΠΈ UntukSetiap Objek Selari ia akan datang.

1. Kami memikirkan apa yang bot kami akan lakukan

Saya tidak mempunyai apa-apa idea, saya perlu berfikir. Saya telah pun menulis bot-notebook. Saya tidak mahu membuat bot "yang menghantar sesuatu ke suatu tempat." Untuk menyambung ke Azure, anda memerlukan kad kredit, tetapi dari mana pelajar mendapatnya? Perlu diingatkan bahawa semuanya tidak begitu buruk: awan utama memberikan beberapa jenis tempoh ujian secara percuma (tetapi anda masih memerlukan nombor kad kredit - dan nampaknya satu dolar akan didebitkan daripadanya. Saya tidak ingat jika ia dikembalikan kemudian.)

Tanpa AI ML, ia tidak begitu menarik untuk membuat penenun-penyair-bot-miskin.

Saya memutuskan untuk membuat bot yang akan mengingatkan saya (atau bukan saya) perkataan Inggeris daripada kamus.
Untuk mengelak daripada bermain-main dengan pangkalan data, kamus akan disimpan dalam fail teks dan dikemas kini secara manual.
Dalam kes ini, tugasnya adalah untuk menunjukkan asas kerja, dan bukan untuk membuat sekurang-kurangnya produk separuh siap.

2. Mencuba apa dan bagaimana buat pertama kali

Mari buat folder C:poshtranslate
Mula-mula, mari kita lihat jenis powershell yang kita ada, mari lancarkan ISE melalui start-run
powershell ise
atau cari Powershell ISE dalam program yang dipasang.
Selepas pelancaran, "sesetengah jenis editor" biasa akan dibuka; jika tiada medan teks, maka anda sentiasa boleh mengklik "Fail - buat baharu".

Mari lihat versi powershell - tulis dalam medan teks:

get-host 

dan tekan F5.

Powershell akan menawarkan untuk menyimpan - "Skrip yang akan anda jalankan akan disimpan.", kami bersetuju, dan simpan fail dari powershell dengan nama dalam C: poshtranslate myfirstbotBT100.

Selepas pelancaran, dalam tetingkap teks bawah kami mendapat jadual data:

Name             : Windows PowerShell ISE Host
Version          : 5.1.(ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅)

Saya ada 5.1 sesuatu, itu sudah cukup. Jika anda mempunyai Windows 7/8 lama maka bukan masalah besar - walaupun PowerShell perlu dikemas kini kepada versi 5 - mis. Directions.

Taip Get-Date dalam baris arahan di bawah, tekan Enter, lihat masa, pergi ke folder root dengan arahan
cd
dan kosongkan skrin dengan arahan cls (tidak, anda tidak perlu menggunakan rm)

Sekarang mari kita semak apa yang berfungsi dan bagaimana - mari kita tulis bukan kod, tetapi dua baris, dan cuba fahami apa yang mereka lakukan. Mari kita mengulas baris dengan get-host dengan simbol # dan tambah sedikit.

# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ шаблона Π±ΠΎΡ‚Π° 
# get-host
<# это ΠΏΡ€ΠΈΠΌΠ΅Ρ€ многострочного коммСнтария #>
$TimeNow = Get-Date
$TimeNow

(Apa yang menarik ialah dalam senarai juntai bawah pemformatan kod pada HabrΓ© terdapat dua dozen pilihan - tetapi Powershell tidak ada. Dos ada. Perl ada.)

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

Kami mendapat output berikut:

Saturday, December 8, 2019 21:00:50 PM (ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‚ΠΈΠΏΠ°)

Sekarang mari kita lihat dua baris ini dan beberapa perkara menarik supaya kita tidak kembali kepada perkara ini pada masa hadapan.

Tidak seperti Pascal (dan bukan sahaja), PowerShell sendiri cuba menentukan jenis yang hendak diberikan kepada pembolehubah; butiran lanjut tentang perkara ini ditulis dalam artikel Program pendidikan menaip dalam bahasa pengaturcaraan
Oleh itu, dengan mencipta pembolehubah $TimeNow dan memberikannya nilai tarikh dan masa semasa (Get-Date), kita tidak perlu terlalu risau tentang jenis data yang akan ada.

Benar, kejahilan ini mungkin menyakitkan kemudian, tetapi itu untuk kemudian. Di bawah dalam teks akan ada contoh.
Mari lihat apa yang kita dapat. Mari kita laksanakan (pada baris arahan)

$TimeNow | Get-member

dan dapatkan halaman teks yang tidak dapat difahami

Contoh teks yang tidak dapat difahami nombor 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, pembolehubah jenis TypeName: System.DateTime telah dibuat dengan sekumpulan kaedah (dalam erti kata apa yang boleh kita lakukan dengan objek pembolehubah ini) dan sifat.

Jom telefon $TimeNow.DayOfYear β€” kita mendapat nombor hari dalam setahun.
Jom telefon $TimeNow.DayOfYear | Get-Member - kita mendapatkan TypeName: System.Int32 dan sekumpulan kaedah.
Jom telefon $TimeNow.ToUniversalTime() - dan dapatkan masa dalam UTC

Penyahpepijat

Kadang-kadang ia berlaku bahawa perlu untuk melaksanakan program sehingga baris tertentu dan melihat keadaan program pada masa itu. Untuk tujuan ini, ISE mempunyai fungsi Nyahpepijat - togol titik putus
Letakkan titik putus di suatu tempat di tengah, jalankan dua baris ini dan lihat rupa pecahannya.

3. Memahami interaksi dengan bot Telegram

Sudah tentu, lebih banyak literatur telah ditulis mengenai interaksi dengan bot, dengan semua getpush dan sebagainya, tetapi isu teori boleh dipertimbangkan secara pilihan.

Dalam kes kami adalah perlu:

  • Belajar menghantar sesuatu dalam surat-menyurat
  • Belajar untuk mendapatkan sesuatu daripada surat-menyurat

3.1 Belajar menghantar sesuatu dalam surat menyurat dan menerima daripadanya

Sedikit kod - bahagian 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 Persekutuan Rusia pada ketika ini kami mendapat ralat Tidak dapat menyambung ke pelayan jauh.

Atau kami tidak menerimanya - bergantung pada pengendali telekom dan sama ada proksi dikonfigurasikan dan berfungsi
Nah, yang tinggal hanyalah menambah proksi. Sila ambil perhatian bahawa menggunakan proksi yang tidak disulitkan dan umumnya penipuan adalah amat berbahaya untuk kesihatan anda.

Tugas mencari proksi yang berfungsi tidak begitu sukar - kebanyakan proksi http yang diterbitkan berfungsi. Saya rasa yang kelima berkesan untuk saya.

Sintaks menggunakan proksi:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

Jika anda menerima mesej dalam sembang anda dengan bot, maka semuanya baik-baik saja, anda boleh meneruskan. Jika tidak, teruskan penyahpepijatan.

Anda boleh melihat rentetan $URL4SEND anda bertukar menjadi dan cuba memintanya dalam penyemak imbas, seperti ini:

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

3.2. Kami belajar cara menulis "sesuatu" dalam sembang, sekarang mari cuba membacanya

Mari tambah 4 baris lagi dan lihat kandungan di dalamnya melalui | dapatkan-ahli

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

Perkara yang paling menarik disediakan kepada kami

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

Mari lihat apa yang ada pada mereka:

Write-Host "ParsedHtml"
$MyMessageGet.ParsedHtml # Ρ‚ΡƒΡ‚ интСрСсноС
Write-Host "RawContent"
$MyMessageGet.RawContent # ΠΈ Ρ‚ΡƒΡ‚ интСрСсноС, Π½ΠΎ Π΅Ρ‰Π΅ ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΈ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠ΅. 
Write-Host "Content"
$MyMessageGet.Content

Jika semuanya berfungsi untuk anda, anda akan mendapat barisan panjang seperti:

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

Nasib baik, dalam artikel yang diterbitkan sebelum ini Telegram bot untuk pentadbir sistem baris ini (ya, menurut $MyMessageGet.RawContent | get-member ialah System.String), telah pun dibongkar.

4. Proses apa yang anda terima (kami sudah tahu cara menghantar sesuatu)

Seperti yang telah tertulis di sini, perkara yang paling perlu terletak pada kandungan. Mari kita lihat lebih dekat.

Mula-mula, kami akan menulis beberapa lagi frasa kepada bot daripada antara muka web atau daripada telefon

/message1
/message2
/message3

dan lihat melalui penyemak imbas pada alamat yang telah dibentuk dalam pembolehubah $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 ini? Beberapa objek kompleks daripada tatasusunan objek yang mengandungi pengecam mesej hujung ke hujung, pengecam sembang, pengecam penghantaran dan banyak maklumat lain.

Walau bagaimanapun, kita tidak perlu memikirkan "jenis objek apakah ini" - sebahagian daripada kerja telah dilakukan untuk kita. Mari lihat apa yang ada di dalamnya:

Membaca mesej yang diterima atau bahagian 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. Apakah yang perlu kita lakukan mengenainya sekarang?

Mari simpan fail yang terhasil di bawah nama myfirstbotBT105 atau apa sahaja yang anda suka, tukar tajuk dan komen semua kod yang telah ditulis melalui

<#start comment 105 end comment 105#>

Sekarang kita perlu memutuskan di mana untuk mendapatkan kamus (dengan baik, di mana - pada cakera dalam fail) dan bagaimana rupanya.

Sudah tentu, anda boleh menulis kamus besar betul-betul dalam teks skrip, tetapi ini benar-benar di luar perkara itu.
Jadi mari kita lihat apa yang powershell boleh berfungsi seperti biasa.
Secara umum, dia tidak kisah fail mana yang hendak digunakan, ia tidak penting bagi kami.
Kami mempunyai pilihan: txt (anda boleh, tetapi mengapa), csv, xml.
Bolehkah kita menonton semua orang? Mari kita lihat semua orang.
Mari buat kelas MyVocabClassExample1 dan pembolehubah $MyVocabExample1
Saya perhatikan bahawa kelas ditulis tanpa $

beberapa kod #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 cuba tulis ini ke dalam fail menggunakan sampel.

Beberapa kod #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 mendapat ralat pada baris Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2.

Dia tidak mahu menambah, ah-ah, sungguh memalukan.

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

Mari lihat apa yang berlaku. Paparan teks yang hebat - tetapi bagaimana untuk mengeksportnya kembali? Perlukah saya memperkenalkan beberapa jenis pemisah teks, seperti koma?

Dan pada akhirnya anda mendapat "nilai dipisahkan koma (CSV) fail 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 begitu dibezakan oleh logiknya; untuk prosedur yang serupa, dalam satu kes -FilePath digunakan, dalam -Path yang lain.

Di samping itu, dalam fail ketiga bahasa Rusia hilang, dalam fail keempat ternyata ... ada sesuatu yang berlaku. #TYPE System.Object[] 00
# "Count","Length", "LongLength", "Rank", "SyncRoot", "IsReadOnly", "IsFixedSize", "IsSynchronized"
#
Mari kita tulis semula sedikit:

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

Nampaknya ia telah membantu, tetapi saya masih tidak menyukai formatnya.

Saya terutamanya tidak suka bahawa saya tidak boleh meletakkan baris dari objek ke dalam fail secara langsung.
By the way, sejak kami mula menulis ke fail, bolehkah kami mula menyimpan log permulaan? Kami mempunyai masa sebagai pembolehubah, kami boleh menetapkan nama fail.

Benar, belum ada apa-apa untuk ditulis, tetapi anda boleh memikirkan cara terbaik untuk memutarkan log.
Mari cuba xml buat masa 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

Mengeksport ke xml mempunyai banyak kelebihan - kebolehbacaan, eksport keseluruhan objek, dan tidak perlu melakukan peningkatan.

Mari cuba baca fail xml.

Sedikit bacaan dari xml

$MyFilenameExample06 = $ScriptDir + "Example06.xml"
$MyVocabExample4AsArray = Import-Clixml -Path $MyFilenameExample06
# $MyVocabExample4AsArray 
# $MyVocabExample4AsArray[0]
# ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Ρ… Π½ΡŽΠ°Π½ΡΠ°Ρ…. Powershell врСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π²Π΅Π΄Π΅Ρ‚ сСбя Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ ΠΊΠ°ΠΊ Π±Ρ‹ стоило Π±Ρ‹ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π±Ρ‹.
# Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρƒ мСня эти Π΄Π²Π° Π²Ρ‹Π²ΠΎΠ΄Π° ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ
# Write-Output $MyVocabExample4AsArray 
# write-host $MyVocabExample4AsArray 

Mari kita kembali kepada tugas. Kami menulis fail ujian, membacanya, format storan adalah jelas, jika perlu, anda boleh menulis editor fail kecil yang berasingan untuk menambah dan memadam baris.

Biar saya ingatkan anda bahawa tugasnya adalah untuk membuat bot latihan kecil.

Format kerja: Saya menghantar arahan "contoh" kepada bot, bot menghantar saya perkataan dan transkripsi yang dipilih secara rawak, dan selepas 10 saat menghantar saya terjemahan dan ulasan. Kami tahu cara membaca arahan, kami juga ingin belajar cara memilih dan menyemak proksi secara automatik, dan menetapkan semula pembilang mesej kepada dilupakan.

Mari kita nyahkomen semua yang diulas sebelum ini sebagai tidak perlu, ulas contoh yang tidak diperlukan sekarang dengan txt dan csv, dan simpan fail sebagai versi B106

Oh ya. Mari hantar sesuatu kepada bot sekali lagi.

6. Penghantaran daripada fungsi dan banyak lagi

Sebelum memproses penerimaan, anda perlu mencipta fungsi untuk menghantar "sekurang-kurangnya sesuatu" selain daripada mesej ujian.

Sudah tentu, dalam contoh kita hanya akan mempunyai satu penghantaran dan hanya satu pemprosesan, tetapi bagaimana jika kita perlu melakukan perkara yang sama beberapa kali?

Lebih mudah untuk menulis fungsi. Jadi, kita mempunyai pembolehubah jenis objek $MyVocabExample4AsArray, baca daripada fail, dalam bentuk tatasusunan sebanyak dua elemen.
Jom baca.

Pada masa yang sama, kita akan berurusan dengan jam; kita akan memerlukannya kemudian (sebenarnya, dalam contoh ini kita tidak memerlukannya :)

Beberapa kod #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 anda boleh lihat dengan mudah, fungsi ini memanggil $MyToken dan $MyChatID, yang telah dikodkan dengan keras sebelum ini.

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

Walau bagaimanapun, kerana ini adalah contoh, kami akan mengabaikannya buat masa ini.

Oleh kerana $MyVocabExample4AsArray bukanlah tatasusunan, walaupun ia sangat serupa dengan satu, maka anda tidak boleh menerimanya begitu sahaja minta panjangnya.

Sekali lagi kita perlu melakukan sesuatu yang tidak boleh dilakukan - payung terjun tidak mengikut kod - ambil dan kira

Beberapa kod #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 ciri menarik. Katakan kita mahu menerima 0 atau 1 (kita hanya mempunyai dua elemen dalam tatasusunan). Apabila menetapkan sempadan 0..1, adakah kita akan mendapat "1"?
tidak - kami tidak akan mendapatkannya, kami mempunyai contoh istimewa Contoh 2: Dapatkan integer rawak antara 0 dan 99 Dapatkan rawak -Maksimum 100
Oleh itu, untuk 0..1 kita perlu menetapkan saiz 0..2, dengan nombor elemen maksimum = 1.

7. Pemprosesan mesej masuk dan panjang giliran maksimum

Di mana kita berhenti tadi? kami mempunyai pembolehubah yang diterima $MyMessageGet
dan $Content4Pars01 diperoleh daripadanya, yang mana kami berminat dengan unsur-unsur tatasusunan Content4Pars01.result

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

Mari hantar bot /message10, /message11, /message12, /word dan sekali lagi /word dan /hello.
Mari lihat apa yang kami dapat:

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

Mari kita lihat semua yang diterima dan hantarkan balasan jika mesej itu adalah /perkataan
kes konstruk, yang disifatkan sesetengah orang sebagai if-elseif, dipanggil dalam powershell melalui suis. Pada masa yang sama, kod di bawah menggunakan kekunci -wildcard, yang sama sekali tidak perlu malah berbahaya.

Beberapa kod #7.1

Write-Output "This is part 7"
Foreach ($Result in $Content4Pars01.result) # Π”Π°, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ быстрСС 
 { 
    switch -wildcard ($Result.message.text) 
            {
            "/word" {MyFirstFunction($TextForExample1)}
            }
}

Mari jalankan skrip beberapa kali. Kami akan mendapat perkataan yang sama dua kali untuk setiap percubaan pelaksanaan, terutamanya jika kami membuat kesilapan dalam pelaksanaan rawak.

Tetapi berhenti. Kami tidak menghantar /perkataan lagi, jadi mengapa mesej itu diproses semula?

Barisan gilir untuk menghantar mesej kepada bot mempunyai panjang terhingga (saya rasa 100 atau 200 mesej) dan mesti dikosongkan secara manual.

Ini sudah tentu diterangkan dalam dokumentasi, tetapi anda perlu membacanya!

Dalam kes ini, kami memerlukan parameter ?chat_id dan &timeout, &limit, &parse_mode=HTML dan &disable_web_page_preview=true belum lagi diperlukan.

Dokumentasi untuk telegram api ada di sini
Ia berkata dalam bahasa putih dan Inggeris:
Pengecam kemas kini pertama yang akan dikembalikan. Mesti lebih besar satu daripada yang tertinggi antara pengecam kemas kini yang diterima sebelum ini. Secara lalai, kemas kini bermula dengan yang paling awal
belum disahkan kemas kini dikembalikan. Kemas kini dianggap disahkan sebaik sahaja getUpdates dipanggil dengan mengimbangi yang lebih tinggi daripada update_idnya. Offset negatif boleh ditentukan untuk mendapatkan kemas kini bermula dari -offset kemas kini dari penghujung baris gilir kemas kini. Semua kemas kini sebelum ini 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 menetapkan semula dan menulis semula fungsi itu sedikit. Kami mempunyai dua pilihan - hantar keseluruhan mesej ke fungsi dan proses sepenuhnya dalam fungsi, atau berikan hanya ID mesej dan tetapkannya semula. Sebagai contoh, yang kedua kelihatan lebih mudah.

Sebelum ini, rentetan pertanyaan "semua mesej" kami kelihatan seperti

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

dan ia akan kelihatan 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 

Tiada siapa yang melarang anda untuk mula-mula menerima semua mesej, memprosesnya, dan hanya selepas permintaan pemprosesan berjaya tidak disahkan -> disahkan.

Mengapakah masuk akal untuk memanggil pengesahan selepas semua pemprosesan selesai? Kegagalan mungkin berlaku di tengah-tengah pelaksanaan, dan jika untuk contoh chatbot percuma, kehilangan satu mesej bukanlah sesuatu yang istimewa, maka jika anda sedang memproses gaji atau transaksi kad seseorang, hasilnya mungkin lebih teruk.

Beberapa baris kod 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 kesimpulan

Fungsi asas - membaca mesej, menetapkan semula baris gilir, membaca dari fail dan menulis ke fail telah dilakukan dan ditunjukkan.

Hanya ada empat perkara yang perlu dilakukan:

  • menghantar jawapan yang betul kepada permintaan dalam sembang
  • menghantar respons kepada SEBARANG sembang yang bot telah ditambahkan
  • melaksanakan kod dalam gelung
  • melancarkan bot daripada penjadual windows.

Semua tugas ini adalah mudah dan boleh dicapai dengan mudah dengan membaca dokumentasi tentang parameter seperti
Set-ExecutionPolicy Unrestricted dan -ExecutionPolicy Bypass
kitaran borang

$TimeToSleep = 3 # опрос ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 3 сСкунды
$TimeToWork = 10 # ΠΌΠΈΠ½ΡƒΡ‚
$HowManyTimes = $TimeToWork*60/$TimeToSleep # счСтчик для Ρ†ΠΈΠΊΠ»Π°
$MainCounter = 0
for ($MainCounter=0; $MainCounter -le $HowManyTimes) {
sleep $TimeToSleep
$MainCounter ++

Terima kasih kepada semua yang membaca.

Sumber: www.habr.com

Tambah komen