prefacio
En estos días uno de mis pequeños amigos me preguntó si podía hacer para Ta una configuración flexible de la micro-canales robot de chat de grupo, antes de que entendieron el itchat
uso de la biblioteca, acepté de buena gana, y pasé una noche, finalmente hizo un prototipo.
Un equipo que ejecuta el programa de la siguiente manera:
La información sobre el teléfono de la siguiente manera:
De hecho, en base a itchat
los robots de micro-canal de la calle ya podrido, pero la mayoría son demasiado simples, comparativamente hablando, tengo este programa tiene los siguientes varias características distintivas:
1, el apoyo a cerca de chat de grupo especificado respuesta abierta / automático, basta con utilizar el Bloc de notas para abrir group.csv
el archivo, que desea abrir rellenar automáticamente en respuesta a un nombre de grupo de chat, perdedores cada vez que un nombre de chat de grupo, debe envolver.
2, el apoyo a la respuesta ajustes personalizados palabras clave, sólo tiene que utilizar el Bloc de notas para abrir keyword.csv
el archivo, de conformidad con la palabra clave {***, ***} responde también se pueden agregar sin tener que realizar ningún cambio en el código. Perdedores un par clave-valor, abrigo también es necesario, cabe destacar que la coma de entrada.
3, el momento de soporte de mensajería a granel, y el tiempo, el mensaje se puede modificar de forma dinámica durante la ejecución del programa.
4, no es favorablemente GUI
interfaz, en el que el color de referencia con un diseño simple de la micro-canal.
juego de bricolaje
1, para las empresas
Como comerciante, cuando el grupo de mantenimiento puede tener este tipo de necesidades, el tiempo para enviar un mensaje. Por ejemplo
回复 xxx 可获得 yyy
, mientras que en elkeyword.csv
documento previamente escrito. De esta manera, puede hacer que los miembros del grupo lo que necesitan, y no es necesario el tipo, copiar y pegar, también puede manejar varios grupos al mismo tiempo, la paz de la mente también es eficiente.
2, para las personas ordinarias
El tiempo, los padres que envían bendiciones a los mensajes de la buena noche amigos y amigas.
3, Ali va al servidor de despliegue
Si usted quiere tener un error que ha sido automáticamente mensaje enviado grupo, el equipo debe haber sido abierto, pero implementar en el servidor de la nube puede resolver este problema. proceso de implementación puede hacer referencia a mi artículo anterior, servidor de la nube Ali mientras que da portal de adquisición preferente.
El diseño detallado del código
1, la arquitectura de código
Desde la introducción GUI
, GUI
los bloques de código y bloques de código responsable de mensajes en masa, son obstructiva, a tal fin, deben establecerse procedimientos mecanismo multi-roscado, en el que la GUI
interfaz es el hilo principal, ejecute un bloque de código responsable de mensaje masa en un hilo de niño, el hilo la comunicación entre uso el wxPython
incorporado en wx.lib.pubsub
el módulo, una vez que el hilo hijo para realizar la acción correspondiente en la adopción de wx.CallAfter(pub.sendMessage)
la interfaz para enviar mensajes para notificar GUI
el hilo, a fin de asegurar GUI
actualización oportuna no considera Caton.
2, el flujo de código
En primer lugar, cargar el archivo de configuración apropiada para determinar qué grupo de chat de respuesta automática abierta, responder e información de palabras clave. Por eso, durante la ejecución del programa, esta información no se puede cambiar dinámicamente.
En el que la carga de keyword
código es el siguiente:
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]
El keywords
conjunto de variables globales para su fácil recuperación, a la transmisión de parámetros de llamada que debe evitarse, se determina i == 0
para eliminar csv
la primera línea de la información del encabezado del archivo.
El grueso del bloque de código siguiente responsables, comentarios de código más claras, no se repetirá
@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))
Masa responsable de la sincronización y el código de código más independiente, mientras que los hilos de niños empezaron, iniciar el cronometraje de la lógica de ejecución de la masa
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()
Una de las principales funciones es threading.Timer(minutes * 60, self.auto_timer)
, lo que significa es responsable de implementar el grueso del hilo, y luego abrir un hilo, el intervalo de hilo minutes * 60
después de segundos para ejecutar una función de devolución de llamada self.auto_timer
, pero esto sólo puede activarse una vez, de ninguna manera ha sido el sondeo, la solución está en ir dentro de la función de devolución de llamada a realizar threading.Timer(minutes * 60, self.auto_timer)
, un poco similar a la llamada recursiva, y es diferente de la llamada recursiva hay condición de terminación, pero no produce desbordamiento de la memoria debido al temporizador, llega el momento y una función de devolución de llamada de activación, este hilo de la vida termina aquí, por lo que la duración del programa se está ejecutando, el número de hilos activos dígitos acaba individuales:
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
Debido a las limitaciones de espacio parte del código, no aparecen.
Cómo experimentar
La preocupación pública Nº meses de duración pequeña de agua fondo replica robot grupo de micro-canales puede ser obtenida