python微信聊天机器人改进版,定时或触发抓取天气预报、励志语录等,向好友推送
最近想着做一个微信机器人,主要想要实现能够每天定时推送天气预报或励志语录,励志语录要每天有自动更新,定时或当有好友回复时,能够随机推送不同的内容。于是开始了分析思路。博主是采用了多线程群发,因为微信对频繁发送消息过快还会出现发送失败的问题,因此还要加入time.sleep(1),当然时间根据自身情况自己定咯。本想把接入写诗机器人,想想自己的渣电脑于是便放弃了,感兴趣的可以尝试一下。做完会有不少收获希望对你有帮助。
(1)我们要找个每天定时更新天气预报的网站,和一个更新励志语录的网站。当然如果你想更新其他内容,相信高智商的你这些都是小意思啦。博主是随便找了2个网站进行抓取。
第一步:抓取某网站天气预报信息,为我所用,因温度气候和生活指数在两个页面,于是将2个页面的数据抓取并进行整合:
这里抓取第一个页面内容,为温度,风向,日期,随便把第二天天气的也一并抓取了:
- def get_content(self, html_str):
- html = etree.HTML(html_str)
- weather_ts = html.xpath("//div[@id='7d']/ul")
- today_w = ''
- tomorrow_w = ''
- for weather_t in weather_ts:
- today_w += weather_t.xpath("./li[1]/h1/text()")[0] + ' '
- today_w += weather_t.xpath("./li[1]/p[1]/text()")[0] + ' '
- today_w += weather_t.xpath("./li[1]/p[2]/i/text()")[0] + ' '
- today_w += '风向' + weather_t.xpath("./li[1]/p[3]/i/text()")[0]
- tomorrow_w += weather_t.xpath("./li[2]/h1/text()")[0] + ' '
- tomorrow_w += weather_t.xpath("./li[2]/p[1]/text()")[0] + ' '
- tomorrow_w += '风向' + weather_t.xpath("./li[2]/p[3]/i/text()")[0]
- all_w = today_w + '--' + tomorrow_w
return all_w
这里抓取第二页面内容,包括穿衣指数,紫外线指数:
- def get_content1(self, html_str):
- html = etree.HTML(html_str)
- living_ins =html.xpath("//div[@class='livezs']/ul")
- today_living = ''
- for living_in in living_ins:
- today_living += living_in.xpath("./li[1]/span/text()")[0]
- today_living += living_in.xpath("./li[1]/em/text()")[0] + ':'
- today_living += living_in.xpath("./li[1]/p/text()")[0] + ' '
- today_living += living_in.xpath("./li[2]/a/em/text()")[0] + ' '
- today_living += living_in.xpath("./li[2]/a/p/text()")[0] + ' '
- today_living += living_in.xpath("./li[3]/em/text()")[0] + ':'
- today_living += living_in.xpath("./li[3]/p/text()")[0] + ' '
- today_living += living_in.xpath("./li[4]/a/em/text()")[0] + ' '
- today_living += living_in.xpath("./li[4]/a/p/text()")[0] + ' '
- today_living += living_in.xpath("./li[6]/em/text()")[0] + ':'
- today_living += living_in.xpath("./li[6]/p/text()")[0]
- return today_living
第二步:抓取某网经典唯美励志语录,为了每次发送或者回复都有信息感,博主抓取了10个数据,并进行随机返回:
- def Soul():
- html = etree.HTML(res)
- soul_sen = html.xpath("//div[@class='mLeft']")
- soul_dict = {}
- for soul_s in soul_sen:
- soul_dict[1] = soul_s.xpath('./div[1]/div[2]/div[2]/text()')[0].strip()
- soul_dict[2] = soul_s.xpath('./div[2]/div[2]/div[2]/text()')[0].strip()
- soul_dict[3] = soul_s.xpath('./div[3]/div[2]/div[2]/text()')[0].strip()
- soul_dict[4] = soul_s.xpath('./div[4]/div[2]/div[2]/text()')[0].strip()
- soul_dict[5] = soul_s.xpath('./div[5]/div[2]/div[2]/text()')[0].strip()
- soul_dict[6] = soul_s.xpath('./div[6]/div[2]/div[2]/text()')[0].strip()
- soul_dict[7] = soul_s.xpath('./div[7]/div[2]/div[2]/text()')[0].strip()
- soul_dict[8] = soul_s.xpath('./div[8]/div[2]/div[2]/text()')[0].strip()
- soul_dict[9] = soul_s.xpath('./div[9]/div[2]/div[2]/text()')[0].strip()
- soul_dict[10] = soul_s.xpath('./div[10]/div[2]/div[2]/text()')[0].strip()
- i = random.randint(1,10)
- return soul_dict[i]
(2)开始我们的重头戏,博主选择的是wxpy库,需要导入的库如下:
- import time
- import json
- import requests
- import datetime
- import threading
- from queue import Queue
- import schedule
- import wxpy
- from weather import WeatherSpider
- from soul import Soul
- bot = wxpy.Bot(cache_path=True)
现在先设置定时器,你可以设置多个的啦,博主只设置了早上:
- schedule.every().day.at("10:01").do(send)
- while True:
- schedule.run_pending()
- time.sleep(1)
接着,我们先获取抓取内容,微信好友数据,引入创建多线程:
- def send():
- wea_ls = '早上好,今天又是元气满满的一天\n' + WeatherSpider('101271610').run() +'您可以:'+ '\n回复"成都"获取成都天气\n回复"唯美"随机获取励志唯美语录'
- send_queue = Queue()
- fris = bot.friends().search('') # 这里填空会向所有好友的发送,或者填你想要单独发送的人
- for fri in fris:
- send_queue.put(fri)
- t_list = []
- for i in range(3):
- t_msend = threading.Thread(target=more_thread, args=(send_queue, wea_ls))
- t_list.append(t_msend)
- for t in t_list:
- t.setDaemon(True)
- t.start()
- for q in [send_queue]:
- q.join()
- print("主线程结束")
然后,开始向好友发送数据:
- def more_thread(send_queue, wea_ls):
- while True:
- try:
- friend = send_queue.get()
- friend.send(wea_ls)
- print("发送成功,a:",friend)
- except Exception as ret:
- time.sleep(1) # 如果你发送的好友很多,时间可以设置大一点,防止微信发送频繁,导致发送失败
- continue # 这里不建议加continue,依个人微信情况而定吧
- send_queue.task_done()
这里开始监听消息,并向朋友回送,一定要过滤掉群消息和公众号消息,具体为什么后面告诉你:
- @bot.register()
- def rcv_message(msg):
- sender = str(msg.sender)
- if '<MP:'in str(sender) or '<Group:' in str(sender): # 这里过滤掉群消息和公众号消息
- return
- now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
- # print(now)
- recv_save = ''
- rev_save = '发送人:'+ sender +" 内容:"+ msg.text + ' ' + now
- print(rev_save)
- with open('wechat.md','a') as f: # 这里我们要把朋友发送的消息进行保存,方便查看以免遗漏重要消息
- f.write(rev_save)
- f.write('\n')
- if msg.text == '成都':
- wea_cd = '成都' + WeatherSpider('').run()
- return wea_cd
- elif msg.text == '唯美':
- return Soul()
- else:
- try:
- return robot_tuling(msg.text)
- except Exception as ret:
- fri_me = bot.friends().search('virtual')[0]
- fri_me.send("发送错误,信息:%s" % ret)
- return ("主人不在所以我智商为0了,请尝试下回复(唯美)随机获取励志唯美语句")
下面接入图灵机器人,让实现智能聊天回复:
- def robot_tuling(text):
- url = "http://www.tuling123.com/openapi/api"
- api_key = "a3c47b29c497e87ab0b6e566f32" # 这里我已经修改,需要自己申请一个咯
- payload = {
- "key": api_key,
- "info": text,
- }
- rec = requests.post(url, data=json.dumps(payload))
- result = json.loads(rec.content)
- # print(result["text"])
- if result["text"] == "亲爱的,当天请求次数已用完。":
- return "主人不在所以我智商为0了,尝试下回复(唯美)随机获取励志唯美语句"
- return result["text"]
好了,所有工作完成,看看效果,记得屏蔽了公众号,不然会有下面效果:
关注公众号「互联网专栏」,后台回复:wechat,获取本文全套代码!
python微信聊天机器人改进版,定时或触发抓取天气预报、励志语录等,向好友推送的更多相关文章
- 手把手教你用Python代码实现微信聊天机器人 -- Python wxpy
关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 来学习了,微信聊天机器人. 环境要求: Windows / Li ...
- 【翻译】用AIML实现的Python人工智能聊天机器人
前言 用python的AIML包很容易就能写一个人工智能聊天机器人. AIML是Artificial Intelligence Markup Language的简写, 但它只是一个简单的XML. 下面 ...
- 使用图灵机器人api搭建微信聊天机器人php实现
之前通过hook技术实现了微信pc端发送消息功能,如果在结合图灵机器人就能实现微信聊天机器人. 代码下载:http://blog.yshizi.cn/131.html 逻辑如下: 下面我简单介绍一下步 ...
- 使用python/casperjs编写终极爬虫-客户端App的抓取-ZOL技术频道
使用python/casperjs编写终极爬虫-客户端App的抓取-ZOL技术频道 使用python/casperjs编写终极爬虫-客户端App的抓取
- Python 3.X 要使用urllib.request 来抓取网络资源。转
Python 3.X 要使用urllib.request 来抓取网络资源. 最简单的方式: #coding=utf-8 import urllib.request response = urllib. ...
- 【Python撩妹合集】微信聊天机器人,推送天气早报、睡前故事、精美图片分享
福利时间,福利时间,福利时间 如果你还在为不知道怎么撩妹而烦恼,不知道怎么勾搭小仙女而困惑,又或者不知道怎么讨女朋友欢心而长吁短叹. 那么不要犹豫徘徊,往下看.接下来我会分享怎么使用 Python 实 ...
- SAP成都研究院飞机哥: SAP C4C中国本地化之微信聊天机器人的集成
今天的文章仍然来自Jerry的老同事,SAP成都研究院的张航(Zhang Harry).关于他的背景介绍,请参考张航之前的文章:SAP成都研究院飞机哥:程序猿和飞机的不解之缘.下面是他的正文. 大家好 ...
- Python 简易聊天机器人
聊天机器人 | |-----MySql | |---module--"逻辑运算层" | | | |---ciku--"与词库交互" | | | |---dict ...
- python爬虫(一)_爬虫原理和数据抓取
本篇将开始介绍Python原理,更多内容请参考:Python学习指南 为什么要做爬虫 著名的革命家.思想家.政治家.战略家.社会改革的主要领导人物马云曾经在2015年提到由IT转到DT,何谓DT,DT ...
随机推荐
- sudo apt-get 与 yum安装有啥区别
rpm包和deb包是两种Linux系统下最常见的安装包格式,在安装一些软件或服务的时候免不了要和它们打交道. rpm包主要应用在RedHat系列包括 Fedora等发行版的Linux系统上, deb包 ...
- javascript DOM编程艺术(检测与性能优化)
一.对象检测(是否支持js方法):只有支持了该方法才可调用 if(!getElementById || getElementsByTagName){ return false; } 二.性能考滤 1. ...
- 网络传输数据封装详解(IP,UDP,TCP)
IP数据包也叫IP报文分组,传输在ISO网络7层结构中的网络层,它由IP报文头和IP报文用户数据组成,IP报文头的长度一般在20到60个字节之间,而一个IP分组的最大长度则不能超过65535个字节. ...
- 【转】Python的下划线
原文: 1. Python中的下划线(译文) 2. [转]关于python中带下划线的变量和函数的意义 总结: 1. 单下划线开头.保护变量,不可被其他包导入使用,除非在__all__声明可以显示引用 ...
- 洛谷 P2725 解题报告
P2725 邮票 Stamps 题目背景 给一组 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K -- 表示信封上能够贴 K 张邮票.计算从 1 到 M 的最大连续可贴出的邮资. 题目描 ...
- 洛谷 P2764 解题报告
P2764 最小路径覆盖问题 问题描述: 给定有向图\(G=(V,E)\).设\(P\) 是\(G\) 的一个简单路(顶点不相交)的集合.如果\(V\) 中每个顶点恰好在\(P\) 的一条路上,则称\ ...
- Windows驱动开发入门指引
1. 前言 因工作上项目的需要,笔者需要做驱动相关的开发,之前并没有接触过相关的知识,折腾一段时间下来,功能如需实现了,也积累了一些经验和看法,所以在此做番总结. 对于驱动开发的开发指引,微软 ...
- Eclipse安装Jetty插件
通过Eclipse MarketPlace安装Jetty插件. Jetty下载 1. 2.3.4.5. 注:在使用Jetty的时候,同一个Project中,不可以同时存在两个版本的库,否则会出现找不 ...
- 使用WampServer和DVWA在Windows10上搭建渗透测试环境
前言: DVWA是一个具有脆弱性的Web测试应用,需要PHP和MySQL的环境支持.我们可以手动配置DVWA所需的运行环境,也可以使用WampServer进行搭建.WampServer是集成了Apac ...
- zookeeper 配置文件conf目录下 zoo文件 配置详解
clientPort:客户端尝试连接server的端口号 (对外服务端口) 通常为2181 dataDir:存放快照文件snapshot的目录.(储存数据的目录) dataLogDir:事务日志存放位 ...