端末として連絡先でチャット

「Androidを含むUnixシステム用のGO言語で記述されたWebインターフェイスを備えたシンプルなタスクマネージャー」 、Go言語、およびシンプルなステータスユーティリティの投稿に触発され、Vkontakteソーシャルネットワーク用のチャットボットを楽しい実験として作成することにしました。



チャットボットとソーシャルネットワークを選択した理由は何ですか? 楽しみのためだけに加えて、実用的な計算があります:





このユーティリティは、テキストコマンドに応答するシンプルなチャットボットです。 VKへのメッセージを自分自身に書き込み、ユーティリティは特定の頻度でVK APIをポーリングし、メッセージのリストを受け取ります。 その後、入力されたメッセージを事前定義されたテキストコマンドのリストと比較するためだけに残ります。

複雑なことはありませんが、VK APIについて知っておく必要のあるニュアンスがあります。

まず、個人メッセージにアクセスするには、VKアプリケーションをデスクトップとして登録する必要があります。 また、アクセストークンのリクエストで、プライベートメッセージにアクセスする権利とコールバック用の「空白」ページを設定します。

アクセストークンのアドレスは次のようになります。

  https://oauth.vk.com/authorize?client_id=#####&scope=offline,messages&redirect_uri=https%3A%2F%2Foauth.vk.com%2Fblank.html&display=page&v=5.28&response_type=token 


次に、1秒あたりのリクエスト数に制限があるため、メッセージは2秒のタイマーで受信されます。

c := time.Tick(2 * time.Second) lastMsgId := int64(0) for _ = range c { msgs, err := getMsgs(lastMsgId) if err != nil { fmt.Println(err) } else { if len(msgs.Response.Items) > 0 { lastMsgId = msgs.Response.Items[0].Id } for _, msg := range msgs.Response.Items { msgBody := strings.Trim(msg.Body, "") if checkVkId(msg.UserId) && checkTime(msg.Date) && checkResultPrefix(msgBody) { go doCmd(msgBody) } } } }
      
      





着信メッセージの分析とコマンドの結果の送信:



 func doSysCmd(msg string) { switch true { case strings.HasPrefix(msg, "@sys/host"): sendMsg(*vk_id, fmt.Sprintf("%+v", sysstat.GetHost())) case strings.HasPrefix(msg, "@sys/disk"): sendMsg(*vk_id, fmt.Sprintf("%+v", sysstat.GetDisk("/"))) case strings.HasPrefix(msg, "@sys/load"): sendMsg(*vk_id, fmt.Sprintf("%+v", sysstat.GetLoad())) case strings.HasPrefix(msg, "@sys/ram"): sendMsg(*vk_id, fmt.Sprintf("%+v", sysstat.GetRam())) case strings.HasPrefix(msg, "@sys"): sendMsg(*vk_id, fmt.Sprintf("\n%+v", sysstat.GetSystem("/"))) case strings.HasPrefix(msg, "@sh"): args := strings.SplitN(msg, " ", 2) if len(args) < 2 { return } fmt.Println("exec: ", args[1]) sendMsg(*vk_id, fmt.Sprintf(" %+v", sysstat.ExecShell(args[1]))) } }
      
      





システムの現在のステータスをボーナスとして取得することに加えて、次のコマンドで任意のメモを保存できます。

!list-ID番号付きの保存されたリストの出力

!add [text]-新しいエントリを追加します

!del [number]-指定されたIDのレコードを削除します


メモはメモリに排他的に保存されます。

アプリケーションのクラッシュに対する保護は提供されていませんが、重大なエラーが発生した場合にアプリケーションを再起動するスーパーバイザーの下でそのようなことを実行するために練習しました。 goプログラムのRAM消費量は従来最小限であり、約10 MB変動します。スーパーバイザーは同じ量を使用します。



githubのソース。



All Articles