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から直接引っ越してきました
優先度1、自分かどうかをチェック
1つのロボットの返信に対して,まず,このロボットに情報を読み取った後の処理の優先度,すなわち対応する動作の前後順を設定する必要がある.間違いなく、私たちは最初のステップで受け取ったこの文contentのソースメンバーが誰なのかを検出しなければなりません.メンバーが自分であれば、応答できません.だから、以下のコードを書くことができます.
優先度2は、「マスター」メッセージかどうかを確認します
マスターを設定するのは、ロボットをいつでも「熱的に閉じる」ため、コマンドラインで閉じる必要はありません.もちろん、この優先度に追加するだけで他の機能を追加することもできます.そのため、この優先順位は主に「飼い主がロボットにメッセージを返信し続けるかどうか」を見ることです.
この優先度の内容はすべて関数内に配置され、関数の戻り値は0または1です.0であれば、主人がロボットを閉じた(または閉じた状態)ことを表し、ロボットは回復する必要はありません.1未満の場合は、飼い主を代表してロボットをオン(またはオン)にすると、ロボットは復帰することができます.
ロボットが現在位置する状態は,メッセージを受信するたびに判定する必要があるため,この状態をローカルに保存する.
masterFlagFile_名前は状態値に保存されたファイルアドレス(混乱したネーミング仕様を無視)です.場所が異なる場合は、必ずtxtファイルを作成し、初期状態を追加し、masterFlagFile_nameをあなたの住所に置き換えます.
上記のコードでは,まずmemberが空であるか,すなわちクラスタ内で言うか否かを判断し,もしそうであれば次のステップに進む.次に、メンバーのqq号が主人のqq号であるか否かを判断し、もしそうであればメッセージがクローズ(オープン)コマンドであるか否かを判断し、もしそうであればファイルに対して相応の修正を行う.
修正はjsonでファイルを修正し、ファイルの読み取りにjsonを作用する.load,書き込み操作用json.dump.この2つの使い方は上のコードからわかります.
命令の追加と削除
マスターフラッグ="1"を確定した後、私はここにいくつかの命令に関するものを挿入しました(私が当初どう思っていたのは恐らく天だけが知っていて、どうしてここでプラスするのか、怠け者で位置を変えてバグを出すのが怖いので、いっそこのようにしましょう)、主に3つの内容です:指令を追加して、命令を削除して、字語は命令ライブラリを識別します.
次のコードではsentence 1は「修正不可の全文認識命令コーパス」を表し、sentence 2は「修正可能な全文認識命令コーパス」を表し、otherSenListは単語認識命令コーパスを表す.この3つのコーパスはすべて辞書で格納され、keyは命令であり、valueは返信である.
削除命令を追加するには特定の形式があるので、私は直接この特殊な形式を探して対応する関数を呼び出します.ここで私の追加命令の形式は
削除の形式はこれと似ています.
こんなに複雑なのは、チャットの中で奇妙な形式が現れることを防止し、奇妙なバグが発生することを防止することです.しかし、CommandAddとCommandDeleteの2つの関数は私が作ったのはあまり美しくありません.個人的には正規表現で文字列を直接マッチングすれば、2つの&の間の内容を抽出するのはもっと簡単かもしれませんが、当初書くときは面倒で、正規表現を再学習する必要があるので、いっそifでやりました.
私のここのやり方は実はとても簡単で、content文字列の中のすべての文字を遍歴して、flagを運用して現在出会った&がいくつかであることを確定して、それからそれぞれkeyとvalに対して重畳して、そしてそれを文全体の識別コーパスの中に保存します.
私の中にはCannotTouch関数も運用しています.修正できない命令を指しています.結局、すべての命令が他人に修正されてめちゃくちゃになったら、それは面白くない.これは権限の問題に相当する.この関数の実装コードは次のとおりです.
小結
この1編は先にここに来て、次の内容はポイントシステム、サインシステム、天気検出など(私がここで設定した優先度で分けたもの)を始めて、文認識は私のところで一番後ろの2つの優先度なので、少し遅れて書くかもしれません.
すべてのコードはgithubに置いてあります.まだブログを書いていない内容も含めて、自分で見ることができます.
githubアドレス:https://github.com/HanpuLiang/A-Example-of-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
好きなら注目していいねとか好きだよ!