人狠话不多,根据ITCHAT接口编写的一个微信个人号聊天机器人,基于这个基础做个LINUX版本的微信也是信手拈来
我是铜梁视窗小编何跃,继门户网站采集、公众号智能响应之后,又踏入新的征程——微信个人号聊天机器人。
以下程序是粗狂版本,尚未接入平台数据库,所以只能开启简单的聊天和清早10点以前打招呼的功能。
更多功能请自行下载代码,安装python3以上环境试验以下。
基于itchat的各种接口和python语言,写个linux版本的微信好像也不是很难的哈?
主要程序部分
# coding=utf-8 import time import datetime import checklist import tuling import itchat from itchat.content import * @itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING]) def text_reply(msg): print(msg) if msg['Text'] == '我通过了你的朋友验证请求,现在我们可以开始聊天了': return '我是铜梁视窗运营何跃,很高兴认识你。 我们平台提供商家活动营销策划、网络营销策划服务,如有需要呼叫18996069665' else: return '[小狗]' + tuling.get_response(msg['Text'], msg['FromUserName']) @itchat.msg_register(TEXT, isGroupChat=True) def text_reply(msg): print(msg) white_list = { "测试群": "@@9393335b11f120437a8e99f114994a1d352452944761a8c17652466c30463d29", "宝妈3群": "@@050c154296139ce5be557a0f07020be2900355628b54e1c331f444d6120b812f", '铜梁生活馆砍价1群': '@@b56ed25d9369edf46c926584e29a194acf90c97a36e780e164d3f8d809f00537' } if '你是机器人' in msg['Text']: return '我是他开发的聊天机器人,不信一起来聊到天荒地老!' if msg['ActualNickName'] in white_list.keys(): if msg['IsAt']: return '@' + msg['ActualNickName'] + '\u2005 ' + tuling.get_response(msg['Text']) + '[握手]' else: return '[小狗]' + tuling.get_response(msg['Text'], msg['FromUserName']) @itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO]) def download_files(msg): localfile = 'file/' + msg.fileName msg.download(localfile) typeSymbol = { PICTURE: 'img', VIDEO: 'vid', }.get(msg.type, 'fil') return '@%s@%s' % (typeSymbol, msg.fileName) @itchat.msg_register(FRIENDS) def add_friend(msg): msg.user.verify() msg.user.send('我是铜梁视窗运营何跃,很高兴认识你。 我们平台提供商家活动营销策划、网络营销策划服务,如有需要呼叫18996069665') # 登陆后各种打招呼 def afterlogin(): hour = datetime.datetime.now().hour if hour < 10: # 先给群打招呼 ghelloword = '亲们早上好,贝贝佳38女王节微商城秒杀正在进行中,更有10积分赢取1000元游乐券活动等你来拿哟!' sayhitogroup(ghelloword) # 再个个人打招呼 localtime = time.strftime("%Y-%m-%d", time.localtime()) phelloword = '亲爱的%s早上好啊[鲜花],今天是' + localtime + ',星期' + time.strftime("%w", time.localtime()) phelloword += '\n睁开眼睛看到你还在这里,感觉真好[爱],感谢有你一路陪伴[爱]' sayhitofriend(phelloword, 1) else: print('过了10点不打招呼了') # 给所有群发消息 def sayhitogroup(msg): mpsList = itchat.get_chatrooms(update=True)[1:] print(mpsList) for it in mpsList: print('"' + it['NickName'] + '":"' + it['UserName'] + '"') if checklist.cr(it['NickName'], 1) == 1: itchat.send_msg(msg, it['UserName']) # 给所有人发消息 def sayhitofriend(msg, namepluse=0): friendslist = itchat.get_friends(update=True)[1:] for m in friendslist: print('"' + m['NickName'] + '":"' + m['UserName'] + '","headimgurl":"' + m['HeadImgUrl'] + '"') if checklist.cr(m['NickName'], 0) == 1: if namepluse == 0: itchat.send_msg(msg, m['UserName']) else: itchat.send_msg(msg % m['NickName'], m['UserName']) itchat.auto_login(hotReload=True, loginCallback=afterlogin) itchat.run(debug=True)
问题来了,有时候发消息一不小心就得罪人了怎么办!设置白名单啊,只有这些人可以收到,注意了,白名单记得写入数据库,不要用username,用nickname登记!记得每天要刷新群和个人号里面的好友名称哟
# 发送消息都要检查的,不然要出事儿,先列举一个白名单不能发,判断通过的就发了,这个后面怕是要搞动态获取列表哟 def cr(name, msgtype, whitelist=None): if whitelist == None and msgtype == 1: whitelist = ['贝贝佳', '宝妈', '砍价', '生活群', '助力'] elif whitelist == None and msgtype == 0: whitelist = ['a', 'A', 'T', 't'] if name in whitelist: return 1 else: return 0
话说都是自动回复,没得机器人帮忙谁帮你回复呢?我用的图灵,觉得有点弱智,希望你能够找个更好的机器人反馈给我唷
# coding=utf8 import sys, os import requests, json try: with open('tuling.json') as f: key = json.loads(f.read())['key'] except: key = '' # if key is '', get_response will return None # raise Exception('There is something wrong with the format of you plugin/config/tuling.json') def get_response(msg, userid): url = 'http://www.tuling123.com/openapi/api' payloads = { 'key': key, 'info': msg, 'userid': userid, } try: r = requests.post(url, data=json.dumps(payloads)).json() except: return if not r['code'] in (100000, 200000, 302000, 308000, 313000, 314000): return if r['code'] == 100000: # 文本类 return '\n'.join([r['text'].replace('<br>', '\n')]) elif r['code'] == 200000: # 链接类 return '\n'.join([r['text'].replace('<br>', '\n'), r['url']]) elif r['code'] == 302000: # 新闻类 l = [r['text'].replace('<br>', '\n')] for n in r['list']: l.append('%s - %s' % (n['article'], n['detailurl'])) return '\n'.join(l) elif r['code'] == 308000: # 菜谱类 l = [r['text'].replace('<br>', '\n')] for n in r['list']: l.append('%s - %s' % (n['name'], n['detailurl'])) return '\n'.join(l) elif r['code'] == 313000: # 儿歌类 return '\n'.join([r['text'].replace('<br>', '\n')]) elif r['code'] == 314000: # 诗词类 return '\n'.join([r['text'].replace('<br>', '\n')]) if __name__ == '__main__': try: ipt = raw_input ipt = lambda: raw_input('>').decode(sys.stdin.encoding) except: ipt = lambda: input('>') while True: a = ipt() print(get_response(a, 'ItChat'))