Utilisation python Flask développer robot de micro-canal

raison

Depuis que je suis un petit blog personnel, et a également enregistré des cours, le tout sur la mise en place du groupe micro-canal correspondant, mais les groupes en deux dimensions micro-code lettre est en train de changer, ils ne peuvent pas souvent changé. Donc, nous voulons engager dans un robot micro de canal, micro-canal automatique, groupe de dessin automatique. Ado, d'abord sur la carte

Les résultats montrent

Nous pouvons essayer l'effet, l'effet est tout à fait bâton


5.jpg


tiny.jpg


web_tiny.png

demande

  • D'autres peuvent, par un code à deux dimensions par ajouter automatiquement mon ami

  • Initiative d'inviter des amis à envoyer des liens et une lettre d'introduction dans le groupe après l'adoption de

  • RSVP, plus le groupe peut envoyer une invitation dans le lien du groupe

  • Toutes les données de chat à stocker et peuvent afficher Web

  • Répondre au contenu pertinent en fonction des informations d'entrée utilisateur

Sélection de la technologie

  • python3

  • Flask: framework MVC léger

  • itchat: interfaces API obtenu micro-canaux

  • MySQL: liée au stockage de contenu micro-canal

  • Turing robot: appels API pour les scènes actives répondent

architecture

Je n'ai pas utilisé le flacon de méthode par défaut MVC utilisé après la réalisation de mon propre: une structure hiérarchique et d'un cadre clair MVC. Structuré comme suit

Chaque dossier a son propre rôle clair

Application.py ├── 
├── commune 
│ ├── libs 
│ └── modèles 
├── config 
│ ├── base_setting.py 
│ ├── local_setting.py 
│ ├── production_setting.py 
├── contrôleurs 
│ index.py ├── 
│ ├── member.py 
├── intercepteurs 
│ ├── Auth.py 
│ ├── errorHandler.py 
├── emploi 
│ ├── launcher.py 
│ ├── movie.py 
│ └── tâches 
├── manager.py 
├── requirement.txt 
├── statique 
│ ├── js 
│ └── plugins 
├── modèles 
│ ├── commune 
│ ├── index.html 
│ ├── info.html 
│ └── membre 
├── essai
└── apsch_test.py │ 
├── tornado_server.py 
└── www.py


source de réalisation

Voici la principale réalisation de la source suivante

# - * - codage: utf-8 - * - à 
partir de l' application d'importation d'application, db 
itchat d'importation, signal, JSON, temps, os, aléatoire 
importation multitraitement 
de ctypes c_bool d'importation, c_int 

de TuLingService d'importation common.libs.tuling123.TuLingService 
de commune WeChatBotService importation .libs.wxbot.WeChatBotService 
de QueueList d'importation common.models.queue 
de getCurrentTime d'importation common.libs.DateUtil 
retraçage d'importation, demande 



'' ' 
python manage.py runJob -m wechatbot / index 
''' 
classe JobTask (): 
    def __init __ (self): 
        laissez - passer 

    exécuter def (self, params): 
        essayer: 
            #增加重试连接次数
            # Les demandes à l' aide de la bibliothèque de urllib3, la valeur par défaut http connexion keep-alive est, des demandes de fausse prise fermée. 
            requests.session = S () 
            s.keep_alive = False 

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

            Sujets = [] 
            t_queue_consumer = multiprocessing.Process (target = syncConsumer, args = ( "t_queue_consumer")) 
            t_queue_consumer.daemon vrai = 
            threads.append (t_queue_consumer) 


            app.logger.info ( « le processus parent {0} Running'.format (os.getpid ())) 
            pour I Range (LEN (Threads)): 
                Threads [I] .start () 


            # initialize tous vos amis, dans la file d' attente, le processus de faire les choses 
            queue_msg = { 
                de type ': « amis »,
                « Les données »: itchat.get_friends (mise à jour = true) 
            } 
            global_queue.put (queue_msg) 

            ## doit prendre des contacts de chat de groupe enregistrés à l'emploi ne pourra pas accéder aux 
            #https: //github.com/littlecodersh/ ItChat / DÉLINQUANCE / 480 
            queue_msg = { 
                'type': 'Groupe', 
                'Data': itchat.get_chatrooms (mise à jour = true) 
            } 
            global_queue.put (queue_msg) 


            itchat.run () 
        l'exception exception AS ERR: 
            app.logger.error ( "========= itchat: erreur RUN ========") 
            traceback.print_exc () 
            sortie (15) 


 
    @staticmethod
    DEF sortie (Signum, Frame):
        sendmail_flag mondiale
        app.logger.info ( "exit manuellement ~ ~") 
        app.logger.info ( "Signum:% S, Structure:% S, sendmail_flag:% s" % (Signum, Frame, sendmail_flag)) Dans le 
        cas contraire sendmail_flag: 
            sendmail_flag = vrai 
            # itchat.logout () # exit après l' exécution de la prochaine fois , il est nécessaire de code d' analyse afin de vous connecter à 
            partir common.libs.queue.QueueListService importation QueueListService 
            notice_users = QueueListService.getNoticeUsers (IDS = [le app.config [ 'NOTICE_WECHAT_USER'] [ 'family_host_man']]) 
            données = { 
                "MSG": "robot micro-canal vers le bas, nécessite une intervention humaine, réparé ~ ~", 
                "title": "[rappeler] robot de micro canal vers le bas", 
                "notice_users": notice_usersnotice_users 
            }
            QueueListService.addQueueMsg (queue_name = "rappel", data = données, type = 2) la 
        sortie (15) 


# http://itchat.readthedocs.io/zh/latest/ 
#加入图灵机器人: https: //www.kancloud .cn / turation / 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', 
        'data': msg 
    } 
    global_queue.put (queue_msg) 

    ! si msg.Type == itchat.content.TEXT et msg.FromUserName = "newsapp": 

        si msg.Type == itchat.content.TEXT et ( "邀请" dans msg.Text ou "加群" dans msg.Text):
            # Groupe additif Pendant ce temps a envoyé un lien d'invitation 
            itchat.add_member_into_chatroom (get_group_id (" petit monde programmation Joe « ), [{ 'UserName' : msg.FromUserName}], 
                                            useInvitation = True) 
            retour Aucun 
        « » ' 
        besoin de filtrer plusieurs circonstances, par exemple ne possèdent pas leur propre réponse envoyé par le 
        '' ' 
        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 = [ 
            « Bienvenue dans le monde des robots programmés prodigues ~ ~ », 
            « vous pouvez entrer que je veux dire, il y aura des œufs », 
            « blog personnel: http: // www.54php.cn »,
            "RSVP, ajoutez un groupe de mots clés peut rejoindre le groupe", 
            "Get Mu compte du cours, s'il vous plaît faites attention au nombre public"  
        ] 
        tmp_msg.étendre (GetAd (is_rand = Faux))
        msg.user.send ( "\ n le" .join (tmp_msg)) 
        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']) 
        # liens transmettant simultanément l' invitation de groupe additif 
        itchat.add_member_into_chatroom (get_group_id ( "petit monde programmation Joe"), [{ 'UserName' : msg [ 'RecommendInfo'] [ 'username']}] , useInvitation = True) 
    Elif msg.Type dans [itchat.content.SYSTEM, itchat.content.NOTE]: 
        commentaires #note add exprimés par le contenu d'amis 
        passent 
    l'autre:
        si msg.Type == « Partage » et msg.Text == « vous invite à participer à un chat en groupe »:
            Aucun retour
        "http://t.cn/AiK3JQe3",
 
        tmp_msg = [ « ~ ~ Je suis un enfant ne reconnaît pas ce que vos cheveux Oh. »] 
        Tmp_msg.extend (GetAd ())
        msg.user.send ( "\ n" .join (tmp_msg)) 
    retour Aucun 


@ itchat.msg_register (itchat.content.INCOME_MSG, isGroupChat = True) 
def handle_group_msg (msg): 
    app.logger.info ( "type: {0 }, texte: {1} "Format (msg.Type, msg.Text)). 
    app.logger.info (msg) 
    retour Aucun 

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 = [ 
        "", 
        « ======= =========== " 
        "espérer beaucoup de soutien, nombre de préoccupations du public: CodeRonin", 
        " prodigues cliquez sur l'article pour soutenir l'AD en bas: « + ad_urls [random.randint ( 1, len (ad_urls)) . - 1] 
    ] 

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

    retour tmp_msg 

# obtenir un chat de groupe ID 
DEF get_group_id (GROUP_NAME): 
    group_list = itchat.search_chatrooms (name = GROUP_NAME) 
    group_list retour [0] [ 'UserName'] 

# signal de sortie du piège, par exemple + C contrôle 
 
signal.signal (signal.SIGINT, JobTask.exit)
s (signal.SIGTERM, JobTask.sortie) 

« » »
Stockées dans la base de données que j'utilise le filetage, donc asynchrone n'affecte pas le retour 
file d' attente et le module file d' attente a trois constructeurs: 
la file d' attente FIFO FIFO file d' attente Python module. classe Queue.Queue (MAXSIZE) 
LIFO pile est similaire à celle mise en. classe queue.LifoQueue (maxsize) 
il y a un niveau de file d'attente de priorité inférieure plus en premier. classe queue.PriorityQueue (MAXSIZE) 
'' ' 
Gestionnaire = multiprocessing.Manager () 
global_queue = multiprocessing.Queue () 
sendmail_flag = multiprocessing.Value (c_bool, False) 
DEF syncConsumer (nom): 
    avec app.app_context (): # HTTP: //flask-sqlalchemy.pocoo.org/2.3/contexts/ 
        le while True: 
            l'essai: 
                app.logger.info ( "syncConsumer, pid:% s" % (os.getpid ())) 
                queue_msg = global_queue.get ()
                # Get_nowait ()阻塞等待不会
                app.logger.info ( '[% s]取到了[% de]' % (nom, queue_msg [ 'type'])) 
                si queue_msg [ 'type'] dans [ "amis", "groupe"]: 
                    type = 2 si queue_msg [ 'type'] == "groupe" else 1 
                    WeChatBotService.initContact (queue_msg [ 'data'], type) 

                elif queue_msg [ 'type'] == "msg": 
                    WeChatBotService.addHistory (queue_msg [ 'data' ]) 
                time.sleep (1) 
            sauf exception comme err: 
                traceback.print_exc () la 
                sortie (15)


résumé

Au moyen de itchat et images du robot, puis sur la base python3 + Flask MVC + MySQL peut réaliser son propre robot micro lettre, le processus est en fait assez simple, mais nous devons avoir une certaine connaissance de python3 + Flask MVC, et je résume sous l'expérience du projet un ensemble de personnalisé: une structure hiérarchique et claire concurrency, élevé framework MVC.

publicité

Si vous êtes intéressé à apprendre Python Flask, toute bonne base est faible et vous pouvez regarder mes deux cours, pour votre référence



Adresse originale: utiliser Python Flask développer robot micro-canal
Tags: micro lettre    WeChat    Robot    Robot    Python    le Flask    MOOC    classe Mu   

recommandation intelligente

Je suppose que tu aimes

Origine www.cnblogs.com/apanly/p/12446267.html
conseillé
Classement