Gjatë bisedave me një mik, papritur zbulova se nxënësit në klasat 8-10 në shkollën e tyre nuk mësojnë fare programimin. Word, Excel dhe kaq. As Logo, as Pascal, as madje VBA për Excel.
U befasova shumĂ«, hĂ«ngra internetin dhe fillova tĂ« lexoj â
Një nga detyrat e shkollës profesionale është të ndihmojë në formimin e një brezi të ri, që i përgjigjet nivelit të tij të zhvillimit dhe stilit të jetesës, kushteve të shoqërisë informative.
Ky kurs do të mundësojë që nxënësit të forcojnë në praktikë njohuritë e tyre mbi strukturat kryesore të gjuhës së programimit Pascal. (nga programi i ndonjë gimnazie për vitin 2017)
Si pĂ«rfundim, vendosa tĂ« harxhoj disa orĂ« dhe tĂ« shkruaj njĂ« shembull "si tĂ« krijosh njĂ« bot tĂ« thjeshtĂ« â pĂ«r nxĂ«nĂ«sit."
PoshtĂ« Ă«shtĂ« informacion mbi se si tĂ« shkruash njĂ« bot tĂ« thjeshtĂ« nĂ« PowerShell dhe ta bĂ«sh atĂ« tĂ« funksionojĂ« pa webhook, IP tĂ« bardha, serverĂ« tĂ« dedikuar, makina virtuale nĂ« cloud dhe gjĂ«ra tĂ« tjera â nĂ« njĂ« PC tĂ« zakonshĂ«m nĂ« shtĂ«pi me Windows tĂ« zakonshĂ«m.
TLDR: Një tjetër artikull i mërzitshëm me gabime gramatikore dhe faktike, s'ka asgjë për të lexuar, nuk ka humor, nuk ka imazhe.
Nuk ka asgjë të re në artikull, pothuajse gjithçka që është shkruar më parë është në Habrë, për shembull në artikujt dhe .
Për më tepër, artikulli është krijuar me qëllim që të mos i referohet çdo herë literaturës mësimore. Nuk ka asnjë referencë për Banda 4, PowerShell Deep Dives ose të themi The 5 Pillars of the AWS Well-Architected Framework në tekst.
Në vend të një parathënie, mund ta anashkalojmë
Mundshëm të lehtëNë vitin 2006, Microsoft lëshoi PowerShell 1.0 për atëherë Windows XP, Vista dhe serverin 2003. Në një mënyrë, ai zëvendësoi gjëra si skenarët cmdbat, skenarë vb, Windows Script Host dhe JScript.
Edhe tani PowerShell mund të konsiderohet vetëm si hapi tjetër pas varianteve të Logo, përveç ndoshta atyre që akoma përdoren Delphi (ose diçka më të vjetër), pavarësisht se ka cikle, klasa, funksione, thirrje MS GUI, dhe kështu me radhë.
Përdorimi i PowerShell është relativisht i rrallë, mund të haset kryesisht në formën e PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Desire State Configuration, dhe disa dhjetëra programe dhe funksione të tjera të përdorura rrallë. Ndoshta, ai do të ketë një rigjallërim me daljen , por nuk është e sigurt.
PowerShell ka tre përparësi të mëdha:
- ĂshtĂ« relativisht i thjeshtĂ«, pĂ«r tĂ« ka shumĂ« literaturĂ« dhe shembuj, madje edhe nĂ« rusisht, pĂ«r shembull njĂ« artikull pĂ«r Foreach â nga libri â pĂ«r diferencĂ«n () dhe {}
- Ai vjen së bashku me redaktorin , në paketë me Windows. Ka madje edhe një debugger diçka.
- Nga ai lehtësisht thirren .
0. Përgatitja.
Na nevojitet:
- Një PC me Windows (unë kam Windows 10)
- Një lidhje të paktën në internet (përmes NAT për shembull)
- PĂ«r ata qĂ« kanĂ« akses tĂ« kufizuar nĂ« telegram â freegate i instaluar dhe i konfiguruar nĂ« shfletues, nĂ« disa raste tĂ« komplikuara sĂ« bashku me Symple DNS Crypt
- Prania e një klienti funksional të telegramit në telefon
- Kuptimi i bazave â çfarĂ« Ă«shtĂ« njĂ« variabĂ«l, njĂ« array, njĂ« cikĂ«l.
Artikuj tĂ« hapur dhe tĂ« lexuar â dhe
1. Të krijojmë një bot testues të ri.
Duke qenĂ« se kĂ«tĂ« e dinĂ« tĂ« gjithĂ«, dhe ka qenĂ« mĂ« parĂ«, kjo gjithashtu mund tĂ« kalojĂ«Siç Ă«shtĂ« thĂ«nĂ« nĂ« artikullin mĂ« lart â Para sĂ« gjithash, njĂ« bot pĂ«r Telegram â Ă«shtĂ« akoma njĂ« aplikacion qĂ« ekzekutohet nĂ« anĂ«n tuaj dhe bĂ«n kĂ«rkesa nĂ« Telegram Bot API. Madje API Ă«shtĂ« e qartĂ« â boti i drejtohet njĂ« URL tĂ« caktuar me parameterĂ«, dhe Telegram pĂ«rgjigjet me njĂ« objekt JSON.
Problemet e lidhura me kĂ«tĂ«: nĂ«se, nĂ« ndonjĂ« mĂ«nyrĂ« tĂ« panjohur, merrni njĂ« kod nga objekti JSON dhe ndonjĂ«herĂ« e dĂ«rgoni atĂ« pĂ«r ekzekutim (pĂ«rveç qĂ«llimit) â kodi do tĂ« vihet nĂ« funksion.
Procesi i krijimit është përshkruar në dy artikujt më sipër, por le të përsërisim: në telegram hapim kontaktet, kërkojmë @botfather, i themi atij /newbot, krijojmë botin Botfortest12344321, e emërtojmë Mynext1234bot dhe marrim një mesazh me një çelës unik të formatit 1234544311:AbcDefNNNNNNNNNNNNN
Ruajeni çelësin dhe mos e shpërndani!
MĂ« pas mund tĂ« konfigurojmĂ« botin, pĂ«r shembull, tâi ndalim shtimin e tij nĂ« grupe, por nĂ« hapat e parĂ« nuk Ă«shtĂ« e nevojshme.
Do të pyesim BotFather për «/mybot» dhe do të korrigjojmë cilësimet, nëse diçka nuk është siç duhet.
SĂ«rish do tĂ« hapim kontaktet, do ta gjejmĂ« atje @Botfortest12344321 (duhet tĂ« fillojmĂ« kĂ«rkimin me @) dhe do tĂ« klikojmĂ« «start» dhe do tâi shkruajmĂ« botit «/Glory to the robots». Shenja / Ă«shtĂ« e detyrueshme, thonjat nuk janĂ« tĂ« nevojshme.
Boti, natyrisht, nuk do të përgjigjet.
Do ta kontrollojmĂ« qĂ« boti Ă«shtĂ« krijuar â do ta hapim.
:AbcDefNNNNNNNNNNNNN/getMe
ku 1234544311:AbcDefNNNNNNNNNNNNN â çelĂ«si i marrĂ« mĂ« parĂ«,
dhe do të marrim një varg të formatit
{"ok":true,"result":{""}}
Ne kemi frasen e parĂ« sekrete (token). Tani na nevojitet tĂ« zbulojmĂ« numrin e dytĂ« sekret - ID-nĂ« e bisedĂ«s me botin. Ădo bisedĂ«, grup etj. janĂ« individuale dhe kanĂ« numrin e vet tĂ« veçantĂ« (ndonjĂ«herĂ« me minus â pĂ«r grupet e hapura). PĂ«r tĂ« zbuluar kĂ«tĂ« numĂ«r, na nevojitet tĂ« kĂ«rkojmĂ« nĂ« shfletues (nĂ« tĂ« vĂ«rtetĂ« nuk Ă«shtĂ« domosdoshmĂ«risht nĂ« shfletues, por pĂ«r njĂ« kuptim mĂ« tĂ« mirĂ« mund tĂ« filloni me tĂ«) adresĂ«n (ku 1234544311:NNNNNNNNN Ă«shtĂ« tokeni juaj
https://api.telegram.org/bot1234544311:NNNNNNNNN/getUpdates
dhe të marrim një përgjigje si
{"ok":true,"result":[{"update_id":âŠ,⊠bisedĂ«"{"id":123456789
Na nevojitet saktësisht chat_id.
Të kontrollojmë nëse mund të shkruajmë në bisedë manualisht: të thërrasim nga shfletuesi adresën
https://api.telegram.org/botvahtoken/sendMessage?chat_id=123456789&text="Life is directed motion"Nëse merrni një mesazh në bisedë nga boti - është në rregull, kaloni në fazën tjetër.
Kështu (nëpërmjet shfletuesit) gjithmonë mund të kontrolloni ku janë problemet - nëse janë në gjenerimin e lidhjes, ose nëse diçka është fshehur dhe nuk funksionon.
ĂfarĂ« duhet tĂ« dini para se tĂ« vazhdoni leximin
Në Telegram ka disa lloje bisedash grupore (të hapura, të mbyllura). Për këto biseda disa funksionalitete (p.sh., id) ndryshojnë, gjë që nganjëherë shkakton disa probleme.
Të supozojmë se është fundi i vitit 2019, dhe megjithatë hero i kohës sonë, i njohuri njeriu-orkestër (administrator, avokat, ekspert i sigurisë së informacionit, programer dhe praktikisht MVP) Evgeni V. dallon variablin $i nga array, ka zotëruar ciklet, ndoshta në dy vitet e ardhshme do të zotërojë Chocolatey, e pastaj do të arrijë në dhe do të arrihet.
1. Të mendojmë, çfarë do të bëjë boti ynë
Nuk kisha ide, duhej të mendohesha. Kam shkruar tashmë një boti-shënim. Nuk doja të bënte boti "i cili dërgon diçka diku". Për të lidhur Azure, nevojitet një kartë krediti, por nga e kuptoj ajo është nga një nxënës? Duhet të theksohet se gjërat nuk janë aq keq: shumica e shërbimeve të cloud ofrojnë një periudhë provë falas (por numri i kartës së krediti ende kërkohet - dhe nga ajo do të sillen një dollar. Nuk e mbaj mend nëse është kthyer pastaj.)
Pa AI ML, bota me natyrë e ashpër nuk është aq interesante.
Vendosa të bëj një boti që do të më kujtonte (ose jo) fjalë angleze nga fjalori.
Fjalori, në mënyrë që të mos merrem me BD, do të ndodhet në një skedar tekstual dhe do të plotësohet manualisht.
Në këtë rast, detyra është të tregojë bazat në punë, dhe jo të krijojë ndonjë produkt të gatshëm, edhe pjesërisht.
2. Po provoni për herë të parë
Të krijojmë një dosje C:poshtranslate
Fillimisht, të shohim çfarë kemi me powershell, ta hapim ISE përmes start-run
powershell ise
ose ta gjejmë Powershell ISE në programet e instaluara.
Pas hapjes do tĂ« shfaqet njĂ« "editor i zakonshĂ«m", nĂ«se nuk ka fushĂ« teksti, gjithmonĂ« mund tĂ« klikoni "File â create new".
TĂ« shohim versionin e powershell â tĂ« shkruajmĂ« nĂ« fushĂ«n e tekstit:
get-host
dhe të shtypim F5.
Powershell do tĂ« propozoi qĂ« tĂ« ruajmĂ« â "The script you are about to run will be saved.", le tĂ« pranojmĂ« dhe ta ruajmĂ« nĂ« C:poshtranslate me emrin myfirstbotBT100.
Pas ekzekutimit, në dritaren e poshtme do të marrim një tabelë të dhënash:
Name : Windows PowerShell ISE Host
Version : 5.1.(dhe kështu me radhë)
UnĂ« kam 5.1 me ndonjĂ« gjĂ« tjetĂ«r, kjo Ă«shtĂ« e mjaftueshme. NĂ«se keni Windows 7/8 tĂ« vjetĂ«r, nuk Ă«shtĂ« aspak problem â megjithatĂ«, Ă«shtĂ« e nevojshme tĂ« pĂ«rmirĂ«sohet PowerShell nĂ« versionin 5 â pĂ«r shembull, nga .
Të shkruajmë në komandën e poshtme Get-Date, të shtypim Enter, të shikojmë orën, të kalojmë në dosjen rrënjësore me komandën
cd
dhe të pastrojmë ekranin me komandën cls (jo, nuk duhet të përdorim rm)
Tani do tĂ« kontrollojmĂ« se çfarĂ« funksionon â do tĂ« shkruajmĂ« madje jo kod, por dy rreshta dhe do tĂ« pĂ«rpiqemi tĂ« kuptojmĂ« se çfarĂ« bĂ«jnĂ«. Do tĂ« komentonim rreshtin me get-host me simbolin # dhe do tĂ« shtojmĂ« pak mĂ« shumĂ«.
# ĐŃĐžĐŒĐ”Ń ŃĐ°Đ±Đ»ĐŸĐœĐ° Đ±ĐŸŃа
# get-host
<# ŃŃĐŸ ĐżŃĐžĐŒĐ”Ń ĐŒĐœĐŸĐłĐŸŃŃŃĐŸŃĐœĐŸĐłĐŸ ĐșĐŸĐŒĐŒĐ”ĐœŃаŃĐžŃ #>
$TimeNow = Get-Date
$TimeNow
(ĂfarĂ« Ă«shtĂ« interesante. NĂ« listĂ«n e rregullimit tĂ« kodit nĂ« habr ka dy duzina variante â por powershell aty nuk ka. Ka Dos. Ka Perl.)
Dhe do ta ekzekutojmë kodin duke shtypur F5 ose ">" nga GUI.
Do të marrim një dalje:
E shtunë, 8 Dhjetor 2019 21:00:50 PM (ose diçka e ngjashme)
Tani do të merremi me këto dy rreshta dhe disa momente interesante, për ta evituar këtë në të ardhmen.
Në krahasim me pascalin (dhe jo vetëm), powershell vetë përpiqet të përcaktojë se cili tip t'i atribuohet variablës, më shumë mbi këtë shkruhet në artikullin
Prandaj, duke krijuar një variabël $TimeNow dhe duke i dhënë vlerën e datës dhe orës aktuale (Get-Date), nuk duhet të shqetësohemi shumë se cili tip të dhënash do të ketë.
E vërteta është, se nga kjo padituri më vonë mund të krijohet një dhimbje, por kjo është më vonë. Në tekstin e mëposhtëm do të jetë një shembull.
Të shohim se çfarë kemi arritur. Ekzekutojmë (në komandën e poshtme)
$TimeNow | Get-memberdhe do të marrim një faqe me tekst të paqartë
Shembulli i tekstit të paqartë numër 1
PS C:> $TimeNow | Get-member
TypeName: System.DateTime
Emri Lloji i Anëtarit Definicioni
---- ---------- ----------
Shto <b>Metoda </b>data e kohës Shto(vlera e intervalit të kohës)
..
ShfaqjaHint PronëEShënjestruar Lloji i ShfaqjesHint ShfaqjaHint=DateTime
Data <b>Pronë </b>data e kohës Data {merr;}
Viti Pronë int Viti {merr;}
..
Data e kohës PronëScript System.Object Data e kohës {merr= nëse ((& { Set-StrictMode -Version 1; $this.ShfaqjaHint }) -ieq "Data")...
Siç duket, është krijuar një variabël e tipit TypeName: System.DateTime me shumë metoda (në kuptimin se çfarë mund të bëjmë me këtë objektvariabël) dhe pronarive.
Do tĂ« thĂ«rrasim $TimeNow.DayOfYear â do tĂ« marrim numrin e ditĂ«s nĂ« vit.
Do tĂ« thĂ«rrasim $TimeNow.DayOfYear | Get-Member â do tĂ« marrim TypeName: System.Int32 dhe grupin e metodave.
Do tĂ« thĂ«rrasim $TimeNow.ToUniversalTime() â dhe do tĂ« marrim kohĂ«n nĂ« UTC
Debuguesi
NdonjĂ«herĂ« ndodh qĂ« Ă«shtĂ« e nevojshme tĂ« ekzekutohet programma deri nĂ« njĂ« linjĂ« tĂ« caktuar dhe tĂ« shikohet gjendja e programĂ«s nĂ« atĂ« moment. PĂ«r kĂ«tĂ«, nĂ« ISE ka funksionin Debug â toggle break point
Vendosni një pikë ndalimi diku në mes, ekzekutoni këto dy linja dhe shikoni si duket ndalimi.
3. Të diskutojmë për ndërveprimin me botin e Telegramit
Sigurisht, për ndërveprimin me botin, me të gjitha getpush-et etj. është shkruar akoma më shumë literaturë, megjithatë çështja e teorisë mund të shqyrtohet fakultativisht.
Në rastin tonë është e nevojshme:
- Të mësojmë të dërgojmë diçka në bisedë
- Të mësojmë të marrim diçka nga biseda
3.1. Mësojmë të dërgojmë diçka në bisedë dhe të marrim gjithashtu
Pak kod â pjesa 3
Write-output "Kjo është pjesa 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 = "Jeta është lëvizje e drejtuar - " + $TimeNow
$URL4SEND = "https://api.telegram.org/bot$MyToken/sendMessage?chat_id=$MyChatID&text=$MyText01"
Invoke-WebRequest -Uri $URL4SEND
dhe në RF në këtë vend ne marrim gabimin Unable to connect to the remote server.
Ose nuk marrim â varet nga operatori i lidhjes dhe nĂ«se proksi Ă«shtĂ« i konfiguruar dhe punon
ĂfarĂ« tĂ« bĂ«jmĂ« â mbetet tĂ« shtojmĂ« proksi. Keni parasysh â pĂ«rdorimi i njĂ« proksi tĂ« paenkriptuar dhe gjithashtu tĂ« huaj Ă«shtĂ« jashtĂ«zakonisht i rrezikshĂ«m pĂ«r shĂ«ndetin tuaj.
Detyra e kĂ«rkimit tĂ« njĂ« proksi funksional nuk Ă«shtĂ« shumĂ« e komplikuar â pjesa mĂ« e madhe e http proksive tĂ« botuar punon. MĂ« duket se mĂ« ka funksionuar proksi i pestĂ«.
Sintaksa me përdorimin e proksit:
Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy
NĂ«se keni marrĂ« njĂ« mesazh nĂ« bisedĂ«n tuaj me botin â gjithçka Ă«shtĂ« shkĂ«lqyeshĂ«m, mund tĂ« kaloni mĂ« tej. NĂ«se jo â vazhdoni debugimin.
Mund të shikoni në çfarë shndërrohet linja juaj $URL4SEND dhe të provoni ta kërkoni atë në shfletues, për shembull kështu:
$URL4SEND2 = '"'+$URL4SEND+'"'
start chrome $URL4SEND2
3.2. Të shkruajmë "diçka" në bisedë kemi mësuar, tani do të provojmë të lexojmë
Do të shtojmë edhe 4 linja dhe do të shikojmë se çfarë ka brenda përmes | get-member
$URLGET = "https://api.telegram.org/bot$MyToken/getUpdates"
$MyMessageGet = Invoke-WebRequest -Uri $URLGET -Method Get -Proxy $MyProxy
Write-Host "Get-Member"
$MyMessageGet | Get-Member
Gjëja më interesante na ofron
Content Property string Content {get;}
ParsedHtml Property mshtml.IHTMLDocument2 ParsedHtml {get;}
RawContent Property string RawContent {get;set;}Le të shohim se çfarë ka në to:
Write-Host "ParsedHtml"
$MyMessageGet.ParsedHtml # këtu është interesante
Write-Host "RawContent"
$MyMessageGet.RawContent # dhe këtu është interesante, por gjithashtu e lexueshme.
Write-Host "Content"
$MyMessageGet.Content
Nëse gjithçka funksionon, do të merrni një string të gjatë si:
{"ok":true,"result":[{"update_id":12345678,
"message":{"message_id":3,"from":{"id"PĂ«r fat, nĂ« artikullin e mĂ«parshĂ«m rreth Botit tĂ« Telegram pĂ«r administratorĂ«t e sistemeve, ky string (po, sipas $MyMessageGet.RawContent | get-member â Ă«shtĂ« System.String), tashmĂ« Ă«shtĂ« analizuar.
4. TĂ« ĐŸĐ±ŃĐ°Đ±ĐŸŃĐžĐŒ rezultatin (tĂ« dĂ«rgojmĂ« diçka ne tashmĂ« dimĂ«)
Siç është shkruar më parë , më e nevojshme ndodhet në content. Le të shohim më afër.
Së pari, le të shkruajmë botos një ose dy fraza nga interfejsi web ose nga telefoni
/message1
/message2
/message3dhe të shohim përmes shfletuesit adresën që është formuar në ndryshore $URLGET.
Do të shohim diçka si:
{"ok":true,"result":[{"update_id":NNNNNNN,
"message":{"message_id":10, .. "text":"\/message1"
"message":{"message_id":11, .. "text":"\/message2
"message":{"message_id":12, .. "text":"\/message3 ĂfarĂ« Ă«shtĂ« kjo? NjĂ« objekt kompleks nga vazhda e objekteve, qĂ« pĂ«rmban njĂ« identifikues tĂ« mesazhit, identifikuesin e bisedĂ«s, identifikuesin e dĂ«rguesit dhe shumĂ« informacione tĂ« tjera.
MegjithatĂ«, nuk kemi nevojĂ« tĂ« analizojmĂ« «çfarĂ« Ă«shtĂ« ky objekt» â njĂ« pjesĂ« e punĂ«s Ă«shtĂ« bĂ«rĂ« pĂ«r ne. Le tĂ« shohim se çfarĂ« ka brenda:
Lexojmë mesazhet e marra ose pjesa 4
Write-Host "Kjo është pjesa 4" <# natyrisht që ky string nuk na nevojitet në tekstin përfundimtar, por është e leverdisshme për të kërkuar. #>
$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. ĂfarĂ« do tĂ« bĂ«jmĂ« tani me kĂ«tĂ«
Do ta ruajmë skedarin e marrë me emrin myfirstbotBT105 ose siç preferoni, do ta ndryshojmë titullin dhe do ta komentojmë të gjithë kodin e shkruar deri tani përmes
<#fillim komenti 105 fund komenti 105#>
Tani na duhen për të vendosur, ku të marrim fjalorin (eh, si ku - në disk në një skedar) dhe si do të duket ai.
Sigurisht, mund të mbushim një fjalor të madh direkt në tekstin e skenarit, por kjo është krejtësisht e paarsyeshme.
Prandaj, le të shohim me çfarë mund të punojë natyralisht powershell.
Në të vërtetë, për të nuk ka rëndësi se me cilin skedar punon, te ne ka rëndësi.
Kemi në dispozicion: txt (mundet, por përse), csv, xml.
Ose mund t'i shohim të gjithë. Le të shohim të gjithë.
Do të krijojmë klasën MyVocabClassExample1 dhe variablën $MyVocabExample1
vërej që klasa shkruhet pa $
pak kod #5
write-host "Kjo është pjesa 5"
class MyVocabClassExample1 {
[string]$Original # fjala
[string]$Transcript
[string]$Translate
[string]$Example
[int]$VocWordID # një moment shumë interesant. Përdorimi i int me kufizimet e tij ndonjëherë mund të çojë në pasoja të çuditshme, për shembull - rasti i fundit me SSD HPE. Fillimisht nuk e shtova këtë element, pastaj e shkrova dhe e komentoha.
}
$MyVocabExample1 = [MyVocabClassExample1]::new()
$MyVocabExample1.Original = "Apple"
$MyVocabExample1.Transcript = "[ ËapÉl ]"
$MyVocabExample1.Translate = "Mollë"
$MyVocabExample1.Example = "Një mollë është një frut i ëmbël dhe i ngrënshëm i prodhuar nga një pemë molle (Malus domestica)"
# $MyVocabExample1.$VocWordID = 1
$MyVocabExample2 = [MyVocabClassExample1]::new()
$MyVocabExample2.Original = "Pear"
$MyVocabExample2.Transcript = "[ pe(É)r ]"
$MyVocabExample2.Translate = "Dardhë"
$MyVocabExample2.Example = "Dardha (\/ËpÉÉr\) Ă«shtĂ« njĂ« specie e gjinisĂ« Pyrus"
# $MyVocabExample1.$VocWordID = 2
Le të provojmë ta shkruajmë këtë në skedarë sipas .
Disa kode #5.1
Write-Host $ScriptDir # shpresoj që $ScriptDir nuk e keni komentuar
$MyFilenameExample01 = $ScriptDir + "Shembulli01.txt"
$MyFilenameExample02 = $ScriptDir + "Shembulli02.txt"
Write-Host $MyFilenameExample01
Out-File -FilePath $MyFilenameExample01 -InputObject $MyVocabExample1
Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2
notepad $MyFilenameExample01
â dhe do tĂ« marrim njĂ« gabim nĂ« rreshtin Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2.
Nuk dëshiron të shtojë, ua, sa keq.
$MyVocabExample3AsArray = @($MyVocabExample1,$MyVocabExample2)
Out-File -FilePath $MyFilenameExample02 -InputObject $MyVocabExample3AsArray
notepad $MyFilenameExample02
Le tĂ« shohim çfarĂ« dolĂ«n. NjĂ« pamje shumĂ« e bukur tekstuale â por si mund ta eksportojmĂ« pĂ«rsĂ«ri nga ajo? TĂ« pĂ«rdorim ndonjĂ« ndarĂ«s teksti, pĂ«r shembull presje?
Dhe në fund të marrim "skedë me ndarës - presje, vlera të ndara me presje (CSV)". .
#
$MyFilenameExample03 = $ScriptDir + "Shembulli03.csv"
$MyFilenameExample04 = $ScriptDir + "Shembulli04.csv"
Export-Csv -Path $MyFilenameExample03 -InputObject $MyVocabExample1
Export-Csv -Path $MyFilenameExample03 -InputObject $MyVocabExample2 -Append
Export-Csv -Path $MyFilenameExample04 -InputObject $MyVocabExample3AsArray
Sa e lehtë të shohësh, MS nuk doli shumë logjik, për procedura të ngjashme në një rast përdoret -FilePath, ndërsa në tjetri -Path.
Përveç kësaj, në skedarin e tretë u humb gjuha ruse, në skedarin e katërt doli... mirë, diçka doli. #TYPE System.Object[] 00
# âCountâ,»Length»,«LongLength»,«Rank»,«SyncRoot»,«IsReadOnly»,«IsFixedSize»,«IsSynchronized»
#
Le të rishkruajmë pak:
Export-Csv -Path $MyFilenameExample03 -InputObject $MyVocabExample1 -Encoding Unicode
Export-Csv -Path $MyFilenameExample03 -InputObject $MyVocabExample2 -Append -Encoding Unicode
notepad $MyFilenameExample03
notepad $MyFilenameExample04
Duket se ndihmoi â por formati gjithsesi nuk mĂ« pĂ«lqen.
Sidomos nuk më pëlqen se nuk mund të vendos rreshtat nga objekti drejtpërdrejt në skedar.
Dhe, pasi filluam tĂ« shkruajmĂ« nĂ« skedarĂ« â ndoshta do tĂ« fillojmĂ« tĂ« mbajmĂ« njĂ« log tĂ« fillimit? Koha si variabĂ«l e kemi, emrin e skedarit e dimĂ« ta cakalojmĂ«.
E shkruar, e vërtetë, për momentin nuk kemi çfarë të shkruajmë, por mund të mendojmë se si ta bëjmë më mirë rotacionin e dosjeve.
Njëherë le të provojmë xml.
Pak 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
Eksportimi nĂ« xml ka vetĂ«m pĂ«rfitime â lexueshmĂ«ria, eksportimi i tĂ« gjithĂ« objektit dhe nuk Ă«shtĂ« e nevojshme tĂ« kryhet uppend.
Të provojmë .
Pak lexim nga xml
$MyFilenameExample06 = $ScriptDir + "Example06.xml"
$MyVocabExample4AsArray = Import-Clixml -Path $MyFilenameExample06
# $MyVocabExample4AsArray
# $MyVocabExample4AsArray[0]
# dhe pak për nuancat që nuk janë të qarta. Powershell herë pas here sillet ndryshe nga çfarë do të pritej.
# për shembull, këta dy dalje ndryshojnë
# Write-Output $MyVocabExample4AsArray
# write-host $MyVocabExample4AsArray
Le të kthehemi te detyra. Ne shkruam një skedar provues, e lexuam, formati i ruajtjes është i qartë, nëse nevojitet mund të shkruajmë një editor të vogël të veçantë për shtimin dhe fshirjen e rreshtave.
Rikujtoj, se detyra ishte të krijohej një bot që mëson.
Formati i punës: unë dërgoj komandën "shembull" botit, boti më dërgon një fjalë të zgjedhur rastësisht dhe transkription, dhe pas 10 sekondash dërgon përkthimin dhe komentin. Ne dimë të lexojmë komandat, do të mësojmë dhe se si të përshtatemi automatikisht dhe të kontrollojmë proxy-t, dhe të anullojmë çdo numërim mesazhesh.
Do të rikthejmë gjithçka që është komentuar si të panevojshme, do të komentojmë shembujt me txt dhe csv që janë bërë të panevojshme, dhe do ta ruajmë skedarin si version B106.
Ah, po. Të dërgojmë diçka boti përsëri.
6. Dërgimi nga funksionet dhe jo vetëm
Para se të fillojmë të procesojmë marrjen, duhet të krijojmë një funksion dërgimi "çfarëdo", përveç mesazhit testues.
Sigurisht, në shembullin tonë do të ketë vetëm një dërgim dhe nga një përpunim, por nëse na nevojitet të bëjmë të njëjtën gjë disa herë?
Më e lehtë është të shkruajmë një funksion. Pra, ne kemi një variabël të tipit objekt $MyVocabExample4AsArray, e lexuar nga skedari, në formën e një ndarjeje me dy elemente.
NĂ« tĂ« njĂ«jtĂ«n kohĂ« do tĂ« merremi me orĂ«t, do na nevojitet mĂ« vonĂ« (nĂ« tĂ« vĂ«rtetĂ« nĂ« kĂ«tĂ« shembull â nuk na nevojitet đ
Pak kod #6.1
Write-Output "Ky është Pjesa 6"
$Timezone = (Get-TimeZone)
IF($Timezone.SupportsDaylightSavingTime -eq $True){
$TimeAdjust = ($Timezone.BaseUtcOffset.TotalSeconds + 3600) } # koha e përmirësuar
ELSE{$TimeAdjust = ($Timezone.BaseUtcOffset.TotalSeconds)
}
function MyFirstFunction($SomeExampleForFunction1){
$TimeNow = Get-Date
$TimeNow.ToUniversalTime()
# $MyText02 = $TimeNow + " " + $SomeExampleForFunction1 # dhe këtu do të marrim një gabim
$MyText02 = $SomeExampleForFunction1 + " " + $TimeNow # ndërsa këtu nuk do të marrim, kush e kupton pse - është i zgjuar.
$URL4SendFromFunction = "https://api.telegram.org/bot$MyToken/sendMessage?chat_id=$MyChatID&text=$MyText02"
Invoke-WebRequest -Uri $URL4SendFromFunction -Proxy $MyProxy
}
Siç mund ta shikoni lehtësisht, në funksion thirret $MyToken dhe $MyChatID, të cilat janë caktuar më parë.
Kjo nuk duhet bërë, dhe, nëse $MyToken është i njëjtë për çdo bot, atëherë $MyChatID do të ndryshojë në varësi të bisedës.
Megjithatë, duke qenë se ky është një shembull, për momentin do ta injorojmë këtë.
Pasi $MyVocabExample4AsArray nuk është një array, megjithëse duket shumë si një, atëherë nuk mund ta merrni thjesht dhe të kërkoni gjatësi të tij.
Do tĂ« duhet sĂ«rish tĂ« bĂ«ni atĂ« qĂ« nuk duhet bĂ«rĂ« â tĂ« zbarkoni jo nĂ« mĂ«nyrĂ« kodike â tĂ« merrni dhe tĂ« llogaritni
Pak kodi #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)
# apo në një rresht
# MyFirstFunction($MyVocabExample4AsArray[Get-Random -Minimum 0 -Maximum ($MaxRandomExample -1)].Example)
# Të gatuarje vetë, cili shembull është më i lehtë për t'u lexuar nga njerëzit e jashtëm.
RastĂ«sor . Supozoni se duam tĂ« marrim 0 ose 1 (ne kemi vetĂ«m dy elementĂ« nĂ« array). Kur caktojmĂ« kufijtĂ« 0..1 â a do tĂ« marrim '1'?
jo â nuk do ta marrim, kemi dhĂ«nĂ« veçanĂ«risht shembullin Example 2: Merrni njĂ« numĂ«r rastĂ«sor mes 0 dhe 99 Get-Random -Maximum 100
Prandaj për 0..1 do të duhet të caktqjmë madhësinë 0..2, me numrin maksimal të elementit = 1.
7. Trajtimi i mesazheve të pranuara dhe gjatësi maksimale e radhës
Në çfarë kemi ndalur më parë? kemi marrë variablën e marrë $MyMessageGet
dhe të marrë $Content4Pars01, nga e cila na interesojnë elementët e array Content4Pars01.result
$Content4Pars01.result[0].update_id
$Content4Pars01.result[0].message
$Content4Pars01.result[0].message.text Do t'i dërgojmë botit /message10, /message11, /message12, /word dhe përsëri /word dhe /përshëndetje.
Le të shohim se çfarë kemi marrë:
$Content4Pars01.result[0].message.text
$Content4Pars01.result[2].message.text Do të kalojmë të gjithën e marrë dhe do të dërgojmë përgjigje, nëse mesazhi ishte /word
kontraktimi case of, ajo që disa e përshkruajnë si if-elseif, në powershell thirret . Në kodin më poshtë, është përdorur çelësi -wildcard, i cili nuk është aspak i nevojshëm dhe madje është i dëmshëm.
Pak kodi #7.1
Write-Output "Ky është pjesa 7"
Foreach ($Result in $Content4Pars01.result) # Po, mund të bëhet më shpejt
{
switch -wildcard ($Result.message.text)
{
"\/word" {MyFirstFunction($TextForExample1)}
}
}
Do ta ekzekutojmë skenarin disa herë. Do të marrim të njëjtin fjalë dy herë për çdo përpjekje ekzekutimi, sidomos nëse kemi gabuar në realizimin e random.
Por ndaloni. Ne nuk e dhamë përsëri \/word, pse mesazhi po trajtohet përsëri?
Rradha për dërgimin e mesazheve te boti ka një gjatësi të kufizuar (duket 100 ose 200 mesazhe), dhe duhet të pastrohet manualisht.
Në dokumentacion është përshkruar sigurisht, por duhet ta lexojmë!
Në këtë rast, na nevojitet parametri ?chat_id, ndërsa &timeout, &limit, &parse_mode=HTML dhe &disable_web_page_preview=true për momentin nuk janë të nevojshme.
Dokumentacioni për Në anglisht shkruhet qartë:
Identifikuesi i përditësimit të parë që do të kthehet. Duhet të jetë më i madh me një se ai më i larti nga identifikuesit e përditësimeve të marra më parë. Me default, përditësimet fillojnë me më të hershmet.
të pabaruara përditësimi kthehet. Një përditësim konsiderohet i konfirmuar sa herë që getUpdates të thirret me një offset më të lartë se sa update_id i tij.. Offset negativ mund të specifikohet për të marrë përditësime duke filluar nga -offset përditësimi nga fundi i radhës së përditësimeve. Të gjitha përditësimet e mëparshme do të harrohen.
Le të shohim në:
$Content4Pars01.result[0].update_id
$Content4Pars01.result[1].update_id
$Content4Pars01.result | select -last 1
($Content4Pars01.result | select -last 1).update_idPo ashtu do ta ribotojmĂ« â disi do ta rishkruajmĂ« funksionin. Ne kemi dy mĂ«nyra â tĂ« kalojmĂ« tĂ«rĂ« mesazhin nĂ« funksion dhe ta trajtojmĂ« atĂ« plotĂ«sisht nĂ« funksion, ose vetĂ«m tĂ« kalojmĂ« ID-nĂ« e mesazhit dhe ta ribotojmĂ« atĂ«. PĂ«r shembull, e dyta duket mĂ« e thjeshtĂ«.
Më parë, linja jonë e kërkesës për "të gjitha mesazhet" dukej si
$URLGET = "https:\/\/api.telegram.org\/bot$MyToken\/getUpdates"dhe do të duket si
$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
Askush nuk e ndalon të fillojmë të marrim të gjitha mesazhet, t'i trajtojmë ato, dhe vetëm pas trajtimit të suksesshëm të kërkojmë unconfirmed -> confirmed.
Pse ka kuptim të thërrasim konfirmimin pas përfundimit të të gjitha trajtimeve? Mund të ndodhë një dështim në mes të ekzekutimit, dhe, nëse, për shembull, për një chatbot falas kalimi i ndonjë mesazhi të veçantë nuk është asgjë, atëherë, nëse po trajtoni pagën e dikujt ose një transaksion me kartë, rezultati mund të jetë më keq.
Disa rreshta të tjera kodi
$LastMessageId = ($Content4Pars01.result | select -last 1).update_id #pritet e gabimit këtu supozohet të rregullohen vetë.
$URLGET1 = "https://api.telegram.org/bot$mytoken/getUpdates?offset=$LastMessageId&limit=100"
Invoke-WebRequest -Uri $URLGET1 -Method Get -Proxy $MyProxy
8. Në vend të përfundimit
Funksionet kryesore â leximi i mesazheve, fshirja e rendit, leximi nga skedari dhe shkrimi nĂ« skedare janĂ« realizuar dhe treguar.
Kane mbetur vetëm katër gjëra për të bërë:
- dërgimi i përgjigjes së saktë në kërkesën në bisedë
- dĂ«rgimi i pĂ«rgjigjes nĂ« ĂDO bisedĂ« ku Ă«shtĂ« shtuar boti
- ekzekutimi i kodit në cikël
- nisja e botit nga planifikuesi i Windows.
Të gjitha këto detyra janë të thjeshta dhe lehtësisht të realizueshme nëpërmjet leximit të dokumentacionit për parametrat si
Set-ExecutionPolicy Unrestricted dhe -ExecutionPolicy Bypass
cikli i llojit
$TimeToSleep = 3 # pyetje çdo 3 sekonda
$TimeToWork = 10 # minuta
$HowManyTimes = $TimeToWork*60/$TimeToSleep # numërues për cikël
$MainCounter = 0
for ($MainCounter=0; $MainCounter -le $HowManyTimes) {
sleep $TimeToSleep
$MainCounter ++
Faleminderit të gjithëve që lexuat deri në fund.
Burimi: habr.com
