python微信公众号自动推送(十分简单的教程)

 

b3b0f8a7d0434498920c018a4a44fcbb.jpeg

 

目录

一、注册微信公众号

     1.注册链接

    2.登录成功

3.关注该公众号

4.创建模板

二、代码实现

1.爬取天气信息

2.计算生日天数

 3.获取access token

4.获取关注者的openid

5.向用户广播消息

6.最终代码


 

2023年五月五日更:

   自五月四日起原来的微信公众号模版将不再生效,可根据最新的开发文档更新的规则对自己的模版进行修改,修改过后即可重新获取到有内容的微信公众号推送

4e7ac03f274e4a01b7245da3831dc180.png

 

 

一、注册微信公众号

     1.注册链接

https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/indexhttps://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

a5d25c810a1347519ad3aa02a16ff062.png

到达这个界面微信扫码登录即可(若出现登录失败问题则建议换一个更好的网络环境再尝试或者尝试刷新网页)

    2.登录成功

 

 66a30a81c61a46bd9e6f312eb08d9011.jpeg

登录成功后会自动生成你的appid和appsecret(后面会用到) 接口信息等暂时不用管若后期想完全实现自动推送则需要挂自己的服务器(后续会更新)

3.关注该公众号

9814f436792f4ddb91cb3ebd808c3346.jpeg

 扫码关注即可(建议不要心急自己调试好了再让npy关注)

4.创建模板

 创建模板时既可以将所有的 文本文字+数据 放在一起当作数据像这样

0e1c775f4dc24345993ca2a150474633.png

 也可以再模板内先写出来,但是这种方法会让模板的灵活性变小做大的修改只能重新创建新的模板 

 bff0ecfa04f94e739eeff756a1cf0115.png

 创建好模板微信公众号注册的工作就结束了

二、代码实现

首先了解以下的几个库

import requests
import json
import datetime
import time
from bs4 import BeautifulSoup
from zhdate import ZhDate
#用到的库

1.爬取天气信息

def get_weather(self):"""该方法中用到了beautifulsoup的一些基本用法感兴趣可以深入了解python爬虫"""url = 'http://www.weather.com.cn/weather/101290101.shtml'     #昆明天气网站sysdate = datetime.date.today()r = requests.get(url, timeout=30)                             # 用requests抓取网页r.raise_for_status()                                          # 异常时停止r.encoding = r.apparent_encoding                              # 编码格式html = r.textfinal_list = []soup = BeautifulSoup(html, 'html.parser')       # 用BeautifulSoup库解析网页body = soup.body                                  # 从soup里截取body的一部分data = body.find('div', {'id': '7d'})        #在网页浏览器按F12遍历div 找到 id = 7d                                                                 #的对应标签 会发现七天的天气信息都包括在子节点中ul = data.find('ul')                                          #用find方法找ul标签lis = ul.find_all('li')                                       #找到ul中的li标签也就是列表其中存放着 日期 天气 风力等信息 for day in lis:temp_list = []date = day.find('h1').string                              # 找到日期if date.string.split('日')[0] == str(sysdate.day):temp_list = []date = day.find('h1').string                          # 找到日期temp_list.append(date)info = day.find_all('p')                              # 找到所有的p标签temp_list.append(info[0].string)if info[1].find('span') is None:                      # 找到p标签中的第二个值'span'标签——最高温度temperature_highest = ' '                         # 用一个判断是否有最高温度else:temperature_highest = info[1].find('span').stringtemperature_highest = temperature_highest.replace('℃', ' ')if info[1].find('i') is None:                         # 找到p标签中的第二个值'i'标签——最高温度temperature_lowest = ' '                          # 用一个判断是否有最低温度else:temperature_lowest = info[1].find('i').stringtemperature_lowest = temperature_lowest.replace('℃', ' ')temp_list.append(temperature_highest)                 # 将最高气温添加到temp_list中temp_list.append(temperature_lowest)                  # 将最低气温添加到temp_list中final_list.append(temp_list)                          # 将temp_list列表添加到final_list列表中return '天气情况:' + final_list[0][1] + '\n温度:' + final_list[0][3].strip() + '~' + \final_list[0][2].strip() + '℃'

2.计算生日天数

 def get_herbirthday(self):"""获取npy生日 这里还用到了农历时间库可以去网上查阅 ZhDate库 其他基本上是datetime中的一些获取当前日期和toordinal没什么特别难的"""today = datetime.datetime.now()                               #获取现在时间信息data_str = today.strftime('%Y-%m-%d')herbirthDay = ZhDate(today.year, 1, 18).to_datetime()          #将农历1.18号的时间转换为公历时间再转换为datetime类型的时间if herbirthDay >today :                                        #如果ta的生日日期比今天靠后则直接计算这两天的序号之差difference = herbirthDay.toordinal() - today.toordinal()return ("\n距离熊又又生日,还有 %d 天。" % (difference))elif herbirthDay <today:                                       #如果ta的生日日期比今天靠前则给ta的生日加上一年再计算这两天的序号之差herbirthDay = herbirthDay.replace(today.year+1)difference = herbirthDay.toordinal() - today.toordinal()return ("\n距离熊又又生日,还有 %d 天。" % (difference))else:return ('生日快乐bb!!')

 3.获取access token

获取公众号的access_token值,access_token是公众号全局唯一接口调用凭据,公众号调用各接口时都需要使用access_token。api接口:接口调用请求说明
https请求方式:

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={你的appid}&secret={你的appsecret}
 def get_access_token(self):"""获取access_token通过查阅微信公众号的开发说明就清晰明了了"""url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}'.\format(self.appID, self.appsecret)headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36'}response = requests.get(url, headers=headers).json()access_token = response.get('access_token')return access_token

4.获取关注者的openid

   opend_id是(有关注公众号的微信账号)用户id,想要消息推送过去就必须要获取open_id

获取open id的https请求方式为

https://api.weixin.qq.com/cgi-bin/user/get?access_token={获取的access token}&next_openid={}
def get_openid(self):"""获取所有用户的openid微信公众号开发文档中可以查阅获取openid的方法"""next_openid = ''url_openid = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token=%s&next_openid=%s' % (self.access_token, next_openid)ans = requests.get(url_openid)open_ids = json.loads(ans.content)['data']['openid']return open_ids

5.向用户广播消息

http请求方式:

 POST https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=ACCESS_TOKEN
def sendmsg(self):  """给所有用户发送消息"""url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={}".format(self.access_token)if self.opend_ids != '':for open_id in self.opend_ids:body = {"touser": open_id,"template_id": self.template_id,"url": "https://www.baidu.com/","topcolor": "#FF0000",#对应模板中的数据模板"data": {"frist": {"value": self.dataJson.get("frist"),               "color": "#FF99CC"                                  #文字颜色},"body": {"value": self.dataJson.get("body"),"color": "#EA0000"},"weather": {"value": self.dataJson.get("weather"),"color": "#00EC00"},"date": {"value": self.dataJson.get("date"),"color": "#6F00D2"},"remark": {"value": self.dataJson.get("remark"),"color": "#66CCFF"}}}data = bytes(json.dumps(body, ensure_ascii=False).encode('utf-8'))  #将数据编码json并转换为bytes型response = requests.post(url, data=data)                    result = response.json()                                            #将返回信息json解码print(result)                                                       # 根据response查看是否广播成功else:print("当前没有用户关注该公众号!")

6.最终代码

import requests
import json
import datetime
import time
from bs4 import BeautifulSoup
from zhdate import ZhDateclass SendMessage():                                                 #定义发送消息的类def __init__(self):                                              date = self.get_date()                                       #获取当前日期weather = self.get_weather()                                 #获取天气信息lovedate = self.get_loveday()                                #获取纪念日herbirthday = self.get_herbirthday()                         #获取npy生日mybirthday = self.get_mybirthday()                           #获取自己生日body =lovedate+"\n"+herbirthday+mybirthday                   self.dataJson ={"frist":"早上好bb!❤\n",                     #最终要发送的json"date":date+'\n',"body":body+" ","weather":weather+'\n城市:昆明'+'\n',        #因为还没写获取地理位置的所以城市暂时写死 后续将会改为获取当前位置并爬取对应城市的天气信息版本"last":'\n今天也是爱bb🐖的一天捏!!!'      }self.appID = ''                             #appid 注册时有self.appsecret = ''           #appsecret 同上self.template_id = ''  # 模板idself.access_token = self.get_access_token()                   #获取 access tokenself.opend_ids = self.get_openid()                            #获取关注用户的openiddef get_weather(self):"""该方法中用到了beautifulsoup的一些基本用法感兴趣可以深入了解python爬虫"""url = 'http://www.weather.com.cn/weather/101290101.shtml'     #昆明天气网站sysdate = datetime.date.today()r = requests.get(url, timeout=30)                             # 用requests抓取网页信息r.raise_for_status()                                          # 异常时停止r.encoding = r.apparent_encoding                              # 编码格式html = r.textfinal_list = []soup = BeautifulSoup(html, 'html.parser')                     # 用BeautifulSoup库解析网页 #soup里有对当前天气的建议body = soup.body                                              # 从soup里截取body的一部分data = body.find('div', {'id': '7d'})                         #在网页浏览器按F12遍历div 找到 id = 7d 的对应标签 会发现七天的天气信息都包括在子节点中ul = data.find('ul')                                          #用find方法找ul标签lis = ul.find_all('li')                                       #找到ul中的li标签也就是列表其中存放着 日期 天气 风力等信息 for day in lis:temp_list = []date = day.find('h1').string                              # 找到日期if date.string.split('日')[0] == str(sysdate.day):temp_list = []date = day.find('h1').string                          # 找到日期temp_list.append(date)info = day.find_all('p')                              # 找到所有的p标签temp_list.append(info[0].string)if info[1].find('span') is None:                      # 找到p标签中的第二个值'span'标签——最高温度temperature_highest = ' '                         # 用一个判断是否有最高温度else:temperature_highest = info[1].find('span').stringtemperature_highest = temperature_highest.replace('℃', ' ')if info[1].find('i') is None:                         # 找到p标签中的第二个值'i'标签——最高温度temperature_lowest = ' '                          # 用一个判断是否有最低温度else:temperature_lowest = info[1].find('i').stringtemperature_lowest = temperature_lowest.replace('℃', ' ')temp_list.append(temperature_highest)                 # 将最高气温添加到temp_list中temp_list.append(temperature_lowest)                  # 将最低气温添加到temp_list中final_list.append(temp_list)                          # 将temp_list列表添加到final_list列表中return '天气情况:' + final_list[0][1] + '\n温度:' + final_list[0][3].strip() + '~' + \final_list[0][2].strip() + '℃'def get_date(self):"""这些都是datetime库中的用法若零基础可以去python的开发文档中查阅"""sysdate = datetime.date.today()                 # 只获取日期now_time = datetime.datetime.now()              # 获取日期加时间week_day = sysdate.isoweekday()                 # 获取周几week = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期天']return '现在是' + str(now_time)[0:16] + ' ' + week[week_day - 1]def get_herbirthday(self):"""获取npy生日 这里还用到了农历时间库可以去网上查阅 ZhDate库 其他基本上是datetime中的一些获取当前日期和toordinal没什么特别难的"""today = datetime.datetime.now()                               #获取现在时间信息data_str = today.strftime('%Y-%m-%d')herbirthDay = ZhDate(today.year, 1, 18).to_datetime()          #将农历1.18号的时间转换为公历时间再转换为datetime类型的时间if herbirthDay >today :                                        #如果ta的生日日期比今天靠后则直接计算这两天的序号之差difference = herbirthDay.toordinal() - today.toordinal()return ("\n距离熊又又生日,还有 %d 天。" % (difference))elif herbirthDay <today:                                       #如果ta的生日日期比今天靠前则给ta的生日加上一年再计算这两天的序号之差herbirthDay = herbirthDay.replace(today.year+1)difference = herbirthDay.toordinal() - today.toordinal()return ("\n距离熊又又生日,还有 %d 天。" % (difference))else:return ('生日快乐bb!!')def get_mybirthday(self):"""同上"""today = datetime.datetime.now()data_str = today.strftime('%Y-%m-%d')mybirthDay = datetime.datetime(today.year,12,7)if mybirthDay >today :difference = mybirthDay.toordinal() - today.toordinal()return ("\n距离刘壮壮生日,还有 %d 天。" % (difference))elif mybirthDay <today:mybirthDay = mybirthDay.replace(today.year+1)difference = mybirthDay.toordinal() - today.toordinal()return ("\n距离刘壮壮生日,还有 %d 天。" % (difference))else:return ('祝我生日快乐!!')def get_loveday(self):"""用法同上"""today = datetime.datetime.now()data_str = today.strftime('%Y-%m-%d')oneDay = datetime.date(2022, 4, 4)d =  today.toordinal()-oneDay.toordinal()return ("我们已经相爱 %d 天。\n%d 年 %d 个月 %d 天。\n%d 个月 %d 天。\n%d 周 %d 天。" % (d,d // 365, (d % 365) // 30, (d % 365) % 30, d // 30, d % 30, d // 7, d % 7))def get_access_token(self):"""获取access_token通过查阅微信公众号的开发说明就清晰明了了"""url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}'.\format(self.appID, self.appsecret)headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36'}response = requests.get(url, headers=headers).json()access_token = response.get('access_token')return access_tokendef get_openid(self):"""获取所有用户的openid微信公众号开发文档中可以查阅获取openid的方法"""next_openid = ''url_openid = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token=%s&next_openid=%s' % (self.access_token, next_openid)ans = requests.get(url_openid)open_ids = json.loads(ans.content)['data']['openid']return open_idsdef sendmsg(self):  """给所有用户发送消息"""url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={}".format(self.access_token)if self.opend_ids != '':for open_id in self.opend_ids:body = {"touser": open_id,"template_id": self.template_id,"url": "https://www.baidu.com/","topcolor": "#FF0000",#对应模板中的数据模板"data": {"frist": {"value": self.dataJson.get("frist"),               "color": "#FF99CC"                                  #文字颜色},"body": {"value": self.dataJson.get("body"),"color": "#EA0000"},"weather": {"value": self.dataJson.get("weather"),"color": "#00EC00"},"date": {"value": self.dataJson.get("date"),"color": "#6F00D2"},"last": {"value": self.dataJson.get("last"),"color": "#66CCFF"}}}data = bytes(json.dumps(body, ensure_ascii=False).encode('utf-8'))  #将数据编码json并转换为bytes型response = requests.post(url, data=data)                    result = response.json()                                            #将返回信息json解码print(result)                                                       # 根据response查看是否广播成功else:print("当前没有用户关注该公众号!")if __name__ == "__main__":sends = SendMessage()sends.sendmsg()

代码还有很多需要改进的地方

大佬轻喷!!!

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/50084.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatGPT说明SQLAlchemy中的关系加载技术,joinedload加载方式,并与selectinload的不同之处

之前一直对SQLAlchemy中的关系加载很模糊 一次百度在SQLAlchemy中如何加载关联数据&#xff0c;给出的答案是selectinload&#xff0c;发现蛮好用&#xff0c;就一直使用了&#xff0c;没再继续了解其他的关系API&#xff0c;一次偶然的技术需要到这些了&#xff0c;赶紧来复习…

好用的码字软件,年入百万的大神作家们都在用

如今&#xff0c;码字软件需求很大&#xff0c;市面上也出现了很多码字软件&#xff0c;但找到一款适合自己的码字软件却并不容易&#xff0c;那么你知道大些大神作家们喜欢用什么软件么&#xff1f;其实我也不知道&#xff0c;但是我发现了一个秘密&#xff0c;那就是由橙瓜打…

猿创征文|五款程序员必备神级工具,看看你用过几个?

程序员必备的神级工具 一、有道词典二、XMind三、Notepad四、Typora五、Everything 一、有道词典 邻居家有个小孩&#xff0c;一个资深学瘾少年&#xff0c;有他经过的地方&#xff0c;总会引起周边妇女赞扬&#xff08;以及对其余所有孩子的无限嘲讽&#xff09;。 有一次&am…

一篇万字博文带你入坑爬虫这条不归路 【万字图文】

&#x1f47b;最近&#xff0c;很多粉丝私信我问——爬虫到底是什么&#xff1f;学习爬虫到底该从何下手&#xff1f;&#x1f47b; &#x1f62c;其实&#xff0c;我想说的也是曾经的我身为小白的时候某些大牛对我说过的——很多时候我们都有一颗想要学习新知识的心&#xff…

微软/Hotmail验证码识别97%识别率方案

如图所示&#xff0c;微软Hotmail的验证码与我们往常所见的验证码略有不同&#xff0c;他是 【双层粘结】 的验证码&#xff0c;这对于我们识别有什么影响呢&#xff1f; 我们先来看CTC算法的TimeStep在语音识别中的表示&#xff1a; 因为位数不固定&#xff0c;一般通过端到…

EasyCaptcha图形验证码工具

介绍 Java图形验证码工具&#xff0c;支持gif&#xff08;动图&#xff09;、中文、算术等类型&#xff0c;可用于Java Web、JavaSE等项目。 快速开始 导入依赖 <dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</art…

您的captcha验证码设置对了吗?

Web App 评估可能是当今最流行的渗透测试之一。它们非常受欢迎&#xff0c;以至于 Hacker One 和 Bug Crowd 等公共漏洞赏金网站为希望修复 XSS、SQL 注入、CSRF 等漏洞的公司提供了数百个程序。许多公司还拥有自己的赏金计划&#xff0c;用于向以下人员报告 Web 漏洞一个安全团…

微软验证码项目 Captcha Code Demo 从 .NET Core 1.1.2升级到2.1.0

How to make and use captcha code in ASP.NET Core 在ASP.NET Core 中如何实现 captcha 验证码 这个 Demo 是在微软 msdn 中找到的&#xff0c;早期 2017年6月30日发布。发现它的时候是 2019年10月30日。这时候 .NET Core 版本 3.0 已发布。Visual Studio 2019 也已经自动更新…

【文心一言】广告文案、演讲稿与请假条自动生成

前言 作为一名大学生而言&#xff0c;平时参加或者举办一些学校组织的活动的时候&#xff0c;总是避免不了需要准备一些演讲稿、广告宣传文案等内容&#xff0c;甚至于在疫情十分严重的这几年内&#xff0c;如何跟老师“委婉的”请假&#xff0c;也成为了我日常头疼的事情。但在…

如何设计好一条推送通知

你注意过么&#xff0c;每天从不同的 App 上收到的大量的推送通知与提醒&#xff0c;这些通知里有多少你真的有兴趣? 智能手表屏幕上无意义的通知 每天&#xff0c;用户对各种没用的通知应接不暇&#xff0c;这些通知让他们分散注意力&#xff0c;甚至成为了骚扰。骚扰的通知…

通知栏消息文案写作干货:个推手把手教你写

去搜一搜消息推送的入门秘籍、干货精华&#xff0c;始终绕不开“推送有价值的信息很关键”&#xff0c;其载体则是走心的文案&#xff0c;那么对于APP运营人员来说&#xff0c;什么样的推送文案称得上“优秀”&#xff1f;本文结合部分APP的通知栏消息案例&#xff0c;从中规中…

通告,消息,提醒,设计

通告Bulletin&#xff1a; 平台发&#xff0c;用户收。分为实时通告和非实时通告。通告有优先级&#xff1a;紧急&#xff0c;高&#xff0c;普通。 平台向单个用户发&#xff0c;平台向多个用户发&#xff0c;平台向某一个用户类型发&#xff0c;平台向全部用户发。 平台发布通…

Twitter注册如何做到ip防关联

因为Twitter还可以用来做广告&#xff0c;所以很多跨境电商都是通过Twitter来工作的。对于这些用户来说&#xff0c;一个Twitter账号肯定是不够的&#xff1b;多个账户需要同时操作。但是&#xff0c;如果你使用相同的浏览器或相同的ip地址&#xff0c;你很快就会决定询问关联的…

IP-GUARD控制台账户输入多次错误密码锁定后该如何解锁?

其他管理员账户给锁定了,暂时只能等其锁定时间到了才可以再次输入,默认是设置是锁定30min; 1、如果急需此账户查看,可以使用admin系统管理员账户登录控制台,在工具-账户中清除这个账户的密码,重新登录设置密码。

Oracle用户被锁查哪个具体IP地址造成的

Oracle用户被锁查哪个具体IP地址造成的 1、用dba角色的用户登陆&#xff0c;进行解锁&#xff0c;先设置具体时间格式&#xff0c;以便查看具体时间 SQL> alter session set nls_date_format‘yyyy-mm-dd hh24:mi:ss’; Session altered. 2、查看具体的被锁时间 SQL>…

在 Linux 下利用ipset大量屏蔽恶意 IP 地址

很多情况下&#xff0c;你可能需要在Linux下屏蔽IP地址。比如&#xff0c;作为一个终端用户&#xff0c;你可能想要免受间谍软件或者IP追踪的困扰。或者当你在运行P2P软件时。你可能想要过滤反P2P活动的网络链接。如果你是一名系统管理员&#xff0c;你可能想要禁止垃圾IP地址访…

EasyCharts,简单易用的Excel图表插件

EasyCharts是一款简单易用的Excel插件&#xff0c;主要有一键生成Excel未提供的图表、图表美化、配色参考等功能&#xff0c;轻轻松松就能搞定需要通过编程或者复杂操作才能实现的图表啦&#xff01; 以下展示插件中的部分图表类型。

分享一款好用的图表制作软件,简单、美观又高效!

换新工作后&#xff0c;老板给我一个任务&#xff0c;让我每周制作数据报告&#xff0c;辛苦做了半天&#xff0c;谁知道老板是一个“颜值即正义"人&#xff0c;嫌弃我的图表不好看&#xff0c;好惆怅。然后一个同行的好朋友给我分享了一款好用的图表制作软件—BDP&#x…

2021-07-19 .NET高级班 113-AmCharts实时图表的使用

@{ViewData["Title"] = "Index"; }<div class="row"><div class="col-lg-3 col-md-3 col-sm-6 col-xs-12"><div class="dashboard-stat blue">

一款简单、实时、酷炫的图表制作软件

当今&#xff0c;图表制作已经成了每一个职场人的日常&#xff0c;如果列个职场基本傍身技能排行榜&#xff0c;图表制作怕是前三了。虽说它是工作日常&#xff0c;虽说它很重要&#xff0c;但很多人还是做不好图表。 比如&#xff0c;我们想象中的图表可能是这样的&#xff1a…