Досум менен баарлашып жатып, мен күтүлбөгөн жерден алардын мектебинде 8-10-класстын балдарына программалоону такыр үйрөтүшпөй турганын билдим. Word, Excel жана баары. Логотип жок, ал тургай Паскаль да, Excel үчүн VBA да жок.
Мен абдан таң калдым, интернетти ачып окуй баштадым -
Адистештирилген мектептин милдеттеринин бири болуп, анын өнүгүү деңгээли жана жашоо образы боюнча маалыматтык коомдун шарттарына жооп берген жаңы муунду тарбиялоого көмөк көрсөтүү саналат.
Бул курс студенттерге Паскаль программалоо тилинин негизги түзүлүштөрү боюнча билимдерин практика жүзүндө бекемдөөгө мүмкүндүк берет. (кээ бир гимназиянын 2017-жылга карата программасынан)
Акыр-аягы, мен бир нече саат убакыт бөлүп, "мектеп окуучулары үчүн жөнөкөй ботту кантип түзүү керек" деген мисалды келтирүүнү чечтим.
Төмөндө Powershell программасында дагы бир жөнөкөй ботту кантип жазуу жана аны вебхуктарсыз, ак IP даректерсиз, атайын серверлерсиз, булутта жайгаштырылган виртуалдык машиналарсыз жана башкаларсыз – кадимки туташуусу бар кадимки үй компьютеринде кантип иштетүү керектиги көрсөтүлгөн. Windows.
TLDR: Грамматикалык жана фактологиялык каталары бар дагы бир кызыксыз макала, окуй турган эч нерсе жок, юмор жок, сүрөттөрү жок.
Макалада жаңы эч нерсе жок, буга чейин жазылгандардын дээрлик баары Habréде, мисалы, макалаларда болгон и .
Анын үстүнө, макала ар дайым окуу адабиятына кайрылбоо үчүн атайылап ашыкча. Текстте Gang 4, PowerShell Deep Dives же айталы, AWS Well-Architected Framework 5 мамыларына шилтемелер жок.
Баш сөздүн ордуна, өткөрүп жиберсеңиз болот
Өткөрүп коюңуз2006-жылы Microsoft ошол кездеги PowerShell 1.0 версиясын чыгарган Windows XP, Vista жана 2003 серверлери. Айрым жагынан алганда, ал cmdbat жана vb скрипттери сыяктуу нерселерди алмаштырган. Windows Скрипт хосту жана JScript.
Азыр деле PowerShell логотип опцияларынан кийинки кадам катары каралышы мүмкүн, балким дагы деле колдонулган Delphi (же эски бир нерсе) ордуна, циклдердин, класстардын, функциялардын, MS GUI чалууларынын, жана башкалар.
Powershell салыштырмалуу сейрек колдонулат, сиз аны PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Каалаган Мамлекет Конфигурациясы, жана ондон ашык сейрек колдонулган программалар жана функциялар. Балким, ал бошотуу менен экинчи шамал алат , бирок ал так эмес.
Powershell дагы үч чоң артыкчылыгы бар:
- Бул салыштырмалуу жөнөкөй, ал жөнүндө көптөгөн адабияттар жана мисалдар бар, ал тургай орус тилинде, мисалы, Foreach жөнүндө макала - китептен - айырма жөнүндө () жана {}
- Ал редактор менен барат менен толукталган WindowsАл жерде кандайдыр бир мүчүлүштүктөрдү оңдоочу бар.
- Андан чалуу оңой .
0. Даярдоо.
Биз керек болот:
- менен PC Windows (Менде бар Windows 10)
- Жок дегенде Интернетке кирүү (мисалы, NAT аркылуу)
- Telegramга мүмкүнчүлүгү чектелген адамдар үчүн - браузерде орнотулган жана конфигурацияланган фрегэйт, кээ бир кыйын учурларда, Symple DNS Crypt менен бирге
- Телефонуңузда иштеген телеграмма кардары бар
- Негиздерди түшүнүү - өзгөрмө, массив, цикл деген эмне.
Ачылган жана окуган макалалар - и
1. Келгиле, дагы бир сыноо ботун түзөлү.
Муну баары мурунтан эле билгендиктен жана болуп өткөндүктөн, аны өткөрүп жиберсеңиз да болотЖогорудагы макалада айтылгандай - Биринчиден, Telegram үчүн бот - ал дагы эле сиз тарапта иштеп жаткан жана Telegram Bot API'ге суроо-талаптарды жасаган колдонмо. Андан тышкары, API түшүнүктүү - бот параметрлери бар белгилүү бир URL'ге жетет, ал эми Telegram JSON объектиси менен жооп берет.
Тиешелүү көйгөйлөр: эгер сиз JSON объектисинен кандайдыр бир белгисиз жол менен кодду алып, кандайдыр бир жол менен аны аткарууга жөнөтсөңүз (атайын эмес), код сиз үчүн аткарылат.
Түзүү процесси жогорудагы эки макалада сүрөттөлгөн, бирок мен дагы бир жолу кайталайм: телеграммада биз байланыштарды ачабыз, @botfather издейбиз, ага /newbot айтабыз, Botfortest12344321 ботун түзүп, аны Mynext1234bot деп атайбыз жана уникалдуу ачкыч менен билдирүү алабыз. форма 1234544311:AbcDefNNNNNNNNNNNNNNNN
Ачкычка кам көрүңүз жана аны бербеңиз!
Андан кийин сиз ботту конфигурациялай аласыз, мисалы, аны топторго кошууга тыюу сала аласыз, бирок биринчи кадамдарда бул зарыл эмес.
Келгиле, BotFatherден “/mybot” сурайлы жана бизге бир нерсе жакпаса, жөндөөлөрдү тууралайлы.
Келгиле, кайра байланыштарды ачалы, ошол жерден @Botfortest12344321 табыңыз (издөө @ менен баштоо милдеттүү), "старт" баскычын чыкылдатып, ботко "/Роботторго даңк" деп жазыңыз. / белгиси талап кылынат, тырмакча керек эмес.
Бот, албетте, эч нерсеге жооп бербейт.
Келгиле, бот түзүлгөнүн текшерип, аны ачалы.
:AbcDefNNNNNNNNNNNNNNNN/getMe
бул жерде 1234544311:AbcDefNNNNNNNNNNNNNNNN мурда алынган ачкыч,
жана сыяктуу линияны алыңыз
{"ok":true,"result":{""}}
Бизде биринчи жашыруун фраза (токен) бар. Эми биз экинчи жашыруун номерди табышыбыз керек - бот менен баарлашуунун идентификатору. Ар бир чат, топ ж.б. индивидуалдуу жана өзүнүн номери бар (кээде минус менен - ачык топтор үчүн). Бул номерди билүү үчүн, браузерден (чындыгында, бул браузерде талап кылынбайт, бирок жакшыраак түшүнүү үчүн андан баштасаңыз болот) даректи (мында 1234544311:NNNNNNNNNN сиздин энбелгиңиз) сурашыбыз керек.
https://api.telegram.org/bot1234544311:NNNNNNNNN/getUpdates
жана сыяктуу жооп алыңыз
{"ok":true,"result":[{"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 өзгөрмөсүн массивден айырмалайт, илмектерди өздөштүрдү, караңыз, кийинки эки жылда Шоколадейди өздөштүрүп кетет, анан и ал келет.
1. Ботубуз эмне кылаарын ойлойбуз
Менде эч кандай идея жок болчу, ойлонушум керек болчу. Мен буга чейин бот-блокнот жазганмын. Мен "бир жерге бир нерсе жөнөтүүчү" бот жасагым келген жок. Azure менен туташуу үчүн сизге кредиттик карта керек, бирок студент аны кайдан алат? Белгилей кетчү нерсе, баары анчалык деле жаман эмес: негизги булуттар кандайдыр бир сыноо мөөнөтүн бекер беришет (бирок сизге дагы эле кредиттик картанын номери керек - жана андан бир доллар дебеттелип калат окшойт. Эсимде жок. кийинчерээк кайтарылган.)
AI ML болбосо, бот-кедей акынды жасоо анчалык деле кызыктуу эмес.
Мен сөздүктөн англисче сөздөрдү эске сала турган (же мага эмес) бот жасоону чечтим.
Маалыматтар базасы менен убара болбош үчүн, сөздүк тексттик файлда сакталып, кол менен жаңыртылат.
Мында иштин негизин керсетуу, жок дегенде жарым-жартылай даяр буюм жасоо милдети турат.
2. Эмнени жана кантип биринчи жолу аракет кылуу
C:poshtranslate папкасын түзөлү
Биринчиден, бизде кандай Powershell бар экенин карап көрөлү, келгиле, ISEди старт-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 проксилеринин көбү иштейт. Менимче, бешинчи мен үчүн иштеген.
Прокси аркылуу синтаксис:
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 боту системалык администратор үчүн бул линия (ооба, $MyMessageGet.RawContent | ылайык get-мүчөсү - 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
# "Сана","Узундук","Узун узундук","Ранк","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ден бир аз окуу
$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)
# Угадайте сами, какой пример легче читается посторонними людьми.
Random . Келгиле, биз 0 же 1 алгыбыз келет дейли (массивде эки эле элемент бар). 0..1 чектерин койгондо "1" алабызбы?
жок - биз аны албайбыз, бизде атайын мисал бар 2-мисал: 0 жана 99 ортосундагы кокус бүтүн санды алыңыз Get-Random -Maximum 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 жана кайра /сөз жана /салам.
Келгиле, бизде эмне бар экенин карап көрөлү:
$Content4Pars01.result[0].message.text
$Content4Pars01.result[2].message.text Келгиле, алынган нерселердин бардыгын карап чыгалы жана эгер билдирүү /сөз болсо, жооп жөнөтөлү
Айрымдар if-elseif деп сыпаттаган конструкция учуру пауэршеллде деп аталат . Ошол эле учурда, төмөндөгү код -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 параметри керек, жана &тайм, &limit, &parse_mode=HTML жана &disable_web_page_preview=true азырынча керек эмес.
үчүн документтер Ал ак жана англис тилинде мындай дейт:
Кайтарыла турган биринчи жаңыртуунун идентификатору. Мурда алынган жаңыртуулардын идентификаторлорунун эң чоңунан бир чоңураак болушу керек. Демейки боюнча, жаңыртуулар эң эртеден башталат
такталбаган жаңыртуулар кайтарылат. getUpdates менен чалуу замат жаңыртуу ырасталды деп эсептелет ордун толтуруу жогору анын update_id караганда. Терс офсет жаңыртууларды алуу үчүн көрсөтүлүшү мүмкүн -offset жаңыртуудан жаңыртуулар кезегинин аягынан баштап. Бардык мурунку жаңыртуулар унутулат.
Келгиле, карап көрөлү:
$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 Чексиз жана -ExecutionPolicy айланып өтүү
форманын цикли
$TimeToSleep = 3 # опрос каждые 3 секунды
$TimeToWork = 10 # минут
$HowManyTimes = $TimeToWork*60/$TimeToSleep # счетчик для цикла
$MainCounter = 0
for ($MainCounter=0; $MainCounter -le $HowManyTimes) {
sleep $TimeToSleep
$MainCounter ++
Окугандардын баарына рахмат.
Source: www.habr.com
