Templed ar gyfer bot telegram syml ar gyfer plant ysgol mewn graddau 7-9 gan ddefnyddio Powershell

Yn ystod sgyrsiau gyda ffrind, dysgais yn sydyn nad yw plant mewn graddau 8-10 yn eu hysgol yn cael eu haddysgu i raglennu o gwbl. Word, Excel a phopeth. Dim logo, dim hyd yn oed Pascal, dim hyd yn oed VBA ar gyfer Excel.

Cefais fy synnu'n fawr, agorais y Rhyngrwyd a dechreuais ddarllen -
Un o dasgau ysgol arbenigol yw hyrwyddo addysg cenhedlaeth newydd sy'n cwrdd ag amodau'r gymdeithas wybodaeth yn ei lefel o ddatblygiad a ffordd o fyw.
Bydd y cwrs hwn yn caniatáu i fyfyrwyr atgyfnerthu eu gwybodaeth am luniadau sylfaenol iaith raglennu Pascal yn ymarferol. (o raglen rhywfaint o gampfa ar gyfer 2017)

Yn y diwedd, penderfynais dreulio ychydig oriau a braslunio enghraifft o “sut i greu bot syml i blant ysgol.”

O dan y toriad mae sut i ysgrifennu bot syml arall yn Powershell a gwneud iddo weithio heb wehook, IPs gwyn, gweinyddwyr pwrpasol, peiriannau rhithwir wedi'u lleoli yn y cwmwl, ac yn y blaen - ar gyfrifiadur personol cartref rheolaidd gyda Windows rheolaidd.

TLDR: Erthygl ddiflas arall gyda gwallau gramadegol a ffeithiol, dim byd i'w ddarllen, dim hiwmor, dim lluniau.

Nid oes dim byd newydd yn yr erthygl, mae bron popeth a ysgrifennwyd o'r blaen eisoes wedi bod ar Habré, er enghraifft mewn erthyglau Cyfarwyddiadau: Sut i greu bots yn Telegram и Telegram bot ar gyfer gweinyddwr system.
Ar ben hynny, mae'r erthygl yn ddiangen yn fwriadol er mwyn peidio â chyfeirio at lenyddiaeth addysgol bob tro. Nid oes unrhyw gyfeiriadau at Gang 4, PowerShell Deep Dives nac, dyweder, 5 Piler Fframwaith wedi'i Bensaernïo'n Dda AWS yn y testun.

Yn lle rhagair, gallwch sgipio

Mae croeso i chi hepgorYn 2006, rhyddhaodd Microsoft PowerShell 1.0 ar gyfer y Windows XP, Vista, a Server 2003 ar y pryd. Mewn rhai ffyrdd, fe ddisodlodd pethau fel sgriptiau cmdbat, sgriptiau vb, Windows Script Host a JScript.

Hyd yn oed nawr, dim ond ar ôl yr opsiynau Logo y gellir ystyried PowerShell fel y cam nesaf, yn lle'r Delphi a ddefnyddir yn ôl pob tebyg (neu rywbeth hŷn), er gwaethaf presenoldeb dolenni, dosbarthiadau, swyddogaethau, galwadau MS GUI, Integreiddio git ac yn y blaen.

Yn gymharol anaml y defnyddir Powershell; dim ond ar ffurf PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Cyfluniad y Wladwriaeth Ddymunol y gallwch ddod ar ei draws, Mynediad Gwe PowerShell a dwsin neu fwy o raglenni a swyddogaethau nas defnyddir yn aml. Efallai y caiff ail wynt gyda'r rhyddhad WSL2, ond nid yw'n union.

Mae gan Powershell hefyd dair mantais fawr:

  1. Mae'n gymharol syml, mae yna lawer o lenyddiaeth ac enghreifftiau amdano, a hyd yn oed yn Rwsieg, er enghraifft, erthygl am Foreach - o'r llyfr PowerShell mewn dyfnder - am y gwahaniaeth () a {}
  2. Mae'n mynd gyda'r golygydd ISE, wedi'i gynnwys gyda Windows. Mae hyd yn oed rhyw fath o ddadfygiwr yno.
  3. Mae'n hawdd galw ohono cydrannau ar gyfer adeiladu rhyngwyneb graffigol.

0. Paratoi.

Bydd arnom angen:

  • Windows PC (mae gen i Windows 10)
  • O leiaf rhyw fath o fynediad i'r Rhyngrwyd (trwy NAT er enghraifft)
  • Ar gyfer y rhai sydd â mynediad cyfyngedig i telegram - gosod a ffurfweddu freegate yn y porwr, mewn rhai achosion anodd, ynghyd â Symple DNS Crypt
  • Cael cleient telegram sy'n gweithio ar eich ffôn
  • Deall y pethau sylfaenol iawn - beth yw newidyn, arae, dolen.

Wedi agor a darllen erthyglau - Cyfarwyddiadau: Sut i greu bots yn Telegram и Telegram bot ar gyfer gweinyddwr system

1. Gadewch i ni greu bot prawf arall.

Gan fod pawb eisoes yn gwybod hyn, ac eisoes wedi digwydd, gallwch chi hefyd ei hepgorFel y nodwyd yn yr erthygl uchod - Yn gyntaf oll, bot ar gyfer Telegram - mae'n dal i fod yn gymhwysiad sy'n rhedeg ar eich ochr chi ac yn gwneud ceisiadau i'r Telegram Bot API. Ar ben hynny, mae'r API yn glir - mae'r bot yn cyrchu URL penodol gyda pharamedrau, ac mae Telegram yn ymateb gyda gwrthrych JSON.

Problemau cysylltiedig: os byddwch mewn rhyw ffordd anhysbys yn cymryd rhywfaint o god o wrthrych JSON ac yn ei anfon rywsut i'w weithredu (nid yn bwrpasol), bydd y cod yn cael ei weithredu ar eich rhan.

Disgrifir y broses greu mewn dwy erthygl uchod, ond ailadroddaf: mewn telegram rydym yn agor cysylltiadau, yn chwilio am @botfather, yn dweud wrtho / newbot, yn creu bot Botfortest12344321, yn ei alw Mynext1234bot, ac yn derbyn neges gydag allwedd unigryw o'r ffurflen 1234544311:AbcDefNNNNNNNNNNNNNN

Cymerwch ofal o'r allwedd a pheidiwch â'i roi i ffwrdd!

Yna gallwch chi ffurfweddu'r bot, er enghraifft, gwahardd ei ychwanegu at grwpiau, ond yn y camau cyntaf nid yw hyn yn angenrheidiol.

Gadewch i ni ofyn i BotFather am “/ mybot” ac addasu'r gosodiadau os nad ydyn ni'n hoffi rhywbeth.

Gadewch i ni agor y cysylltiadau eto, dewch o hyd i @Botfortest12344321 yno (mae'n orfodol cychwyn y chwiliad gyda @), cliciwch "cychwyn" ac ysgrifennwch at y bot "/Glory to the robots." Mae angen yr arwydd /, nid oes angen dyfynbrisiau.
Ni fydd y bot, wrth gwrs, yn ateb unrhyw beth.

Gadewch i ni wirio bod y bot wedi'i greu a'i agor.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNNNN/getMe
lle 1234544311:AbcDefNNNNNNNNNNNNNN yw'r allwedd a dderbyniwyd yn flaenorol,
a chael llinyn fel
{ "iawn":true, "canlyniad":{"" }}

Mae gennym yr ymadrodd cyfrinachol cyntaf (tocyn). Nawr mae angen i ni ddarganfod yr ail rif cyfrinachol - ID y sgwrs gyda'r bot. Mae pob sgwrs, grŵp, ac ati yn unigol ac mae ganddo ei rif ei hun (weithiau gyda minws - ar gyfer grwpiau agored). Er mwyn darganfod y rhif hwn, mae angen i ni ofyn yn y porwr (yn wir, nid yw'n angenrheidiol o gwbl yn y porwr, ond i gael gwell dealltwriaeth gallwch ddechrau ag ef) y cyfeiriad (lle 1234544311:NNNNNNNNNN yw eich tocyn

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

a chael ymateb fel

{ "iawn": gwir, "canlyniad":[{ "update_id":...,... sgwrsio" :{ " id ":123456789

Mae angen chat_id.

Gadewch i ni wirio y gallwn ysgrifennu at y sgwrs â llaw: ffoniwch y cyfeiriad o'r porwr

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

Os ydych chi'n derbyn neges gan bot yn eich sgwrs, iawn, rydych chi'n symud ymlaen i'r cam nesaf.

Fel hyn (trwy'r porwr) gallwch chi bob amser wirio a oes problemau gyda'r genhedlaeth cyswllt, neu a yw rhywbeth wedi'i guddio yn rhywle ac nad yw'n gweithio.

Beth sydd angen i chi ei wybod cyn parhau i ddarllen

Mae gan Telegram sawl math o sgyrsiau grŵp (agored, caeedig). Ar gyfer y sgyrsiau hyn, mae rhai o'r swyddogaethau (er enghraifft, id) yn wahanol, sydd weithiau'n achosi rhai problemau.

Gadewch i ni dybio mai hi yw diwedd 2019, a hyd yn oed arwr ein hoes, y Dyn-Gerddorfa adnabyddus (gweinyddwr, cyfreithiwr, arbenigwr diogelwch gwybodaeth, rhaglennydd ac yn ymarferol MVP) Evgeniy V. yn gwahaniaethu rhwng y newidyn $i ac arae, wedi meistroli dolenni, yn edrych yn y cwpl o flynyddoedd nesaf bydd meistroli Chocolatey, ac yna Prosesu cyfochrog â PowerShell и ForEach-Gwrthrych Parallel fe ddaw.

1. Meddyliwn beth a wna ein bot

Doedd gen i ddim syniadau, roedd yn rhaid i mi feddwl. Rwyf eisoes wedi ysgrifennu llyfr nodiadau bot. Doeddwn i ddim eisiau gwneud bot “sy’n anfon rhywbeth i rywle.” I gysylltu ag Azure mae angen cerdyn credyd arnoch chi, ond o ble mae'r myfyriwr yn ei gael? Dylid nodi nad yw popeth mor ddrwg: mae'r prif gymylau yn rhoi rhyw fath o gyfnod prawf am ddim (ond mae angen rhif cerdyn credyd arnoch o hyd - ac mae'n ymddangos y bydd doler yn cael ei ddebydu ohono. Nid wyf yn cofio os fe'i dychwelwyd yn ddiweddarach.)

Heb AI ML dyw hi ddim mor ddiddorol gwneud bot-poeth-poet-weaver.

Penderfynais wneud bot a fydd yn fy atgoffa (neu nid fi) o eiriau Saesneg o'r geiriadur.
Er mwyn osgoi chwarae rhan yn y gronfa ddata, bydd y geiriadur yn cael ei storio mewn ffeil testun a'i ddiweddaru â llaw.
Yn yr achos hwn, y dasg yw dangos hanfodion y gwaith, ac nid i wneud o leiaf cynnyrch gorffenedig yn rhannol.

2. Ceisio beth a sut am y tro cyntaf

Gadewch i ni greu ffolder C:poshtranslate
Yn gyntaf, gadewch i ni weld pa fath o blisgyn pwerau sydd gennym, gadewch i ni lansio ISE trwy gychwyn
powershell ise
neu ddod o hyd i Powershell ISE mewn rhaglenni gosod.
Ar ôl ei lansio, bydd y “rhyw fath o olygydd” cyfarwydd arferol yn agor; os nad oes maes testun, yna gallwch chi bob amser glicio “File - create new”.

Edrychwn ar y fersiwn o powershell - ysgrifennwch yn y maes testun:

get-host 

a gwasgwch F5.

Bydd Powershell yn cynnig arbed - “Bydd y sgript rydych ar fin ei rhedeg yn cael ei chadw.”, rydym yn cytuno, ac yn cadw'r ffeil o powershell gyda'r enw yn C: poshtranslate myfirstbotBT100.

Ar ôl ei lansio, yn y ffenestr testun isaf rydym yn cael tabl data:

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

Mae gen i 5.1 rhywbeth, dyna ddigon. Os oes gennych chi hen Windows 7/8 yna dim bargen fawr - er bydd angen diweddaru PowerShell i fersiwn 5 - e.e. cyfarwyddiadau.

Teipiwch Get-Date yn y llinell orchymyn isod, pwyswch Enter, edrychwch ar yr amser, ewch i'r ffolder gwraidd gyda'r gorchymyn
cd
a chlirio'r sgrin gyda'r gorchymyn cls (na, nid oes angen i chi ddefnyddio rm)

Nawr, gadewch i ni wirio beth sy'n gweithio a sut - gadewch i ni ysgrifennu nid hyd yn oed y cod, ond dwy linell, a cheisio deall yr hyn y maent yn ei wneud. Gadewch i ni wneud sylwadau ar y llinell gyda get-host gyda'r symbol # ac ychwanegu ychydig.

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

(Yr hyn sy'n ddiddorol yw bod dau ddwsin o opsiynau yn y gwymplen fformatio cod ar Habré - ond nid yw Powershell yno. Mae Dos yno. Mae Perl yno.)

A gadewch i ni redeg y cod trwy wasgu F5 neu ">" o'r GUI.

Rydym yn cael yr allbwn canlynol:

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

Nawr, gadewch i ni edrych ar y ddwy linell hyn a rhai pwyntiau diddorol fel na fyddwn yn dychwelyd at hyn yn y dyfodol.

Yn wahanol i Pascal (ac nid yn unig), mae PowerShell ei hun yn ceisio penderfynu pa fath i'w aseinio i newidyn; mae mwy o fanylion am hyn wedi'u hysgrifennu yn yr erthygl Rhaglen addysgol ar deipio mewn ieithoedd rhaglennu
Felly, trwy greu newidyn $TimeNow a phennu gwerth y dyddiad a'r amser cyfredol (Get-Date) iddo, nid oes rhaid i ni boeni gormod am ba fath o ddata fydd yno.

Yn wir, efallai y bydd yr anwybodaeth hwn yn brifo yn ddiweddarach, ond mae hynny ar gyfer hwyrach. Isod yn y testun bydd enghraifft.
Gawn ni weld beth gawson ni. Gadewch i ni weithredu (ar y llinell orchymyn)

$TimeNow | Get-member

a chael tudalen o destun annealladwy

Enghraifft o destun annealladwy rhif 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")...                                         

Fel y gwelwch, mae newidyn o fath TypeName: System.DateTime wedi'i greu gyda chriw o ddulliau (yn yr ystyr o'r hyn y gallwn ei wneud gyda'r gwrthrych newidyn hwn) ac eiddo.

Gadewch i ni alw $TimeNow.DayOfYear — cawn rif y dydd o'r flwyddyn.
Gadewch i ni alw $TimeNow.DayOfYear | Get-Member — cawn TypeName: System.Int32 a grŵp o ddulliau.
Gadewch i ni alw $TimeNow.ToUniversalTime() - a chael yr amser yn UTC

Dadfygiwr

Weithiau mae'n digwydd bod angen gweithredu rhaglen hyd at linell benodol a gweld cyflwr y rhaglen ar y foment honno. At y diben hwn, mae gan ISE swyddogaeth Debug - togl pwynt torri
Rhowch dorbwynt rhywle yn y canol, rhedwch y ddwy linell hyn a gweld sut olwg sydd ar y toriad.

3. Deall y rhyngweithio gyda'r Telegram bot

Wrth gwrs, mae hyd yn oed mwy o lenyddiaeth wedi'i ysgrifennu ar ryngweithio â'r bot, gyda phob getpush ac yn y blaen, ond gellir ystyried mater theori yn ddewisol.

Yn ein hachos ni mae angen:

  • Dysgwch i anfon rhywbeth mewn gohebiaeth
  • Dysgwch sut i gael rhywbeth o ohebiaeth

3.1 Dysgu anfon rhywbeth mewn gohebiaeth a derbyn ohono

Ychydig o god - rhan 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

ac yn Ffederasiwn Rwsia ar y pwynt hwn rydym yn cael y gwall Methu cysylltu â'r gweinydd pell.

Neu nid ydym yn ei dderbyn - yn dibynnu ar y gweithredwr telathrebu ac a yw'r dirprwy wedi'i ffurfweddu ac yn gweithio
Wel, y cyfan sydd ar ôl yw ychwanegu dirprwy. Sylwch fod defnyddio dirprwy heb ei amgryptio ac yn gyffredinol yn dwyllodrus yn hynod beryglus i'ch iechyd.

Nid yw'r dasg o ddod o hyd i ddirprwy sy'n gweithio yn anodd iawn - mae'r rhan fwyaf o'r procsis http cyhoeddedig yn gweithio. Rwy'n meddwl bod y pumed un wedi gweithio i mi.

Cystrawen gan ddefnyddio dirprwy:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

Os ydych chi'n derbyn neges yn eich sgwrs gyda bot, yna mae popeth yn iawn, gallwch chi symud ymlaen. Os na, parhewch i ddadfygio.

Gallwch weld beth mae eich llinyn $URL4SEND yn troi iddo a cheisiwch ofyn amdano yn y porwr, fel hyn:

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

3.2. Fe wnaethon ni ddysgu sut i ysgrifennu “rhywbeth” mewn sgwrs, nawr gadewch i ni geisio ei ddarllen

Gadewch i ni ychwanegu 4 llinell arall a gweld beth sydd y tu mewn trwy | cael-aelod

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

Mae'r peth mwyaf diddorol yn cael ei ddarparu i ni

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

Gawn ni weld beth sydd ynddynt:

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

Os yw popeth yn gweithio i chi, fe gewch linell hir fel:

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

Yn ffodus, yn yr erthygl a gyhoeddwyd yn flaenorol Telegram bot ar gyfer gweinyddwr system y llinell hon (ie, yn ôl $MyMessageGet.RawContent | get-member yw System.String), eisoes wedi'i ddadosod.

4. Prosesu'r hyn a dderbyniwch (rydym eisoes yn gwybod sut i anfon rhywbeth)

Fel yr ysgrifenwyd eisoes yma, mae y pethau mwyaf angenrheidiol yn gorwedd mewn cynnwys. Gadewch i ni edrych yn agosach arno.

Yn gyntaf, byddwn yn ysgrifennu cwpl mwy o ymadroddion i'r bot o'r rhyngwyneb gwe neu o'r ffôn

/message1
/message2
/message3

ac edrychwch drwy'r porwr i'r cyfeiriad a ffurfiwyd yn y newidyn $URLGET.

Byddwn yn gweld rhywbeth fel:

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

Beth yw e? Rhywfaint cymhleth o araeau o wrthrychau sy'n cynnwys dynodwr neges o'r dechrau i'r diwedd, dynodwr sgwrsio, dynodwr anfon a llawer o wybodaeth arall.

Fodd bynnag, nid oes angen i ni ddarganfod “pa fath o wrthrych yw hwn” - mae rhan o’r gwaith eisoes wedi’i wneud i ni. Gawn ni weld beth sydd y tu mewn:

Darllen negeseuon a dderbyniwyd neu ran 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. Beth ddylem ni ei wneud amdano nawr?

Gadewch i ni gadw'r ffeil canlyniadol o dan yr enw myfirstbotBT105 neu beth bynnag yr hoffech chi orau, newidiwch y teitl a rhowch sylwadau ar yr holl god a ysgrifennwyd eisoes trwy

<#start comment 105 end comment 105#>

Nawr mae angen i ni benderfynu ble i gael y geiriadur (wel, ble - ar ddisg mewn ffeil) a sut olwg fydd arno.

Wrth gwrs, gallwch chi ysgrifennu geiriadur enfawr yn union yn nhestun y sgript, ond mae hyn wrth ymyl y pwynt yn llwyr.
Felly, gadewch i ni weld â pha powershell y gall weithio fel arfer.
Yn gyffredinol, nid oes ots ganddo pa ffeil i weithio gyda hi, nid yw o bwys i ni.
Mae gennym ni ddewis: txt (gallwch chi, ond pam), csv, xml.
Gawn ni wylio pawb?Gadewch i ni weld pawb.
Gadewch i ni greu MyVocabClassExample1 dosbarth a newidyn $MyVocabExample1
Sylwaf fod y dosbarth wedi ei ysgrifenu heb $

rhyw god #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

Gadewch i ni geisio ysgrifennu hwn i mewn i ffeiliau gan ddefnyddio sampl.

Rhywfaint o god #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

- ac rydym yn cael gwall ar y llinell All-Ffeil -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2.

Nid yw am ychwanegu, ah-ah, dyna drueni.

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

Gawn ni weld beth sy'n digwydd. Golygfa testun gwych - ond sut i'w allforio yn ôl? A ddylwn i gyflwyno rhyw fath o wahanwyr testun, fel atalnodau?

Ac yn y diwedd byddwch yn cael “ffeil gwerthoedd wedi'u gwahanu gan goma (CSV) A AROS AROS.
#

$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 

Fel sy'n hawdd i'w weld, nid yw MS yn cael ei wahaniaethu'n arbennig gan ei resymeg; ar gyfer gweithdrefn debyg, mewn un achos defnyddir -FilePath, mewn un arall -Llwybr.

Yn ogystal, yn y drydedd ffeil diflannodd yr iaith Rwsieg, yn y bedwaredd ffeil mae'n troi allan ... wel, digwyddodd rhywbeth. #TYPE System.Object[] 00
# “Cyfrif”, “Hyd”, “HydHyd”, “Ranc”, “SyncRoot”, “IsReadOnly”, “IsFixedSize”,”IsSynchronized”
#
Gadewch i ni ei ailysgrifennu ychydig:

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

Mae'n ymddangos ei fod wedi helpu, ond dydw i ddim yn hoffi'r fformat o hyd.

Nid wyf yn arbennig yn hoffi hynny ni allaf roi llinellau o wrthrych i mewn i ffeil yn uniongyrchol.
Gyda llaw, ers i ni ddechrau ysgrifennu at ffeiliau, a allwn ni ddechrau cadw log cychwyn? Mae gennym amser fel newidyn, gallwn osod enw'r ffeil.

Yn wir, nid oes dim i'w ysgrifennu eto, ond gallwch chi feddwl am y ffordd orau o gylchdroi'r logiau.
Gadewch i ni geisio xml am y tro.

Rhai 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

Mae gan allforio i xml lawer o fanteision - darllenadwyedd, allforio'r gwrthrych cyfan, a dim angen perfformio uppend.

Gadewch i ni geisio darllen ffeil xml.

Darlleniad bach o xml

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

Gadewch i ni ddychwelyd at y dasg. Fe wnaethon ni ysgrifennu ffeil brawf, ei ddarllen, mae'r fformat storio yn glir, os oes angen, gallwch chi ysgrifennu golygydd ffeiliau bach ar wahân i ychwanegu a dileu llinellau.

Gadewch imi eich atgoffa mai'r dasg oedd gwneud bot hyfforddi bach.

Fformat gwaith: Rwy'n anfon y gorchymyn “enghraifft” i'r bot, mae'r bot yn anfon gair a thrawsgrifiad a ddewiswyd ar hap ataf, ac ar ôl 10 eiliad yn anfon cyfieithiad a sylw ataf. Rydyn ni'n gwybod sut i ddarllen gorchmynion, hoffem hefyd ddysgu sut i ddewis a gwirio dirprwyon yn awtomatig, ac ailosod cownteri neges i ebargofiant.

Gadewch i ni nodi bod popeth y dywedwyd yn flaenorol yn ddiangen, gwnewch sylwadau ar yr enghreifftiau sydd bellach yn ddiangen gyda txt a csv, a chadw'r ffeil fel fersiwn B106

O ie. Gadewch i ni anfon rhywbeth at y bot eto.

6. Anfon o swyddogaethau a mwy

Cyn prosesu'r dderbynfa, mae angen i chi greu swyddogaeth ar gyfer anfon "o leiaf rhywbeth" heblaw neges prawf.

Wrth gwrs, yn yr enghraifft dim ond un anfon a fydd gennym a dim ond un prosesu, ond beth os bydd angen inni wneud yr un peth sawl gwaith?

Mae'n haws ysgrifennu swyddogaeth. Felly, mae gennym newidyn o wrthrych math $MyVocabExample4AsArray, wedi'i ddarllen o'r ffeil, ar ffurf amrywiaeth o gymaint â dwy elfen.
Gadewch i ni fynd i ddarllen.

Ar yr un pryd, byddwn yn delio â'r cloc; bydd ei angen arnom yn nes ymlaen (yn wir, yn yr enghraifft hon ni fydd ei angen arnom :)

Rhywfaint o god #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
}

Fel y gallwch weld yn hawdd, mae'r swyddogaeth yn galw $MyToken a $MyChatID, a gafodd eu codio'n galed yn gynharach.

Nid oes angen gwneud hyn, ac os yw $MyToken yn un ar gyfer pob bot, yna bydd $ MyChatID yn newid yn dibynnu ar y sgwrs.

Fodd bynnag, gan fod hon yn enghraifft, byddwn yn ei hanwybyddu am y tro.

Gan nad yw $MyVocabExample4AsArray yn arae, er ei fod yn debyg iawn i un, felly ni allwch ei gymryd yn unig gofyn ei hyd.

Unwaith eto bydd yn rhaid i ni wneud rhywbeth na ellir ei wneud - parasiwt nid yn ôl y cod - ei gymryd a'i gyfri

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

ar hap nodwedd ddiddorol. Gadewch i ni ddweud ein bod am dderbyn 0 neu 1 (dim ond dwy elfen sydd gennym yn yr arae). Wrth osod ffiniau 0..1, a gawn ni “1”?
na - ni fyddwn yn ei gael, mae gennym enghraifft arbennig Enghraifft 2: Cael cyfanrif ar hap rhwng 0 a 99 Cael ar Hap - Uchafswm 100
Felly, ar gyfer 0..1 mae angen i ni osod y maint 0..2, gyda'r rhif elfen uchaf = 1.

7. Prosesu negeseuon sy'n dod i mewn ac uchafswm hyd y ciw

Ble wnaethon ni stopio yn gynharach? mae gennym y newidyn a dderbyniwyd $MyMessageGet
a $Content4Pars01 a gafwyd ganddo, y mae gennym ddiddordeb yn yr elfennau o'r gyfres o ganlyniadau Content4Pars01.

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

Gadewch i ni anfon y bot /message10, /message11, /message12, /word ac eto /word and /hello.
Gawn ni weld beth gawson ni:

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

Gadewch i ni fynd trwy bopeth a dderbyniwyd ac anfon ymateb os oedd y neges yn /word
gelwir yr achos o adeiladu, yr hyn y mae rhai yn ei ddisgrifio fel if-elseif, yn powershell trwy switsh. Ar yr un pryd, mae'r cod isod yn defnyddio'r allwedd -wildcard, sy'n gwbl ddiangen a hyd yn oed yn niweidiol.

Rhywfaint o god #7.1

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

Gadewch i ni redeg y sgript cwpl o weithiau. Byddwn yn cael yr un gair ddwywaith am bob ymgais i ddienyddio, yn enwedig os gwnaethom gamgymeriad wrth weithredu hap.

Ond stopiwch. Wnaethon ni ddim anfon / gair eto, felly pam mae'r neges yn cael ei phrosesu eto?

Mae hyd cyfyngedig i'r ciw ar gyfer anfon negeseuon i'r bot (100 neu 200 neges, dwi'n meddwl) a rhaid ei glirio â llaw.

Disgrifir hyn wrth gwrs yn y ddogfennaeth, ond mae'n rhaid i chi ei ddarllen!

Yn yr achos hwn, mae angen y paramedr ?chat_id, ac nid oes angen &timeout, &limit, &parse_mode=HTML a &disable_web_page_preview=gwir eto.

Dogfennaeth ar gyfer telegram api sydd yma
Mae'n dweud mewn gwyn a Saesneg:
Dynodydd y diweddariad cyntaf i'w ddychwelyd. Rhaid iddo fod yn fwy o un na'r uchaf ymhlith dynodwyr diweddariadau a dderbyniwyd yn flaenorol. Yn ddiofyn, diweddariadau gan ddechrau gyda'r cynharaf
heb ei gadarnhau diweddariad yn cael eu dychwelyd. Ystyrir bod diweddariad wedi'i gadarnhau cyn gynted ag y gelwir getUpdates gyda gwrthbwyso uwch na'i update_id. Gellir pennu'r gwrthbwyso negyddol i adalw diweddariadau sy'n dechrau o -offset update o ddiwedd y ciw diweddariadau. Bydd pob diweddariad blaenorol yn cael ei anghofio.

Edrychwn ar:

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

Ydym, a byddwn yn ei ailosod ac yn ailysgrifennu'r swyddogaeth ychydig. Mae gennym ddau opsiwn - trosglwyddwch y neges gyfan i'r swyddogaeth a'i phrosesu'n gyfan gwbl yn y swyddogaeth, neu rhowch ID y neges yn unig a'i ailosod. Er enghraifft, mae'r ail yn edrych yn symlach.

Yn flaenorol, roedd ein llinyn ymholiad “pob neges” yn edrych fel

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

a bydd yn edrych fel

$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 

Nid oes neb yn eich gwahardd rhag derbyn pob neges yn gyntaf, eu prosesu, a dim ond ar ôl cais prosesu llwyddiannus heb ei gadarnhau -> wedi'i gadarnhau.

Pam mae'n gwneud synnwyr i alw cadarnhad ar ôl i'r holl brosesu ddod i ben? Mae methiant yn bosibl yng nghanol y gweithredu, ac os er enghraifft chatbot rhad ac am ddim, nid yw colli un neges yn ddim byd arbennig, yna os ydych chi'n prosesu cyflog neu drafodiad cerdyn rhywun, gall y canlyniad fod yn waeth.

Cwpl arall o linellau o god

$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. Yn lle casgliad

Swyddogaethau sylfaenol - darllen negeseuon, ailosod ciw, darllen o ffeil ac ysgrifennu i ffeil yn cael eu gwneud a'u dangos.

Dim ond pedwar peth sydd ar ôl i’w gwneud:

  • anfon yr ateb cywir i gais mewn sgwrs
  • anfon ymateb i UNRHYW sgwrs yr ychwanegwyd y bot ato
  • gweithredu cod mewn dolen
  • lansio bot o'r amserlen windows.

Mae'r holl dasgau hyn yn syml a gellir eu cyflawni'n hawdd trwy ddarllen y ddogfennaeth am baramedrau megis
Set-ExecutionPolicy Anghyfyngedig a -ExecutionPolicy Ffordd Osgoi
cylch y ffurf

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

Diolch i bawb sydd wedi darllen.

Ffynhonnell: hab.com

Ychwanegu sylw