序文
私は、Taにマイクロチャネルグループチャットロボットの柔軟な設定を行うことができれば私の小さな友人の一人が尋ね、これらの日は、前に理解itchat
ライブラリを使用することを、私は容易に合意し、最終的に試作品を作った、夜を過ごしました。
次のようにプログラムを実行しているコンピュータ:
携帯電話の情報を次のように
実際には、に基づいて、itchat
マイクロチャネルロボットすでに腐った通り、ほとんどがあまりにも単純であり、比較的に言えば、私はこのプログラムは、以下のいくつかの明確な特徴があります:
1、オープン/クローズ自動返信のためのサポートは、単に開くために、メモ帳を使用して、グループチャットを指定しgroup.csv
たファイルを、あなたはグループチャット名の回答を記入自動的に開くようにしたい、敗者たびに、グループチャット名、あなたがラップする必要があります。
2、カスタム設定キーワード応答のためのサポート、ちょうど開くために、メモ帳を使用してkeyword.csv
キーワード{***、***}返信フォーマットに応じて、ファイルは、コードに変更を加えることなく追加することができます。敗者キーと値のペア、またラップ、ノート入力コンマいる必要があります。
図3に示すように、バルクメッセージング・サポートのタイミング、時間、メッセージは、プログラム実行中に動的に変更することができます。
図4は、好適にありGUI
、インターフェース前記マイクロチャネルのシンプルなデザインと基準色。
DIYプレイ
企業のための1、
商人として、メンテナンスグループは、メッセージを送信する時間を、このようなニーズを持っていることがあります。例えば
回复 xxx 可获得 yyy
、中しばらくkeyword.csv
前書かれた文書。また、同時に複数のグループを処理することができ、この方法では、あなたは彼らが必要なものをグループメンバーを作ることができ、あなたが入力する必要はありませんが、コピー&ペースト、心の平和も効率的です。
普通の人のための2、
タイミング、男性と女性の友人おやすみメッセージに祝福を送る両親。
3、アリは、展開サーバーに行きます
あなたは自動的にグループて送信メッセージとなっているバグを持つようにしたい場合は、お使いのコンピュータが開いている必要がありますが、クラウドサーバにデプロイするには、この問題を解決することができます。優先購入ポータルを与えながらの展開プロセスは、前回の記事、アリクラウドサーバーを参照することができます。
コードの詳細設計
図1に示すように、コード・アーキテクチャ
導入以来GUI
、GUI
コードブロックと質量メッセージを担当するコードブロックは、そのために、手順はここでマルチスレッド機構、導入しなければならない、閉塞されているGUI
インタフェースは、スレッドは、メインスレッドは、子スレッドで大量のメッセージを担当するコードのブロックを実行します私の間の通信には使用wxPython
ビルトインwx.lib.pubsub
モジュールの採用に対応するアクションを実行するために子スレッド一度wx.CallAfter(pub.sendMessage)
通知するメッセージを送信するインターフェイスをGUI
確保するように、スレッドをGUI
カトンを考えていないタイムリーなリフレッシュを。
図2に示すように、コードフロー
まず、オープン自動返信、返信やキーワード情報をチャットどのグループかを決定するために、適切なコンフィギュレーション・ファイルをロードします。プログラムの実行中に、この情報を動的に変更することができない理由、それはあります。
ローディング前記keyword
コードは以下の通りであります:
def load_keyword(self):
global keywords
with open('keyword.csv', 'r', encoding='utf-8', newline='') as f:
reader = csv.reader(f)
for i, line in enumerate(reader):
if i == 0:
continue
keywords[line[0]] = line[1]
keywords
渡すパラメータコールを回避するための簡単な検索のためのグローバル変数のセットは、決定されるi == 0
除去するcsv
ファイルのヘッダ情報の最初の行。
より明確な責任、コードのコメント次のコードブロックの主なバルクは、繰り返されることはありません
@itchat.msg_register(TEXT, isGroupChat=True)
def group_text(msg):
global keywords
groups = itchat.get_chatrooms(update=True)
for group in groups:
# 群的 NickName 是群名称,UserName 是群id(以两个@开始)
# Python/Java 学习交流群
if group['NickName'] in group_names: # 从群中找到指定的群聊
group_id = msg['FromUserName']
# 防止其他群消息的的干扰
if not group_id == group['UserName']:
break
# 准备回复的消息
keys = keywords.keys()
key = ''
for i in keys:
if i in msg['Text']:
key = i
break
if key == '':
return
message = keywords.get(key)
# 在消息中找到 发送人的id
sender_id = msg['ActualUserName']
# 有时 group['MemberList'] 为空,改变思路由群 id 获取群聊成员
# group_info = itchat.update_chatroom(msg['ToUserName'], detailedMember=True)
# if len(group_info) == 0:
# toUserName 是自己在群聊发消息时,群 id 在消息里的 key
# FromUserName 是别人在群里发时,群 id 在消息里的 key
group_info = itchat.update_chatroom(group_id, detailedMember=True)
memberlist = group_info['MemberList']
for member in memberlist:
# 找到消息的发送者
if member['UserName'] == sender_id:
# 如果有备注名,群聊显示的是备注名
to_user = member['RemarkName']
if len(to_user) == 0:
# 否则显示成员自己修改的在群里的昵称
to_user = member['DisplayName']
if len(to_user) == 0:
# 否则显示他微信号的昵称
to_user = member['NickName']
itchat.send_msg('@{}\n{}'.format(to_user, message), group['UserName'])
wx.CallAfter(pub.sendMessage, "update", msg="回复群聊[{}]成员[{}]成功:[{}]".format(group['NickName'],to_user,message))
タイミングと上記のコードコードより独立した責任ミサ、子スレッドが開始している間、質量の実行ロジックのタイミングを開始
def run(self):
global t
t = threading.Timer(minutes * 60, self.auto_timer)
t.start()
self.load_keyword()
self.load_group()
itchat.auto_login(hotReload=True)
itchat.run()
主要な機能の一つは、threading.Timer(minutes * 60, self.auto_timer)
それが意味スレッドの大部分を実装するための責任があり、その後、糸間隔をスレッドを開いて、何minutes * 60
秒でコールバック関数を実行するためにした後self.auto_timer
、しかし、解決策をしている、これが唯一の手立てがポーリングされていない、一度トリガすることができます実行するコールバック関数の内部で行ってthreading.Timer(minutes * 60, self.auto_timer)
、再帰呼び出しに少し似て、再帰呼び出しと異なる一切の終了条件はありませんが、ため、タイマーのメモリオーバーフローが発生しない、時間が来ると、トリガコールバック関数、このプログラムの期間は、アクティブなスレッドだけで一桁の数を実行しているように、人生のスレッドは、ここで終了します:
def auto_timer(self):
global auto_message
groups = itchat.get_chatrooms(update=True)
for group in groups:
if group['NickName'] in group_names:
itchat.send_msg('{}'.format(auto_message), group['UserName'])
wx.CallAfter(pub.sendMessage, "update",
msg="群聊[{}]定时消息:[{}]发送成功".format(group['NickName'], auto_message))
global t # 把 t 设置为全局变量
t = threading.Timer(minutes * 60, self.auto_timer)
t.start()
GUI
スペースの制約のために、コードの一部は、はみ出さないでください。
体験する方法
社会的関心号月長い小さな水の背景が返信マイクロチャネルグループロボットが得られます