zoukankan      html  css  js  c++  java
  • 图灵机器人微信自动聊天功能

    最近,同学搞了个微信自动回复,只要再群里说话,就会回复,感觉挺好玩,现把代码分享下如下,先看看效果,如下图

    左边的是机器人,右边的是我和它聊的。

    现在开始把!

    首先需要去图灵申请个apikey,图灵官网http://www.turingapi.com/

    配置文件Wxpy.ini如下

    [tuling]
    #此处是从图灵申请的apikey
    apikey="*****"
    
    [wechat]
    #utf-8 gbk
    charset="utf-8"
    
    #好友昵称,目前仅支持一个,不需要则留空
    friend=""
    
    #群组昵称,目前仅支持一个,不需要则留空
    group=""
    
    #自动回复消息前缀
    prefix=" "
    
    #自动回复消息后缀
    subfix=" "

    代码文件Wxpy.py如下:

    #coding:utf-8
    __author__ = '***'
    import time
    import sys
    import os
    import ctypes
    import Tkinter
    import tkMessageBox
    import json
    import requests
    import re
    import subprocess
    import datetime
    import ConfigParser
    import wxpy
    
    
    def msgBox(title, info):
        newTitle = title.decode('utf-8')
        newInfo = info.decode('utf-8')
        print newTitle, newInfo
        top = Tkinter.Tk()
        top.withdraw()
        tkMessageBox.showinfo(title, info)
        #tkMessageBox.askyesno(title, info)
        #ctypes.windll.user32.MessageBoxA(0, newInfo, newTitle, 0)
        #os.system('msg %username% /TIME:2 '+info)
    
    
    def test():
        print "%s."%sys._getframe().f_code.co_name
        try :
            time.sleep(0.3)
        except Exception,e:
            print e
            return
            
    def chatbot_init():
        bot = ChatBot("Terminal", 
        storage_adapter = "chatterbot.storage.JsonFileStorageAdapter", 
        logic_adapters = [ 
                        "chatterbot.logic.MathematicalEvaluation", 
                        "chatterbot.logic.TimeLogicAdapter", 
                        "chatterbot.logic.BestMatch" 
                        ], 
        input_adapter = "chatterbot.input.TerminalAdapter", 
        output_adapter = "chatterbot.output.TerminalAdapter", 
        database = "./database.db" 
        ) 
     
    
    def tuling_api(api_key, info):
        url = 'http://www.tuling123.com/openapi/api?key='+api_key+'&info='+info
        print url
        res = requests.get(url)
        res.encoding = 'utf-8'
        jsonRes = json.loads(res.text)#str to dict
        #print('tuling_api: ' + jsonRes['text'])
        return jsonRes['text']
        
    if "__main__" == __name__:
        # if(len(sys.argv) < 4):
            # msgBox("error", "para error!")
        # deviceName=sys.argv[1]
        try:
            reload(sys)
            sys.setdefaultencoding('utf-8')
            
            #api_key='302dbb3ed3f845e5863c9ca7210acc2a'
            api_key = ''
            targetFriend = ''
            targetGroup = ''
            strPrefix = ''
            strSubfix = ''
            charset = ''
            cf = ConfigParser.ConfigParser()
            cf.read('Wxpy.ini')
            api_key = cf.get('tuling','apikey').strip('"').strip()
            targetFriend = cf.get('wechat','friend').strip('"').strip()
            targetGroup = cf.get('wechat','group').strip('"').strip()
            strPrefix = cf.get('wechat','prefix').strip('"')
            strSubfix = cf.get('wechat','subfix').strip('"')
            charset = cf.get('wechat','charset').strip('"').strip()
            targetAutoReply = []
            
            print len(api_key), api_key
            print len(targetFriend), targetFriend.decode(charset)
            print len(targetGroup), targetGroup.decode(charset)
            print len(charset), charset
            if(len(api_key) == 0 or ( len(targetFriend) == 0 and len(targetGroup) == 0) ):
                msgBox('参数错误', '请参照使用说明 然后重新打开软件')
                sys.exit(1)
            #tuling = wxpy.Tuling(api_key='302dbb3ed3f845e5863c9ca7210acc2a')
            bot = wxpy.Bot(cache_path=True)
            friends_stat = bot.friends().stats()
            #print friends_stat
            for province, count in friends_stat["province"].iteritems():
                #print "province '%s', count %s"%(province, count)
                pass
            for city, count in friends_stat["city"].iteritems():
                #print "city '%s', count %s"%(city, count)
                pass
            for sex, count in friends_stat["sex"].iteritems():
                #print "sex '%s', count %s"%(sex, count)
                pass
            
            myGroup = None
            groups = bot.groups()
            count=0
            for group in groups:
                #print group.user_name
                if group.nick_name!=None:
                    #print group.nick_name
                    if len(targetGroup) != 0 and group.nick_name.find(targetGroup.decode(charset)) != -1:
                        print 'Got it in groups.++++++++++++++++++++++++++++++++++++++'
                        myGroup = group
                        targetAutoReply.append(myGroup)
                count+=1
            print "groupCnt=%d."%count
            
            myFriend = None
            friends = bot.friends()
            count=0
            for friend in friends:
                #print friend.user_name
                if friend.nick_name!=None:
                    #print friend.nick_name
                    if len(targetFriend) != 0 and friend.nick_name.find(targetFriend.decode(charset)) != -1:
                        print 'Got it in friends.------------------------------------'
                        myFriend = friend
                        targetAutoReply.append(myFriend)
                    pass
                count+=1
            print "friendCnt=%d."%count
            
            tmpStr = strPrefix + 'Hi.' + strSubfix# + str(datetime.datetime.now())
            if myGroup != None:
                myGroup.send(tmpStr.decode('utf-8','ignore'))
            if myFriend != None:
                myFriend.send(tmpStr.decode('utf-8','ignore'))
            #bot.file_helper.send(tmpStr.decode('utf-8','ignore'))
            
            
            print '-----------------------------------'
            
            # 打印来自其他好友、群聊和公众号的消息
            @bot.register()
            def print_others(msg):
                print 'From others: '
                #print msg
                print msg.sender.name,msg.text,msg.type
    
            # # 回复 groups 的消息 (优先匹配后注册的函数!)
            # @bot.register(myGroup)
            # def auto_reply_groups(msg):
                # print 'From auto_reply_groups:'
                # #print msg
                # print msg.sender.name,msg.text,msg.type
                # #msg.sender.mark_as_read()
                # if msg.type == 'Text': #如果是文字,就利用图灵机器人api回复,return和msg.reply_msg效果一样
                    # print 'Text.'
                    # #replyText = tuling.do_reply(msg)
                    # #replyText = tuling.reply_text(msg)
                    # replyText = tuling_api(api_key, msg.text)
                    # replyText = strPrefix + replyText + strSubfix
                    # print '===<', replyText
                    # #msg.sender.send(replyText)
                    # msg.reply_msg(replyText)
                    # #return replyText
                # elif msg.type == 'Picture': #如果接受到图片,就自动回复同样的图片
                    # print ('this is Picture:{}'.format(msg.file_name))
                    # savaPath = msg.file_name
                    # msg.get_file(savaPath)
                    # msg.reply_image(savaPath)
                # else:#其它的就转发回给发送人
                    # msg.forward(msg.sender)
                
            # 回复 friends 的消息 (优先匹配后注册的函数!)
            @bot.register(targetAutoReply)
            def auto_reply(msg):
                if len(targetAutoReply) == 0:
                    return
                print 'From auto_reply:'
                #print msg
                print msg.sender.name,msg.text,msg.type
                #msg.sender.mark_as_read()
                if msg.type == 'Text': #如果是文字,就利用图灵机器人api回复,return和msg.reply_msg效果一样
                    print 'Text..'
                    if msg.text.startswith(strPrefix) and msg.text.endswith(strSubfix):
                        return
                    #replyText = tuling.do_reply(msg)
                    replyText = tuling_api(api_key, msg.text)
                    replyText = strPrefix + replyText + strSubfix
                    print '===<', replyText
                    #msg.sender.send(replyText)
                    msg.reply_msg(replyText)
                    #return replyText
                elif msg.type == 'Picture': #如果接受到图片,就自动回复同样的图片
                    print ('this is Picture:{}'.format(msg.file_name))
                    savaPath = msg.file_name
                    msg.get_file(savaPath)
                    msg.reply_image(savaPath)
                else:#其它的就转发回给发送人
                    msg.forward(msg.sender)
                
            # # 自动接受新的好友请求
            @bot.register(msg_types=wxpy.FRIENDS)
            def auto_accept_friends(msg):
                print 'From auto_accept_friends:'
                #print msg
                print msg.sender.name,msg.text,msg.type
                # # 接受好友请求
                # #new_friend = msg.card.accept()
                # # 向新的好友发送消息
                # #new_friend.send('哈哈,我自动接受了你的好友请求')
            
            wxpy.embed()
            # # 进入Python命令行,让程序保持运行
            while(1):
                pass
        except Exception,e:
            print e
        finally:
            sys.exit(1)

    有兴趣的可以玩玩,感觉挺好玩。 

  • 相关阅读:
    NLPIR大数据语义系统文本数据分析挖掘平台
    NLPIR:中文语义挖掘是自然语言处理的关键
    NLPIR-JZSearch智能搜索深层挖掘大数据资源
    NLPIR智能Protege知识图谱实现多场景应用
    DotNet加密方式解析--散列加密
    SSO单点登录PHP简单版
    xss框架基础框架实现
    Kafka Offset Storage
    C#如何使用ES
    模拟Vue之数据驱动
  • 原文地址:https://www.cnblogs.com/kumufengchun/p/10280884.html
Copyright © 2011-2022 走看看