侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   159

最近想着做一个微信机器人,主要想要实现能够每天定时推送天气预报或励志语录,励志语录要每天有自动更新,定时或当有好友回复时,能够随机推送不同的内容。于是开始了分析思路。博主是采用了多线程群发,因为微信对频繁发送消息过快还会出现发送失败的问题,因此还要加入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 timeimport jsonimport requestsimport datetimeimport threadingfrom queue import Queueimport scheduleimport wxpyfrom weather import WeatherSpiderfrom soul import Soulbot = 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微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!


  • 上一条:
    python3人脸识别的两种方法
    下一条:
    Python 给屏幕打印信息加上颜色的实现方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客