Şablon ji bo botek telegramê ya hêsan ji bo xwendekarên dibistanê di polên 7-9 de bi karanîna Powershell

Di dema sohbetên bi hevalekî re, ez ji nişka ve fêr bûm ku zarokên di polên 8-10-an de li dibistana wan qet fêrî bernamekirinê nayên kirin. Word, Excel û her tişt. Ne logo, ne jî Pascal, ne jî VBA ji bo Excel.

Ez pir şaş bûm, Înternetê vekir û dest bi xwendinê kir -
Yek ji erkên dibistana pispor ew e ku perwerdehiya nifşek nû pêşve bibe ku di asta pêşkeftin û şêwaza jiyana xwe de şert û mercên civaka agahdarî pêk tîne.
Ev qurs dê bihêle xwendekar di pratîkê de zanîna xwe ya li ser avahîyên bingehîn ên zimanê bernamenûsê Pascal yek bikin. (ji bernameya çend salona werzîşê ya 2017)

Di dawiyê de, min biryar da ku çend demjimêran derbas bikim û mînakek "çawa meriv botek hêsan ji bo xwendekarên dibistanê biafirîne."

Li jêr qutkirinê ev e ku meriv çawa botek din a hêsan di Powershell-ê de binivîsîne û wê bixebite bêyî tevnhook, IP-yên spî, serverên veqetandî, makîneyên virtual yên di ewr de hatine bicîh kirin, û hwd - li ser PC-ya malê ya birêkûpêk bi Windows-a birêkûpêk.

TLDR: Gotareke din a bêzar a bi xeletiyên rêzimanî û rasteqînî, tiştekî xwendinê, bê mîzah, bê wêne.

Di gotarê de tiştek nû tune, hema hema her tiştê ku berê hatî nivîsandin berê li ser Habré bû, mînakî di gotaran de Rêbername: Meriv çawa botan di Telegram de çêdike и Bot Telegram ji bo rêveberê pergalê.
Wekî din, gotar bi qestî zêde ye, da ku her car guh nede wêjeya perwerdehiyê. Di nivîsê de referansên Gang 4, PowerShell Deep Dives an, bêje, 5 Stûnên Çarçoveya Baş-Architected AWS tune.

Di şûna pêşgotinekê de, hûn dikarin bişopînin

Hestên xwe biavêjinDi 2006-an de, Microsoft PowerShell 1.0 ji bo Windows XP, Vista, û Server 2003-ya wê demê derxist. Bi hin awayan, ew li şûna tiştên wekî nivîsarên cmdbat, nivîsarên vb, Windows Script Host û JScript cîh girt.

Heya nuha, PowerShell tenê dikare wekî gava paşîn piştî vebijarkên Logoyê were hesibandin, li şûna ku belkî hîn jî Delphi (an tiştek kevntir) tê bikar anîn, tevî hebûna lûp, çîn, fonksiyon, bangên MS GUI, entegrasyona Git û da ser.

Powershell kêm kêm tê bikar anîn; hûn tenê dikarin di forma PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Veavakirina Dewleta Xwestî de, rûbirû bibin, PowerShell Web Access û bi dehan bername û fonksiyonên kêm kêm têne bikar anîn. Dibe ku ew ê bi berdanê re bayek duyemîn bigire WSL2, lê ne tam e.

Powershell jî sê avantajên mezin hene:

  1. Ew nisbeten hêsan e, di derbarê wê de gelek wêje û nimûne hene, û tewra bi rûsî, mînakî, gotarek li ser Foreach - ji pirtûkê PowerShell bi kûrahî - li ser cudahiya () û {}
  2. Ew bi edîtorê re diçe ISE, bi Windows re tê de ye. Tewra cûreyek debugger jî li wir heye.
  3. Ew hêsan e ku jê re telefon bikin pêkhateyên ji bo avakirina navgînek grafîkî.

0. Amadekirin.

Em ê hewce ne

  • Windows PC (Min Windows 10 heye)
  • Bi kêmanî cûreyek gihîştina Înternetê (mînakek bi rêya NAT)
  • Ji bo kesên ku gihîştina telegramê tixûbdar e - freegate di gerokê de hatî saz kirin û mîheng kirin, di hin rewşên dijwar de, digel Symple DNS Crypt
  • Li ser têlefona we xerîdarek telegramê ya xebatê heye
  • Fêmkirina pir bingehîn - guhêrbar, array, loop çi ye.

Gotar vekirin û xwendin - Rêbername: Meriv çawa botan di Telegram de çêdike и Bot Telegram ji bo rêveberê pergalê

1. Werin em botek ceribandinek din ava bikin.

Ji ber ku her kes jixwe vê yekê dizane, û jixwe qewimiye, hûn jî dikarin jê derbas bibinWekî ku di gotara jor de hate gotin - Berî her tiştî, botek ji bo Telegram - ew hîn jî serîlêdanek e ku li tenişta we dimeşe û daxwazan ji Telegram Bot API re dike. Digel vê yekê, API zelal e - bot bi parameteran digihîje URLek taybetî, û Telegram bi tiştek JSON re bersiv dide.

Pirsgirêkên têkildar: heke hûn bi rengek nenas ji tiştek JSON kodê bistînin û bi rengek ji bo darvekirinê bişînin (ne bi mebest), kod dê ji we re were darve kirin.

Pêvajoya afirandinê di du gotarên li jor de hatî destnîşan kirin, lê ez dubare dikim: di telegramekê de em têkiliyan vedikin, li @botfather digerin, jê re dibêjin /newbot, botek Botfortest12344321 biafirînin, jê re dibêjin Mynext1234bot, û peyamek bi mifteyek bêhempa distînin. form 1234544311: AbcDefNNNNNNNNNNNNNN

Li mifteyê miqate bin û dev jê bernedin!

Dûv re hûn dikarin botê mîheng bikin, mînakî, lê zêdekirina wê li koman qedexe bikin, lê di gavên pêşîn de ev ne hewce ye.

Ka em ji BotFather "/mybot" bipirsin û heke em tiştek jê hez nakin mîhengan biguherînin.

Ka em ji nû ve têkiliyan vekin, li wir @Botfortest12344321 bibînin (pêwîst e ku lêgerîna bi @ dest pê bike), "destpêk" bikirtînin û ji botê binivîsin "/Glory to the robots." Nîşana / pêdivî ye, quotes ne hewce ne.
Bot, bê guman, dê tiştek bersiv neke.

Werin em kontrol bikin ka bot hatiye afirandin û wê vekin.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNN/getMe
li ku derê 1234544311:AbcDefNNNNNNNNNNNNNN mifteya berê wergirtiye,
û rêzek mîna bistînin
{"ok":rast,"encam":{""}}

Yekem hevoka veşartî (nîşan) me heye. Naha pêdivî ye ku em jimareya veşartî ya duyemîn - Nasnameya danûstendinê bi botê re bibînin. Her sohbet, kom, hwd.. kesane ye û jimareya xwe heye (carinan bi minus - ji bo komên vekirî). Ji bo ku em vê hejmarê fêr bibin, pêdivî ye ku em di gerokê de daxwaz bikin (bi rastî, ew di gerokê de qet ne hewce ye, lê ji bo têgihiştinek çêtir hûn dikarin pê dest pê bikin) navnîşana (ku 1234544311: NNNNNNNNNN nîşana we ye

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

û bersivek mîna bistînin

{"ok":true,"encam":[{"update_id":...,... galgalî":{"id":123456789

Pêdiviya me bi chat_id heye.

Werin em kontrol bikin ka em dikarin bi destan li chatê binivîsin: ji geroka navnîşanê telefon bikin

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

Heke hûn di sohbeta xwe de ji botekek peyamek werdigirin, baş e, hûn derbasî qonaxa din dibin.

Bi vî rengî (bi navgîniya gerokê) hûn dikarin her gav kontrol bikin ka di hilberîna girêdanê de pirsgirêk hene, an tiştek li cîhek veşartî ye û naxebite.

Tiştê ku divê hûn zanibin berî ku hûn xwendinê bidomînin

Telegram çend celeb sohbetên komê hene (vekirî, girtî). Ji bo van sohbetan, hin fonksiyonan (mînak, id) cûda ne, ku carinan dibe sedema hin pirsgirêkan.

Ka em bihesibînin ku dawiya sala 2019-an e, û tewra lehengê dema me, Man-Orkestra-ya navdar (rêveber, parêzer, pisporê ewlehiya agahdarî, bernamenûs û di pratîkê de MVP) Evgeniy V. guhêrbar $i ji rêzê vediqetîne. loops master kiriye, binihêre di çend salên pêş de dê Chocolatey master bike, û paşê Pêvajoya paralel bi PowerShell re и ForEach-Object Parallel wê bê.

1. Em difikirin ka bota me dê çi bike

Fikrên min tune bûn, divê ez bifikirim. Min berê jî bot-defterek nivîsand. Min nexwest botek çêkim "ku tiştek dişîne cîhek." Ji bo girêdana bi Azure re hûn hewceyê qerta krediyê ne, lê xwendekar wê ji ku digire? Pêdivî ye ku were zanîn ku her tişt ne ew qas xirab e: ewrên sereke cûreyek ceribandinê belaş didin (lê hûn hîn jî hewceyê jimareyek qerta krediyê ne - û wusa dixuye ku dê dolarek jê were xerc kirin. Nayê bîra min gelo paşê hat vegerandin.)

Bêyî AI ML çêkirina bot-xizan-helbestvan-weaver ne ewqas balkêş e.

Min biryar da ku botekek ku dê peyvên îngilîzî yên ji ferhengê bîne bîra min (an na) çêkim.
Ji bo ku bi databasê re mijûl nebe, ferheng dê di pelek nivîsê de were hilanîn û bi destan were nûve kirin.
Di vê rewşê de, peywir ev e ku bingehên xebatê nîşan bide, û ne ku bi kêmanî hilberek qismî qediyayî çêbike.

2. Yekem car çi û çawa diceribîne

Ka em peldankek C:poshtranslate ava bikin
Pêşîn, ka em bibînin ka çi celeb hêzek me heye, ka em ISE-ê bi navgîniya destpêkê-rêvebirinê ve bidin destpêkirin
powershell ise
an jî di bernameyên sazkirî de Powershell ISE bibînin.
Piştî destpêkirinê, "cûreyek edîtorê" ya naskirî dê vebe; heke qada nivîsê tune be, wê hingê hûn dikarin her gav "Pel - nû biafirînin" bikirtînin.

Ka em li guhertoya powershell binêrin - di qada nivîsê de binivîsin:

get-host 

û F5 bitikîne.

Powershell dê pêşkêşî hilanînê bike - "Skrîpta ku hûn ê bixebitin dê were tomar kirin.", em razî ne, û pelê ji powershell bi navê C: poshtranslate hilînin. myfirstbotBT100.

Piştî destpêkirinê, di pencereya nivîsê ya jêrîn de em tabloyek daneyê digirin:

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

Min tiştek 5.1 heye, bes e. Heke we Windows 7/8 kevn heye, wê hingê tiştek mezin tune - her çend PowerShell pêdivî ye ku ji bo guhertoya 5-ê were nûve kirin - mînak. fermanên.

Di rêzika fermanê ya jêrîn de Get-Date binivîsin, Enter bikirtînin, li wextê binêrin, bi fermanê biçin peldanka root
cd
û bi fermana cls ekranê paqij bikin (na, hûn ne hewce ne ku rm bikar bînin)

Naha em kontrol bikin ka çi û çawa dixebite - bila ne kodê, lê du rêzan binivîsin, û hewl bidin ku fêm bikin ka ew çi dikin. Ka em rêzika bi get-host bi nîşana # şîrove bikin û piçekî lê zêde bikin.

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

(Tiştê balkêş ev e ku di navnîşa dakêşana formatkirina kodê de li ser Habré du deh vebijark hene - lê Powershell ne li wir e. Dos heye. Perl li wir e.)

Werin em kodê bi tikandina F5 an ">" ji GUI-yê bimeşînin.

Em encamên jêrîn bistînin:

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

Niha em li van her du rêzan û çend xalên balkêş binêrin da ku em di paşerojê de li vê yekê venegerin.

Berevajî Pascal (û ne tenê), PowerShell bixwe hewl dide ku diyar bike ka kîjan celeb ji guhêrbarek veqetîne; hûrguliyên bêtir di derbarê vê de di gotarê de têne nivîsandin. Bernameya perwerdehiyê li ser nivîsandina bi zimanên bernamesaziyê
Ji ber vê yekê, bi afirandina guhêrbarek $TimeNow û destnîşankirina wê nirxa tarîx û demjimêra heyî (Get-Date), ne hewce ye ku em zêde xem bikin ka dê çi celeb dane li wir be.

Rast e, ev nezanî dibe ku paşê zirarê bide, lê ew ji bo paşê ye. Li jêr di nivîsê de dê mînakek hebe.
Ka em bibînin ka me çi girt. Ka em bicîh bikin (li ser rêza fermanê)

$TimeNow | Get-member

û rûpelek nivîsa nefêmkirî bistînin

Mînaka nivîsa ku nayê famkirin jimare 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")...                                         

Wek ku hûn dibînin, guherbareke cureyê TypeName: System.DateTime bi komek rêbazan (di wateya ku em dikarin bi vê tiştê guhêrbar re çi bikin) û taybetmendiyan hatiye afirandin.

Em bang bikin $TimeNow.DayOfYear - em hejmara roja salê distînin.
Em bang bikin $TimeNow.DayOfYear | Get-Member - em distînin TypeName: System.Int32 û komek rêbazan.
Em bang bikin $TimeNow.ToUniversalTime() - û wextê di UTC de bistînin

Debugger

Carinan diqewime ku pêdivî ye ku meriv bernameyekê heya rêzek diyar bike û rewşa bernameyê di wê gavê de bibîne. Ji bo vê armancê, ISE fonksiyonek Debug heye - xala veqetandinê biguhezîne
Xalek veqetandinê li deverek navîn deynin, van her du rêzan bimeşînin û bibînin ka şikestin çawa xuya dike.

3. Têgihîştina pêwendiya bi botê Telegram

Bê guman, hîn bêtir edebiyat li ser danûstendina bi botê, bi hemî getpush û hwd re hatî nivîsandin, lê mijara teoriyê dikare vebijarkî were hesibandin.

Di rewşa me de pêwîst e:

  • Fêr bibin ku hûn di nameyan de tiştek bişînin
  • Fêr bibin ku ji hevpeyivînê tiştek bistînin

3.1 Fêrbûna şandina tiştek bi nameyan û wergirtina jê

Kodek piçûk - beşa 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

û li Federasyona Rûsyayê di vê nuqteyê de em xeletiyê distînin Nekare bi servera dûr ve were girêdan.

An jî em wê wernagirin - bi operatorê telekomê ve girêdayî ye û gelo proxy hatî mîheng kirin û kar dike
Welê, ya ku dimîne ev e ku meriv proxy lê zêde bike. Ji kerema xwe bala xwe bidin - karanîna navgînek neşîfrekirî û bi gelemperî xapînok ji bo tenduristiya we zehf xeternak e.

Karê dîtina proxyek xebatkar ne pir dijwar e - piraniya proxeyên http yên hatine weşandin dixebitin. Ez difikirim ku ya pêncemîn ji min re xebitî.

Hevoksaziya ku proxy bikar tîne:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

Ger hûn di danûstendina xwe de bi botek re peyamek bistînin, wê hingê her tişt baş e, hûn dikarin bimeşin. Ger na, debugkirinê bidomînin.

Hûn dikarin bibînin ku rêzika weya $URL4SEND vediguhere çi û biceribînin ku wê di gerokê de daxwaz bikin, mîna vê:

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

3.2. Em fêr bûn ku meriv çawa di chatê de "tiştek" binivîse, naha em hewl bidin ku wê bixwînin

Ka em 4 rêzikên din lê zêde bikin û bibînin ka di hundurê | bibin-endam

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

Tişta herî balkêş ji me re tê pêşkêş kirin

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

Ka em bibînin ka di wan de çi heye:

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

Ger her tişt ji we re dixebite, hûn ê rêzek dirêj bistînin wekî:

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

Xwezî, di gotara berê de hate weşandin Bot Telegram ji bo rêvebirê pergalê ev rêz (erê, li gor $MyMessageGet.RawContent | get-endam System.String e), jixwe hatiye jihevxistin.

4. Tiştê ku hûn distînin pêvajoyê bikin (em jixwe dizanin ku meriv çawa tiştek bişîne)

Wekî ku berê hatî nivîsandin vir, tiştên herî pêwîst di naverokê de ne. Werin em ji nêzîk ve lê binêrin.

Pêşîn, em ê çend bêjeyên din ji botê ji navgîniya malperê an ji têlefonê binivîsin

/message1
/message2
/message3

û bi gerokê li navnîşana ku di guherbara $URLGET de hatî çêkirin binêre.

Em ê tiştek wekî bibînin:

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

Ew çi ye? Hin tiştên tevlihev ji rêzikên tiştan ku di nav wan de nasnameyek peyamê ya dawî-bi-dawî, nasnavê chatê, nasnameya şandinê û gelek agahdariya din hene.

Lêbelê, ne hewce ye ku em fêhm bikin "ev çi celeb e" - beşek ji xebatê berê ji bo me hatîye kirin. Ka em bibînin ka hundurê çi ye:

Xwendina peyamên wergirtî an beşa 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. Niha em gerekê çi bikin?

Ka em pelê encam di bin navê myfirstbotBT105 an ya ku hûn çêtirîn jê hez dikin hilînin, sernavê biguherînin û hemî kodên ku berê hatine nivîsandin bi navgîniya şîrove bikin.

<#start comment 105 end comment 105#>

Naha pêdivî ye ku em biryar bidin ka em ferhengê li ku derê bistînin (baş, li ku - li ser dîskê di pelê de) û ew ê çawa xuya bike.

Bê guman, hûn dikarin ferhengek mezin rast di nivîsa nivîsarê de binivîsin, lê ev bi tevahî ji xalê dûr e.
Ji ber vê yekê em bibînin ka powershell bi çi normal dikare bi kar bike.
Bi gelemperî, ew ne girîng e ku bi kîjan pelê re bixebite, ji me re ne girîng e.
Hilbijartinek me heye: txt (hûn dikarin, lê çima), csv, xml.
Ma em dikarin her kesî temaşe bikin? Werin em her kesî bibînin.
Ka em çînek MyVocabClassExample1 û guhêrbarek $MyVocabExample1 çêbikin
Ez bala xwe didim ku çîn bêyî $ tê nivîsandin

hin 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

Ka em hewl bidin ku vê yekê bi karanîna pelan binivîsin mînak.

Hin 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

- û em di xeta Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2 de xeletiyek distînin.

Ew naxwaze lê zêde bike, ah-ah, çi şerm e.

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

Ka em bibînin ka çi dibe. Dîtina nivîsê ya mezin - lê meriv wê çawa paşde derxîne? Ma divê ez celebek veqetankerên nivîsê, wek kêşan, destnîşan bikim?

Û di dawiyê de hûn pelek "nirxên ji hev veqetandî (CSV) A distînin SOP HINDIKIRIN.
#

$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 

Wekî ku hêsan tê dîtin, MS bi taybetî ji hêla mantiqa xwe ve nayê cûda kirin; ji bo pêvajoyek wusa, di rewşek de -FilePath, di yekî din de -Rêyek tê bikar anîn.

Herweha di dosyaya sêyem de zimanê rûsî wenda bû, di dosyaya çaran de derket... baş e, tiştek qewimî. #TYPE System.Object[] 00
# "Hejmar", "Dirêjî", "Drêjahî", "Rêz", "SyncRoot", "Tenê Xwe Xwendin e", "Pîsaziya IsFixed", "Synchronized"
#
Ka em hinekî ji nû ve binivîsin:

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

Wusa dixuye ku ew alîkarî kiriye, lê ez hîn jî ji formatê hez nakim.

Ez bi taybetî hez nakim ku ez nikaribim rêzikên ji objeyekê rasterast têxim pelê.
Bi awayê, ji ber ku me dest bi nivîsandina pelan kir, gelo em dikarin dest bi girtina têketinek destpêkê bikin? Wextê me wekî guhêrbar heye, em dikarin navê pelê saz bikin.

Rast e, hîn tiştek tune ku meriv binivîsîne, lê hûn dikarin bifikirin ka meriv çawa tomaran bizivirîne çêtirîn.
Ka em niha xml biceribînin.

Hin 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

Hinardekirina xml-ê gelek avantajên xwe hene - xwendin, îxrackirina tevahiyê, û ne hewce ye ku pêvekirinek were kirin.

Let's try pelê xml bixwînin.

Xwendina piçûk ji xml

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

Werin em vegerin ser karê xwe. Me pelek ceribandinê nivîsand, wê bixwînin, formata hilanînê zelal e, heke hewce be, hûn dikarin edîtorek pelê piçûkek veqetandî binivîsin da ku rêzan lê zêde bikin û jêbirin.

Bihêle ez ji we re bi bîr bînim ku peywir çêkirina botek perwerdehiya piçûk bû.

Forma xebatê: Ez fermana "mînak"ê ji botê re dişînim, bot peyveke bi awakî rasthatî û transkrîpsiyona bijartî ji min re dişîne, û piştî 10 çirkeyan werger û şîroveyê ji min re dişîne. Em dizanin ka meriv çawa fermanan dixwîne, em jî dixwazin fêr bibin ka meriv çawa bixweber proxyan hilbijêrin û kontrol bikin, û jimarvanên peyaman ji bîrkirinê vegerînin.

Werin em her tiştê ku berê wekî nepêwîst hatî şîrove kirin şîrove bikin, mînakên naha nehewce bi txt û csv şîrove bikin, û pelê wekî guhertoya B106 hilînin.

Oh yes. Ka em dîsa tiştek ji botê re bişînin.

6. Dispatch ji fonksiyonên û zêdetir

Berî ku hûn pêvajoyek pêşwaziyê bikin, hûn hewce ne ku fonksiyonek ji bo şandina "kêmtir tiştek" ji bilî peyamek ceribandinê biafirînin.

Bê guman, di nimûneyê de em ê tenê yek şandin û tenê yek pêvajoyê hebin, lê heke hewce bike ku em çend caran heman tiştî bikin?

Nivîsandina fonksiyonek hêsantir e. Ji ber vê yekê, guhêrbarek me ya cureyê objeya $MyVocabExample4AsArray heye, ku ji pelê tê xwendin, di forma rêzek bi qasî du hêmanan de ye.
Ka em biçin bixwînin.

Di heman demê de, em ê bi demjimêrê re mijûl bibin; em ê paşê hewce bikin (bi rastî, di vê nimûneyê de em ê hewce nebin :)

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

Wekî ku hûn dikarin bi hêsanî bibînin, fonksiyonê gazî $MyToken û $MyChatID dike, ku berê hişk-kodkirî bûn.

Ne hewce ye ku hûn vê yekê bikin, û heke $MyToken ji bo her botê yek be, wê hingê dê $MyChatID li gorî chatê biguhere.

Lêbelê, ji ber ku ev mînakek e, em ê ji bo nuha paşguh bikin.

Ji ber ku $MyVocabExample4AsArray ne rêzek e, her çend ew pir dişibihe yekî, wê demê hûn nikarin tenê bigirin dirêjiya wê bixwaze.

Careke din em ê neçar bimînin ku tiştek ku nayê kirin bikin - paraşût ne li gorî kodê - bigirin û bijmêrin

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

Bêpayîn taybetmendiya balkêş. Em bibêjin ku em dixwazin 0 an 1-ê bistînin (di rêzê de tenê du hêman hene). Dema ku sînorên 0..1 danîn, em ê "1" bistînin?
na - em ê jê negirin, me mînakek taybetî heye Mînak 2: Di navbera 0 û 99-an de jimareyek bêserûber bistînin Get-Random - Herî zêde 100
Ji ber vê yekê, ji bo 0..1 em hewce ne ku mezinahiya 0..2, bi hêjmara elementa herî zêde = 1 saz bikin.

7. Pêvajoya peyamên hatinî û dirêjahiya dorê ya herî zêde

Em berê li ku rawestiyan? me guherbara wergirtî $MyMessageGet heye
û $Content4Pars01 jê wergirtiye, ya ku em bi hêmanên rêzika Content4Pars01.result re eleqedar in

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

Ka em botê /message10, /message11, /message12, /word û dîsa /peyv û /hello bişînin.
Ka em bibînin ka me çi girt:

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

Werin em her tiştê hatî wergirtin bişopînin û heke peyam /peyv bû bersivek bişînin
doza çêkirinê, ya ku hin wekî if-elseif binav dikin, di powershell de tê gotin bi rêya switch. Di heman demê de, koda jêrîn mifteya -wildcard bikar tîne, ku bi tevahî nepêwist û tewra zirardar e.

Hin kod #7.1

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

Ka em senaryoya çend caran bimeşînin. Em ê ji bo her hewildana darvekirinê du caran heman peyvê bistînin, nemaze heke me di pêkanîna random de xeletiyek kir.

Lê raweste. Me dîsa /peyv neşand, ji ber vê yekê çima peyam dîsa tê pêvajo kirin?

Rêza şandina peyaman ji botê re dirêjiyek bêdawî heye (100 an 200 peyam, ez difikirim) û divê bi destan were paqij kirin.

Ev bê guman di belgeyê de tête diyar kirin, lê divê hûn wê bixwînin!

Di vê rewşê de, pêdivîya me bi parametreya ?chat_id heye, û &timeout, &limit, &parse_mode=HTML û &disable_web_page_preview=true hêj ne hewce ne.

Belge ji bo telegram api li vir e
Bi spî û îngilîzî dibêje:
Nasnameya nûvekirina yekem a ku were vegerandin. Divê di nav nasnameyên nûvekirinên berê hatine wergirtin de yek ji ya herî bilindtir be. Bi xwerû, nûvekirin bi ya herî zû dest pê dikin
nehatine piştrast kirin nûvekirin têne vegerandin. Gava ku getUpdates bi an re tê gotin nûvekirinek pejirandî tête hesibandin serketinê mezintir ji wê update_id. Ji nûvekirina -offset-ê ji dawiya rêza nûvekirinan dest pê dike, guheztina neyînî dikare were destnîşan kirin. Hemî nûvekirinên berê dê bêne ji bîr kirin.

Ka em lê binêrin:

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

Erê, û em ê wê ji nû ve saz bikin û fonksiyonê hinekî ji nû ve binivîsin. Du vebijarkên me hene - tevahiya peyamê ji fonksiyonê re derbas bikin û wê bi tevahî di fonksiyonê de bişopînin, an tenê nasnameya peyamê bidin û wê ji nû ve bikin. Mînakî, ya duyemîn hêsantir xuya dike.

Berê, rêzika pirsê ya me "hemû peyam" dixuya

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

û ew ê wusa xuya bike

$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 

Kes ne qedexe dike ku hûn pêşî hemî peyaman bistînin, wan bişopînin, û tenê piştî ku daxwaznameya pêvajoyek serketî nayê pejirandin -> pejirandin.

Çima maqûl e ku meriv piştî ku hemî pêvajoyê qediya gazî pejirandinê bike? Di nîvê darvekirinê de têkçûnek mimkun e, û heke ji bo mînakek chatbotek belaş, wendakirina yek peyamek ne tiştek taybetî ye, wê hingê heke hûn meaş an danûstendina qerta yekî bişopînin, dibe ku encam xirabtir be.

Çend xetên din ên kodê

$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. Li şûna encamekê

Fonksiyonên bingehîn - xwendina peyaman, vesazkirina rêzê, xwendina ji pelê û nivîsandina pelê têne kirin û xuyang kirin.

Tenê çar tişt mane ku bikin:

  • şandina bersiva rast ji daxwazek di chatê de
  • şandina bersivek ji bo HER sohbeta ku bot lê zêde bû
  • pêkanîna kodê di xelekekê de
  • destpêkirina botek ji plansazkera windows.

Hemî van peywiran hêsan in û bi xwendina belgeyên li ser pîvanên wekî mînak bi hêsanî têne kirin
Set-ExecutionPolicy Bêsînor û -ExecutionPolicy Bypass
çerxa formê

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

Spas ji bo her kesê ku xwendin.

Source: www.habr.com

Add a comment