razón
Ya que tengo un pequeño blog personal, y también registró algunos cursos, todos en la creación del grupo de micro-canal correspondiente, pero los grupos de códigos de micro-carta bidimensionales está cambiando, no pueden a menudo cambiado. Por lo que queremos participar en un robot canal micro, automático de micro-canales, grupo dibujo automático. Ado, en primer lugar en el mapa
Los resultados muestran
Podemos probar el efecto, el efecto es bastante palo
demanda
Otros pueden, por un código de dos dimensiones por añadir automáticamente mi amigo
Iniciativa para invitar a amigos para enviar algunos enlaces y una carta de presentación en el grupo después de la adopción de
RSVP, además del grupo pueden enviar una invitación al grupo de enlace
Todos los datos de chat para ser almacenados y pueden mostrar Web
Responder a contenido relevante basado en la información de entrada del usuario
Selección de la tecnología
python3
Frasco: framework MVC ligera
itchat: logrado micro-canal interfaces API
contenido de micro-canal relacionado con el almacenamiento: MySQL
Turing robot: llamadas a la API para las escenas activas responden
arquitectura
Yo no utilizar el frasco por defecto MVC manera se utiliza después de la realización de mi propia: una estructura jerárquica y el marco MVC clara. Estructurado de la siguiente manera
Cada carpeta tiene su propia función clara
Application.py ├── ├── común │ ├── libs │ └── modelos ├── config │ ├── base_setting.py │ ├── local_setting.py │ ├── production_setting.py ├── controladores │ index.py ├── │ ├── member.py ├── interceptores │ ├── Auth.py │ ├── errorHandler.py ├── empleos │ ├── launcher.py │ ├── movie.py │ └── tareas ├── manager.py ├── requirement.txt ├── estática │ ├── js │ └── plugins ├── plantillas │ ├── común │ ├── index.html │ ├── info.html │ └── miembro de prueba ├── └── apsch_test.py │ ├── tornado_server.py └── www.py
El logro de la fuente
Aquí el principal logro de la siguiente fuente
# - * - coding: UTF-8 - * - de aplicación solicitud de importación, db itchat importación, señal, JSON, tiempo, OS, al azar importación multiprocesamiento de ctypes c_bool importación, c_int de common.libs.tuling123.TuLingService TuLingService importación de común .libs.wxbot.WeChatBotService WeChatBotService importación de common.models.queue QueueList importación de common.libs.DateUtil importación getCurrentTime rastreo importación, solicita '' ' pitón manage.py runjob -m wechatbot / index ''' clase JobTask (): def __init __ (self): pass def ejecutar (auto, params): try: #增加重试连接次数 # Las solicitudes usando la biblioteca urllib3, la conexión predeterminada es http mantenimiento de conexión es, las solicitudes para establecer Falso cerrado. requests.session = S () s.keep_alive = False itchat.auto_login (enableCmdQR = 2, hotReload = True) Hilos = [] t_queue_consumer = multiprocessing.Process (target = syncConsumer, args = ( "t_queue_consumer",)) t_queue_consumer.daemon True = threads.append (t_queue_consumer) app.logger.info ( 'el proceso padre {0} es Running'.format (os.getpid ())) for i in range (lEN) (hilos): Hilos [I] .start () # initialize todos sus amigos, en la cola, entonces el proceso de hacer las cosas queue_msg = { 'tipo': 'amigos', '' los datos: itchat.get_friends (Actualización = True) } global_queue.put (queue_msg) ## debe tener un grupo de chat contactos guardados en el trabajo no será capaz de llegar a los #https: //github.com/littlecodersh/ItChat/issues/480 queue_msg = { 'tipo': 'Grupo', 'datos': itchat.get_chatrooms (actualización = True) } global_queue.put (queue_msg) itchat.run () la excepción excepción ERR AS: app.logger.error ( "========= itchat: RUN ======== error") el rastreo dice en voz alta.print_exc () de salida (15) @staticmethod Salir DEF (Signum, Frame):notice_users } sendmail_flag mundial app.logger.info ( "salida manualmente ~ ~") app.logger.info ( "Signum:% S, Marco:% S, sendmail_flag:% s" % (Signum, Marco, sendmail_flag)) si no se sendmail_flag: sendmail_flag = la verdadera # itchat.logout () # exit después de ejecutar la próxima vez que es necesario código de exploración con el fin de conectarse a common.libs.queue.QueueListService importación QueueListService notice_users = QueueListService.getNoticeUsers (IDS = [app.config [ 'NOTICE_WECHAT_USER'] [ 'family_host_man']]) de datos = { "MSG": "down robot micro-canal, requiere la intervención humana, reparado ~ ~", "title": "[recordar] micro canal robot hacia abajo", "notice_users": notice_users QueueListService.addQueueMsg (nombre_cola = "recordatorio", data = datos, tipo = 2) de salida (15) # http://itchat.readthedocs.io/zh/latest/ #加入图灵机器人: https: //www.kancloud .cn / Turing / web_api / 522992 #关于进程的文章: https: //mozillazg.com/2017/07/python-how-to-generate-kill-clean-zombie-process.html @ itchat.msg_register (itchat. content.INCOME_MSG) def handle_msg (msg): queue_msg = { 'tipo': 'msg', 'datos': msg } global_queue.put (queue_msg) Si msg.Type == itchat.content.TEXT y msg.FromUserName = "newsapp": si msg.Type == itchat.content.TEXT y ( "邀请" en msg.Text o "加群" en msg.Text): # Mientras tanto el grupo aditivo envió un enlace de invitación itchat.add_member_into_chatroom (get_group_id (" Joe programación pequeño mundo "), [{ 'nombre de usuario' : msg.FromUserName}], useInvitation = True) de retorno Ninguno '' ' necesidad de filtro de varias circunstancias, por ejemplo, no son dueños de su propia respuesta enviada por el '' ' tmp_msg = [] tmp_msg.append (TuLingService.getRobotAnswer (msg.Text)) tmp_msg.extend (getAd ()) msg.user.send ( "\ n-" .join (tmp_msg)) elif msg.Type == itchat.content.FRIENDS: msg.user.verify () tmp_msg = [ "Bienvenido al mundo de los robots programado pródigo ~ ~", "puede introducir quiero decir, que habrá de huevo", "blog personal: http: // www.54php.cn", "RSVP, agregar un grupo de palabras clave puede unirse al grupo", "Obtener cuenta Mu curso, por favor preste atención al número público" ] tmp_msg.extender (getAd (is_rand = FALSE)) msg.user.send ( "\ la" .join (tmp_msg) n-) itchat.send_image (app.root_path + " /web/static/images/wechat/coderonin.jpg "MSG [ 'RecommendInfo'] [ 'nombre de usuario']) itchat.send_image (app.root_path +" /web/static/images/wechat/mina.jpg", MSG [ 'RecommendInfo'] [ 'username']) # links que transmiten simultáneamente invitación a un grupo aditivo itchat.add_member_into_chatroom (get_group_id ( "Joe programación pequeño mundo"), [{ 'nombre de usuario' : msg [ 'RecommendInfo'] [ 'username']}] , useInvitation = True) elif msg.Type en [itchat.content.SYSTEM, itchat.content.NOTE]: #Nota comentarios Agregar expresadas por el contenido de los amigos pasan al otro: Si msg.Type == "Compartir" y msg.Text == " invita a unirse a un grupo de chat": Ninguno de retorno tmp_msg = [ "~ ~ yo era un niño no reconoce lo que el cabello Oh."] Tmp_msg.extend (getAd ()) msg.user.send ( "\ n" .join (tmp_msg)) de retorno Ninguno @ itchat.msg_register (itchat.content.INCOME_MSG, isGroupChat = True) def handle_group_msg (msg): app.logger.info ( "tipo: {0}, el texto: {1} "formato (msg.Type, msg.Text)) app.logger.info (msg) de retorno Ninguno def getAd (is_rand = true): ad_urls = [ " http: // t. cn / AiK3JhDK " "http://t.cn/AiK3JLD5", "http://t.cn/AiK3JqKX", "http://t.cn/AiK3JfqQ", " http://t.cn/ AiK3JXWa", "http://t.cn/AiK3JNvY", "http://t.cn/AiKS9XZR", "http://t.cn/AiK3JQe3", "http://t.cn/AiK3JuJi", "http://t.cn/AiK3JeOC", "http://t.cn/AiK3ivyk", "http://t.cn/AiK3izxl", "http://t.cn/AiK3iLVH" ] tmp_msg = [ "", "==================", "espero mucho apoyo, la preocupación pública número: CodeRonin", "pródigo clic en el artículo para apoyar la parte inferior AD:" + ad_urls [la random.randint - 1 (1, len (ad_urls).).] ] IF is_rand y la random.randint (1,10) <8:. tmp_msg = [] retorno tmp_msg # obtener un grupo de chat ID DEF get_group_id (GROUP_NAME): group_list = itchat .search_chatrooms (name = GROUP_NAME) retorno group_list [0] [ 'nombre de usuario'] Señal de salida # Trampa, por ejemplo + C de control signal.signal (signal.SIGINT, JobTask.exit) signal.signal (signal.SIGTERM, JobTask.salida) ''' Almacenada en la base de datos que utilizo el roscado, de modo asíncrono no afectar a la rentabilidad de colas y colas módulo tiene tres constructores: el FIFO cola FIFO cola de Python módulo. clase Queue.Queue (MAXSIZE) LIFO pila es similar al último out. clase queue.LifoQueue (maxsize) hay un nivel cola de prioridad más baja más en primer lugar. clase queue.PriorityQueue (MAXSIZE) '' ' Gestor = multiprocessing.Manager () global_queue = multiprocessing.Queue () sendmail_flag = multiprocessing.Value (c_bool, False) DEF syncConsumer (nombre): con app.app_context (): # http: //flask-sqlalchemy.pocoo.org/2.3/contexts/ el while True: el intento: app.logger.info ( "syncConsumer, pid:% s" % (os.getpid ())) queue_msg = global_queue.get () # Get_nowait ()阻塞等待不会 app.logger.info ( '[% s]取到了[% s]' % (nombre, queue_msg [ 'type'])) si queue_msg [ 'type'] en [ "amigos" , "grupo"]: type = 2 si queue_msg [ 'type'] == "grupo" else 1 WeChatBotService.initContact (queue_msg [ ''] de datos, tipo) elif queue_msg [ 'type'] == "msg": WeChatBotService .addHistory (queue_msg [ '']) de datos time.sleep (1) excepto Excepción como err: traceback.print_exc () salida (15)
resumen
Por medio de itchat e imágenes del robot, y luego sobre la base de python3 + Frasco MVC + MySQL puede lograr su propio micro carta robot, el proceso es muy simple, pero necesitamos tener algún conocimiento de python3 + Frasco MVC, y lo resumió en virtud de la experiencia del proyecto un conjunto de personalizada: una estructura jerárquica y, de alta concurrencia framework MVC clara.
anuncio
Si usted está interesado en aprender Python Frasco, todo el fundamento buena es débil y se puede ver en mis dos cursos, para su referencia
Python Frasco de entrada al maestro: https://coding.imooc.com/class/399.html
Construcción de un sistema de reserva applet de Python Frasco micro canal: https://coding.imooc.com/class/265.html
Dirección original: el uso de Python Frasco desarrollar micro-canal robot
Etiquetas: micro carta WeChat Robot Robot Python el frasco MOOC clase Mu
recomendación inteligente
- Mira estos 20 principales proyectos de código abierto!
- [Demo] carta micro en la pared
- Python Frasco jsonify un error decimal
- !! ¡número de línea externa Python Frasco de la entrada a los amigos con dominio
- registro de procedimientos mensaje de suscripción de conexión para las pequeñas micro-canal se detalla