使用Pythonのフラスコは、マイクロチャネルのロボットを開発します

理由

私は小さな個人のブログ、そしてまた、いくつかのコースを記録し、対応するマイクロチャネルグループの設立に関するすべてが、2次元のマイクロ文字コード・グループが変更さを持っているので、彼らは頻繁に変更することはできません。我々は、マイクロチャネルロボット、自動マイクロチャネル、自動作図グループに従事したいので。マップ上の最初の騒ぎ、

結果は

私たちは、効果を試すことができ、効果は非常にスティックです


5.jpg


tiny.jpg


web_tiny.png

需要

  • その他には、2次元コードにより自動的によって私の友人を追加することができます

  • の採択後のグループにいくつかのリンクや紹介状を送信するために友人を招待するためのイニシアチブ

  • RSVP、プラスグループは、グループ・リンクへの招待状を送ることができます

  • すべてのチャットデータを格納すると、Webを表示することができます

  • ユーザ入力情報に基づいて関連コンテンツへの返信

テクノロジーの選択

  • python3

  • フラスコ:軽量MVCフレームワーク

  • itchat:マイクロチャネル達成APIインターフェイス

  • MySQLの:ストレージ関連のマイクロチャネルコンテンツ

  • アクティブなシーン応答のためのAPIコール:ロボットをチューリング

アーキテクチャ

階層構造と明確なMVCフレームワーク:私は自分の実現した後に使用されるデフォルトMVCの道フラスコを使用していませんでした。次のように構造化

各フォルダには、独自の明確な役割を担っています

application.py├── 
├──共通
│├──のlibs 
│└──モデル
├──設定
│├──base_setting.py 
│├──local_setting.py 
│├──production_setting.py 
├──コントローラ
│ index.py├── 
│├──member.py 
├──インターセプタ
│├──Auth.py 
│├──errorHandler.py 
├──ジョブ
│├──launcher.py 
│├──movie.py 
│ └──タスク
├──manager.py 
├──requirement.txt 
├──静的
│├──JS 
│└──プラグイン
├──テンプレート
│├──共通
│├──のindex.html 
│├── info.html 
│└──メンバー
├──テスト
└──apsch_test.py│ 
├──tornado_server.py 
└──www.py


ソースを達成

以下のソースの主な成果をここに

# - * -コーディング:UTF-8 - * - 
アプリケーションのインポートアプリケーション、DBから
インポートitchat、信号、JSON、時間、OS、ランダム
マルチプロセッシングインポート
のctypesからはc_boolをインポートし、c_intの

common.libs.tuling123.TuLingServiceインポートTuLingServiceから
共通から.libs.wxbot.WeChatBotServiceインポートWeChatBotService 
common.models.queueインポートQueueListから
common.libs.DateUtilインポートgetCurrentTimeから
インポートトレースバック、要求



'' ' 
のpython manage.py RUNJOB -m wechatbot /インデックス
''' 
クラスJobTask():
    DEF __init __(自己):
        渡す

    デフ実行(自己、のparams):
        試してみる:
            #增加重试连接次数
            #、デフォルトのHTTP接続は、キープアライブがある偽クローズを設定する要求urllib3ライブラリを使用して要求しています。
            requests.session = S()
            s.keep_alive =偽

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

            スレッド= [] 
            t_queue_consumer = multiprocessing.Process(目標= syncConsumer、引数=( "t_queue_consumer"))
            t_queue_consumer.daemon真= 
            threads.append(t_queue_consumer)


            app.logger.info(「親プロセス{0} Running'.format IS(os.getpid()))
            の範囲でI()(スレッドLEN)の場合:
                スレッド[I] .start () 


            #は、物事のプロセス、キューに、すべてのあなたの友人を初期化
            {queue_msg = 
                、「友人」:「タイプ」を
                「データ」:itchat.get_friends(更新=真)
            } 
            global_queue.put(queue_msg)

            ##を取得することができなくなりますジョブに保存されたグループチャットコンタクトを取る必要があります
            #https://github.com/littlecodersh/をItChat /非行/ 480 
            queue_msg = { 
                'タイプ': 'グループ'、
                'データ':itchat.get_chatrooms(アップデート=真)
            } 
            global_queue.put(queue_msg)


            itchat.run()
        例外としてERR除く:
            app.logger.error ( "========= itchat:RUNエラー========")
            traceback.print_exc()
            出口(15)


 
    @staticmethod
    DEF終了(シグナム、フレーム):
        グローバルsendmail_flag
        app.logger.info( "手動で終了~~")
        app.logger.info( "シグナム:%S、フレーム:%S、sendmail_flag:%はS" %(シグナム、フレーム、sendmail_flag))
        IFないsendmail_flag:
            sendmail_flag =真
            #itchat.logout()#出口がスキャンコードする必要がある次回実行した後にログインするために
            common.libs.queue.QueueListServiceインポートQueueListServiceのから
            notice_users = QueueListService.getNoticeUsers(IDS = [App.configファイル[「NOTICE_WECHAT_USER」] [ 'family_host_man']]) 
            データ= { 
                "MSG": "マイクロチャネルロボットダウン、人間の介入を必要とし、修理~~"、
                "タイトル": "[]マイクロチャネルロボットダウンを思い出させる"、
                "notice_users":notice_usersnotice_users 
            }
            QueueListService.addQueueMsg(queue_nameの= "リマインダー"、データ=データ、タイプ= 2)
        の出口(15)


#http://itchat.readthedocs.io/zh/latest/ 
#加入图灵机器人ます。https://www.kancloud .CN /チューリング/ 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 = { 
        'タイプ': 'MSG'、
        'データ':MSG 
    } 
    global_queue.put(queue_msg)

    !msg.Type == itchat.content.TEXTとmsg.FromUserNameなら= "newsapp":

        もしmsg.Type == itchat.content.TEXT及び(msg.Textで"邀请"又は"加群" msg.Textで):
            #一方、加法群は、招待状のリンクを送りました 
            itchat.add_member_into_chatroom(GET_GROUP_ID("ジョー「は小さな世界をプログラミング)、[{ 'ユーザー名' :MSGを。FromUserName}]、
                                            = TrueのuseInvitation)
            の戻りなし
        '' ' 
        例えば、いくつかの状況フィルタリングする必要が、自分の回答を所有していないが、自分自身を送信する
        ' '' 
        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 = [ 
            「ロボットの世界へようこそ〜放蕩プログラム
            「」あなたは卵があるでしょう、私が言いたい入力することができます」 
        ] 
        tmp_msg。伸びる(getAd(is_rand =偽)) 
            のhttp://「個人的なブログWWW。54php.cn」、
            「RSVP、キーワードのグループがグループに参加することができます追加は、」
            「公共の数」にムーコースアカウント、してください注意を払うを取得
        msg.user.send(「\ N-」.join(tmp_msg))
        itchat.send_image(app.root_path +」 /web/static/images/wechat/coderonin.jpg "MSG [ 'RecommendInfo'] [ 'ユーザー名'])
        itchat.send_image(app.root_path +" /web/static/images/wechat/mina.jpg」、MSG [ 'RecommendInfo'] [ 'ユーザー名'])
        を同時に添加グループ招待の送信#リンク
        itchat.add_member_into_chatroom(GET_GROUP_ID( "ジョーは小さな世界をプログラミング")、[{ 'ユーザー名' :MSGの[ 'RecommendInfo'] [ 'ユーザー名']}] 、useInvitation =真)
    のelif msg.Typeで[itchat.content.SYSTEM、itchat.content.NOTE]:
        友人の内容によって表現#note追加コメント
        渡し
    、他の:
        msg.Type ==「共有」とmsg.Text場合 ==「 招待あなたはグループチャットに参加します」:
            リターンなし
        "http://t.cn/AiK3JQe3"、
 
        tmp_msgを= [「~~私は子供がどのようなあなたの髪ああを認識しませんでした。」] 
        tmp_msg.extend(getAd())
        msg.user.send( "\ n"は.join(tmp_msg))
    リターンなし


itchat.msg_register @(itchat.content.INCOME_MSG、isGroupChat = TRUE)
DEF handle_group_msg(MSG):
    app.logger.info(「タイプ:{0 }、テキスト:{1} "形式(msg.Type、msg.Text))。
    app.logger.info(MSG)
    リターンなし

getAd DEF(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 = [ 
        ""、
        「======= =========== " 
        "多くの支持を期待し、国民の関心番号:CodeRonin"、
        "ボトムADをサポートするために、物品の放蕩クリック:「+ ad_urls [random.randint( 1、lenは(ad_urls)) - 1] 
    ] 

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

    戻りtmp_msgの

IDチャット#グループを得る
DEFがGET_GROUP_ID(GROUP_NAME):
    group_list = itchat.search_chatrooms(名= GROUP_NAME)
    戻りgroup_list [0] [ 'ユーザー名'] 
トラップ出口信号、例えば+ Cコントロール
 
signal.signal(signal.SIGINT、JobTask.exit)
signal.signal(signal.SIGTERM、JobTask。終了) 

「」」
私はスレッドを使用するデータベースに保存され、非同期ので、戻りは影響しない
キューを、キューモジュール3つのコンストラクタを持っている:
FIFOキューFIFO Pythonのキューモジュール。Queue.Queueクラス(MAXSIZE)
LIFOスタックその最後のアウトに似ています。クラスqueue.LifoQueue(MAXSIZE)
低いプライオリティキューレベルはよりうち最初あります。queue.PriorityQueueクラス(MAXSIZE)
'' ' 
マネージャー= multiprocessing.Manager()
global_queue = multiprocessing.Queue()
sendmail_flag = multiprocessing.Value(c_bool、偽)
DEF syncConsumer(名):
    app.app_contextと():#HTTP: //flask-sqlalchemy.pocoo.org/2.3/contexts/ 
        しばらく真:
            試してみる:
                app.logger.info( "PID syncConsumer、:%S" %は(os.getpid())) 
                queue_msg = global_queue.get()
                #get_nowait()阻塞等待不会
                app.logger.info( '[%s]を取到了[%s]は' %(名前、queue_msg [ '型']))
                であれば[ "友人"でqueue_msg [ '型'] 、 "グループ"]:
                    タイプ= 2であればqueue_msg [ 'タイプ'] == "グループ"他の1 
                    WeChatBotService.initContact(queue_msg [ 'データ']、タイプ)

                ELIF queue_msg [ 'タイプ'] == "MSG":
                    WeChatBotService .addHistory(queue_msg [ 'データ'])
                time.sleep(1)
            ERRとして例外を除い:
                traceback.print_exc()
                の出口(15)


概要

独自のマイクロ文字のロボットを実現することができますのpython3 +フラスコMVC + MySQLのに基づいて、その後itchatの手段とロボットの絵、とすることで、プロセスが実際には非常にシンプルですが、私たちはのpython3 +フラスコMVCのいくつかの知識を持っている必要があり、私はプロジェクトの経験の下に総括しましたパーソナライズのセット:階層構造と明確な、高い同時実行MVCフレームワーク。

広告

あなたがPythonのフラスコを学ぶことに興味を持っている場合は、全体の良い基盤は弱く、あなたの参考のために、私の2つのコースを見ることができます



オリジナル住所: 使用Pythonのフラスコは、マイクロチャネルのロボット開発
タグ: マイクロ手紙    微信    ロボット    ロボット    のPython    フラスコ    MOOC    ムークラスを   

インテリジェント勧告

おすすめ

転載: www.cnblogs.com/apanly/p/12446267.html