美文网首页
使用Pyhton+ItChat+图灵机器人扩展微信功能

使用Pyhton+ItChat+图灵机器人扩展微信功能

作者: OliverChu | 来源:发表于2019-12-18 20:25 被阅读0次

    教程使用到:

    已经实现的功能:

    • 微信消息记录,撤回消息查看
    • 发送指令召唤机器人
    • 开关电脑、远程控制电脑拍照摄像并发送图像

    将要实现的功能:

    • 在妹子起床的时候给妹子推送天气,问候晚安(部分实现)
    • 将聊天记录存入数据库(没时间弄完)
    • (给树莓派增加一种控制方式)控制树莓派端,然后通过树莓派上的UDP Server去广播控制指令到Arduino端,随后控制远程家用设备(窗帘、灯等等)
    • 更加颗粒化的配置

    不废话上代码:

    main.py

    #coding:utf-8
    import itchat
    from itchat.content import *
    import control
    import time
    import sqlite3
    import requests
    import json
    from urllib import parse
    import schedule
    import _thread
    
    me = {}
    ROBOT_NAME = "小x"
    TULING_KEY = "tuling_key"
    vips = []
    robots = set()
    
    def gen_db():
        conn = sqlite3.connect("wechat.db")
        print("Connect to database successfully.")
        c = conn.cursor()
        c.execute('''CREATE TABLE CHATS IF NOT EXISTS
            (id INT PRIMARY KEY NOT NULL autoincrement,
            msgId text not null,
            fromName char(70),
            toName char(70),
            time text,
            from text,
            to text,
            content text
            );''')
    
    @itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
    def text_reply(msg):
        # print(msg)
        fromUserName = itchat.search_friends(userName=msg.FromUserName)
        toUserName = itchat.search_friends(userName=msg.ToUserName)
        print("%s [%s] [%s -> %s]:%s"%(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(msg.CreateTime)),msg.type,get_name(fromUserName),get_name(toUserName),msg.text))
        if msg.type == TEXT and msg.FromUserName != me.userName:
            if msg.text.strip() == "%s"%(ROBOT_NAME) and msg.FromUserName not in robots:
                msg.user.send("恭喜你,成功召唤了我家机器人,你可以问TA任何事情(比如今天天气、讲个笑话鬼故事等等)\n回复 '%s再见' 就可以让TA滚蛋哟" % (ROBOT_NAME) )
                robots.add(msg.FromUserName)
            if msg.text == "%s再见"%(ROBOT_NAME) and msg.FromUserName in robots:
                msg.user.send("虽然我走了,但是我会永远爱你~")
                msg.user.send_image('./dady.jpg') # 随便发的一张暴漫表情
                robots.remove(msg.FromUserName)
    
        if msg.type == TEXT and msg.FromUserName in robots and  msg.FromUserName != me.userName:
            #处于ai聊天的用户
            tuling(msg)
        if msg.FromUserName == me.userName and msg.ToUserName == me.userName:
            #是自己    
            command(msg,msg.text)
        else:
            #不是自己对自己说
            pass
        # return msg.text
    
    def get_name(user):
        return user.NickName if user.RemarkName == "" else user.RemarkName
    
    def command(msg,text):
        if text.startswith(ROBOT_NAME):
            msg.user.send(control.cmd(itchat,msg,text[3:]))
    
    def tuling(msg):
        params = parse.urlencode({'key':TULING_KEY,'info':msg.text})
        url = 'http://www.tuling123.com/openapi/api?'+params
        res = requests.get(url)
        res.encoding = 'utf-8'
        print("tuling:",res.text)
        jd = json.loads(res.text)
        msg.user.send(jd['text'])
    
    def lc(): # 登陆成功执行
        print('finish logining')
        friends = itchat.get_friends(update=True)
        for f in friends:
            print(f)
            if f.RemarkName == "XXXX": 
                vips.append(f)
        global me
        me = itchat.search_friends()
        print(me)
        # _thread.start_new_thread( print_time,())
    
    def ec():
        print('exit')
    
    def job():
        print("定时任务开始执行.")
    
        for v in vips:
            msg = {
                'user':v,
                'text':v.City+'的天气'
            }
            print(msg)
            tuling(msg)
    
    def print_time():
        schedule.every(1).seconds.do(job)
        while True:
            schedule.run_pending()
            time.sleep(1)
    
    # itchat.auto_login(hotReload=True,loginCallback=lc, exitCallback=ec)
    itchat.auto_login(hotReload=True,loginCallback=lc, exitCallback=ec)
    itchat.run()
    # schedule.every().day.at("20:32").do(job)
    
    print("GAME OVER.")
    
    

    control.py

    #coding:utf-8
    import os
    import cv2
    
    def cmd(itchat,msg,data):
        data.strip()
        print("execute cmd:",data)
        # os.system(data)
        if data == "关机":
            os.system("shutdown -s -t 1000 -c 已经被微信机器人执行远程关机指令")
            return "执行成功,1000秒后关机"   
        elif data =="取消关机":
            os.system("shutdown -a")
            return "取消关机成功" 
        elif data == "拍照":
            f = capture()
            # msg.user.send_image(path)
            itchat.send_image(f)
            return "拍照成功"
        elif data == "录像":
            f = video()
            print(f)
            itchat.send_file(fileDir=f)
            # itchat.send_video("@vid@%s" % f)
            return "录像成功"
        return "未知指令"
    
    def video():
        p = "e:/temp.mp4"
        cap = cv2.VideoCapture(0)
        cap.set(3,640)
        cap.set(4,480)
        cap.set(1, 10.0)
        fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
        out = cv2.VideoWriter(p, fourcc,10,(640,480))
        count = 0
        while True:
            ret,frame = cap.read()
            if ret == True:
                frame = cv2.flip(frame, 1)
                a = out.write(frame)
                print(".",end="")
                if count == 200: #1.2m & 20s
                    print()
                    break
            else:
                break
            count = count + 1
        cap.release()
        out.release()
        cv2.destroyAllWindows()
        return p
    
    def capture():
        p  = "e:/temp.jpg"
        cap = cv2.VideoCapture(0)
        ret, frame = cap.read()
        cv2.imwrite(p, frame)
        cap.release()
        cv2.destroyAllWindows()
        return p
    

    执行:

    python main.py

    相关文章

      网友评论

          本文标题:使用Pyhton+ItChat+图灵机器人扩展微信功能

          本文链接:https://www.haomeiwen.com/subject/vjxpnctx.html