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
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
Python Flask d'entrée au maître: https://coding.imooc.com/class/399.html
Construction d'un canal micro applet Python Flask système de réservation: https://coding.imooc.com/class/265.html
Adresse originale: utiliser Python Flask développer robot micro-canal
Tags: micro lettre WeChat Robot Robot Python le Flask MOOC classe Mu