Python crear un robot de chat de grupo de micro-canales (con interfaz de operador)

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 itchatuso 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:

Aquí Insertar imagen Descripción

La información sobre el teléfono de la siguiente manera:

Aquí Insertar imagen Descripción

De hecho, en base a itchatlos 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.csvel 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.csvel 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 GUIinterfaz, 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 el keyword.csvdocumento 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, GUIlos 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 GUIinterfaz 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 wxPythonincorporado en wx.lib.pubsubel 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 GUIel hilo, a fin de asegurar GUIactualización oportuna no considera Caton.

Aquí Insertar imagen Descripción

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 keywordcó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 keywordsconjunto de variables globales para su fácil recuperación, a la transmisión de parámetros de llamada que debe evitarse, se determina i == 0para eliminar csvla 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 * 60despué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

Publicado 84 artículos originales · ganado elogios 250 · Vistas de 150.000 +

Supongo que te gusta

Origin blog.csdn.net/ygdxt/article/details/89134003
Recomendado
Clasificación