文章目录

  • 写在前面
    • 做的什么
    • 一些tips
  • 1.爬虫部分
  • 2.微信机器人转发消息
    • 2.1机器人需求以及实现过程
    • 2.2向好友发送推送
      • 2.2.1得到一个好友列表
      • 2.2.2遍历好友列表推送消息
  • 3.微信机器人代码
    • 3.1结构
    • 3.2主程序
    • 3.3get_school()函数内部
    • 3.4小补充,关于@bot.register()
  • 2019/11/19补充
  • 写在后面

写在前面

做的什么

1.爬取学院和教务处公告

  1. 使用requests库发起get请求获得目标HTML。
  2. 使用bs4用来解析HTML获取公告标题和链接。

2.开发微信机器人向好友和自己推送标题和链接

  1. 好友微信内自主订阅通知,以此获取到一个好友列表
  2. 遍历列表,向好友推消息

一些tips

微信机器人和QQ机器人开发类似,有对应的py库,但是今年早些时候腾讯停止了WebQQ服务。所以正规的QQ机器人就没法开发了,但是听说也有一些其它的渠道可以开发QQ机器人,不过既然官方都停止维护了,就没有再去深入了解。
所以就转向了微信机器人,有几点很头疼:

  1. 想搞个小号开发,但微信申请新的账号不像QQ那么容易
  2. 我申请完了发现小号登不上Web微信!查了一下好像说新申请的号一年内不让登陆
  3. 问了好多渣男有没有不用的微信小号而且能登陆网页微信的,没结果。我一想:有也不会给啊,人吃饭的工具啊。

折腾了一阵子最后还是用自己的号做开发,有点小烦。
建议先快速浏览一下wepy官方中文文档,对于这个库能做什么、该怎么做应该会有一个大概的认识。
大概了解后,后面开发的时候根据自己的需求对应地去找相应的API就好了。
下面是一个最简单地示例,向你昵称为“XX小舟”的好友发送’Hello WeChat!’。

from wxpy import *
# 初始化机器人,扫码登陆
bot = Bot()
my_friend = bot.friends().search('XX小舟', sex=MALE)[0]#返回的是一个列表,所以加上[0]
my_friend.send('Hello WeChat!')

1.爬虫部分

分出去写了,一是因为内容比较独立,二是加进来总体篇幅太长。
链接:py爬虫爬取学校通知公告

2.微信机器人转发消息

上面部分说到了如何判断通知是最新的。
用的方法是: 实时获取当天的年月日,与网站内通告的日期比对,相等则一定是最新消息,爬到一条后就把它的链接添加到一个“已抓取”列表中,再次抓取的时候先判断通知的链接是否在列表内,在则是当日已抓取信息;不在内则是当日新信息,到了第二天则清空“已抓取”列表。

2.1机器人需求以及实现过程

我的微信机器人要达到的目标很简单:就是给指定好友发送消息。所以其实很多功能都没用到,比如说对群聊的监控、自动拉人入群以及图灵机器人在线陪聊等等。
所以我的开发路线也很明确,根据对应想要的功能在前面给的官方文档中直接去找API。开发其它功能也是同样的思路,虽然说网上关于微信机器人开发的博客还挺多的,也包括我这篇。但是别人的博客也可能是对应实现某个功能,可能不是你自己想要的,这样去找、去看博客其实效率很低。遇到不确定的地方还是得去查官方文档。

2.2向好友发送推送

2.2.1得到一个好友列表

如果每次都是通过如下的方式去寻找好友再发消息出去,就很傻。

my_friend = bot.friends().search('XX小舟', sex=MALE)[0]

所以我搞了一个“订阅”:好友主动订阅通知,由此将好友分别加入两个通知的两个列表。大致效果如下

代码如下,其实可以简单的理解成一个自动回复的例子:

@bot.register(Friend, TEXT)# 规定响应好友发来的“TEXT”类型的msg
def service(msg):print(msg.text)if '通知' in msg.text:msg.reply_msg("你想订阅哪些网站通知?\n 请回复标题,如:1,2或12\n1.机自学院通告\n2.教务处通告\n注:订阅成功后可回复TD取消订阅")if '1' in msg.text:if msg.sender in friends_school:msg.reply_msg("您已经成功订阅机自学院通告,无需再次操作")else:friends_school.append(msg.sender)msg.reply_msg("成功订阅机自学院通告")if '2' in msg.text:if msg.sender in friends_teaching:msg.reply_msg("您已经成功订阅教务处通告,无需再次操作")else:friends_teaching.append(msg.sender)msg.reply_msg("成功订阅教务处通告")if "TD" in msg.text:if msg.sender in friends_school and msg.sender in friends_teaching:friends_school.remove(msg.sender)friends_teaching.remove(msg.sender)msg.reply_msg("成功退订学院、教务处通告")elif msg.sender in friends_school:friends_school.remove(msg.sender)msg.reply_msg("成功退订学院通告")elif msg.sender in friends_teaching:friends_teaching.remove(msg.sender)msg.reply_msg("成功退订教务处通告")else:msg.reply_msg("您还未订阅")

2.2.2遍历好友列表推送消息

如此就得到了两个列表friends_school和friends_teaching,分别存放了订阅两个网站通知的好友。发送消息时,遍历列表,向好友推送消息。

for eachFriend in friends_school:eachFriend.send("学院有新通知,标题:“" + each_text + "”")eachFriend.send("链接:" + real_href)

如果爬到新消息,就推送出去,效果如下

3.微信机器人代码

3.1结构

前面一些全局变量没有截图进来,占位置。

3.2主程序

因为涉及到爬虫,所以写了个while一直重复执行,每次循环最后sleep 5秒。

while 1:# 获取当天时间,格式与网页内相同,Y-M-DtimeGet = time.strftime('%Y-%m-%d', time.localtime())if timeGet == today:passelse:# 如果到达明天,today重新赋值,并且清空“已爬取网页列表”today = timeGetexception = []# print(today)# 学院通告get_school()# 爬取学院公告并发给好友# 教务处通告get_teaching()# 爬取教务处公告并发给好友print("##########################")print("已爬取名单:")print(exception)# 已爬取的通知列表print("学院名单:")print(friends_school)print("教务处名单:")print(friends_teaching)time.sleep(5)

3.3get_school()函数内部

get_teaching就不放了,两者几乎一样。

def get_school():url = 'http://www.auto.shu.edu.cn/synr/tzgg.htm'# 模拟浏览器发送HTTP请求header = {'User-Agent': 'Mozilla/5.0'}try:response = requests.get(url, headers=header)response.raise_for_status()response.encoding = response.apparent_encodinghtml = response.textsoup = BeautifulSoup(html, "html.parser")except:print("爬取失败了,朋友")mail("报错", "爬虫失败了")#这个mail函数文中没讲,是给我自己发送邮件,参数为主题+正文returntarget = soup.find_all("span", string=today)for eachOne in target:# 得到链接和标题each_text = eachOne.parent.parent.td.a.texteach_href = eachOne.parent.parent.td.a.get("href")if each_href in exception:passelse:# 没在“已爬取列表”内的话,发送链接、消息给好友real_href = "http://www.auto.shu.edu.cn/" + each_href[3:]# 处理一下链接print(real_href)print(each_text)# 给我自己发邮件通知mail("学院有新通知", "标题:" + each_text + "\n链接:" + real_href)for eachFriend in friends_school:eachFriend.send("学院有新通知,标题:“" + each_text + "”")eachFriend.send("链接:" + real_href)# 加入“已爬取列表”exception.append(each_href)

3.4小补充,关于@bot.register()

为了保持登陆,官方文档这么说的(截图):

因为我程序里写了while,所以就不需要堵塞线程,程序不会结束。但是突然一想,我的两个@bot.register()注册的函数都在while外面,能被执行到吗?
调试证明,这两个@bot.register()注册的函数都能被执行,所以我推断它的本质是回调函数。

2019/11/19补充

以前用户信息放在一列表内,一旦重启用户信息就没了,所以写了数据库保存用户信息,记录了乱码问题。
py操作MySQL以及解决乱码问题的记录
并且把代码上传了:spider

写在后面

记录学习,欢迎交流,多多指教

wepy微信机器人:向好友推送爬取的公告相关推荐

  1. python实现企业微信机器人的自动推送

    关于企业微信机器人的自动推送 前些天,做了一个关于企业微信机器人自动推送消息的一个小功能,在这里来聊一下其中学习到的一些内容. 由于是需要进行自动推送新闻,因此先对需要获得信息的网页进行爬取. 在爬取 ...

  2. Beego搭建企业微信机器人定时消息推送

    Beego搭建企业微信Robot定时消息推送 功能说明 PostMan添加job msgType 默认是:text并且支持@all markdown支持颜色和样式但是不支持@all cron quar ...

  3. python: 企业微信 机器人定制化推送

    需要实现的是: 1.企微推送 定制化消息 思路: (1)把需要推送的内容处理好 (2)调用企微api (3)推送时间的设置触发--可利用jekins的Build Triggers定时构建 上具体实现: ...

  4. 企业微信机器人脚本python_python提取数据库数据并实现企业微信机器人定时消息推送...

    之前发过一个企业微信群机器人接口调用发提醒的文章,是用最简单的VBS脚本+Windows任务计划来实现的,仅实现了定时发送固定内容的提醒.其实企业微信机器人就是一个webhook接口,用户以post ...

  5. 企业微信机器人实现自动推送天气预报

    start~ 因为要用到天气信息,在网上找了很多免费的api,不是有调用限制要不就是返回的结果不满意,最终看了百度的比较合适,决定用爬虫抓下来. 在百度上搜索"长春天气",将浏览器 ...

  6. 利用Python制作微信机器人(三)实现爬取JD商品价格

    从前两篇的博客来看,目前已经实现了机器人单向给微信发消息,和与机器人进行交互式发消息,详情如下: 利用Python制作微信机器人(一)机器人单向发消息 利用Python制作微信机器人(二)与机器人进行 ...

  7. python爬虫如何实现每天爬取微信公众号的推送文章

    python爬虫如何实现每天爬取微信公众号的推送文章 上上篇文章爬虫如何爬取微信公众号文章 上篇文章python爬虫如何爬取微信公众号文章(二) 上面的文章分别介绍了如何批量获取公众号的历史文章url ...

  8. java获取微信公总号推送的所有信息的url,用于爬取微信推送的文章内容

    场景描述: 在用户提出需要爬取微信公总号推送消息的时候,感觉是懵逼的,之前从来没爬取过,无从下手,没办法顾客是上帝,既然用户提出了需求,我们只能想法去解决问题. 然后根据用户提供微信公总号  安泰科现 ...

  9. html5 微信墙,HTML5服务器端推送事件 解决PHP微信墙推送问题

    问题描述 以前的文章中< PHP微信墙制作,开源 >已经用PHP搭建了一个微信墙获取信息的服务器,然后我就在想推送技术应该怎么解决,上一篇已经用了.NET 的signalr做了一个微信墙, ...

最新文章

  1. TestSuite测试报告生成
  2. 蓝桥杯JAVA省赛2013-----B------4(黄金连分数)
  3. SQL批量提交修改业务
  4. 排序 不用order by_Sort Techniques:介绍九种排序算法
  5. SQL存储过程和函数区别(超级简单,人人都可以看懂)
  6. vb mysql 5.1 adodb_VB 中 ADO、 ADODB、 ADODC 的区别与联系(皮毛)
  7. [PHP]全国省市区信息,mysql数据库记录
  8. 35岁开发转测试,能度过中年危机吗?
  9. js 验证的银行卡信息(哪家银行、储蓄卡还是信用卡)
  10. 使用google的jib, 发布Docker镜像到阿里云
  11. 量子力学最新发现:人不会真正死去
  12. Dharma家族变体,.adobe后缀勒索病毒解密
  13. Java 操作Word书签(一):添加、删除、读取书签
  14. 大数据技术生态体系组件概述
  15. 这样走能实现读博梦想吗?
  16. Python——Flask基础学习
  17. 该结束这忙忙碌碌却又碌碌无为的生活了
  18. Laravel 上传文件大小改为200M
  19. 数字IC-1.8 子模块组建整模块-动态数码管设计代码实例
  20. 页面实现自动保存内容功能

热门文章

  1. windows数字签名与详解信息替换
  2. Python之Tkinter控件几何管理类
  3. IOS 16.2 升级后双卡只能开启一张卡的bug解决
  4. 关于amd.dll后门病毒入侵3306端口的临时解决方案
  5. Web 前端框架 Layui
  6. 老鼠和奶酪——————C++
  7. 学计算机的都是好男人,心理学:好男人的十个标准,做到4个就值得嫁了!
  8. 数据并发问题-精通spring 企业应用开发实战读书笔记
  9. SQL简单查询语句问题
  10. Android 源码 Wi-Fi 连接流程分析