Samfura don sauƙaƙan bot na telegram don yaran makaranta a maki 7-9 ta amfani da Powershell

A lokacin tattaunawa da wani abokina, kwatsam na sami labarin cewa yaran da ke aji 8-10 a makarantarsu ba a koyar da su programming kwata-kwata. Word, Excel da komai. Babu tambari, har ma Pascal, har ma da VBA don Excel.

Na yi mamaki kwarai, na bude Intanet na fara karantawa.
Daya daga cikin ayyukan makaranta na musamman shi ne inganta ilimin sabbin tsararraki da suka dace da yanayin zamantakewar jama'a a matakin ci gaba da salon rayuwarsu.
Wannan kwas ɗin zai ba wa ɗalibai damar haɓaka a aikace iliminsu na ainihin ginin harshen shirye-shiryen Pascal. (daga shirin wasu gymnasium na 2017)

A ƙarshe, na yanke shawarar ciyar da sa'o'i biyu kuma in zana misalin "yadda ake ƙirƙirar bot mai sauƙi ga yaran makaranta."

Da ke ƙasa da yanke shine yadda za a rubuta wani bot mai sauƙi a cikin Powershell kuma ya sa ya yi aiki ba tare da webhook ba, farar IPs, sabobin sadaukarwa, ƙaddamar da na'urori masu mahimmanci a cikin girgije, da sauransu - akan PC na gida na yau da kullum tare da Windows na yau da kullum.

TLDR: Wani labarin mai ban sha'awa tare da kurakurai na nahawu da gaskiya, babu abin da za a karanta, babu abin dariya, babu hotuna.

Babu wani sabon abu a cikin labarin, kusan duk abin da aka rubuta a baya ya riga ya kasance akan Habré, misali a cikin labarai Umarni: Yadda ake ƙirƙirar bots a Telegram и Telegram bot don mai sarrafa tsarin.
Bugu da ƙari, labarin ba shi da gangan don kada ya koma ga wallafe-wallafen ilimi kowane lokaci. Babu nassoshi ga Gang 4, PowerShell Deep Dives ko, a ce, Pillars 5 na Tsarin Tsare-tsare na AWS a cikin rubutu.

Maimakon gabatarwa, kuna iya tsallakewa

Jin kyauta don tsallakewaA cikin 2006, Microsoft ya saki PowerShell 1.0 don Windows XP, Vista, da Server 2003. A wasu hanyoyi, ya maye gurbin abubuwa kamar rubutun cmdbat, rubutun vb, Mai watsa shiri na Rubutun Windows da JScript.

Har yanzu, PowerShell za a iya ɗaukar shi azaman mataki na gaba bayan zaɓin Logo, maimakon mai yiwuwa har yanzu ana amfani da Delphi (ko wani abu mafi girma), duk da kasancewar madaukai, azuzuwan, ayyuka, kiran MS GUI, Git hadewa da sauransu.

Ana amfani da Powershell ba da daɗewa ba; za ku iya saduwa da shi kawai ta hanyar PowerShell Core, VMware vSphere PowerCLI, Azure PowerShell, MS Exchange, Tsarin Jiha da ake so, Samun damar Yanar Gizo na PowerShell da dozin ko fiye da shirye-shirye da ayyuka da ba a cika amfani da su ba. Wataƙila zai sami iska ta biyu tare da sakin Farashin WSL2, amma ba daidai ba ne.

Powershell kuma yana da manyan fa'idodi guda uku:

  1. Yana da sauƙi mai sauƙi, akwai wallafe-wallafe da misalai masu yawa game da shi, har ma a cikin Rashanci, alal misali, labarin game da Foreach - daga littafin. PowerShell a cikin zurfin - game da bambanci () da {}
  2. Yana tafiya tare da editan ISE, hada da Windows. Akwai ma wani nau'in gyara kurakurai a wurin.
  3. Yana da sauƙin kira daga gare ta abubuwan da aka gyara don gina ƙirar ƙirar hoto.

0. Shiri.

Za mu buƙaci:

  • Windows PC (Ina da Windows 10)
  • Aƙalla wani nau'in shiga Intanet (ta hanyar NAT misali)
  • Ga waɗanda ke da iyakacin damar yin amfani da telegram - shigar da daidaita shi a cikin mai binciken, a wasu lokuta masu wahala, tare da Symple DNS Crypt
  • Samun abokin ciniki na telegram mai aiki akan wayarka
  • Fahimtar ainihin asali - menene m, tsararru, madauki.

An buɗe kuma karanta labarai - Umarni: Yadda ake ƙirƙirar bots a Telegram и Telegram bot don mai sarrafa tsarin

1. Bari mu ƙirƙiri wani gwajin bot.

Tun da kowa ya riga ya san wannan, kuma ya riga ya faru, za ku iya tsallake shiKamar yadda aka fada a cikin labarin da ke sama - Da farko, bot don Telegram - har yanzu aikace-aikace ne da ke gudana a gefen ku kuma yin buƙatun zuwa Telegram Bot API. Bugu da ƙari, API a bayyane yake - bot yana samun dama ga takamaiman URL tare da sigogi, kuma Telegram yana amsawa da wani abu JSON.

Matsalolin da ke da alaƙa: idan ta wata hanya da ba a sani ba ka ɗauki wasu lamba daga abin JSON kuma ko ta yaya aika shi don aiwatarwa (ba da gangan ba), za a aiwatar da lambar a gare ku.

An bayyana tsarin ƙirƙirar a cikin labarai guda biyu a sama, amma na sake maimaitawa: a cikin telegram mun buɗe lambobin sadarwa, nemi @botfather, gaya masa / newbot, ƙirƙirar bot Botfortest12344321, kira shi Mynext1234bot, kuma karɓi saƙo tare da maɓalli na musamman na form 1234544311:AbcDefNNNNNNNNNNNN

Kula da maɓallin kuma kada ku ba da shi!

Sannan zaku iya saita bot, alal misali, hana ƙara shi zuwa ƙungiyoyi, amma a cikin matakan farko wannan ba lallai bane.

Bari mu tambayi BotFather don "/mybot" kuma mu daidaita saitunan idan ba ma son wani abu.

Bari mu sake buɗe lambobin sadarwa, nemo @Botfortest12344321 a wurin (wajibi ne a fara bincike da @), danna "fara" kuma rubuta zuwa bot "/ Glory to the robots." Ana buƙatar alamar / alamar, ba a buƙatar ƙididdiga.
Bot, ba shakka, ba zai amsa komai ba.

Bari mu bincika cewa an ƙirƙiri bot kuma buɗe shi.

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNN/getMe
inda 1234544311:AbcDefNNNNNNNNNNNN shine maɓallin da aka karɓa a baya,
kuma sami layi kamar
{"ok":gaskiya,"sakamako":{""}}

Muna da kalmar sirri ta farko (alama). Yanzu muna buƙatar gano lambar sirri ta biyu - ID na hira tare da bot. Kowace taɗi, ƙungiya, da sauransu na mutum ɗaya ne kuma yana da lambar kansa (wani lokaci tare da ragi - don ƙungiyoyin buɗewa). Domin gano wannan lambar, muna buƙatar buƙatun a cikin burauzar (a gaskiya, ba lallai ba ne a cikin burauzar, amma don ƙarin fahimta za ku iya farawa da shi) adireshin (inda 1234544311: NNNNNNNNNN shine alamar ku).

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

kuma a sami amsa kamar

{"ok":gaskiya,"sakamako":[{"update_id":...,... hira":{"id":123456789

Muna buƙatar chat_id.

Bari mu duba cewa za mu iya rubuta zuwa hira da hannu: kira adreshin daga browser

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

Idan kun karɓi saƙo daga bot a cikin tattaunawar ku, to, kun matsa zuwa mataki na gaba.

Ta wannan hanyar (ta hanyar mai bincike) koyaushe zaku iya bincika ko akwai matsaloli tare da haɓakar hanyar haɗin gwiwa, ko kuma idan wani abu ya ɓoye a wani wuri kuma baya aiki.

Abin da kuke buƙatar sani kafin ci gaba da karatu

Telegram yana da nau'ikan tattaunawar rukuni da yawa (buɗe, rufe). Ga waɗannan tattaunawar, wasu ayyuka (misali, id) sun bambanta, wanda wani lokaci yana haifar da wasu matsaloli.

Bari mu ɗauka cewa ƙarshen 2019 ne, har ma da jarumin zamaninmu, sanannen Man-Orchestra (mai gudanarwa, lauya, ƙwararren tsaro na bayanai, mai tsara shirye-shirye da kuma kusan MVP) Evgeniy V. ya bambanta $ i m daga tsararru, ya ƙware madaukai, duba a cikin shekaru biyu masu zuwa za su mallaki Chocolatey, sannan Daidaita aiki tare da PowerShell и Daidaiton Abu-Kai Na Kowa zai zo.

1. Muna tunanin abin da bot ɗinmu zai yi

Ba ni da wani ra'ayi, dole in yi tunani. Na riga na rubuta littafin rubutu. Ba na son yin bot "wanda ke aika wani abu a wani wuri." Don haɗawa zuwa Azure kuna buƙatar katin kuɗi, amma daga ina ɗalibin ya samo shi? Ya kamata a lura cewa duk abin da ba shi da kyau sosai: babban girgije yana ba da wani nau'in lokacin gwaji kyauta (amma har yanzu kuna buƙatar lambar katin kiredit - kuma da alama za a cire dala daga gare ta. Ban tuna ba idan an dawo daga baya.)

Ba tare da AI ML ba yana da ban sha'awa sosai don yin bot-malauni-mawaƙi-maƙala.

Na yanke shawarar yin bot wanda zai tunatar da ni (ko a'a) kalmomin Ingilishi daga ƙamus.
Don guje wa yin mu'amala da bayanan bayanai, za a adana ƙamus ɗin a cikin fayil ɗin rubutu kuma a sabunta shi da hannu.
A wannan yanayin, aikin shine don nuna ainihin aikin, kuma ba don yin akalla samfurin da aka gama ba.

2. Gwada menene kuma ta yaya a karon farko

Bari mu ƙirƙiri babban fayil C:poshtranslate
Da farko, bari mu ga irin nau'in wutar lantarki da muke da shi, bari mu ƙaddamar da ISE ta hanyar farawa
powershell aiki
ko sami Powershell ISE a cikin shirye-shiryen da aka shigar.
Bayan ƙaddamarwa, "wani nau'in edita" wanda aka saba da shi zai buɗe; idan babu filin rubutu, to koyaushe zaka iya danna "Fayil - ƙirƙira sabo".

Bari mu kalli sigar powershell - rubuta a cikin filin rubutu:

get-host 

kuma danna F5.

Powershell zai bayar don adanawa - "Rubutun da kuke shirin aiwatarwa za a adana shi.", mun yarda, kuma mun adana fayil ɗin daga powershell tare da suna a C: poshtranslate myfirstbotBT100.

Bayan ƙaddamarwa, a cikin ƙananan taga rubutu muna samun tebur na bayanai:

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

Ina da wani abu 5.1, ya isa. Idan kuna da tsohuwar Windows 7/8 to babu babban yarjejeniya - kodayake PowerShell yana buƙatar sabuntawa zuwa sigar 5 - misali. umarnin.

Rubuta Get-Date a layin umarni da ke ƙasa, danna Shigar, duba lokacin, je zuwa babban fayil ɗin tushen tare da umarnin
cd
kuma share allon tare da umarnin cls (a'a, ba kwa buƙatar amfani da rm)

Yanzu bari mu duba abin da ke aiki da kuma yadda - bari mu rubuta ba ko da code, amma biyu Lines, da kuma kokarin fahimtar abin da suke yi. Bari mu yi sharhi kan layi tare da samun-host tare da alamar # kuma ƙara kaɗan.

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

(Abin da ke da ban sha'awa shi ne cewa a cikin jerin abubuwan da aka saukar da tsarin code akan Habré akwai zaɓuɓɓuka biyu dozin - amma Powershell ba ya nan. Dos yana can. Perl yana can.)

Kuma bari mu gudanar da lambar ta latsa F5 ko ">" daga GUI.

Muna samun fitarwa mai zuwa:

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

Yanzu bari mu dubi waɗannan layi biyu da wasu abubuwa masu ban sha'awa don kada mu koma ga wannan a nan gaba.

Ba kamar Pascal (kuma ba kawai), PowerShell kanta yana ƙoƙarin tantance nau'in nau'in da za a sanya wa mai canzawa; ƙarin cikakkun bayanai game da wannan an rubuta su a cikin labarin. Shirin ilimantarwa akan bugawa a cikin yarukan shirye-shirye
Don haka, ta hanyar ƙirƙirar maɓalli na $ TimeNow da sanya masa ƙimar kwanan wata da lokaci na yanzu (Get-Date), ba lallai ne mu damu da yawa game da wane nau'in bayanai za su kasance a wurin ba.

Tabbas, wannan jahilci na iya cutar da shi daga baya, amma wannan na gaba ne. A ƙasa a cikin rubutun za a sami misali.
Bari mu ga abin da muka samu. Bari mu aiwatar (a kan layin umarni)

$TimeNow | Get-member

kuma sami shafi na rubutu marar fahimta

Misalin lambar rubutu mara fahimta 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")...                                         

Kamar yadda kake gani, nau'in nau'in TypeName: System.DateTime an halicce shi tare da gungun hanyoyi (a cikin ma'anar abin da za mu iya yi da wannan abu mai mahimmanci) da kaddarorin.

Mu kira $TimeNow.DayOfYear - muna samun adadin ranar shekara.
Mu kira $TimeNow.DayOfYear | Get-Member - mun samu TypeName: System.Int32 da ƙungiyar hanyoyin.
Mu kira $TimeNow.ToUniversalTime() - kuma sami lokaci a UTC

Mai gyara kuskure

Wani lokaci yakan faru cewa ya zama dole a aiwatar da shirin har zuwa wani layi na musamman da ganin yanayin shirin a wannan lokacin. Don wannan dalili, ISE yana da aikin gyara kuskure - jujjuya wurin hutu
Saka wurin karya wani wuri a tsakiya, gudanar da waɗannan layi biyu kuma duba yadda hutun ya kasance.

3. Fahimtar hulɗar da Telegram bot

Tabbas, har ma da ƙarin wallafe-wallafen an rubuta game da hulɗa tare da bot, tare da duk getpush da sauransu, amma batun ka'idar ana iya la'akari da zaɓin zaɓi.

A cikin yanayinmu ya zama dole:

  • Koyi don aika wani abu a cikin wasiƙa
  • Koyi don samun wani abu daga wasiƙa

3.1 Koyan aika wani abu cikin wasiƙa da karɓa daga gare ta

A little code - part 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

kuma a cikin Tarayyar Rasha a wannan lokacin muna samun kuskure Ba a iya haɗawa zuwa uwar garken nesa ba.

Ko kuma ba mu karɓa ba - ya dogara da ma'aikacin sadarwa da ko an saita wakili kuma yana aiki
To, abin da ya rage shi ne ƙara wakili. Lura cewa yin amfani da wakili mara ɓoyewa kuma gabaɗaya na zamba yana da haɗari ga lafiyar ku.

Ayyukan neman wakili mai aiki ba shi da wahala sosai - yawancin shafukan yanar gizo da aka buga suna aiki. Ina tsammanin na biyar ya yi min aiki.

Haɗin kai ta amfani da wakili:

Invoke-WebRequest -Uri $URL4SEND -Proxy $MyProxy

Idan kun karɓi saƙo a cikin taɗi tare da bot, to komai yana da kyau, zaku iya ci gaba. Idan ba haka ba, ci gaba da yin kuskure.

Kuna iya ganin abin da layin ku na $URL4SEND ya juya zuwa kuma gwada neman ta a cikin mazuruftan, kamar haka:

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

3.2. Mun koyi yadda ake rubuta "wani abu" a cikin hira, yanzu bari mu yi ƙoƙari mu karanta shi

Bari mu ƙara ƙarin layuka 4 mu ga abin da ke ciki ta | zama memba

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

Abu mafi ban sha'awa an tanadar mana

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

Bari mu ga abin da ke cikinsu:

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

Idan komai yayi muku aiki, zaku sami dogon layi kamar:

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

Abin farin ciki, a cikin labarin da aka buga a baya Telegram bot don mai sarrafa tsarin wannan layin (i, bisa ga $MyMessageGet.RawContent | memba shine System.String), an riga an tarwatsa shi.

4. Tsara abin da kuka karɓa (mun riga mun san yadda ake aika wani abu)

Kamar yadda aka riga aka rubuta a nan, abubuwan da suka fi dacewa suna cikin abun ciki. Mu duba a hankali.

Da farko, za mu rubuta ƙarin jimloli biyu zuwa bot daga mahaɗin yanar gizo ko daga wayar

/message1
/message2
/message3

kuma duba ta hanyar burauzar a adireshin da aka kafa a cikin $URLGET m.

Za mu ga wani abu kamar:

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

Menene shi? Wasu hadaddun abu daga tsararrun abubuwa masu ɗauke da ganowar saƙon ƙarshe zuwa ƙarshe, mai gano taɗi, mai ganowa da sauran bayanai masu yawa.

Duk da haka, ba ma buƙatar sanin "wane irin abu ne wannan" - an riga an yi mana wani ɓangare na aikin. Bari mu ga abin da ke ciki:

Karatun sakonnin da aka samu ko part 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. Menene ya kamata mu yi game da shi yanzu?

Bari mu ajiye sakamakon fayil ɗin a ƙarƙashin sunan myfirstbotBT105 ko duk abin da kuke so mafi kyau, canza take kuma ku fitar da duk lambar da aka riga aka rubuta ta hanyar.

<#start comment 105 end comment 105#>

Yanzu muna buƙatar yanke shawarar inda za mu sami ƙamus (da kyau, inda - akan faifai a cikin fayil) da kuma yadda zai yi kama.

Tabbas, zaku iya rubuta ƙamus mai girma daidai a cikin rubutun rubutun, amma wannan gaba ɗaya yana kusa da batun.
Don haka bari mu ga abin da powershell zai iya aiki da shi kullum.
Gabaɗaya, bai damu da wane fayil ɗin da zai yi aiki da shi ba, ba ruwan mu.
Muna da zabi: txt (zaka iya, amma me yasa), csv, xml.
Za mu iya kallon kowa?Mu ga kowa.
Bari mu ƙirƙiri ajin MyVocabClassExample1 da m $MyVocabExample1
Na lura cewa an rubuta ajin ba tare da $

wani code #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

Bari mu yi ƙoƙarin rubuta wannan cikin fayiloli ta amfani da abin koyi.

Wasu code #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

- kuma mun sami kuskure akan layin Out-File -FilePath $MyFilenameExample01 -InputObject -Apppend $MyVocabExample2.

Ba ya son ƙarawa, ah-ah, abin kunya.

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

Bari mu ga abin da ya faru. Babban kallon rubutu - amma ta yaya ake fitar da shi baya? Shin zan gabatar da wasu nau'ikan masu raba rubutu, kamar waƙafi?

Kuma a ƙarshe za ku sami “fayil ɗin ƙimar waƙafi (CSV) A TSAYA JIRAN.
#

$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 

Kamar yadda yake da sauƙin gani, MS ba ta bambanta ta hanyar dabaru ba; don irin wannan hanya, a cikin wani yanayi -FilePath ana amfani da shi, a wani -Path.

Bugu da ƙari, a cikin fayil na uku harshen Rashanci ya ɓace, a cikin fayil na hudu ya juya ... da kyau, wani abu ya faru. # TYPE System.abu[] 00
# "Kidaya","Tsawon","Tsawon Tsayi", "Rank", "SyncRoot", "IsReadOnly", "IsKafaffen Girman", "An Daidaita"
#
Bari mu sake rubuta shi kadan:

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

Da alama ya taimaka, amma har yanzu ba na son tsarin.

Musamman ba na son cewa ba zan iya sanya layuka daga wani abu cikin fayil kai tsaye ba.
Af, tun da muka fara rubutawa zuwa fayiloli, za mu iya fara ajiye tarihin farawa? Muna da lokaci a matsayin m, za mu iya saita sunan fayil.

Gaskiya ne, babu wani abu da za a rubuta tukuna, amma zaka iya tunanin yadda mafi kyau don juya rajistan ayyukan.
Mu gwada xml a yanzu.

Wasu 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

Fitarwa zuwa xml yana da fa'idodi da yawa - iya karantawa, fitarwar dukkan abu, kuma babu buƙatar yin abin da aka ɗauka.

Bari mu gwada karanta xml fayil.

Karatu kadan daga xml

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

Mu koma kan aikin. Mun rubuta fayil ɗin gwaji, karanta shi, tsarin ajiya a bayyane yake, idan ya cancanta, zaku iya rubuta ƙaramin editan fayil daban don ƙarawa da share layukan.

Bari in tunatar da ku cewa aikin shine yin ƙaramin bot ɗin horo.

Tsarin aiki: Na aika umarnin "misali" zuwa bot, bot ɗin ya aiko mani da kalmar da aka zaɓa ba tare da izini ba, kuma bayan daƙiƙa 10 ya aiko mini da fassarar da sharhi. Mun san yadda ake karanta umarni, za mu kuma so mu koyi yadda ake zaɓar da kuma bincika wakilai ta atomatik, da sake saita ƙidayar saƙo zuwa ga mantawa.

Bari mu ba da amsa duk abin da aka yi sharhi a baya a matsayin ba dole ba ne, yi sharhin misalan da ba dole ba a yanzu tare da txt da csv, kuma adana fayil ɗin azaman sigar B106

Oh, iya. Bari mu sake aika wani abu zuwa bot kuma.

6. Aika daga ayyuka da ƙari

Kafin sarrafa liyafar, kuna buƙatar ƙirƙirar aiki don aika “aƙalla wani abu” ban da saƙon gwaji.

Tabbas, a cikin misalin za mu sami aikawa ɗaya kawai da sarrafa guda ɗaya, amma idan muna buƙatar yin abu ɗaya sau da yawa fa?

Yana da sauƙin rubuta aiki. Don haka, muna da nau'in nau'in nau'in nau'in $MyVocabExample4AsArray, karanta daga fayil ɗin, a cikin nau'in tsararrun abubuwa kamar abubuwa biyu.
Mu je karatu.

A lokaci guda, za mu yi hulɗa da agogo; za mu buƙaci shi daga baya (a zahiri, a cikin wannan misalin ba za mu buƙaci shi ba :)

Wasu code #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
}

Kamar yadda kuke iya gani cikin sauƙi, aikin yana kiran $MyToken da $MyChatID, waɗanda aka yi tauri a baya.

Babu buƙatar yin wannan, kuma idan $MyToken ɗaya ne ga kowane bot, to $MyChatID zai canza dangane da taɗi.

Duk da haka, tun da wannan misali ne, za mu yi watsi da shi a yanzu.

Tun da $MyVocabExample4AsArray ba tsararru ba ne, kodayake yana kama da ɗaya, to. ba za ku iya ɗauka ba kawai nemi tsayinsa.

Har yanzu za mu sake yin wani abu da ba za a iya yi ba - parachute ba bisa ga lambar ba - ɗauka kuma mu ƙidaya

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

A Hargitse fasali mai ban sha'awa. Bari mu ce muna son karɓar 0 ko 1 (muna da abubuwa biyu kawai a cikin tsararru). Lokacin saita iyakoki 0..1, za mu sami "1"?
a'a - ba za mu samu ba, muna da misali na musamman Misali na 2: Sami bazuwar lamba tsakanin 0 da 99 Get-Random -Maximum 100
Don haka, don 0..1 muna buƙatar saita girman 0..2, tare da matsakaicin lambar kashi = 1.

7. Gudanar da saƙonni masu shigowa da matsakaicin tsayin layi

A ina muka tsaya a baya? muna da canjin da aka karɓa $MyMessageGet
da $Content4Pars01 da aka samu daga gare ta, wanda muke sha'awar abubuwan da ke tattare da tsararrun sakamako na Content4Pars01.

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

Bari mu aika bot/message10, /message11, /message12,/word and again /word and /hello.
Bari mu ga abin da muka samu:

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

Bari mu shiga cikin duk abin da aka karɓa kuma mu aika da amsa idan saƙon / kalma ne
al'amarin ginawa, abin da wasu ke kwatantawa da if-elseif, ana kiransa da wutar lantarki ta hanyar canzawa. A lokaci guda, lambar da ke ƙasa tana amfani da maɓallin -wildcard, wanda ba shi da mahimmanci kuma har ma da cutarwa.

Wasu code #7.1

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

Bari mu gudanar da rubutun sau biyu. Za mu sami kalma ɗaya sau biyu don kowane ƙoƙari na kisa, musamman ma idan muka yi kuskure wajen aiwatar da bazuwar.

Amma tsaya. Ba mu sake aika/kalma ba, to me yasa ake sake sarrafa saƙon?

Jerin layi don aika saƙonni zuwa bot yana da iyakataccen tsayi (saƙonni 100 ko 200, ina tsammanin) kuma dole ne a share shi da hannu.

Wannan ba shakka an kwatanta shi a cikin takardun, amma dole ne ku karanta shi!

A wannan yanayin, muna buƙatar sigar ?chat_id, da &lokaci, &limit, &parse_mode=HTML da &disable_web_page_preview=gaskiya ba a buƙata tukuna.

Takardun don api telegram yana nan
Yana cewa da fari da turanci:
Mai gano sabuntawa na farko da za a dawo. Dole ne ya zama mafi girma da ɗaya fiye da mafi girma a cikin masu gano sabbin abubuwan da aka karɓa a baya. Ta hanyar tsoho, sabuntawa farawa da farko
wanda ba a tantancewa ba ana dawo da sabuntawa. Ana la'akari da sabuntawa da tabbatar da zaran an kira getUpdates tare da wani biya mafi girma fiye da update_id. Za'a iya ƙayyadadden kashe-kashe mara kyau don dawo da sabuntawa farawa daga sabunta-offset daga ƙarshen layin sabuntawa. Duk abubuwan da suka gabata za a manta da su.

Mu duba:

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

Ee, kuma za mu sake saita shi kuma za mu sake rubuta aikin kaɗan. Muna da zaɓuɓɓuka guda biyu - ƙaddamar da duk saƙon zuwa aikin kuma sarrafa shi gaba ɗaya a cikin aikin, ko ba da ID ɗin saƙon kawai kuma sake saita shi. Misali, na biyu ya dubi sauki.

A baya can, “duk saƙonnin mu” igiyar tambaya ta yi kama

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

kuma zai yi kama

$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 

Babu wanda ya hana ku fara karɓar duk saƙonnin, sarrafa su, kuma kawai bayan nasarar aiwatar da buƙatar da ba a tabbatar ba -> ta tabbata.

Me yasa yake da ma'ana don kiran tabbatarwa bayan an gama duk aikin? Rashin gazawar yana yiwuwa a tsakiyar kisa, kuma idan misali na chatbot kyauta, rasa saƙo ɗaya ba wani abu bane na musamman, to idan kuna sarrafa albashin wani ko ma'amalar katin, sakamakon zai iya zama mafi muni.

Karin layukan code guda biyu

$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. Maimakon gamawa

Ayyukan asali - karanta saƙonni, sake saitin layi, karantawa daga fayil da rubutu zuwa fayil ana yin su kuma ana nunawa.

Abu hudu ne kawai ya rage a yi:

  • aika madaidaicin amsa ga buƙata a cikin taɗi
  • aika da martani ga KOWANE taɗi wanda aka ƙara bot ɗin
  • aiwatar da code a cikin madauki
  • ƙaddamar da bot daga mai tsara windows.

Duk waɗannan ayyuka suna da sauƙi kuma ana iya cika su cikin sauƙi ta hanyar karanta takaddun game da sigogi kamar
Saita-ExecutionPolicy Ba a iyakance ba da -ExecutionPolicy Ketare
sake zagayowar tsari

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

Na gode duka don karantawa.

source: www.habr.com

Add a comment