Uso Python Garrafa desenvolver robô microcanal

razão

Desde que eu tenho um pequeno blog pessoal, e também gravou alguns cursos, todos no estabelecimento do grupo de micro-canal correspondente, mas os grupos de códigos bidimensionais micro-letra está mudando, eles não podem, muitas vezes alterado. Por isso, queremos envolver em um robô canal micro, micro-automática de canais, grupo desenho automático. Ado, primeiro no mapa

Os resultados mostram

Podemos tentar o efeito, o efeito é muito pau


5.jpg


tiny.jpg


web_tiny.png

demanda

  • Outros podem, por um código bidimensional por adicionar automaticamente meu amigo

  • Iniciativa de convidar amigos para enviar alguns links e uma carta de apresentação para o grupo após a adopção da

  • De RSVP, além de grupo pode enviar um convite para a ligação de grupo

  • Todos os dados de bate-papo para ser armazenado e pode exibir Web

  • Responder a conteúdos relevantes com base em informações de entrada do usuário

Seleção tecnologia

  • python3

  • Flask: framework MVC leve

  • itchat: interfaces API micro-canal conseguida

  • conteúdo de micro-canal relacionado ao armazenamento: MySQL

  • Turing robô: chamadas de API para cenas activas responder

arquitetura

Eu não uso o frasco padrão MVC maneira usado após a realização do meu próprio: uma estrutura hierárquica e framework MVC clara. Estruturado como se segue

Cada pasta tem o seu próprio papel claro

Application.py ├── 
├── comum 
│ ├── libs 
│ └── modelos 
├── configuração 
│ ├── base_setting.py 
│ ├── local_setting.py 
│ ├── production_setting.py 
├── controladores 
│ index.py ├── 
│ ├── member.py 
├── interceptores 
│ ├── Auth.py 
│ ├── errorHandler.py 
├── empregos 
│ ├── launcher.py 
│ ├── movie.py 
│ └── tarefas 
├── manager.py 
├── requirement.txt 
├── estática 
│ ├── js 
│ └── plugins 
├── modelos 
│ ├── comum 
│ ├── index.html 
│ ├── info.html 
│ └── membro 
├── teste
└── apsch_test.py │ 
├── tornado_server.py 
└── www.py


fonte de alcançar

Aqui, a principal realização do seguinte fonte

# - * - coding: utf-8 - * - 
de aplicativo aplicativo de importação, db 
itchat importação, sinal, json, o tempo, os, aleatório 
importação multiprocessamento 
de ctypes c_bool importação, c_int 

de common.libs.tuling123.TuLingService TuLingService importação 
de comum .libs.wxbot.WeChatBotService importação WeChatBotService 
de QueueList common.models.queue importação 
de common.libs.DateUtil importação getCurrentTime 
rastreamento de importação, pede 



'' ' 
python manage.py runjob -m wechatbot / índice 
''' 
classe JobTask (): 
    def __init __ (self): 
        passar 

    def execute (self, params): 
        try: 
            #增加重试连接次数
            # Solicitações usando biblioteca urllib3, a conexão padrão http é keep-alive é, as solicitações para definir Falso fechado. 
            requests.session = S () 
            s.keep_alive = Falso 

            itchat.auto_login (enableCmdQR = 2, hotReload = TRUE) 

            Fios = [] 
            t_queue_consumer = multiprocessing.Process (alvo = syncConsumer, args = ( "t_queue_consumer",)) 
            t_queue_consumer.daemon True = 
            threads.append (t_queue_consumer) 


            app.logger.info ( 'o processo pai {0} é Running'.format (os.getpid ())) 
            for i in range (lEN (Threads)): 
                Threads [I] .start () 


            # inicializar todos os seus amigos, para a fila, então o processo de fazer as coisas 
            queue_msg = { 
                'tipo': 'amigos',
                'Os dados': itchat.get_friends (update = true) 
            } 
            global_queue.put (queue_msg) 

            ## deve demorar contatos grupo de chat guardados para o trabalho não será capaz de chegar aos 
            #https: //github.com/littlecodersh/ ItChat / DELINQUÊNCIA / 480 
            queue_msg = { 
                'type': 'Grupo', 
                'dados': itchat.get_chatrooms (Update = True) 
            } 
            global_queue.put (queue_msg) 


            itchat.run () 
        a salvo exceção como ERR: 
            app.logger.error ( "========= itchat: erro ========") 
            traceback.print_exc () 
            Exit (15) 


 
    @staticmethod
    DEF Exit (Signum, frame):
        sendmail_flag mundial
        app.logger.info ( "saída manualmente ~ ~") 
        app.logger.info ( "Signum:% S, moldura:% S, sendmail_flag:% S" % (Signum, Frame, sendmail_flag)) 
        se não sendmail_flag: 
            sendmail_flag = verdadeiro 
            # itchat.logout () # exit depois de executar a próxima vez que é necessário código de verificação, a fim de login 
            de common.libs.queue.QueueListService Import QueueListService 
            notice_users = QueueListService.getNoticeUsers (IDS = [o app.config [ 'NOTICE_WECHAT_USER'] [ 'family_host_man']]) 
            dados = { 
                "MSG": "para baixo robô micro-canal, requer intervenção humana, reparado ~ ~", 
                "título": "[lembrar] micro canal robô para baixo", 
                "notice_users": notice_usersnotice_users 
            }
            QueueListService.addQueueMsg (queue_name = "lembrança", os dados = dados, tipo = 2) 
        de saída (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 = { 
        'type': 'msg', 
        'dados': msg 
    } 
    global_queue.put (queue_msg) 

    ! se msg.Type == itchat.content.TEXT e msg.FromUserName = "NewsApp": 

        se msg.Type == itchat.content.TEXT e ( "邀请" em msg.Text ou "加群" em msg.Text):
            # Grupo Enquanto isso aditivo enviou um link de convite 
            itchat.add_member_into_chatroom (get_group_id (" Joe programação pequeno mundo "), [{ 'username' : msg.FromUserName}], 
                                            useInvitation = True) 
            retorno Nenhum 
        '' ' 
        necessidade de filtrar várias circunstâncias, por exemplo, não possuir sua própria resposta enviada pelo 
        '' ' 
        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 = [ 
            "Bem-vindo ao mundo de robôs programados pródigo ~ ~", 
            "você pode entrar Eu quero dizer, não haverá ovo", 
            "blog pessoal: http: // www.54php.cn",
            "RSVP, adicione um grupo de palavras-chave pode se juntar ao grupo", 
            "Obter conta Mu Course, por favor, preste atenção ao número pública"  
        ] 
        tmp_msg.estender (getAd (is_rand = FALSE))
        msg.user.send ( "\ o" .join (tmp_msg) n-) 
        itchat.send_image (app.root_path + " /web/static/images/wechat/coderonin.jpg "MSG [ 'RecommendInfo'] [ 'username']) 
        itchat.send_image (app.root_path +" /web/static/images/wechat/mina.jpg", MSG [ 'RecommendInfo'] [ 'username']) 
        ligações # transmitindo simultaneamente aditivo convite grupo 
        itchat.add_member_into_chatroom (get_group_id ( "Joe programação pequeno mundo"), [{ 'username' : msg [ 'RecommendInfo'] [ 'username']}] , useInvitation = True) 
    elif msg.Type em [itchat.content.SYSTEM, itchat.content.NOTE]: 
        comentários Adicionar #note expressas pelos conteúdos de amigos 
        passar 
    o resto:
        se msg.Type == "Sharing" e msg.Text == " convida-o a participar de um chat em grupo":
            retorno Nenhum
        "http://t.cn/AiK3JQe3",
 
        tmp_msg = [ "~ ~ eu era criança não reconhece o seu cabelo Oh."] 
        Tmp_msg.extend (getAd ())
        msg.user.send ( "\ n" .join (tmp_msg)) 
    retorno Nenhum 


@ itchat.msg_register (itchat.content.INCOME_MSG, isGroupChat = True) 
def handle_group_msg (msg): 
    app.logger.info ( "tipo: {0 }, texto: {1} "formato (msg.Type, msg.Text)). 
    app.logger.info (msg) 
    de retorno Nenhum 

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/AiK3JuJi",
        "http://t.cn/AiK3JeOC",
        "Http://t.cn/AiK3ivyk", 
        "http://t.cn/AiK3izxl", 
        "http://t.cn/AiK3iLVH" 
    ] 

    tmp_msg = [ 
        "", 
        "======= =========== " 
        "esperamos muito apoio, o número de preocupação pública: CodeRonin", 
        " clique pródigo sobre o artigo para apoiar o AD bottom: "+ ad_urls [random.randint ( 1, len (ad_urls)) . - 1] 
    ] 

    . IF is_rand eo random.randint (1,10) <8: 
        tmp_msg = [] 

    retorno tmp_msg 

# obter um grupo de chat ID 
DEF get_group_id (GROUP_NAME): 
    GROUP_LIST = itchat.search_chatrooms (name = GROUP_NAME) 
    retorno GROUP_LIST [0] [ 'username'] 

sinal de saída # armadilha, por exemplo, + C Controlo 
 
signal.signal (signal.SIGINT, JobTask.exit)
signal.signal (signal.SIGTERM, JobTask.exit) 

'''
Armazenados no banco de dados Eu uso segmentação, de modo assíncrono não afeta o retorno 
fila e fila módulo tem três construtores: 
o FIFO fila FIFO Python fila módulo. classe Queue.Queue (MAXSIZE) 
LIFO pilha é semelhante ao último a sair. classe queue.LifoQueue (maxsize) 
existe um nível fila de prioridade inferior mais para fora em primeiro lugar. classe queue.PriorityQueue (MAXSIZE) 
'' ' 
Gestor = multiprocessing.Manager () 
global_queue = multiprocessing.Queue () 
sendmail_flag = multiprocessing.Value (c_bool, False) 
DEF syncConsumer (nome): 
    com app.app_context (): # HTTP: //flask-sqlalchemy.pocoo.org/2.3/contexts/ 
        o while True: 
            a tentativa: 
                app.logger.info ( "syncConsumer, pid:% s" % (os.getpid ())) 
                queue_msg = global_queue.get ()
                # Get_nowait ()阻塞等待不会
                app.logger.info ([ 'type']) '[% s]取到了[% s]' % (name, queue_msg) 
                se queue_msg [ 'type'] em [ "amigos" , "grupo"]: 
                    tipo = 2 se queue_msg [] == "grupo" 'tipo' else 1 
                    WeChatBotService.initContact (queue_msg [ 'dados'], tipo) 

                elif queue_msg [ 'tipo'] == "msg": 
                    WeChatBotService .addHistory (queue_msg [ 'dados']) 
                time.sleep (1) 
            , com excepção de excepção como err: 
                traceback.print_exc () 
                saída (15)


resumo

Por meio de itchat e imagens do robô, em seguida, com base em Python3 + Flask MVC + MySQL pode atingir o seu próprio micro carta robô, o processo é bastante simples, mas é preciso ter algum conhecimento de Python3 + Flask MVC, e eu resumiu sob a experiência do projeto um conjunto de personalizado: uma estrutura hierárquica e alta concorrência quadro claro, MVC.

propaganda

Se você estiver interessado em aprender Python Flask, toda a boa base é fraca e você pode olhar para os meus dois cursos, para sua referência



Endereço Original: uso Python Flask desenvolver micro-canais robô
Tags: micro carta    WeChat    Robot    Robot    Python    a garrafa    MOOC    classe Mu   

recomendação inteligente

Acho que você gosta

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