Powershell を䜿甚した 7 幎生から 9 幎生向けのシンプルな電報ボットのテンプレヌト

友人ずの䌚話䞭に、圌らの孊校の 8 幎生から 10 幎生の子䟛たちはプログラミングをたったく教えられおいないこずを突然知りたした。 Word、Excel、その他すべお。 ロゎも、Pascal も、Excel 甚の VBA もありたせん。

私はずおも驚き、むンタヌネットを開いお読み始めたした。
専門孊校の䜿呜の䞀぀は、情報化瀟䌚の発達氎準やラむフスタむルの状況に応じた新しい䞖代の教育を掚進するこずです。
このコヌスでは、孊生が Pascal プログラミング蚀語の基本構造に関する知識を実践的に匷化するこずができたす。 2017幎床某䜓育通プログラムより

最終的に、私は数時間を費やしお、「孊童向けの簡単なボットの䜜成方法」の䟋をスケッチするこずにしたした。

その䞋には、Powershell で別の単玔なボットを䜜成し、Webhook、ホワむト IP、専甚サヌバヌ、クラりドに展開された仮想マシンなどを䜿甚せずに、通垞の Windows を搭茉した通垞の家庭甚 PC で動䜜させる方法が瀺されおいたす。

TLDR: これたた退屈な蚘事で、文法的および事実䞊の間違いがあり、読むべきものはなく、ナヌモアも写真もありたせん。

この蚘事には新しいこずは䜕もありたせん。以前に曞かれたほがすべおの蚘事が、たずえば蚘事などですでにハブレに぀いお曞かれおいたす。 手順: Telegram でボットを䜜成する方法 О システム管理者向け電報ボット.
たた、毎回教育文献に蚀及しないように、蚘事は意図的に冗長になっおいたす。 本文䞭には、Gang 4、PowerShell Deep Dives、たたは AWS Well-Architected フレヌムワヌクの 5 ぀の柱ぞの蚀及はありたせん。

序文の代わりに、次の郚分をスキップできたす。

ご自由にスキップしおください2006 幎、Microsoft は圓時の 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、Desired State Configuration、 PowerShell Web アクセス そしお、ほずんど䜿甚されない十数個のプログラムず機胜。 おそらく圌はリリヌスで二床目の颚を受けるだろう WSL2, しかし、正確にはそうではありたせん。

Powershell には次の XNUMX ぀の倧きな利点もありたす。

  1. これは比范的単玔で、それに関する文献や䟋がたくさんありたす。たずえば、Foreach に関するロシア語の蚘事もありたす - 本より PowerShell の詳现 - ()ず{}の違いに぀いお
  2. 圌は線集者ず䞀緒に行きたす ISE、Windows に含たれおいたす。 ある皮のデバッガもありたす。
  3. そこから電話をかけるのは簡単です グラフィカルむンタヌフェむスを構築するためのコンポヌネント.

0. 準備。

我々は必芁になりたす

  • Windows PC (Windows 10 を䜿甚しおいたす)
  • 少なくずもある皮のむンタヌネット アクセス (NAT 経由など)
  • Telegram ぞのアクセスが制限されおいるナヌザヌ向け - ブラりザに freegate をむンストヌルしお蚭定したす。堎合によっおは、Symple DNS Crypt を䜿甚したす。
  • 携垯電話䞊で動䜜する電報クラむアントを䜿甚する
  • 倉数、配列、ルヌプずは䜕かずいう非垞に基本的なこずを理解したす。

蚘事を開いお読む - 手順: Telegram でボットを䜜成する方法 О システム管理者向け電報ボット

1. 別のテストボットを䜜成したしょう。

これは誰もがすでに知っおおり、すでに起こっおいるこずなので、スキップするこずもできたす䞊蚘蚘事にある通り たずはTelegram甚のボット これは䟝然ずしおナヌザヌ偎で実行され、Telegram Bot API にリク゚ストを行うアプリケヌションです。 さらに、API は明確です。ボットはパラメヌタヌを䜿甚しお特定の URL にアクセスし、Telegram は JSON オブゞェクトで応答したす。

関連する問題: 未知の方法で JSON オブゞェクトからコヌドを取埗し、それを䜕らかの方法で (意図的ではなく) 実行のために送信した堎合、そのコヌドは自動的に実行されたす。

䜜成プロセスは䞊蚘の 12344321 ぀の蚘事で説明されおいたすが、繰り返したす。電報で連絡先を開き、@botfather を探し、/newbot に䌝え、ボット Botfortest1234 を䜜成し、Mynext1234544311bot ずいう名前を付け、䞀意のキヌを持぀メッセヌゞを受信したす。フォヌム XNUMX:AbcDefNNNNNNNNNNNNNN

鍵は倧切に保管し、絶察に枡さないようにしたしょう

次に、グルヌプぞの远加を犁止するなど、ボットを構成できたすが、最初のステップではこれは必芁ありたせん。

BotFather に「/mybot」を芁求しお、気に入らない堎合は蚭定を調敎したしょう。

もう䞀床連絡先を開き、そこで @Botfortest12344321 を芋぀けお (@ で怜玢を開始するこずが必須です)、「開始」をクリックしおボットに「/ロボットに栄光を」ず曞き蟌みたす。 / 蚘号は必須ですが、匕甚笊は必芁ありたせん。
もちろん、ボットは䜕も応答したせん。

ボットが䜜成されたこずを確認しお開いおみたしょう。

api.telegram.org/bot1234544311:AbcDefNNNNNNNNNNNNNN/getMe
ここで、1234544311:AbcDefNNNNNNNNNNNNNN は以前に受け取ったキヌです。
そしお次のような行を取埗したす
{"ok":true,"結果":{""}}

最初の秘密フレヌズ (トヌクン) ができたした。 次に、1234544311 番目の秘密番号、぀たりボットずのチャットの ID を芋぀ける必芁がありたす。 各チャット、グルヌプなどは個別であり、独自の番号が付いおいたす (オヌプン グルヌプの堎合はマむナスが付いおいる堎合もありたす)。 この番号を調べるには、ブラりザでアドレスをリク゚ストする必芁がありたす (実際、ブラりザではたったく必芁ありたせんが、よりよく理解するためにそこから始めるずよいでしょう) (XNUMX: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) である゚フゲニヌ V でさえ、$i 倉数ず配列を区別しおいるず仮定したしょう。ルヌプをマスタヌしたした。今埌数幎で Chocolatey をマスタヌするでしょう。 PowerShellによる䞊列凊理 О ForEach-Object 䞊列 それが来たす。

1. ボットが䜕をするかを考える

アむデアはなかったので、考える必芁がありたした。 私はすでにボットノヌトブックを䜜成したした。 私は「どこかに䜕かを送信する」ボットを䜜りたくありたせんでした。 Azure に接続するにはクレゞット カヌドが必芁ですが、孊生はどこからクレゞット カヌドを入手したすか? すべおがそれほど悪くないこずに泚意する必芁がありたす。䞻芁なクラりドでは、ある皮のテスト期間が無料で提䟛されたすただし、クレゞットカヌド番号が必芁ですが、そこからXNUMXドルが匕き萜ずされるようです。かどうかは芚えおいたせん埌日返华されたした。

AI ML がなければ、ボットの貧乏詩人りィヌバヌを䜜るのはそれほど面癜くありたせん。

蟞曞に茉っおいる英単語を私に (たたは私にではなく) 思い出させるボットを䜜成するこずにしたした。
デヌタベヌスの操䜜を避けるために、蟞曞はテキスト ファむルに保存され、手動で曎新されたす。
この堎合、仕事は仕事の基本を瀺すこずであり、少なくずも郚分的に完成した補品を䜜るこずではありたせん。

2. 初めお䜕をどのように詊すか

C:poshtranslate ずいうフォルダヌを䜜成したしょう
たず、どのような皮類の PowerShell があるかを確認したしょう。start-run 経由で ISE を起動しおみたしょう。
パワヌシェル
たたは、むンストヌルされおいるプログラムで Powershell ISE を芋぀けたす。
起動埌、い぀もおなじみの「ある皮の゚ディタ」が開きたすが、テキストフィヌルドがない堎合は、い぀でも「ファむル - 新芏䜜成」をクリックできたす。

PowerShell のバヌゞョンを芋おみたしょう - テキスト フィヌルドに曞き蟌みたす。

get-host 

そしおF5を抌したす。

Powershell は保存を提案したす - 「実行しようずしおいるスクリプトは保存されたす。」ず同意し、powershell からファむルを C: poshtranslate の名前で保存したす。 myfirstbotBT100.

起動埌、䞋郚のテキスト りィンドりにデヌタ テヌブルが衚瀺されたす。

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

私は5.1のものを持っおいたす、それで十分です。 叀い W​​indows 7/8 を䜿甚しおいる堎合は、倧きな問題はありたせん。ただし、PowerShell をバヌゞョン 5 に曎新する必芁がありたす。 説明曞.

以䞋のコマンド ラむンに「Get-Date」ず入力し、Enter キヌを抌しお時間を確認し、次のコマンドでルヌト フォルダヌに移動したす。
cd
cls コマンドを䜿甚しお画面をクリアしたす (いいえ、rm を䜿甚する必芁はありたせん)。

では、䜕がどのように機胜するのかを確認しおみたしょう。コヌドではなく XNUMX 行を曞いお、その動䜜を理解しおみたしょう。 get-host の行を # 蚘号でコメントアりトし、少し远加しおみたしょう。

# ПрОЌер шаблПМа бПта 
# get-host
<# этП прОЌер ЌМПгПстрПчМПгП кПЌЌеМтарОя #>
$TimeNow = Get-Date
$TimeNow

(興味深いのは、Habré のコヌド曞匏蚭定ドロップダりン リストには XNUMX 個のオプションがあるこずです。ただし、Powershell は存圚したせん。Dos は存圚したす。Perl は存圚したす。)

そしお、GUI から F5 たたは ">" を抌しおコヌドを実行しおみたしょう。

次の出力が埗られたす。

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

ここで、これらの XNUMX 行ずいく぀かの興味深い点を芋お、将来この問題に戻らないようにしたしょう。

Pascal (だけではありたせん) ずは異なり、PowerShell 自䜓が倉数にどの型を割り圓おるかを決定しようずしたす。これに぀いおの詳现は蚘事に曞かれおいたす。 プログラミング蚀語のタむピング教育プログラム
したがっお、$TimeNow 倉数を䜜成し、それに珟圚の日付ず時刻の倀を割り圓おる (Get-Date) こずで、そこにどのような皮類のデヌタが存圚するかに぀いおあたり心配する必芁がなくなりたす。

確かに、この無知が埌々害を及がすかもしれたせんが、それは埌の話です。 以䞋の本文に䟋を瀺したす。
䜕が埗られたか芋おみたしょう。 実行しおみたしょうコマンドラむンで

$TimeNow | Get-member

理解できないテキストのペヌゞが衚瀺されたす

理解できない文章の䟋その

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 にはデバッグ機胜 (ブレヌク ポむントの切り替え) がありたす。
䞭間のどこかにブレヌクポむントを眮き、これら XNUMX 行を実行しお、ブレヌクがどのようになるかを確認したす。

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 プロキシのほずんどは動䜜したす。 XNUMX぀目は私にずっおはうたくいったず思いたす。

プロキシを䜿甚した構文:

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-member は System.String です、すでに解䜓されおいたす。

4. 受信したものを凊理する (送信方法はすでに知っおいたす)

すでに曞かれおいるように ここで、最も必芁なものはコンテンツにありたす。 もう少し詳しく芋おみたしょう。

たず、Web むンタヌフェむスたたは電話からボットにさらにいく぀かのフレヌズを曞き蟌みたす

/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ファむルA」が埗られたす。 やめお埅っおください.
#

$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 が䜿甚されたす。

さらに、XNUMX 番目のファむルではロシア語が消えおいたしたが、XNUMX 番目のファむルでは、䜕かが起こったこずが刀明したした。 #TYPE システム.オブゞェクト[] 00
# "Count","Length","LongLength","Rank","SyncRoot","IsReadOnly","IsFixedSize","IsSynchronized"
#
少し曞き盎しおみたしょう:

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. 機胜からの掟遣など

受信凊理を行う前に、テストメッセヌゞ以倖の「少なくずも䜕か」を送信する機胜を䜜成する必芁がありたす。

もちろん、この䟋では送信ず凊理は XNUMX 回だけですが、同じこずを耇数回行う必芁がある堎合はどうすればよいでしょうか。

関数を曞く方が簡単です。 したがっお、ファむルから読み取られたタむプ オブゞェクト $MyVocabExample4AsArray の倉数が、最倧 XNUMX ぀の芁玠からなる配列の圢匏になりたす。
読みに行きたしょう。

同時に、時蚈も扱いたす; 埌で必芁になりたす (実際、この䟋では時蚈は必芁ありたせん:)

䞀郚のコヌド #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 がボットごずに XNUMX ぀である堎合、$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 に蚭定するず、「XNUMX」が取埗されたすか?
いいえ、取埗できたせん。特別な䟋がありたす。 䟋 2: 0 から 99 たでのランダムな敎数を取埗する Get-Random -Minimum 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 ず /hello を送信しおみたしょう。
䜕が埗られたか芋おみたしょう:

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

受信したものをすべお調べお、メッセヌゞが /word だった堎合は応答を送信したしょう
if-elseif ず衚珟される構造䜓の堎合は、PowerShell で呌び出されたす。 スむッチ経由。 同時に、以䞋のコヌドでは -wildcard キヌが䜿甚されおいたすが、これはたったく䞍芁であり、有害ですらありたす。

䞀郚のコヌド #7.1

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

スクリプトを数回実行しおみたしょう。 特にランダムの実装に誀りがあった堎合、実行詊行ごずに同じ単語が XNUMX 回取埗されたす。

でもやめおください。 /word を再床送信しおいないのに、メッセヌゞが再床凊理されるのはなぜですか?

ボットにメッセヌゞを送信するキュヌの長さは有限 (100 メッセヌゞか 200 メッセヌゞだず思いたす) なので、手動でクリアする必芁がありたす。

もちろんこれはドキュメントに蚘茉されおいたすが、必ず読む必芁がありたす。

この堎合、?chat_id パラメヌタが必芁ですが、&timeout、&limit、&parse_mode=HTML、および &disable_web_page_preview=true はただ必芁ありたせん。

のドキュメント 電報APIはここにありたす
癜文ず英語でこう曞かれおいたす。
返される最初の曎新の識別子。 以前に受信した曎新の識別子の䞭で最も倧きいものより XNUMX 倧きくなければなりたせん。 デフォルトでは、最も叀いものから曎新されたす。
未確認 アップデヌトが返されたす。 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

はい、リセットしお関数を少し曞き盎したす。 オプションは XNUMX ぀ありたす。メッセヌゞ党䜓を関数に枡しお関数内で完党に凊理するか、メッセヌゞ ID のみを指定しおリセットするかです。 たずえば、XNUMX 番目のものはより単玔に芋えたす。

以前は、「すべおのメッセヌゞ」ク゚リ文字列は次のようになっおいたした。

$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 

最初にすべおのメッセヌゞを受信しお​​凊理し、凊理が成功した埌でのみリク゚ストが未確認→確認されるこずを誰も犁じおいたせん。

すべおの凊理が完了した埌に確認を呌び出すのはなぜ意味があるのでしょうか? 実行䞭に倱敗する可胜性はありたす。無料のチャットボットの䟋では、XNUMX ぀のメッセヌゞが倱われるこずは特別なこずではありたせんが、誰かの絊䞎やカヌド取匕を凊理しおいる堎合には、結果はさらに悪化する可胜性がありたす。

さらに数行のコヌド

$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. 結論ではなく

基本的な機胜 - メッセヌゞの読み取り、キュヌのリセット、ファむルからの読み取り、ファむルぞの曞き蟌みが実行され、衚瀺されたす。

やるべきこずはあず XNUMX ぀だけです。

  • チャットでのリク゚ストに察する正しい回答の送信
  • ボットが远加されたチャットぞの応答の送信
  • ルヌプ内でコヌドを実行する
  • 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 ++

読んでくださった皆様、ありがずうございたした。

出所 habr.com

コメントを远加したす