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
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
Python Flask de entrada para o mestre: https://coding.imooc.com/class/399.html
Construção de um Python Flask sistema de reservas applet de micro canais: https://coding.imooc.com/class/265.html
Endereço Original: uso Python Flask desenvolver micro-canais robô
Tags: micro carta WeChat Robot Robot Python a garrafa MOOC classe Mu