qqbotロボットプログラミング例(一)

13603 ワード

qqbotロボットプログラミング例(一)
前に書く
昔から他人のグループに自動的に返信できるロボットがいるのを見て、このような機能がどのように実現されたのかを考えていましたが、その時はプログラミングに触れたことがなかったので、後でやめました.
この前、私はネットでqqbotというライブラリの紹介を見ました.興味を持ってから、私は2回試してみました.私のqqをコントロールするメッセージが面白いことに気づきました.だから、私はさらに探求して、相対的にモデルのあるロボットを作りたいと思っています.
機能の紹介
これまで、私が興味を持っていた機能をいくつか作ってきましたが、醜いですが、やっと実現しました.機能は次のように分けられます.
  • 文全体が認識され、返信される.
  • 単語が認識され、返信される.
  • 学習コマンドと返信;
  • 天気照会;
  • システムに署名します.
  • 積分システム.

  • 文全体を認識して返信するとは、誰かがメッセージAを送った場合、Aが私たちの命令ライブラリにあれば、ロボットがそれに対応する返信を行うことを意味します.
    単語認識と返信とは、誰かがメッセージAを送信し、メッセージAに単語Bが含まれている場合、ロボットがその内容を返信することを意味します.Aに複数の該当語が含まれている場合は、1番目に返信します.
    学習コマンドと返信は、すべての人が特定のフォーマットでコマンドライブラリにコマンドを追加できることです.もちろん、他人のいたずらを防ぐため、私がここに設定したのは「文全体を認識して返信する」コマンドだけを追加できるようにすることです.
    天気の検索は実はとても簡単で、特定のフォーマットを通じて検索したい都市を取得して、それから爬虫類を利用して中国の天気のネット上の相応のデータを登って、更に返事すればいいです.
    サインシステムとポイントシステムがつながっており、一人一人が毎日1回しかサインできず、相応のポイントが得られ、何度もサインすれば定量的なポイントが差し引かれます.
    ポイントシステムは現在強盗(成熟したロボットシステムに啓発されている)が可能で、他の機能はまだ開発されておらず、継続するつもりもないので、雛形を作ったに相当します.
    関連知識の範囲
    今回の内容の最も主要なのはqqbotライブラリの使い方で、ここはqqbotのGitHubで、具体的な使い方は私のここで詳しく話しません.
    私が前に作った画像認識に比べて、csvファイルをデータとして保存していたので、今回はjsonストレージに必要なファイルを新しく勉強して、前よりずっと便利になりました.
    残りは何もないはずですが、普通の内容です.
    テキストの開始
    皆さんがqqbotの使い方を簡単に理解していると仮定します.つまり、メッセージ応答関数onQQMessage(bot,contact,member,content)を自分で定義して、私たちが望んでいる機能を書くだけです.
    4つのパラメータの意味でGitHubから直接引っ越してきました
    bot     : QQBot   ,   List/SendTo/Stop/Restart    ,        
    contact : QContact   ,      ,   ctype/qq/uin/nick/mark/card/name    
    member  : QContact   ,                    ,          
    content : str   ,    

    優先度1、自分かどうかをチェック
    1つのロボットの返信に対して,まず,このロボットに情報を読み取った後の処理の優先度,すなわち対応する動作の前後順を設定する必要がある.間違いなく、私たちは最初のステップで受け取ったこの文contentのソースメンバーが誰なのかを検出しなければなりません.メンバーが自分であれば、応答できません.だから、以下のコードを書くことができます.
    def onQQMessage(bot, contact, member, content):
        #    
        '''!-------         -------!'''
        if bot.isMe(contact, member):
            print('     ')
        else:
            #     

    優先度2は、「マスター」メッセージかどうかを確認します
    マスターを設定するのは、ロボットをいつでも「熱的に閉じる」ため、コマンドラインで閉じる必要はありません.もちろん、この優先度に追加するだけで他の機能を追加することもできます.そのため、この優先順位は主に「飼い主がロボットにメッセージを返信し続けるかどうか」を見ることです.
    #    
    masterFlag = MasterCommands(bot, contact, member, content)
    if masterFlag == '1':
        #     

    この優先度の内容はすべて関数内に配置され、関数の戻り値は0または1です.0であれば、主人がロボットを閉じた(または閉じた状態)ことを表し、ロボットは回復する必要はありません.1未満の場合は、飼い主を代表してロボットをオン(またはオン)にすると、ロボットは復帰することができます.
    def MasterCommands(bot, contact, member, content):
        '''!-------       -------!'''
        masterFlagFile_name = 'C:\\Users\\vento\\Documents\\QQBotSentence\\MasterFlag.txt'
        if member != None:
            if member.qq == '798***079':
                if content == '   !   ':
                    bot.SendTo(contact, '    ,   :(')
                    with open(masterFlagFile_name, 'w') as file_obj:
                        json.dump('0', file_obj)
                        print('    0')
                elif content == '   ,   ':
                    bot.SendTo(contact, '      ')
                    with open(masterFlagFile_name, 'w') as file_obj:
                        json.dump('1', file_obj)
                        print('    1')
        with open(masterFlagFile_name) as file_obj:
            flag = json.load(file_obj)
            print('   ', flag)
        return flag

    ロボットが現在位置する状態は,メッセージを受信するたびに判定する必要があるため,この状態をローカルに保存する.
    masterFlagFile_名前は状態値に保存されたファイルアドレス(混乱したネーミング仕様を無視)です.場所が異なる場合は、必ずtxtファイルを作成し、初期状態を追加し、masterFlagFile_nameをあなたの住所に置き換えます.
         "1",          ,              。

    上記のコードでは,まずmemberが空であるか,すなわちクラスタ内で言うか否かを判断し,もしそうであれば次のステップに進む.次に、メンバーのqq号が主人のqq号であるか否かを判断し、もしそうであればメッセージがクローズ(オープン)コマンドであるか否かを判断し、もしそうであればファイルに対して相応の修正を行う.
    修正はjsonでファイルを修正し、ファイルの読み取りにjsonを作用する.load,書き込み操作用json.dump.この2つの使い方は上のコードからわかります.
    命令の追加と削除
    マスターフラッグ="1"を確定した後、私はここにいくつかの命令に関するものを挿入しました(私が当初どう思っていたのは恐らく天だけが知っていて、どうしてここでプラスするのか、怠け者で位置を変えてバグを出すのが怖いので、いっそこのようにしましょう)、主に3つの内容です:指令を追加して、命令を削除して、字語は命令ライブラリを識別します.
    次のコードではsentence 1は「修正不可の全文認識命令コーパス」を表し、sentence 2は「修正可能な全文認識命令コーパス」を表し、otherSenListは単語認識命令コーパスを表す.この3つのコーパスはすべて辞書で格納され、keyは命令であり、valueは返信である.
    '''!-------    -------!'''
    if 'Command Add' in content:
        CommandAdd(bot, contact, member, content, sentence1)
    
    '''!-------    -------!'''
    if 'Command Delete' in content:
        CommandDelete(bot, contact, member, content, sentence1)
    
    '''!-------          -------!'''
    otherSenList = {' ':['   !  , !', '  !   !', '      !'],
                    '   ':['    ?']}

    削除命令を追加するには特定の形式があるので、私は直接この特殊な形式を探して対応する関数を呼び出します.ここで私の追加命令の形式は
    Command Add!
      &    &
      &      &
    【 】
    Command Add!
      &   &
      &    ,   &

    削除の形式はこれと似ています.
    Command Delete!
      &      &
    【 】
    Command Delete!
      &   &

    こんなに複雑なのは、チャットの中で奇妙な形式が現れることを防止し、奇妙なバグが発生することを防止することです.しかし、CommandAddとCommandDeleteの2つの関数は私が作ったのはあまり美しくありません.個人的には正規表現で文字列を直接マッチングすれば、2つの&の間の内容を抽出するのはもっと簡単かもしれませんが、当初書くときは面倒で、正規表現を再学習する必要があるので、いっそifでやりました.
    def CommandAdd(bot, contact, member, content, sentence1):
        '''!-------    -------!'''
        flag = 0
        key = ''
        val = ''
        for item in content:
            if item == '&' and flag == 0:
                flag = 1
                continue
            else: flag
            key = key + item if flag == 1 and item != '&' else key
            TouchFlag = CannotTouch(bot, contact, member, content, key, sentence1)
            if TouchFlag == 1: break
            if item == '&' and flag == 1:
                flag = 2
                continue
            else: flag
            if item == '&' and flag == 2:
                flag = 3
                continue
            else: flag
            val = val + item if flag == 3 and item != '&' else val
            flag = 4 if item == '&' and flag == 3 else flag
            if flag == 4:
                sentence2[key] = val
                bot.SendTo(contact, '    ~        !',  resendOn1202=False)
                break
        else:
            bot.SendTo(contact, '            ', resendOn1202=False)
    
    def CommandDelete(bot, contact, member, content, sentence1):
        '''!-------    -------!'''
        flag = 0
        key = ''
        for item in content:
            if item == '&' and flag == 0:
                flag = 1
                continue
            else: flag
            key = key + item if flag == 1 and item != '&' else key
            TouchFlag = CannotTouch(bot, contact, member, content, key, sentence1)
            if TouchFlag == 1: break
            flag = 2 if item == '&' and flag == 1 else flag
            if flag == 2:
                sentence2.pop(key)
                bot.SendTo(contact, '    ~', resendOn1202=False)
                break
        else:
            bot.SendTo(contact, '            ', resendOn1202=False)
    

    私のここのやり方は実はとても簡単で、content文字列の中のすべての文字を遍歴して、flagを運用して現在出会った&がいくつかであることを確定して、それからそれぞれkeyとvalに対して重畳して、そしてそれを文全体の識別コーパスの中に保存します.
    私の中にはCannotTouch関数も運用しています.修正できない命令を指しています.結局、すべての命令が他人に修正されてめちゃくちゃになったら、それは面白くない.これは権限の問題に相当する.この関数の実装コードは次のとおりです.
    def CannotTouch(bot, contact, member, content, key, sentence):
        '''!-------        -------!'''
        flag = 0
        if sentence.__contains__(key):
            bot.SendTo(contact, '   ,            ~')
            flag = 1
        return flag

    小結
    この1編は先にここに来て、次の内容はポイントシステム、サインシステム、天気検出など(私がここで設定した優先度で分けたもの)を始めて、文認識は私のところで一番後ろの2つの優先度なので、少し遅れて書くかもしれません.
    すべてのコードはgithubに置いてあります.まだブログを書いていない内容も含めて、自分で見ることができます.
    githubアドレス:https://github.com/HanpuLiang/A-Example-of-qqbot
    好きなら注目していいねとか好きだよ!