Powershell ашиглан 7-9-р ангийн хүүхдүүдэд зориулсан энгийн телеграм ботын загвар

Сургуулийнхаа 8-10 дугаар ангийн хүүхдүүдэд програмчлалын хичээл огт заадаггүйг найзтайгаа ярилцаж байхдаа гэнэт мэдлээ. Word, Excel болон бүх зүйл. Логогүй, тэр ч байтугай Паскаль ч биш, Excel-д зориулсан VBA ч байхгүй.

Би маш их гайхаж, интернет нээж, уншиж эхлэв -
Мэргэшсэн сургуулийн нэг зорилт бол хөгжлийн түвшин, амьдралын хэв маягаараа мэдээллийн нийгмийн нөхцөл байдалд нийцсэн шинэ үеийн боловсролыг дэмжих явдал юм.
Энэхүү сургалт нь оюутнуудад Паскаль програмчлалын хэлний үндсэн бүтцийн талаарх мэдлэгээ практикт бататгах боломжийг олгоно. (Зарим гимнастикийн 2017 оны хөтөлбөрөөс)

Эцэст нь би хэдэн цаг зарцуулж, "сургуулийн хүүхдүүдэд зориулсан энгийн бот хэрхэн бүтээх" жишээг зурахаар шийдэв.

Энгийн Windows үйлдлийн системтэй энгийн гэрийн компьютер дээр Powershell-д өөр энгийн бот бичиж, вэб дэгээ, цагаан IP, тусгай сервер, үүлэн дотор байрлуулсан виртуал машин гэх мэтгүйгээр хэрхэн ажиллах талаар доор өгүүлнэ.

TLDR: Унших зүйлгүй, хошин шог, зураг байхгүй дүрмийн болон баримтын алдаатай бас нэг уйтгартай нийтлэл.

Өгүүлэлд шинэ зүйл байхгүй, өмнө нь бичсэн бараг бүх зүйл Хабре дээр, тухайлбал нийтлэлүүдэд аль хэдийн бичигдсэн байдаг Заавар: Telegram дээр хэрхэн робот үүсгэх и Системийн администраторт зориулсан Telegram робот.
Түүгээр ч зогсохгүй боловсролын уран зохиолд байнга дурдагдахгүйн тулд нийтлэлийг санаатайгаар илүүдүүлсэн болно. Текстэд Gang 4, PowerShell Deep Dives эсвэл AWS-ийн сайн архитектурын хүрээний 5 тулгуурын талаар лавлагаа байхгүй.

Оршил үгийн оронд алгасаж болно

Алгасаж болно2006 онд Майкрософт тухайн үеийн Windows XP, Vista, Server 1.0 үйлдлийн системд зориулсан PowerShell 2003 хувилбарыг гаргасан. Энэ нь зарим талаараа cmdbat скриптүүд, vb скриптүүд, Windows Script Host болон JScript зэрэг зүйлсийг сольсон.

Одоо ч гэсэн PowerShell нь гогцоо, анги, функц, MS GUI дуудлагыг үл харгалзан ашигласан Delphi (эсвэл хуучирсан зүйл)-ийн оронд лого сонголтуудын дараа дараагийн алхам гэж үзэж болно. Git интеграци гэх мэт.

Powershell-ийг харьцангуй ховор ашигладаг тул та үүнийг зөвхөн PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Хүссэн төлөвийн тохиргоо, PowerShell вэб хандалт мөн арав гаруй ховор хэрэглэгддэг программууд болон функцууд. Магадгүй тэр суллагдсанаар хоёр дахь салхи авах болно WSL2, гэхдээ энэ нь яг тийм биш юм.

Powershell нь гурван том давуу талтай:

  1. Энэ нь харьцангуй энгийн, энэ талаар маш олон уран зохиол, жишээ байдаг, тэр ч байтугай орос хэл дээр, жишээлбэл, Foreach-ийн тухай нийтлэл - номноос PowerShell-ийг гүнзгийрүүлсэн - () ба {} ялгааны талаар
  2. Тэр редактортой хамт явдаг ISE, Windows-д багтсан. Тэнд ямар нэгэн алдаа засах төхөөрөмж хүртэл байдаг.
  3. Түүнээс залгахад хялбар байдаг график интерфэйсийг бий болгох бүрэлдэхүүн хэсгүүд.

0. Бэлтгэл ажил.

Бидэнд:

  • Windows PC (надад Windows 10 байна)
  • Наад зах нь зарим төрлийн интернет холболт (жишээ нь NAT-ээр)
  • Telegram руу нэвтрэх боломж хязгаарлагдмал хүмүүст зориулсан - хөтөч дээр суулгасан, тохируулсан freegate, зарим хэцүү тохиолдолд Symple DNS Crypt-тэй хамт
  • Таны утсан дээр ажиллаж байгаа телеграм үйлчлүүлэгчтэй байна
  • Үндсэн ойлголтуудыг ойлгох - хувьсагч, массив, гогцоо гэж юу вэ.

Нийтлэлүүдийг нээж уншсан - Заавар: Telegram дээр хэрхэн робот үүсгэх и Системийн администраторт зориулсан Telegram робот

1. Өөр туршилтын робот үүсгэцгээе.

Хүн бүр үүнийг аль хэдийн мэддэг бөгөөд аль хэдийн тохиолдсон тул та үүнийг алгасаж болноДээрх нийтлэлд дурдсанчлан - Юуны өмнө Telegram-д зориулсан робот - Энэ нь таны талд ажиллаж байгаа бөгөөд Telegram Bot API-д хүсэлт гаргадаг програм хэвээр байна. Үүнээс гадна API нь тодорхой байна - bot нь параметр бүхий тодорхой URL руу ханддаг бөгөөд Telegram нь JSON объектоор хариу үйлдэл үзүүлдэг.

Холбогдох асуудлууд: Хэрэв та ямар нэг үл мэдэгдэх байдлаар JSON объектоос код аваад ямар нэгэн байдлаар гүйцэтгэхээр илгээсэн бол (зориуд биш) код танд хэрэгжих болно.

Бүтээх үйл явцыг дээрх хоёр нийтлэлд тайлбарласан боловч би давтан хэлье: телеграм дээр бид харилцагчдыг нээж, @botfather-ийг хайж, түүнд /newbot-г хэлж, Botfortest12344321 бот үүсгэж, Mynext1234bot гэж нэрлээд, өвөрмөц түлхүүр бүхий мессеж хүлээн авна. маягт 1234544311:AbcDefNNNNNNNNNNNNNNNN

Түлхүүрийг анхаарч, бүү өг!

Дараа нь та ботыг тохируулж болно, жишээлбэл, бүлгүүдэд нэмэхийг хориглох боловч эхний алхамуудад энэ нь шаардлагагүй юм.

BotFather-аас "/mybot" гэж асууж, ямар нэг зүйл таалагдахгүй бол тохиргоогоо тохируулцгаая.

Харилцагчдыг дахин нээцгээе, тэндээс @Botfortest12344321-г олоорой (хайлтыг заавал @-ээр эхлүүлэх хэрэгтэй), "эхлэх" дээр дарж, робот руу "/Роботуудад алдар" гэж бичнэ үү. / тэмдэг шаардлагатай, ишлэл шаардлагагүй.
Бот нь мэдээжийн хэрэг юу ч хариулахгүй.

Бот үүсгэгдсэн эсэхийг шалгаад нээцгээе.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNNNN/getMe
Энд 1234544311:AbcDefNNNNNNNNNNNNNNNN нь өмнө нь хүлээн авсан түлхүүр,
гэх мэт мөрийг аваарай
{"ok": үнэн, "үр дүн":{""}}

Бидэнд анхны нууц хэллэг (жетон) бий. Одоо бид хоёр дахь нууц дугаарыг олж мэдэх хэрэгтэй - боттой чатын ID. Чат, бүлэг гэх мэт нь хувь хүн бөгөөд өөрийн гэсэн дугаартай байдаг (заримдаа хасахтай - нээлттэй бүлгүүдэд). Энэ дугаарыг олж мэдэхийн тулд бид хөтөч дээр хүсэлт гаргах хэрэгтэй (үнэндээ хөтөч дээр энэ нь огт шаардлагагүй, гэхдээ илүү сайн ойлгохын тулд та үүнээс эхэлж болно) хаягийг (1234544311: NNNNNNNNNN нь таны жетон юм)

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

гэх мэт хариуг аваарай

{"ok": үнэн, "үр дүн":[{"update_id":...,... чатлах":{"id":123456789

Бидэнд chat_id хэрэгтэй.

Бид чат руу гараар бичих боломжтой эсэхийг шалгацгаая: хөтөчөөс хаяг руу залгана уу

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

Хэрэв та чат дээрээ ботоос мессеж хүлээн авбал дараагийн шат руу шилжинэ.

Ингэснээр (хөтөчөөр дамжуулан) та холбоос үүсгэхэд асуудал байгаа эсэх, эсвэл хаа нэгтээ ямар нэг зүйл нуугдаж, ажиллахгүй байгаа эсэхийг үргэлж шалгаж болно.

Үргэлжлүүлэн уншихаасаа өмнө юу мэдэх хэрэгтэй вэ

Telegram нь хэд хэдэн төрлийн групп чаттай (нээлттэй, хаалттай). Эдгээр чатын хувьд зарим функцууд (жишээ нь, id) өөр байдаг бөгөөд энэ нь заримдаа зарим асуудал үүсгэдэг.

2019 оны төгсгөл гэж бодъё, тэр ч байтугай бидний үеийн баатар, нэрт Ман-Оркестр (администратор, хуульч, мэдээллийн аюулгүй байдлын мэргэжилтэн, программист, бараг MVP) Евгений В. $i хувьсагчийг массиваас ялгаж, гогцоонуудыг эзэмшсэн, дараагийн хоёр жилд Шоколадэйг эзэмших болно, дараа нь хараарай PowerShell-тэй зэрэгцээ боловсруулалт хийх и ForEach-Object Parallel ирэх болно.

1. Манай робот юу хийх талаар бид боддог

Надад ямар ч санаа байгаагүй, би бодох ёстой байсан. Би аль хэдийн bot-тэмдэглэлийн дэвтэр бичсэн. Би "хаа нэгтээ юм илгээдэг" робот хийхийг хүсээгүй. Azure-д холбогдохын тулд танд зээлийн карт хэрэгтэй, гэхдээ оюутан хаанаас авдаг вэ? Бүх зүйл тийм ч муу биш гэдгийг тэмдэглэх нь зүйтэй: гол үүл нь ямар нэг туршилтын хугацааг үнэ төлбөргүй өгдөг (гэхдээ танд зээлийн картын дугаар хэрэгтэй хэвээр байна - үүнээс доллар хасагдах болно. Би санахгүй байна. дараа нь буцааж өгсөн.)

AI MLгүйгээр бот-ядуу-яруу найрагч-нэхэгч хийх нь тийм ч сонирхолтой биш юм.

Би толь бичгээс англи үгсийг надад (эсвэл надад биш) сануулах робот хийхээр шийдсэн.
Өгөгдлийн сантай ажиллахаас зайлсхийхийн тулд толь бичгийг текст файлд хадгалж, гараар шинэчлэх болно.
Энэ тохиолдолд даалгавар бол ажлын үндсийг харуулах бөгөөд дор хаяж хэсэгчлэн бэлэн бүтээгдэхүүн хийхгүй байх явдал юм.

2. Юуг яаж хийхийг анх удаа туршиж үзэх

C:poshtranslate хавтас үүсгэцгээе
Эхлээд бид ямар төрлийн powershell байгааг харцгаая, ISE-г start-run дамжуулан ажиллуулъя
powershell бол
эсвэл суулгасан програмуудаас Powershell ISE-г олоорой.
Эхлүүлсний дараа ердийн "зарим төрлийн засварлагч" нээгдэх бөгөөд хэрэв текст талбар байхгүй бол та "Файл - шинээр үүсгэх" дээр дарж болно.

Powershell-ийн хувилбарыг харцгаая - текст талбарт бичнэ үү:

get-host 

болон F5 дарна уу.

Powershell хадгалахыг санал болгоно - "Таны ажиллуулах гэж байгаа скрипт хадгалагдах болно." Бид зөвшөөрч, файлыг C: poshtranslate нэрээр powershell-ээс хадгална. myfirstbotBT100.

Ажилласны дараа доод текстийн цонхонд бид өгөгдлийн хүснэгтийг авна.

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

Надад 5.1 юм байна, тэр хангалттай. Хэрэв та хуучин Windows 7/8 үйлдлийн системтэй бол PowerShell-ийг 5-р хувилбар руу шинэчлэх шаардлагатай ч хамаагүй. зааварчилгаа.

Доорх командын мөрөнд Get-Date гэж бичээд Enter дарж, цагийг харан, командтай үндсэн хавтас руу орно
cd
cls командын тусламжтайгаар дэлгэцийг цэвэрлэ (үгүй, та rm ашиглах шаардлагагүй)

Одоо юу, яаж ажилладагийг шалгацгаая - кодыг нь ч биш, харин хоёр мөр бичиж, юу хийж байгааг ойлгохыг хичээцгээе. Get-host гэсэн мөрийг # тэмдэгээр тайлбарлаад жаахан нэмчихье.

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

(Сонирхолтой нь Habré дээрх код форматлах жагсаалтад хэдэн арван сонголт байдаг - гэхдээ Powershell байхгүй. Dos байна. Perl байна.)

Тэгээд GUI-ээс F5 эсвэл ">" товчийг дарж кодыг ажиллуулъя.

Бид дараах гаралтыг авна.

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

Ирээдүйд үүн рүү буцахгүйн тулд одоо эдгээр хоёр мөр болон зарим сонирхолтой зүйлийг харцгаая.

Паскал (зөвхөн биш) -ээс ялгаатай нь PowerShell өөрөө хувьсагчийн төрлийг тодорхойлохыг оролддог бөгөөд энэ талаар дэлгэрэнгүй мэдээллийг нийтлэлд бичсэн болно. Програмчлалын хэлээр бичих боловсролын хөтөлбөр
Тиймээс $TimeNow хувьсагч үүсгэж, түүнд одоогийн огноо, цагийн утгыг (Get-Date) оноосноор бид ямар төрлийн өгөгдөл байх талаар нэг их санаа зовох хэрэггүй болно.

Үнэн, энэ мунхаглал нь дараа нь өвдөж магадгүй, гэхдээ энэ нь хожим юм. Текстийн доор жишээ байх болно.
Бид юу авсныг харцгаая. Гүйцэцгээе (тушаалын мөрөнд)

$TimeNow | Get-member

мөн ойлгомжгүй текстийн хуудсыг аваарай

Үл ойлгогдох текстийн жишээ №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")...                                         

Таны харж байгаагаар TypeName: System.DateTime төрлийн хувьсагч нь олон тооны арга (энэ хувьсагчтай объекттой юу хийж чадах вэ гэдэг утгаараа) болон шинж чанаруудын хамт бүтээгдсэн.

За дуудъя $TimeNow.DayOfYear - бид жилийн өдрийн дугаарыг авдаг.
За дуудъя $TimeNow.DayOfYear | Get-Member - бид авдаг TypeName: System.Int32 ба бүлэг аргууд.
За дуудъя $TimeNow.ToUniversalTime() - мөн UTC дээр цаг аваарай

Дибаг хийгч

Заримдаа тодорхой мөр хүртэлх програмыг ажиллуулж, тухайн үеийн програмын төлөвийг харах шаардлагатай болдог. Энэ зорилгоор ISE нь Debug функцтэй - таслах цэгийг сэлгэх
Дунд хэсэгт нь завсарлагааны цэг байрлуулж, эдгээр хоёр мөрийг ажиллуулж, завсарлага ямар байхыг хараарай.

3. Telegram боттой харилцах харилцааг ойлгох

Мэдээжийн хэрэг, роботтой харьцах, бүх getpush гэх мэт илүү олон уран зохиол бичсэн боловч онолын асуудлыг сонголтоор авч үзэж болно.

Манай тохиолдолд шаардлагатай:

  • Захидал хэлбэрээр ямар нэгэн зүйл илгээж сур
  • Захидал харилцаанаас ямар нэгэн зүйл авч сур

3.1 Захидал хэлбэрээр ямар нэгэн зүйл илгээж, түүнээс хүлээн авч сурах

Бяцхан код - 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

мөн ОХУ-д энэ үед бид алсын серверт холбогдох боломжгүй гэсэн алдаа гарлаа.

Эсвэл бид үүнийг хүлээж авахгүй - харилцаа холбооны оператор болон прокси тохируулагдсан, ажиллаж байгаа эсэхээс хамаарна
За, прокси нэмэх л үлдлээ. Шифрлэгдээгүй, ихэвчлэн хуурамч прокси ашиглах нь таны эрүүл мэндэд маш аюултай гэдгийг анхаарна уу.

Ажиллаж буй прокси хайх нь тийм ч хэцүү биш - нийтлэгдсэн http proxies-ийн ихэнх нь ажилладаг. Тав дахь нь надад ажилласан гэж бодож байна.

Прокси ашиглан синтакс:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

Хэрэв та боттой чатдаа мессеж хүлээн авбал бүх зүйл хэвийн байна, та цаашаа явж болно. Үгүй бол дибаг хийхээ үргэлжлүүлээрэй.

Та өөрийн $URL4SEND стринг ямар болж хувирч байгааг харж, дараах байдлаар хөтөч дээр хүсэлт тавьж үзээрэй:

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

3.2. Бид чат дээр "ямар нэгэн зүйл" бичиж сурсан, одоо үүнийг уншихыг хичээцгээе

Дахиад 4 мөр нэмээд дотор нь юу байгааг | гишүүн авах

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

Хамгийн сонирхолтой зүйл бол бидэнд өгсөн

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

Тэдгээрийн дотор юу байгааг харцгаая:

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

Хэрэв бүх зүйл танд тохирсон бол танд дараах урт дараалал гарах болно.

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

Аз болоход, өмнө нь хэвлэгдсэн нийтлэлд Telegram bot системийн администраторын хувьд энэ мөр (тийм ээ, $MyMessageGet.RawContent | дагуу get-member нь System.String юм), аль хэдийн задалсан байна.

4. Хүлээн авсан зүйлээ боловсруулах (бид ямар нэгэн зүйлийг хэрхэн илгээхээ мэддэг болсон)

Аль хэдийн бичсэнчлэн энд, хамгийн хэрэгтэй зүйлс агуулгад оршдог. Үүнийг илүү нарийвчлан авч үзье.

Эхлээд бид вэб интерфэйс эсвэл утаснаас бот руу хэд хэдэн хэллэг бичнэ

/message1
/message2
/message3

$URLGET хувьсагчид үүссэн хаягаар хөтчөөс харна уу.

Бид иймэрхүү зүйлийг харах болно:

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

Энэ юу вэ? Төгсгөлийн зурвас танигч, чат танигч, илгээгч танигч болон бусад олон мэдээллийг агуулсан объектуудын массиваас зарим цогц объект.

Гэсэн хэдий ч бид "энэ ямар төрлийн объект вэ" гэдгийг ойлгох шаардлагагүй - ажлын нэг хэсэг нь бидний хувьд аль хэдийн хийгдсэн. Дотор нь юу байгааг харцгаая:

Хүлээн авсан мессежийг унших эсвэл 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. Бид одоо энэ талаар юу хийх ёстой вэ?

Үүссэн файлаа myfirstbotBT105 нэрээр эсвэл өөрт таалагдсан зүйлээ хадгалаад гарчгийг нь өөрчилж, өмнө нь бичсэн бүх кодыг комментоор бичээрэй.

<#start comment 105 end comment 105#>

Одоо бид толь бичгийг хаанаас авах вэ (сайн, хаана - файлын дискэн дээр), ямар харагдахыг шийдэх хэрэгтэй.

Мэдээжийн хэрэг, та скриптийн текстэн дээр асар том толь бичиг бичиж болно, гэхдээ энэ нь огт утгагүй зүйл юм.
Тэгэхээр Powershell юутай хэвийн ажиллаж болохыг харцгаая.
Ерөнхийдөө түүнд ямар файлтай ажиллах нь хамаагүй, энэ нь бидэнд хамаагүй.
Бидэнд сонголт байна: txt (та боломжтой, гэхдээ яагаад), csv, xml.
Бүгдийг харж болох уу? Бүгдийг нь харцгаая.
MyVocabClassExample1 анги болон $MyVocabExample1 хувьсагчийг үүсгэцгээе.
Анги нь $гүйгээр бичигдсэн болохыг анхаарна уу

Зарим код №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

Үүнийг ашиглан файл болгон бичихийг оролдъё үлгэр жишээ.

Зарим код №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

- мөн Out-File -FilePath $MyFilenameExample01 -InputObject -Append $MyVocabExample2 мөрөнд алдаа гарлаа.

Тэр нэмэхийг хүсэхгүй байна, аа, ямар ичмээр юм бэ.

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

Юу болсныг харцгаая. Гайхалтай текст харах - гэхдээ үүнийг хэрхэн буцааж экспортлох вэ? Би таслал гэх мэт зарим төрлийн текст тусгаарлагчийг нэвтрүүлэх ёстой юу?

Эцэст нь та "таслалаар тусгаарлагдсан утгууд (CSV) файлыг авах болно ЗОГС ХҮЛЭЭ.
#

$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 

Харахад хялбар, MS нь логикоор онцгой ялгагддаггүй; ижил төстэй процедурын хувьд нэг тохиолдолд -FilePath, өөр тохиолдолд -Path ашигладаг.

Нэмж хэлэхэд, гурав дахь файл дээр орос хэл алга болсон, дөрөв дэх файл дээр энэ нь гарч ирэв ... за, ямар нэгэн зүйл болсон. #TYPE System.Object[] 00
# "Count","Length","LongLength","Rank","SyncRoot","IsReadOnly","IsFixedSize","Synchronized"
#
Үүнийг бага зэрэг дахин бичье:

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

Энэ нь тусалсан бололтой, гэхдээ би форматад дургүй хэвээр байна.

Би ялангуяа объектын мөрийг шууд файл руу оруулж чаддаггүйдээ дургүй.
Дашрамд хэлэхэд, бид файл руу бичиж эхэлснээс хойш эхлүүлэх бүртгэл хөтөлж эхлэх үү? Бидэнд хувьсагчийн хувьд хугацаа байгаа тул файлын нэрийг тохируулж болно.

Үнэн, одоохондоо бичих зүйл алга, гэхдээ та логуудыг хэрхэн хамгийн сайн эргүүлэх талаар бодож болно.
Одоо xml-г туршиж үзье.

Зарим 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

Xml рүү экспортлох нь олон давуу талтай - унших боломжтой, бүхэл бүтэн объектыг экспортлох, нэмэлт өөрчлөлт хийх шаардлагагүй.

Оролдоод үзье xml файлыг уншина уу.

xml-ээс бага зэрэг унших

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

Даалгавар руугаа буцаж орцгооё. Бид туршилтын файл бичсэн, уншсан, хадгалах формат нь тодорхой, шаардлагатай бол та тусдаа жижиг файл засварлагч бичиж, мөр нэмэх, устгах боломжтой.

Даалгавар нь жижиг сургалтын бот хийх байсан гэдгийг сануулъя.

Ажлын хэлбэр: Би "жишээ" командыг бот руу илгээдэг, бот надад санамсаргүй байдлаар сонгосон үг, транскрипцийг илгээж, 10 секундын дараа орчуулга, тайлбарыг илгээдэг. Бид командыг хэрхэн уншихаа мэддэг, мөн прокси автоматаар сонгох, шалгах, мессежийн тоолуурыг мартах горимд оруулах талаар сурахыг хүсч байна.

Өмнө нь шаардлагагүй гэж бичсэн бүх зүйлийн тайлбарыг арилгаж, одоо шаардлагагүй жишээнүүдийг txt болон csv-ээр тайлбарлаж, файлыг B106 хувилбар болгон хадгалцгаая.

Өө тиймээ. Бот руу дахин ямар нэг зүйл илгээе.

6. Функцуудаас илгээх болон бусад

Хүлээн авалтыг боловсруулахын өмнө та туршилтын мессежээс өөр "ядаж ямар нэг зүйл" илгээх функцийг бий болгох хэрэгтэй.

Мэдээжийн хэрэг, жишээн дээр бид зөвхөн нэг илгээлт, зөвхөн нэг боловсруулалт хийх болно, гэхдээ бид ижил зүйлийг хэд хэдэн удаа хийх шаардлагатай бол яах вэ?

Функц бичих нь илүү хялбар байдаг. Тэгэхээр бидэнд файлаас уншсан $MyVocabExample4AsArray төрлийн объектын хувьсагч хоёр элементийн массив хэлбэртэй байна.
Явж уншъя.

Үүний зэрэгцээ бид цагтай харьцах болно, дараа нь бидэнд хэрэгтэй болно (үнэндээ энэ жишээнд бидэнд хэрэггүй болно :)

Зарим код №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
}

Таны харж байгаагаар уг функц нь өмнө нь хатуу кодлогдсон $MyToken болон $MyChatID-г дууддаг.

Үүнийг хийх шаардлагагүй бөгөөд хэрэв $MyToken бот бүрт нэг байвал $MyChatID чатаас хамаарч өөрчлөгдөнө.

Гэсэн хэдий ч энэ нь жишээ учраас бид үүнийг одоохондоо үл тоомсорлох болно.

$MyVocabExample4AsArray нь массив биш боловч нэгтэй маш төстэй тул чи зүгээр л авч чадахгүй уртыг нь хүсэх.

Дахин нэг удаа бид хийх боломжгүй зүйл хийх хэрэгтэй болно - кодын дагуу биш шүхрээр буу - үүнийг аваад тоол

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

Санамсаргүй сонирхолтой онцлог. Бид 0 эсвэл 1-ийг хүлээн авахыг хүсч байна гэж бодъё (бид массив дотор зөвхөн хоёр элемент байна). 0..1-ийн хил хязгаарыг тогтооход бид "1" авах уу?
үгүй - бид үүнийг авахгүй, бидэнд тусгай жишээ байна. Жишээ 2: 0-ээс 99-ийн хооронд санамсаргүй бүхэл тоо аваарай Get-Random -Хамгийн ихдээ 100
Тиймээс 0..1-ийн хувьд бид 0..2 хэмжээг тохируулах хэрэгтэй, хамгийн их элементийн тоо = 1 байна.

7. Ирж буй мессежийг боловсруулах, дарааллын хамгийн их урт

Бид өмнө нь хаана зогссон бэ? бидэнд $MyMessageGet хүлээн авсан хувьсагч байна
ба түүнээс авсан $Content4Pars01, үүнээс бид Content4Pars01.result массивын элементүүдийг сонирхож байна.

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

Бот /message10, /message11, /message12, /word болон дахин /word and /hello.
Бид юу авснаа харцгаая:

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

Хүлээн авсан бүх зүйлийг шалгаад хэрэв мессеж / үг байсан бол хариу илгээцгээе
Зарим хүмүүсийн if-elseif гэж тодорхойлдог Build-ийн тохиолдлыг powershell-д нэрлэдэг шилжүүлэгчээр дамжуулан. Үүний зэрэгцээ доорх код нь -wildcard товчлуурыг ашигладаг бөгөөд энэ нь огт шаардлагагүй, бүр хортой юм.

Зарим код №7.1

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

Скриптийг хэд хэдэн удаа ажиллуулъя. Гүйцэтгэх оролдлого бүрт бид хоёр удаа ижил үгийг авах болно, ялангуяа санамсаргүй байдлаар хэрэгжүүлэхэд алдаа гаргасан бол.

Гэхдээ боль. Бид дахин / үг илгээгээгүй, яагаад мессежийг дахин боловсруулж байна вэ?

Бот руу мессеж илгээх дараалал нь хязгаарлагдмал урттай (100 эсвэл 200 мессеж гэж би бодож байна) бөгөөд гараар цэвэрлэх ёстой.

Үүнийг мэдээж баримт бичигт тайлбарласан байгаа, гэхдээ та үүнийг унших хэрэгтэй!

Энэ тохиолдолд бидэнд ?chat_id параметр хэрэгтэй бөгөөд &timeout, &limit, &parse_mode=HTML болон &disable_web_page_preview=true шаардлагатай биш байна.

-д зориулсан баримт бичиг telegram api энд байна
Энэ нь цагаан болон англи хэлээр:
Буцаах анхны шинэчлэлтийн танигч. Өмнө нь хүлээн авсан шинэчлэлтүүдийн танигчаас нэгээр их байх ёстой. Анхдагч байдлаар, шинэчлэлтүүд хамгийн эртний үеэс эхэлдэг
батлагдаагүй шинэчлэлтийг буцааж өгсөн. getUpdates гэж дуудмагц шинэчлэлтийг баталгаажуулсан гэж үзнэ офсет их update_id-аас илүү. Сөрөг офсетийг шинэчлэлтийн дарааллын төгсгөлөөс -offset update-аас эхлэн шинэчлэлтүүдийг авахын тулд зааж өгч болно. Өмнөх бүх шинэчлэлтүүд мартагдах болно.

Ингээд харцгаая:

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

Тийм ээ, бид үүнийг дахин тохируулж, функцийг бага зэрэг дахин бичих болно. Бидэнд хоёр сонголт бий - мессежийг бүхэлд нь функц руу дамжуулж, функцэд бүхэлд нь боловсруулах эсвэл зөвхөн мессежийн ID-г өгч, дахин тохируулах. Жишээлбэл, хоёр дахь нь илүү энгийн харагдаж байна.

Өмнө нь бидний "бүх мессеж" хайлтын мөр иймэрхүү харагдаж байсан

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

мөн иймэрхүү харагдах болно

$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 

Хэн ч таныг эхлээд бүх мессежийг хүлээн авч, боловсруулахыг хориглодоггүй бөгөөд зөвхөн хүсэлтийг амжилттай боловсруулсны дараа баталгаагүй -> баталгаажуулсан.

Бүх боловсруулалт дууссаны дараа баталгаажуулалтыг дуудах нь яагаад утга учиртай вэ? Гүйцэтгэлийн дундуур бүтэлгүйтэх боломжтой бөгөөд жишээ нь үнэгүй чатботын хувьд ганц мессеж дутуу байх нь онцгой зүйл биш бол та хэн нэгний цалин эсвэл картын гүйлгээг боловсруулж байгаа бол үр дүн нь улам дордох болно.

Дахиад хэдэн мөр код

$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. Дүгнэлтийн оронд

Үндсэн функцууд - мессеж унших, дарааллыг дахин тохируулах, файлаас унших, файл руу бичих зэрэг үйлдлүүд хийгдэж, харагдана.

Хийх дөрвөн зүйл л үлдлээ.

  • хүсэлтийн зөв хариултыг чатаар илгээх
  • Бот нэмсэн аливаа чат руу хариу илгээх
  • гогцоонд кодыг гүйцэтгэх
  • windows төлөвлөгчөөс робот ажиллуулж байна.

Эдгээр бүх даалгаврууд нь энгийн бөгөөд параметрийн талаархи баримт бичгийг унших замаар хялбархан хийж болно
Set-ExecutionPolicy Unrestricted ба -ExecutionPolicy Bypass
хэлбэрийн мөчлөг

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

Уншсан бүх хүмүүст баярлалаа.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх