Uso Flask Python desarrollar robot de micro-canales

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


5.jpg


tiny.jpg


web_tiny.png

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



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

Supongo que te gusta

Origin www.cnblogs.com/apanly/p/12446267.html
Recomendado
Clasificación