python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)


Posted in Python onApril 25, 2019

最近想着做一个微信机器人,主要想要实现能够每天定时推送天气预报或励志语录,励志语录要每天有自动更新,定时或当有好友回复时,能够随机推送不同的内容。于是开始了分析思路。博主是采用了多线程群发,因为微信对频繁发送消息过快还会出现发送失败的问题,因此还要加入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():
 url = 'http://www.59xihuan.cn/'
 headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)"}
 res = requests.get(url, headers=headers).content
 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)

现在先设置定时器,你可以设置多个的啦,博主只设置了早上:

def main():
 print("程序开始运行...")
 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('101270101').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"]

 

好了,所有工作完成,看看效果,记得屏蔽了公众号,不然会有下面效果:

python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)

 

python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)

python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)

总结

以上所述是小编给大家介绍的python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python编程中归并排序算法的实现步骤详解
May 04 Python
python2 与python3的print区别小结
Jan 16 Python
python实现zabbix发送短信脚本
Sep 17 Python
python实现反转部分单向链表
Sep 27 Python
详解Python中is和==的区别
Mar 21 Python
pandas 对group进行聚合的例子
Dec 27 Python
深度学习入门之Pytorch 数据增强的实现
Feb 26 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
Pycharm如何导入python文件及解决报错问题
May 10 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
Aug 22 Python
教你怎么用Python实现GIF动图的提取及合成
Jun 15 Python
再谈python_tkinter弹出对话框创建
Mar 20 Python
Python 给屏幕打印信息加上颜色的实现方法
Apr 24 #Python
利用Python查看微信共同好友功能的实现代码
Apr 24 #Python
python实现飞机大战游戏
Oct 26 #Python
Python3.5面向对象程序设计之类的继承和多态详解
Apr 24 #Python
Python supervisor强大的进程管理工具的使用
Apr 24 #Python
python3爬虫学习之数据存储txt的案例详解
Apr 24 #Python
Python3.5面向对象编程图文与实例详解
Apr 24 #Python
You might like
解析php下载远程图片函数 可伪造来路
2013/06/25 PHP
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
js隐藏与显示回到顶部按钮及window.onscroll事件应用
2013/01/25 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
JavaScript实现图片轮播的方法
2015/07/31 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
js简单时间比较的方法
2016/08/02 Javascript
Vue.js第四天学习笔记(组件)
2016/12/02 Javascript
js图片加载效果实例代码(延迟加载+瀑布流加载)
2017/05/12 Javascript
详解angularjs 关于ui-router分层使用
2017/06/12 Javascript
js+html5实现复制文字按钮
2017/07/15 Javascript
Vue-Cli中自定义过滤器的实现代码
2017/08/12 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
js利用拖放实现添加删除
2020/08/27 Javascript
python写日志封装类实例
2015/06/28 Python
Django 使用logging打印日志的实例
2018/04/28 Python
python实现Zabbix-API监控
2018/09/17 Python
代码详解django中数据库设置
2019/01/28 Python
Python实现元素等待代码实例
2019/11/11 Python
python字典key不能是可以是啥类型
2020/08/04 Python
在 Python 中使用 7zip 备份文件的操作
2020/12/11 Python
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
2015/03/27 HTML / CSS
医学生实习自荐信
2013/10/01 职场文书
应届生污水处理求职信
2013/11/06 职场文书
办公室前台的岗位职责
2013/12/20 职场文书
期终自我鉴定
2014/02/17 职场文书
法律进机关实施方案
2014/03/12 职场文书
信仰心得体会
2014/09/05 职场文书
2014年手术室工作总结
2014/11/26 职场文书
如何写辞职书
2015/02/26 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
员工辞职信范文大全
2015/05/12 职场文书
大学军训通讯稿
2015/07/18 职场文书
2015年美容师个人工作总结
2015/10/14 职场文书