Demo simple respones to group @ message

This commit is contained in:
Changhua
2022-09-25 19:15:20 +08:00
parent 71b3a14e15
commit 7d0ffbac15
14 changed files with 158 additions and 2 deletions
+39
View File
@@ -0,0 +1,39 @@
logging:
version: 1
disable_existing_loggers: True
formatters:
simple:
format: "%(asctime)s %(message)s"
datefmt: "%Y-%m-%d %H:%M:%S"
error:
format: "%(asctime)s %(name)s %(levelname)s %(filename)s::%(funcName)s[%(lineno)d]:%(message)s"
handlers:
console:
class: logging.StreamHandler
level: INFO
formatter: simple
stream: ext://sys.stdout
info_file_handler:
class: logging.handlers.RotatingFileHandler
level: INFO
formatter: simple
filename: wcai.log
maxBytes: 10485760 # 10MB
backupCount: 20
encoding: utf8
error_file_handler:
class: logging.handlers.RotatingFileHandler
level: ERROR
formatter: error
filename: errors.log
maxBytes: 10485760 # 10MB
backupCount: 20
encoding: utf8
root:
level: INFO
handlers: [console, info_file_handler, error_file_handler]
+25 -2
View File
@@ -1,11 +1,34 @@
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import sdk.wcferry as WxSDK
import time
import robot.sdk.wcferry as WxSDK
from robot.base_robot import BaseRobot
from robot.configuration import Config
class Robot(BaseRobot):
def __init__(self, sdk: WxSDK, config: Config) -> None:
super().__init__(sdk, config)
def processMsg(self, msg) -> None:
# 如果不实现本方法,则默认打印原始消息
if self.isGroupChat(msg): # 是群消息
if self.isAt(msg): # 被@
if msg.roomId in self.config.GROUPS: # 在配置的响应的群列表里
self.sendTextMsg(msg.roomId, "收到你的消息了!", msg.wxId)
def main():
print(dir(WxSDK))
robot = Robot(WxSDK, Config())
robot.initSDK()
robot.enableRecvMsg()
while True:
time.sleep(1)
# 不让进程退出,否则机器人就退出了
if __name__ == "__main__":
+65
View File
@@ -0,0 +1,65 @@
# -*- coding: utf-8 -*-
import re
import logging
class BaseRobot(object):
def __init__(self, sdk, config) -> None:
self.sdk = sdk
self.config = config
self.LOG = logging.getLogger("Robot")
def onMsg(self, msg) -> int:
try:
self.processMsg(msg)
except Exception as e:
self.LOG.error(e)
self.printRawMsg(msg)
return 0
def initSDK(self):
if self.sdk.WxInitSDK() != 0:
self.LOG.error("初始化失败")
exit(-1)
self.LOG.info("初始化成功")
self.wxid = self.sdk.WxGetSelfWxid()
def enableRecvMsg(self):
self.sdk.WxEnableRecvMsg(self.onMsg)
def sendTextMsg(self, receiver, msg, at_list=""):
# msg 中需要有 @ 名单中一样数量的 @
ats = ""
if at_list:
# 这里只简单补全数量,后续可以补充群昵称(通过 SQL 获取)
ats = " @" * len(at_list.split(","))
self.sdk.WxSendTextMsg(receiver, f"{msg}{ats}", at_list)
def isGroupChat(self, msg):
return msg.source == 1
def isAt(self, msg, exclude_at_all=True):
atall = []
atuserlist = re.findall(f"<atuserlist>.*({self.wxid}).*</atuserlist>", msg.xml)
if exclude_at_all:
atall = re.findall(f"@所有人", msg.content) # 排除@所有人
return (len(atuserlist) > 0) and (len(atall) == 0)
def printRawMsg(self, msg) -> None:
rmsg = {}
rmsg["id"] = msg.id
rmsg["self"] = msg.self
rmsg["wxId"] = msg.wxId
rmsg["roomId"] = msg.roomId
rmsg["type"] = msg.type
rmsg["source"] = msg.source
rmsg["xml"] = msg.xml
rmsg["content"] = msg.content
self.LOG.info(rmsg)
def processMsg(self, msg) -> None:
raise NotImplementedError("Method [processMsg] should be implemented.")
+29
View File
@@ -0,0 +1,29 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import yaml
import logging.config
class Config(object):
def __init__(self) -> None:
self.reload()
def _load_config(self) -> dict:
pwd = os.path.dirname(os.path.abspath(__file__))
try:
with open(f"{pwd}/config.yaml", "rb") as fp:
yconfig = yaml.safe_load(fp)
except FileNotFoundError:
with open(f"{pwd}/../config.yaml.template", "rb") as fp:
yconfig = yaml.safe_load(fp)
with open(f"{pwd}/config.yaml", "w+") as yf:
yaml.dump(yconfig, yf, default_flow_style=False)
return yconfig
def reload(self):
yconfig = self._load_config()
logging.config.dictConfig(yconfig["logging"])
self.GROUPS = yconfig["groups"]["enable"]
BIN
View File
Binary file not shown.
Executable → Regular
View File
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
View File

Before

Width:  |  Height:  |  Size: 399 KiB

After

Width:  |  Height:  |  Size: 399 KiB

Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.