Citakan pikeun bot telegram basajan pikeun barudak sakola di kelas 7-9 ngagunakeun Powershell

Dina paguneman sareng babaturan, kuring ujug-ujug diajar yén barudak kelas 8-10 di sakolana henteu diajar program. Word, Excel sareng sadayana. Taya logo, moal Pascal, malah teu VBA pikeun Excel.

Kuring reuwas pisan, muka Internét sareng ngamimitian maca -
Salah sahiji tugas sakola khusus nyaéta ngamajukeun pendidikan generasi anyar anu nyumponan kaayaan masarakat inpormasi dina tingkat kamekaran sareng gaya hirupna.
Kursus ieu bakal ngamungkinkeun siswa pikeun ngahijikeun dina prakték pangaweruh ngeunaan konstruksi dasar basa pamrograman Pascal. (tina program sababaraha gimnasium pikeun 2017)

Tungtungna, kuring mutuskeun pikeun nyéépkeun sababaraha jam sareng sketsa conto "kumaha carana ngadamel bot saderhana pikeun murangkalih sakola."

Di handap ieu potong kumaha carana nulis bot basajan sejen dina Powershell tur nyieun jalan tanpa webhook a, IP bodas, dedicated server, deployed mesin virtual dina awan, jeung saterusna - dina PC home biasa kalawan Windows biasa.

TLDR: Artikel boring sejen kalawan kasalahan gramatikal jeung faktual, euweuh maca, euweuh humor, euweuh gambar.

Henteu aya anu énggal dina tulisan, ampir sadayana anu ditulis sateuacanna parantos aya dina Habré, contona dina tulisan Pitunjuk: Kumaha cara nyiptakeun bot dina Telegram и Bot Telegram pikeun administrator sistem.
Leuwih ti éta, artikel téh ngahaja dileukeunan sangkan teu ngarujuk kana sastra atikan unggal waktu. Henteu aya rujukan pikeun Gang 4, PowerShell Deep Dives atanapi, sebutkeun, The 5 Pilar of the AWS Well-Architected Framework dina téks.

Gantina kecap muka hiji, Anjeun bisa ngaliwatan

Ngarasa luncatDina 2006, Microsoft ngaluarkeun PowerShell 1.0 pikeun Windows XP, Vista, sareng Server 2003 harita. Dina sababaraha cara, éta ngagentos hal-hal sapertos skrip cmdbat, skrip vb, Windows Script Host sareng JScript.

Malah ayeuna, PowerShell ngan bisa dianggap salaku lengkah saterusna sanggeus pilihan Logo, tinimbang Delphi meureun masih dipaké (atawa hal heubeul), sanajan ayana loop, kelas, fungsi, MS GUI nelepon, Integrasi Git jeung saterusna.

Powershell jarang dianggo; anjeun ngan ukur tiasa mendakanana dina bentuk PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Konfigurasi State Desired, Aksés Wéb PowerShell jeung belasan atawa leuwih jarang dipaké program jeung fungsi. Panginten anjeunna bakal kéngingkeun angin kadua kalayan sékrési WSL2, tapi teu persis.

Powershell ogé ngagaduhan tilu kauntungan anu ageung:

  1. Éta kawilang saderhana, seueur literatur sareng conto ngeunaan éta, bahkan dina basa Rusia, contona, tulisan ngeunaan Foreach - tina buku. PowerShell dina jero - ngeunaan bédana () jeung {}
  2. Anjeunna mana kalayan redaktur Ise, kaasup sareng Windows. Malah aya sababaraha jinis debugger di dinya.
  3. Gampang nelepon ti dinya komponén pikeun ngawangun panganteur grafis.

0. Persiapan.

Urang bakal butuh:

  • Windows PC (Kuring boga Windows 10)
  • Sahenteuna sababaraha jinis aksés Internét (via NAT contona)
  • Pikeun anu ngagaduhan aksés kawates kana telegram - dipasang sareng ngonpigurasi freegate dina browser, dina sababaraha kasus anu sesah, sareng Symple DNS Crypt
  • Gaduh klien telegram anu tiasa dianggo dina telepon anjeun
  • Ngartos dasar-dasarna - naon variabel, array, loop.

Dibuka sareng maca artikel - Pitunjuk: Kumaha cara nyiptakeun bot dina Telegram и Bot Telegram pikeun administrator sistem

1. Hayu urang nyieun bot test sejen.

Kusabab sadayana parantos terang ieu, sareng parantos kajantenan, anjeun ogé tiasa ngalangkungananaSakumaha anu dinyatakeun dina tulisan di luhur - Anu mimiti, bot pikeun Telegram - éta masih mangrupa aplikasi ngajalankeun di sisi anjeun sarta nyieun requests ka Telegram Bot API. Sumawona, API jelas - bot ngaksés URL khusus sareng parameter, sareng Telegram ngaréspon ku objék JSON.

Masalah anu aya hubunganana: upami dina sababaraha cara anu teu dipikanyaho anjeun nyandak sababaraha kode tina objék JSON sareng kumaha waé ngirimna pikeun dieksekusi (henteu ngahaja), kodeu bakal dieksekusi pikeun anjeun.

Prosés nyiptakeun dijelaskeun dina dua artikel di luhur, tapi kuring ngulang: dina telegram urang muka kontak, néangan @botfather, ngabejaan manehna /newbot, nyieun bot Botfortest12344321, nelepon eta Mynext1234bot, sarta nampa pesen kalayan konci unik tina wujud 1234544311:AbcDefNNNNNNNNNNNNNNNN

Jaga konci na ulah masihan!

Teras anjeun tiasa ngonpigurasikeun bot, contona, nyaram nambihanana ka grup, tapi dina léngkah-léngkah munggaran ieu henteu diperyogikeun.

Hayu urang naroskeun BotFather pikeun "/ mybot" sareng saluyukeun setélan upami urang henteu resep.

Hayu urang buka kontak deui, manggihan @Botfortest12344321 aya (wajib pikeun ngamimitian pilarian kalawan @), klik "mimitian" jeung nulis ka bot "/ Maha Suci robot". Tanda / diperyogikeun, tanda petik henteu diperyogikeun.
Bot, tangtosna, moal ngajawab nanaon.

Hayu urang pariksa yen bot geus dijieun tur mukakeunana.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNN/getMe
dimana 1234544311:AbcDefNNNNNNNNNNNNNN nyaéta konci anu ditampi sateuacana,
sareng kéngingkeun garis sapertos
{"ok":true,"hasil":{""}}

Simkuring boga frase rusiah munggaran (token). Ayeuna urang kedah milarian nomer rusiah kadua - ID obrolan sareng bot. Unggal obrolan, grup, jeung sajabana nyaeta individu jeung boga nomer sorangan (kadangkala kalawan minus - pikeun grup kabuka). Pikeun milarian nomer ieu, urang kedah nyuhunkeun dina browser (saleresna, éta henteu peryogi pisan dina browser, tapi pikeun pamahaman anu langkung saé anjeun tiasa ngamimitian ku éta) alamatna (dimana 1234544311:NNNNNNNNNN mangrupikeun token anjeun.

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

jeung meunang respon kawas

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

Urang peryogi chat_id.

Hayu urang parios yén urang tiasa nyerat kana obrolan sacara manual: nelepon alamatna tina browser

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

Upami anjeun nampi pesen ti bot dina obrolan anjeun, oke, anjeun teraskeun kana tahap salajengna.

Ku cara ieu (via browser nu) anjeun salawasna bisa pariksa naha aya masalah jeung generasi link, atawa lamun aya hiji disumputkeun wae tur teu jalan.

Naon anu anjeun kedah terang sateuacan neraskeun maca

Telegram ngagaduhan sababaraha jinis obrolan grup (buka, ditutup). Pikeun obrolan ieu, sababaraha fungsi (contona, id) béda, anu kadang ngabalukarkeun sababaraha masalah.

Hayu urang nganggap yén éta tungtung 2019, komo pahlawan jaman urang, nu well-dipikawanoh Man-Orchestra (administrator, pengacara, spesialis kaamanan informasi, programmer sarta praktis MVP) Evgeniy V. distinguishes variabel $i ti hiji Asép Sunandar Sunarya, geus mastered puteran, kasampak dina sababaraha hareup taun bakal master Chocolatey, lajeng Ngolah paralel sareng PowerShell и Pikeun Unggal-Objék Paralel éta bakal datang.

1. Urang mikir ngeunaan naon bot urang bakal ngalakukeun

Abdi henteu ngagaduhan ide, kuring kedah mikir. Abdi parantos nyerat bot-notebook. Abdi henteu hoyong ngadamel bot "anu ngirimkeun ka mana waé." Pikeun nyambung ka Azure anjeun peryogi kartu kiridit, tapi ti mana muridna? Ieu kudu dicatet yén sagalana teu jadi goréng: awan utama masihan sababaraha jenis periode test haratis (tapi anjeun masih perlu nomer kartu kiridit - sarta sigana kawas dollar bakal debited ti dinya. Kuring teu apal lamun éta dipulangkeun engké.)

Tanpa AI ML teu jadi metot nyieun bot-miskin-pujangga-Weaver.

Kuring mutuskeun nyieun bot anu bakal ngingetkeun kuring (atanapi henteu kuring) kecap Inggris tina kamus.
Pikeun ngahindarkeun parobihan kana pangkalan data, kamus bakal disimpen dina file téks sareng diropéa sacara manual.
Dina hal ieu, tugasna pikeun nunjukkeun dasar-dasar karya, sareng henteu ngadamel sahenteuna produk sawaréh.

2. Nyobian naon jeung kumaha pikeun kahiji kalina

Hayu urang nyieun folder C:poshtranslate
Kahiji, hayu urang tingali jenis powershell urang boga, hayu urang ngajalankeun ISE via start-run
powershell ieu
atawa manggihan Powershell ISE dina program dipasang.
Saatos peluncuran, biasa biasa "sababaraha jinis éditor" bakal muka; upami teu aya widang téks, teras anjeun tiasa teras-terasan klik "File - jieun énggal".

Hayu urang tingali versi Powershell - tulis dina widang téks:

get-host 

sareng pencét F5.

Powershell bakal nawiskeun pikeun ngahemat - "Skrip anu anjeun badé jalankeun bakal disimpen.", kami satuju, sareng simpen file tina Powershell kalayan nami dina C: poshtranslate myfirstbotBT100.

Saatos peluncuran, dina jandela téks handap kami nampi tabel data:

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

Kuring boga 5.1 hal, éta cukup. Upami anjeun gaduh Windows 7/8 anu lami maka henteu masalah - sanaos PowerShell kedah diénggalan kana versi 5 - contona. parentah.

Ketik Get-Date dina garis paréntah di handap, pencét Lebetkeun, tingali waktosna, angkat kana polder akar kalayan paréntahna
cd
sareng mupus layar nganggo paréntah cls (henteu, anjeun henteu kedah nganggo rm)

Ayeuna hayu urang pariksa naon gawéna sarta kumaha - hayu urang nulis moal malah kode, tapi dua garis, sarta coba ngartos naon maranéhna ngalakukeun. Hayu urang mairan kaluar garis kalawan meunang-host kalawan simbol # tur nambahkeun saeutik.

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

(Naon anu pikaresepeun nyaéta dina daptar turun-handap pormat kode dina Habré aya dua belasan pilihan - tapi Powershell henteu aya. Dos aya. Perl aya.)

Na hayu urang ngajalankeun kode ku mencét F5 atawa ">" ti GUI.

Urang meunang kaluaran handap:

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

Ayeuna hayu urang tingali dua garis ieu sareng sababaraha titik anu pikaresepeun supados urang henteu uih deui ka hareup.

Beda sareng Pascal (sareng sanés waé), PowerShell nyalira nyobian nangtukeun jinis naon anu bakal ditugaskeun ka variabel; langkung rinci ngeunaan ieu ditulis dina tulisan. Program atikan ngeunaan ngetik dina basa pamrograman
Ku alatan éta, ku nyieun variabel $TimeNow jeung nangtukeun eta nilai tanggal jeung waktu ayeuna (Get-Date), urang teu kudu salempang teuing ngeunaan jenis data bakal aya.

Leres, kabodoan ieu tiasa menyakiti engké, tapi éta engké. Di handap dina téks bakal aya conto.
Hayu urang tingali naon urang meunang. Hayu urang laksana (dina garis paréntah)

$TimeNow | Get-member

sareng kéngingkeun halaman téks anu teu kaharti

Conto téks nu teu kaharti 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")...                                         

Salaku bisa ningali, variabel tipe TypeName: System.DateTime geus dijieun kalawan kebat métode (dina rasa naon bisa urang pigawé kalayan objék variabel ieu) jeung sipat.

Hayu urang nelepon $TimeNow.DayOfYear - urang meunang jumlah poé dina sataun.
Hayu urang nelepon $TimeNow.DayOfYear | Get-Member - urang meunang TypeName: System.Int32 jeung grup métode.
Hayu urang nelepon $TimeNow.ToUniversalTime() - sareng kéngingkeun waktos dina UTC

Debugger

Kadang-kadang kajadian yén perlu pikeun ngaéksekusi program dugi ka garis anu tangtu sareng ningali kaayaan program dina waktos éta. Pikeun tujuan ieu, ISE gaduh fungsi Debug - toggle break point
Nempatkeun breakpoint hiji tempat di tengah, ngajalankeun dua garis ieu tur tingal kumaha putus Sigana mah.

3. Ngartos interaksi sareng bot Telegram

Tangtu, malah leuwih literatur geus ditulis dina interaksi jeung bot, kalayan sagala getpush jeung saterusna, tapi masalah téori bisa dianggap optionally.

Dina hal urang perlu:

  • Diajar ngirim hiji hal dina korespondensi
  • Diajar nyandak hiji hal tina korespondensi

3.1 Diajar ngirim hiji hal dina korespondensi sareng nampi ti éta

Kode saeutik - 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

sarta di Féderasi Rusia dina titik ieu kami meunang kasalahan Teu bisa nyambung ka server jauh.

Atanapi kami henteu nampi éta - gumantung kana operator telekomunikasi sareng naha proxy dikonpigurasi sareng jalan
Nya, anu tinggaleun nyaéta nambihan proxy. Punten dicatet yén ngagunakeun proxy anu henteu énkripsi sareng umumna curang bahaya pisan pikeun kaséhatan anjeun.

Tugas milarian proxy anu tiasa dianggo henteu sesah pisan - kalolobaan proksi http anu diterbitkeun tiasa dianggo. Jigana nu kalima digawé pikeun kuring.

Sintaksis ngagunakeun proxy:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

Upami anjeun nampi pesen dina obrolan anjeun sareng bot, maka sadayana henteu kunanaon, anjeun tiasa ngaléngkah. Upami henteu, teraskeun debugging.

Anjeun tiasa ningali naon string $URL4SEND anjeun janten sareng cobian nyuhunkeunana dina browser, sapertos kieu:

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

3.2. Urang diajar kumaha nulis "sesuatu" dina obrolan, ayeuna hayu urang coba maca eta

Hayu urang tambahkeun 4 langkung garis tur tingal naon di jero ngaliwatan | meunang-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 paling metot disadiakeun pikeun urang

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

Hayu urang tingali naon di antarana:

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

Upami sadayana dianggo pikeun anjeun, anjeun bakal nampi garis panjang sapertos:

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

Untungna, dina artikel saméméhna diterbitkeun Telegram bot pikeun administrator sistem baris ieu (nuhun, nurutkeun $ MyMessageGet.RawContent | meunang-anggota nyaeta System.String), parantos dibongkar.

4. Ngolah naon anu anjeun tampa (urang parantos terang kumaha ngirim hiji hal)

Sakumaha anu parantos diserat di dieu, hal nu paling diperlukeun perenahna di eusi. Hayu urang nempo eta leuwih deukeut.

Kahiji, urang bakal nulis sababaraha deui frasa ka bot tina panganteur web atawa tina telepon

/message1
/message2
/message3

jeung kasampak ngaliwatan browser dina alamat nu kabentuk dina variabel $URLGET.

Urang bakal ningali sapertos kieu:

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

Naon éta? Sababaraha objék kompléks tina arrays objék ngandung hiji tungtung-to-tungtung pesen identifier, obrolan identifier, ngirim identifier sarta loba informasi sejenna.

Nanging, urang henteu kedah terang "obyék naon ieu" - bagian tina padamelan parantos dilakukeun pikeun urang. Hayu urang tingali naon di jero:

Maca pesen anu ditampi atanapi 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. Urang kudu kumaha ayeuna?

Hayu urang simpen file anu dihasilkeun dina nami myfirstbotBT105 atanapi naon waé anu anjeun pikahoyong, robih judul sareng koméntar sadaya kode anu parantos diserat via

<#start comment 105 end comment 105#>

Ayeuna urang kedah mutuskeun dimana kéngingkeun kamus (ogé, dimana - dina disk dina file) sareng kumaha éta bakal katingali.

Tangtosna, anjeun tiasa nyerat kamus anu ageung dina téks naskah, tapi ieu leres pisan.
Janten hayu urang tingali naon powershell tiasa dianggo sacara normal.
Sacara umum, anjeunna henteu paduli file anu dianggo, henteu masalah pikeun urang.
Urang boga pilihan: txt (anjeun tiasa, tapi naha), csv, xml.
Naha urang tiasa nonton sadayana? Hayu urang tingali sadayana.
Hayu urang jieun kelas MyVocabClassExample1 sareng variabel $MyVocabExample1
Kuring dicatet yén kelas ditulis tanpa $

sababaraha 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

Hayu urang cobian nyerat ieu kana file nganggo sampel.

Sababaraha 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

- sarta kami meunang kasalahan dina garis Out-File -FilePath $ MyFilenameExample01 -InputObject -Append $ MyVocabExample2.

Anjeunna teu hayang nambahan, ah-ah, naon éra.

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

Hayu urang tingali naon kajadian. Témbongkeun téks anu saé - tapi kumaha carana ngékspor deui? Naha kuring kedah ngenalkeun sababaraha jinis pemisah téks, sapertos koma?

Sareng dina tungtungna anjeun nampi "nilai anu dipisahkeun koma (CSV) file A Seureuh nungguan.
#

$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 

Sapertos anu gampang ditingali, MS henteu khusus dibédakeun ku logikana; pikeun prosedur anu sami, dina hiji kasus -FilePath dianggo, dina anu sanés -Path.

Salaku tambahan, dina file katilu basa Rusia ngaleungit, dina file kaopat tétéla ... ogé, aya kajadian. #TYPE System.Object[] 00
# "Itung", "Panjang", "Panjang", "Rank", "SyncRoot", "IsReadOnly", "IsFixedSize", "IsSynchronized"
#
Hayu urang nulis deui saeutik:

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

Sigana geus mantuan, tapi tetep teu resep format.

Kuring utamana teu resep yén kuring teu bisa nempatkeun garis tina hiji obyék kana file langsung.
Ngomong-ngomong, saprak urang mimiti nyerat kana file, naha urang tiasa ngamimitian nyimpen log ngamimitian? Urang gaduh waktos salaku variabel, urang tiasa nyetél nami file.

Leres, teu acan aya anu nyerat, tapi anjeun tiasa mikirkeun kumaha cara anu pangsaéna pikeun muterkeun log.
Hayu urang coba xml pikeun ayeuna.

Sababaraha 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

Ékspor ka xml ngagaduhan seueur kauntungan - kabaca, ékspor sadayana obyék, sareng henteu kedah ngalakukeun uppend.

Hayu urang cobian maca file xml.

Saeutik bacaan tina xml

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

Hayu urang balik ka tugas. Kami nyerat file uji, baca éta, format panyimpenan jelas, upami diperyogikeun, anjeun tiasa nyerat editor file leutik anu misah pikeun nambihan sareng ngahapus garis.

Hayu atuh ngingetan yén tugas éta nyieun bot latihan leutik.

format karya: Kuring ngirim "conto" paréntah ka bot, bot nu ngirimkeun kuring kecap dipilih acak sarta transkripsi, sarta sanggeus 10 detik ngirimkeun kuring tarjamahan sarta komentar. Urang terang kumaha maca paréntah, urang ogé hoyong diajar kumaha carana milih otomatis tur pariksa proxy, sarta ngareset counters pesen ka oblivion.

Hayu urang uncomment sagalana saméméhna commented kaluar salaku teu perlu, mairan kaluar conto ayeuna teu perlu jeung txt jeung csv, sarta simpen file salaku versi B106

Oh enya. Hayu urang ngirim deui ka bot.

6. Dispatch ti fungsi jeung leuwih

Sateuacan ngolah panarimaan, anjeun kedah nyiptakeun fungsi pikeun ngirim "sahenteuna hal" lian ti pesen tés.

Tangtosna, dina conto urang bakal ngan ukur hiji ngirim sareng ngan ukur hiji pamrosésan, tapi kumaha upami urang kedah ngalakukeun hal anu sami sababaraha kali?

Éta langkung gampang pikeun nyerat fungsi. Ku kituna, urang boga variabel tipe obyék $ MyVocabExample4AsArray, baca tina file, dina bentuk hiji Asép Sunandar Sunarya saloba dua elemen.
Hayu urang baca.

Dina waktos anu sami, urang bakal nganyahokeun jam; urang peryogi éta engké (saleresna, dina conto ieu urang henteu peryogina :)

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

Sakumaha anjeun tiasa tingali, fungsina nyauran $ MyToken sareng $ MyChatID, anu disandi keras sateuacana.

Teu perlu ngalakukeun ieu, sarta lamun $ MyToken hiji pikeun tiap bot, lajeng $ MyChatID bakal robah gumantung kana obrolan.

Nanging, sabab ieu mangrupikeun conto, urang bakal malire ayeuna.

Kusabab $MyVocabExample4AsArray sanes array, sanaos sami sareng hiji, teras anjeun teu bisa ngan nyokot eta menta panjangna.

Sakali deui urang kudu ngalakukeun hiji hal anu teu bisa dipigawé - parasut teu nurutkeun kodeu - nyandak eta sarta cacah

Sababaraha 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 metot. Hayu urang nyebutkeun urang hayang nampa 0 atawa 1 (urang boga ukur dua elemen dina Asép Sunandar Sunarya). Nalika netepkeun wates 0..1, urang bakal nampi "1"?
euweuh - urang moal meunang eta, urang boga conto husus Conto 2: Meunang integer acak antara 0 jeung 99 Meunang-Acak -Maksimum 100
Ku alatan éta, pikeun 0..1 urang kudu nyetel ukuran 0..2, kalawan jumlah unsur maksimum = 1.

7. Ngolah pesen asup jeung panjang antrian maksimum

Dimana urang eureun tadi? kami geus narima variabel $ MyMessageGet
jeung $Content4Pars01 dicandak ti dinya, nu urang museurkeun unsur tina Content4Pars01.result Asép Sunandar Sunarya

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

Hayu urang ngirim bot /message10, /message11, /message12, /word and again /word and /hello.
Hayu urang tingali naon anu urang ngagaduhan:

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

Hayu urang ngaliwat sadayana anu ditampi sareng kirimkeun réspon upami pesen éta / kecap
kasus ngawangun, naon sababaraha ngajelaskeun saolah-olah-elseif, disebut dina Powershell ngaliwatan switch. Dina waktos anu sami, kodeu di handap ieu nganggo konci -wildcard, anu leres-leres henteu perlu sareng ngabahayakeun.

Sababaraha kode #7.1

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

Hayu urang ngajalankeun skrip sababaraha kali. Urang bakal meunang kecap anu sarua dua kali pikeun tiap usaha palaksanaan, utamana lamun urang nyieun kasalahan dina palaksanaan acak.

Tapi eureun. Kami henteu ngirim / kecap deui, janten naha pesenna diolah deui?

Antrian pikeun ngirim pesen ka bot ngabogaan panjang terhingga (100 atawa 200 seratan, Jigana) jeung kudu diberesihan sacara manual.

Ieu tangtu dijelaskeun dina dokuméntasi, tapi anjeun kudu maca eta!

Dina hal ieu, urang peryogi parameter ?chat_id, sareng &timeout, &wates, &parse_mode=HTML sareng &disable_web_page_preview=true teu acan diperyogikeun.

Dokuméntasi pikeun telegram api aya di dieu
Éta nyarios dina basa bodas sareng Inggris:
Identifier tina update munggaran anu dipulangkeun. Kudu leuwih gede ku hiji ti pangluhurna diantara identifiers tina apdet saméméhna narima. Sacara standar, apdet dimimitian ku pangheubeulna
teu satuju update dipulangkeun. Pembaruan dianggap dikonfirmasi pas getUpdates disebut sareng offset luhur ti update_id na. The offset négatip bisa dieusian pikeun meunangkeun apdet mimitian ti -offset update ti tungtung antrian apdet. Kabéh apdet saméméhna bakal poho.

Hayu urang tingali:

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

Leres, sareng kami bakal ngareset sareng nyerat deui fungsina sakedik. Simkuring gaduh dua pilihan - lulus sakabéh pesen ka fungsi jeung ngolah eta sagemblengna dina fungsi, atanapi masihan ngan ID pesen na ngareset eta. Contona, nu kadua Sigana basajan.

Saméméhna, kami "sadaya pesen" string query kasampak kawas

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

sarta eta bakal kasampak kawas

$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 

Teu aya anu ngalarang anjeun nampi sadaya pesen heula, ngolahna, sareng ngan saatos pamrosésan anu suksés henteu dikonfirmasi -> dikonfirmasi.

Naha éta make akal pikiran pikeun nelepon konfirmasi sanggeus sagala processing geus réngsé? Kagagalan mungkin di tengah palaksanaan, sareng upami conto chatbot gratis, leungit pesen tunggal henteu aya anu khusus, maka upami anjeun ngolah gaji atanapi transaksi kartu batur, hasilna tiasa langkung parah.

Sababaraha baris kode deui

$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. Gantina kacindekan

Fungsi dasar - maca pesen, ngareset antrian, maca tina file sareng nyerat kana file parantos dilakukeun sareng ditampilkeun.

Aya ngan opat hal ditinggalkeun pikeun ngalakukeun:

  • ngirimkeun jawaban anu leres kana pamundut dina obrolan
  • ngirimkeun réspon kana obrolan naon waé anu ditambihkeun bot
  • executing kode dina loop a
  • ngaluncurkeun bot tina windows scheduler.

Sadaya pancén ieu saderhana sareng tiasa gampang dilaksanakeun ku maca dokuméntasi ngeunaan parameter sapertos
Set-ExecutionPolicy Unrestricted and -ExecutionPolicy Bypass
siklus formulir

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

Hatur nuhun ka sadayana anu maca.

sumber: www.habr.com

Tambahkeun komentar