最近,同学搞了个微信自动回复,只要再群里说话,就会回复,感觉挺好玩,现把代码分享下如下,先看看效果,如下图
左边的是机器人,右边的是我和它聊的。
现在开始把!
首先需要去图灵申请个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)
有兴趣的可以玩玩,感觉挺好玩。