python实现微信公众号给你的重要用户推送消息

最近小红书上这个很火,觉得做起来应该也不会太难,捣鼓了两天有了初步成效,还有一些功能没实现(比如定时推送),保姆级教程,大家可以借鉴,动手给自己重要的人做一个,或许可以暖ta一整天- -

1、步骤一

没有python的小白记得先下载python和pycharm,本文基于python实现,浅浅贴个网址https://www.python.orghttps://www.python.org/

PyCharm: the Python IDE for Professional Developers by JetBrainsThe Python & Django IDE with intelligent code completion, on-the-fly error checking, quick-fixes, and much more...https://www.jetbrains.com/pycharm/pycharm下载community免费版即可

2、步骤二

微信公众平台https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login打开并注册一个微信公众号测试号,扫码登录即可

测试账号拥有几乎所有的公众号接口,而个人只能申请订阅号,几乎没有接口可用,并且消息推送还会受到次数限制。如果只是做开发测试的话,那么测试帐号比较好用。

3、步骤三

先给大家看一下成品(只是个模板,具体信息需要大家自行修改)

包含内容有:日期、地理位置、当地位置今日(明日)天气、最高温度、最低温度、风力(大家也可以自行加上湿度等等,并可以根据不同天气提醒对方需要怎么样)、在一起多少天、距离下一个生日多少天、每日一句土味情话(来自🐒 渣男 - 说话的艺术 (lovelive.tools))、每日学一句英语(来自爱词霸),看到别的博主还有什么喝水提醒,大家可以自行发挥~

 以上功能生日和在一起多少天很好实现,我直接贴代码

def get_birthday(birthday, year, today):# 获取生日的月和日birthday_month = int(birthday.split("-")[1])birthday_day = int(birthday.split("-")[2])# 今年生日year_date = date(year, birthday_month, birthday_day)# 计算生日年份,如果还没过,按当年减,如果过了需要+1if today > year_date:birth_date = date((year + 1), birthday_month, birthday_day)birth_day = str(birth_date.__sub__(today)).split(" ")[0]elif today == year_date:birth_day = 0else:birth_date = year_datebirth_day = str(birth_date.__sub__(today)).split(" ")[0]return birth_day

 天气、每日一句情话和爱词霸需要通过爬虫获得,在爬之前,将pip更新到最新版本,打开terminal输入pip install --upgrade pip等待更新完成即可

爬的时候要用到beautifulsoup库,同样在terminal输入 pip3 install beautifulsoup4

还要用到request库, 同样在terminal输入pip install requests

我爬取的网站是中国天气网首页 (weather.com.cn)http://www.weather.com.cn/

好处就是url大家只要自行查找一下对应的地区代码替换即可了,天气代码查询可以参照这篇 (41条消息) 中国天气城市代码编号_it_zujun的博客-CSDN博客https://blog.csdn.net/u013634862/article/details/44886769

如北京就是http://www.weather.com.cn/weather/101010100.shtml,直接找到对应的城市代码,将101010100替换即可

我的headers是把所有的复制下来了,所以headers里的referer也记得修改

 修改这两处就可以获得对应地方的天气了,最后记得要把city_name改一下

 代码原理也很简单,访问网站,添加headers是为了模仿用户浏览,通过requests的get获取当前网页的信息,但获得的信息是乱码,所以需要通过’utf-8‘进行解码

利用beautifulsoup提取数据,方式为’lxml‘或者’html.parser‘,我的就只能用后者,前者会报错好像是因为库没下载全--。提取到数据之后,在相关网站按F12,查询自己需要的信息位于哪里,比如日期就存放在’h1‘下面,利用find_all找到所有的日期遍历并存储,取自己需要的即可,比如我的代码里就只需要今明两天的,风力,气温,天气状况都是同理

 代码如下:

def get_weather():city_name = '北京'headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Accept-Encoding':'gzip, deflate','Accept-Language':'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','Cache-Control':'max-age=0','Connection':'keep-alive','Cookie':'HttpOnly; userNewsPort0=1; Hm_lvt_080dabacb001ad3dc8b9b9049b36d43b=1660634957; f_city=%E9%87%91%E5%8D%8E%7C101210901%7C; defaultCty=101210901; defaultCtyName=%u91D1%u534E; Hm_lpvt_080dabacb001ad3dc8b9b9049b36d43b=1660639816','Host':'www.weather.com.cn','Referer':'http://www.weather.com.cn/weather1d/101010100.shtml','Upgrade-Insecure-Requests':'1','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.54'}url = "http://www.weather.com.cn/weather/101010100.shtml"response = get(url = url, headers=headers)text = response.content.decode('utf-8')soup = bs4.BeautifulSoup(text,'html.parser')#存放日期list_day = []i = 0day_list = soup.find_all('h1')for each in day_list:if i <= 1: #今明两天的数据list_day.append(each.text.strip())i += 1#天气情况list_weather = []weather_list = soup.find_all('p',class_ = 'wea') #之前报错是因为写了class 改为class_就好了for i in weather_list:list_weather.append(i.text)list_weather = list_weather[0:2] #只取今明两天#存放当前温度,和明天的最高温度和最低温度tem_list = soup.find_all('p', class_='tem')i = 0list_tem = []for each in tem_list:if i >= 0 and i < 2:list_tem.append([each.span.text, each.i.text]) #记录明天的最高温度和最低温度i += 1#风力list_wind = []wind_list = soup.find_all('p', class_='win')for each in wind_list:list_wind.append(each.i.text.strip())list_wind = list_wind[0:2] #同只取今明两天today_date = list_day[0]today_weather = list_weather[0]today_max = list_tem[0][0] +'℃'today_min = list_tem[0][1]today_wind = list_wind[0]tomorrow = list_day[1]tomorrow_weather = list_weather[1]tomorrow_max = list_tem[1][0]  +'℃'tomorrow_min = list_tem[1][1]tomorrow_wind = list_wind[1]return city_name,today_date,today_weather,today_max,today_min,today_wind,tomorrow,tomorrow_weather,tomorrow_max,tomorrow_min,tomorrow_wind

在昨天晚上运行的时候发现报错了,原因是因为到了晚上今天的温度只显示一个了(只显示当前温度,不显示最高温度最低温度了),那么在运行的时候就会读取不到两个而报错,浅浅修改了一下代码:如下,主要是更改了存放当前温度那一部分,把i==0的情况单独拎出来,大家可以看下以下两种情况,需要在不同情况下跑不同的代码

 

def get_weather():city_name = '北京'headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Accept-Encoding':'gzip, deflate','Accept-Language':'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','Cache-Control':'max-age=0','Connection':'keep-alive','Cookie':'HttpOnly; userNewsPort0=1; Hm_lvt_080dabacb001ad3dc8b9b9049b36d43b=1660634957; f_city=%E9%87%91%E5%8D%8E%7C101210901%7C; defaultCty=101210901; defaultCtyName=%u91D1%u534E; Hm_lpvt_080dabacb001ad3dc8b9b9049b36d43b=1660639816','Host':'www.weather.com.cn','Referer':'http://www.weather.com.cn/weather1d/101010100.shtml','Upgrade-Insecure-Requests':'1','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.54'}url = "http://www.weather.com.cn/weather/101010100.shtml"response = get(url = url, headers=headers)text = response.content.decode('utf-8')soup = bs4.BeautifulSoup(text,'html.parser')#存放日期list_day = []i = 0day_list = soup.find_all('h1')for each in day_list:if i <= 1: #今明两天的数据list_day.append(each.text.strip())i += 1#天气情况list_weather = []weather_list = soup.find_all('p',class_ = 'wea') #之前报错是因为写了class 改为class_就好了for i in weather_list:list_weather.append(i.text)list_weather = list_weather[0:2] #只取今明两天#存放当前温度,和明天的最高温度和最低温度tem_list = soup.find_all('p', class_='tem')i = 0list_tem = []for each in tem_list:if i == 0:list_tem.append(each.i.text)i += 1elif i > 0 and i < 2:list_tem.append([each.span.text, each.i.text])i += 1#风力list_wind = []wind_list = soup.find_all('p', class_='win')for each in wind_list:list_wind.append(each.i.text.strip())list_wind = list_wind[0:2] #同只取今明两天today_date = list_day[0]today_weather = list_weather[0]now = list_tem[0]today_wind = list_wind[0]tomorrow = list_day[1]tomorrow_weather = list_weather[1]tomorrow_max = list_tem[1][0]tomorrow_min = list_tem[1][1]tomorrow_wind = list_wind[1]return city_name,today_date,today_weather,now,today_wind,tomorrow,tomorrow_weather,tomorrow_max,tomorrow_min,tomorrow_wind

 天气讲完了,爱词霸和每日一句更好实现了,均利用json实现,记得import json,爱词霸这个是每天更新一次,所以一天多次输出都是一样的,但是每日情话这个是每次输出都不一样,里面还有些舔狗语录笑死了,这两个网站信息很单一,所以我都没加headers --。大家要写也可自己加上

def get_daily_love():#每日一句情话url = "https://api.lovelive.tools/api/SweetNothings/Serialization/Json"r = requests.get(url)all_dict = json.loads(r.text)sentence = all_dict['returnObj'][0]daily_love = sentencereturn daily_love
def get_ciba():#每日一句英语(来自爱词霸)url = "http://open.iciba.com/dsapi/"r = get(url)note_en = r.json()["content"]note_ch = r.json()["note"]return note_ch, note_en

 接下来要设置字体颜色,如果要随机可以参考以下代码

def get_color():# 获取随机颜色get_colors = lambda n: list(map(lambda i: "#" + "%06x" % random.randint(0, 0xFFFFFF), range(n)))color_list = get_colors(100)return random.choice(color_list)

但是太花了并不会太好看,尤其是元素过多时,因此我修改了一下就变成了

颜色代码可参考此文章(41条消息) Python 颜色代码大全_奋斗中的打工人的博客-CSDN博客_python颜色代码表https://blog.csdn.net/summerriver1/article/details/125215461?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-2-125215461-blog-87262631.t0_layer_eslanding_s&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-2-125215461-blog-87262631.t0_layer_eslanding_s&utm_relevant_index=5

def get_color():# 往list中填喜欢的颜色即可color_list = ['#6495ED','#3CB371']return random.choice(color_list)

在设置data的时候将元素和颜色传入即可,比如你的city值为city_name(北京),颜色为你填充的颜色里的随机一个,也可以自行设置哪个值为什么颜色

 最后,解决access_token,也是利用get来获取,此处config为一个txt文件,方便后续修改

def get_access_token():# appIdapp_id = config["app_id"]# appSecretapp_secret = config["app_secret"]post_url = ("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}".format(app_id, app_secret))try:access_token = get(post_url).json()['access_token']except KeyError:print("获取access_token失败,请检查app_id和app_secret是否正确")os.system("pause")sys.exit(1)# print(access_token)return access_token

重要步骤讲完了 贴一下两个温度版代码:

import random
from time import time, localtime
from requests import get, post
from datetime import datetime, date
import sys
import os
import bs4
import requests
import jsondef get_color():# 往list中填喜欢的颜色即可color_list = ['#6495ED','#3CB371']return random.choice(color_list)def get_access_token():# appIdapp_id = config["app_id"]# appSecretapp_secret = config["app_secret"]post_url = ("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}".format(app_id, app_secret))try:access_token = get(post_url).json()['access_token']except KeyError:print("获取access_token失败,请检查app_id和app_secret是否正确")os.system("pause")sys.exit(1)# print(access_token)return access_tokendef get_weather():city_name = '北京'headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Accept-Encoding':'gzip, deflate','Accept-Language':'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','Cache-Control':'max-age=0','Connection':'keep-alive','Cookie':'HttpOnly; userNewsPort0=1; Hm_lvt_080dabacb001ad3dc8b9b9049b36d43b=1660634957; f_city=%E9%87%91%E5%8D%8E%7C101210901%7C; defaultCty=101210901; defaultCtyName=%u91D1%u534E; Hm_lpvt_080dabacb001ad3dc8b9b9049b36d43b=1660639816','Host':'www.weather.com.cn','Referer':'http://www.weather.com.cn/weather1d/101010100.shtml','Upgrade-Insecure-Requests':'1','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.54'}url = "http://www.weather.com.cn/weather/101010100.shtml"response = get(url = url, headers=headers)text = response.content.decode('utf-8')soup = bs4.BeautifulSoup(text,'html.parser')#存放日期list_day = []i = 0day_list = soup.find_all('h1')for each in day_list:if i <= 1: #今明两天的数据list_day.append(each.text.strip())i += 1#天气情况list_weather = []weather_list = soup.find_all('p',class_ = 'wea') #之前报错是因为写了class 改为class_就好了for i in weather_list:list_weather.append(i.text)list_weather = list_weather[0:2] #只取今明两天#存放当前温度,和明天的最高温度和最低温度tem_list = soup.find_all('p', class_='tem')i = 0list_tem = []for each in tem_list:if i >= 0 and i < 2:list_tem.append([each.span.text, each.i.text]) #记录明天的最高温度和最低温度i += 1#风力list_wind = []wind_list = soup.find_all('p', class_='win')for each in wind_list:list_wind.append(each.i.text.strip())list_wind = list_wind[0:2] #同只取今明两天today_date = list_day[0]today_weather = list_weather[0]today_max = list_tem[0][0] +'℃'today_min = list_tem[0][1]today_wind = list_wind[0]tomorrow = list_day[1]tomorrow_weather = list_weather[1]tomorrow_max = list_tem[1][0]  +'℃'tomorrow_min = list_tem[1][1]tomorrow_wind = list_wind[1]return city_name,today_date,today_weather,today_max,today_min,today_wind,tomorrow,tomorrow_weather,tomorrow_max,tomorrow_min,tomorrow_winddef get_birthday(birthday, year, today):# 获取生日的月和日birthday_month = int(birthday.split("-")[1])birthday_day = int(birthday.split("-")[2])# 今年生日year_date = date(year, birthday_month, birthday_day)# 计算生日年份,如果还没过,按当年减,如果过了需要+1if today > year_date:birth_date = date((year + 1), birthday_month, birthday_day)birth_day = str(birth_date.__sub__(today)).split(" ")[0]elif today == year_date:birth_day = 0else:birth_date = year_datebirth_day = str(birth_date.__sub__(today)).split(" ")[0]return birth_daydef get_daily_love():#每日一句情话url = "https://api.lovelive.tools/api/SweetNothings/Serialization/Json"r = requests.get(url)all_dict = json.loads(r.text)sentence = all_dict['returnObj'][0]daily_love = sentencereturn daily_lovedef get_ciba():#每日一句英语(来自爱词霸)url = "http://open.iciba.com/dsapi/"r = get(url)note_en = r.json()["content"]note_ch = r.json()["note"]return note_ch, note_endef send_message(to_user, access_token, city_name,today_date,today_weather,today_max,today_min,today_wind,tomorrow,tomorrow_weather,tomorrow_max,tomorrow_min,tomorrow_wind,daily_love,note_ch, note_en):url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={}".format(access_token)week_list = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]year = localtime().tm_yearmonth = localtime().tm_monday = localtime().tm_mdaytoday = datetime.date(datetime(year=year, month=month, day=day))week = week_list[today.isoweekday() % 7]# 获取在一起的日子的日期格式love_year = int(config["love_date"].split("-")[0])love_month = int(config["love_date"].split("-")[1])love_day = int(config["love_date"].split("-")[2])love_date = date(love_year, love_month, love_day)# 获取在一起的日期差love_days = str(today.__sub__(love_date)).split(" ")[0]# 获取所有生日数据birthdays = {}for k, v in config.items():if k[0:5] == "birth":birthdays[k] = vdata = {"touser": to_user,"template_id": config["template_id"],"url": "http://weixin.qq.com/download","topcolor": "#FF0000","data": {"date": {"value": "{} {}".format(today, week),"color": get_color()},"city": {"value": city_name,"color": get_color()},"today": {"value": today_date,"color": get_color()},"today_weather": {"value": today_weather,"color": get_color()},"today_max": {"value": today_max,"color": get_color()},"today_min": {"value": today_min,"color": get_color()},"today_wind": {"value": today_wind,"color": get_color()},"tomorrow": {"value": tomorrow,"color": get_color()},"tomorrow_weather": {"value": tomorrow_weather,"color": get_color()},"tomorrow_max": {"value": tomorrow_max,"color": get_color()},"tomorrow_min": {"value": tomorrow_min,"color": get_color()},"tomorrow_wind": {"value": tomorrow_wind,"color": get_color()},"daily_love": {"value": daily_love,"color": get_color()},"birthday": {"value": birthdays,"color": get_color()},"note_en": {"value": note_en,"color": get_color()},"note_ch": {"value": note_ch,"color": get_color()},"love_day": {"value": love_days,"color": get_color()}}}for key, value in birthdays.items():# 获取距离下次生日的时间birth_day = get_birthday(value, year, today)# 将生日数据插入datadata["data"][key] = {"value": birth_day, "color": get_color()}headers = {'Content-Type': 'application/json','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ''AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}response = post(url, headers=headers, json=data).json()if response["errcode"] == 40037:print("推送消息失败,请检查模板id是否正确")elif response["errcode"] == 40036:print("推送消息失败,请检查模板id是否为空")elif response["errcode"] == 40003:print("推送消息失败,请检查微信号是否正确")elif response["errcode"] == 0:print("推送消息成功")else:print(response)if __name__ == "__main__":try:with open("config.txt", encoding="utf-8") as f:config = eval(f.read())except FileNotFoundError:print("推送消息失败,请检查config.txt文件是否与程序位于同一路径")os.system("pause")sys.exit(1)except SyntaxError:print("推送消息失败,请检查配置文件格式是否正确")os.system("pause")sys.exit(1)# 获取accessTokenaccessToken = get_access_token()# 接收的用户users = config["user"]# 传入省份和市获取天气信息city_name,today_date,today_weather,today_max,today_min,today_wind,tomorrow,tomorrow_weather,tomorrow_max,tomorrow_min,tomorrow_wind = get_weather()# 获取每日情话daily_love = get_daily_love()#获取每日一句英语note_ch, note_en = get_ciba()# 公众号推送消息for user in users:send_message(user, accessToken, city_name,today_date,today_weather,today_max,today_min,today_wind,tomorrow,tomorrow_weather,tomorrow_max,tomorrow_min,tomorrow_wind,daily_love,note_ch, note_en)os.system("pause")

 一个温度版代码:

import random
from time import time, localtime
from requests import get, post
from datetime import datetime, date
import sys
import os
import bs4
import requests
import jsondef get_color():# 往list中填喜欢的颜色即可color_list = ['#6495ED','#3CB371']return random.choice(color_list)def get_access_token():# appIdapp_id = config["app_id"]# appSecretapp_secret = config["app_secret"]post_url = ("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}".format(app_id, app_secret))try:access_token = get(post_url).json()['access_token']except KeyError:print("获取access_token失败,请检查app_id和app_secret是否正确")os.system("pause")sys.exit(1)# print(access_token)return access_tokendef get_weather():city_name = '北京'headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Accept-Encoding':'gzip, deflate','Accept-Language':'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6','Cache-Control':'max-age=0','Connection':'keep-alive','Cookie':'HttpOnly; userNewsPort0=1; Hm_lvt_080dabacb001ad3dc8b9b9049b36d43b=1660634957; f_city=%E9%87%91%E5%8D%8E%7C101210901%7C; defaultCty=101210901; defaultCtyName=%u91D1%u534E; Hm_lpvt_080dabacb001ad3dc8b9b9049b36d43b=1660639816','Host':'www.weather.com.cn','Referer':'http://www.weather.com.cn/weather1d/101010100.shtml','Upgrade-Insecure-Requests':'1','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.54'}url = "http://www.weather.com.cn/weather/101010100.shtml"response = get(url = url, headers=headers)text = response.content.decode('utf-8')soup = bs4.BeautifulSoup(text,'html.parser')#存放日期list_day = []i = 0day_list = soup.find_all('h1')for each in day_list:if i <= 1: #今明两天的数据list_day.append(each.text.strip())i += 1#天气情况list_weather = []weather_list = soup.find_all('p',class_ = 'wea') #之前报错是因为写了class 改为class_就好了for i in weather_list:list_weather.append(i.text)list_weather = list_weather[0:2] #只取今明两天#存放当前温度,和明天的最高温度和最低温度tem_list = soup.find_all('p', class_='tem')i = 0list_tem = []for each in tem_list:if i == 0:list_tem.append(each.i.text)i += 1elif i > 0 and i < 2:list_tem.append([each.span.text, each.i.text])i += 1#风力list_wind = []wind_list = soup.find_all('p', class_='win')for each in wind_list:list_wind.append(each.i.text.strip())list_wind = list_wind[0:2] #同只取今明两天today_date = list_day[0]today_weather = list_weather[0]now = list_tem[0]today_wind = list_wind[0]tomorrow = list_day[1]tomorrow_weather = list_weather[1]tomorrow_max = list_tem[1][0]tomorrow_min = list_tem[1][1]tomorrow_wind = list_wind[1]return city_name,today_date,today_weather,now,today_wind,tomorrow,tomorrow_weather,tomorrow_max,tomorrow_min,tomorrow_winddef get_birthday(birthday, year, today):# 获取生日的月和日birthday_month = int(birthday.split("-")[1])birthday_day = int(birthday.split("-")[2])# 今年生日year_date = date(year, birthday_month, birthday_day)# 计算生日年份,如果还没过,按当年减,如果过了需要+1if today > year_date:birth_date = date((year + 1), birthday_month, birthday_day)birth_day = str(birth_date.__sub__(today)).split(" ")[0]elif today == year_date:birth_day = 0else:birth_date = year_datebirth_day = str(birth_date.__sub__(today)).split(" ")[0]return birth_daydef get_daily_love():#每日一句情话url = "https://api.lovelive.tools/api/SweetNothings/Serialization/Json"r = requests.get(url)all_dict = json.loads(r.text)sentence = all_dict['returnObj'][0]daily_love = sentencereturn daily_lovedef get_ciba():#每日一句英语(来自爱词霸)url = "http://open.iciba.com/dsapi/"headers = {'Content-Type': 'application/json','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ''AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}r = get(url, headers=headers)note_en = r.json()["content"]note_ch = r.json()["note"]return note_ch, note_endef send_message(to_user, access_token, city_name,today_date,today_weather,now,today_wind,tomorrow,tomorrow_weather,tomorrow_max,tomorrow_min,tomorrow_wind,daily_love,note_ch, note_en):url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={}".format(access_token)week_list = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]year = localtime().tm_yearmonth = localtime().tm_monday = localtime().tm_mdaytoday = datetime.date(datetime(year=year, month=month, day=day))week = week_list[today.isoweekday() % 7]# 获取在一起的日子的日期格式love_year = int(config["love_date"].split("-")[0])love_month = int(config["love_date"].split("-")[1])love_day = int(config["love_date"].split("-")[2])love_date = date(love_year, love_month, love_day)# 获取在一起的日期差love_days = str(today.__sub__(love_date)).split(" ")[0]# 获取所有生日数据birthdays = {}for k, v in config.items():if k[0:5] == "birth":birthdays[k] = vdata = {"touser": to_user,"template_id": config["template_id"],"url": "http://weixin.qq.com/download","topcolor": "#FF0000","data": {"date": {"value": "{} {}".format(today, week),"color": get_color()},"city": {"value": city_name,"color": get_color()},"today": {"value": today_date,"color": get_color()},"today_weather": {"value": today_weather,"color": get_color()},"now": {"value": now,"color": get_color()},"today_wind": {"value": today_wind,"color": get_color()},"tomorrow": {"value": tomorrow,"color": get_color()},"tomorrow_weather": {"value": tomorrow_weather,"color": get_color()},"tomorrow_max": {"value": tomorrow_max,"color": get_color()},"tomorrow_min": {"value": tomorrow_min,"color": get_color()},"tomorrow_wind": {"value": tomorrow_wind,"color": get_color()},"daily_love": {"value": daily_love,"color": get_color()},"birthday": {"value": birthdays,"color": get_color()},"note_en": {"value": note_en,"color": get_color()},"note_ch": {"value": note_ch,"color": get_color()},"love_day": {"value": love_days,"color": get_color()}}}for key, value in birthdays.items():# 获取距离下次生日的时间birth_day = get_birthday(value, year, today)# 将生日数据插入datadata["data"][key] = {"value": birth_day, "color": get_color()}headers = {'Content-Type': 'application/json','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ''AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}response = post(url, headers=headers, json=data).json()if response["errcode"] == 40037:print("推送消息失败,请检查模板id是否正确")elif response["errcode"] == 40036:print("推送消息失败,请检查模板id是否为空")elif response["errcode"] == 40003:print("推送消息失败,请检查微信号是否正确")elif response["errcode"] == 0:print("推送消息成功")else:print(response)if __name__ == "__main__":try:with open("config.txt", encoding="utf-8") as f:config = eval(f.read())except FileNotFoundError:print("推送消息失败,请检查config.txt文件是否与程序位于同一路径")os.system("pause")sys.exit(1)except SyntaxError:print("推送消息失败,请检查配置文件格式是否正确")os.system("pause")sys.exit(1)# 获取accessTokenaccessToken = get_access_token()# 接收的用户users = config["user"]# 传入省份和市获取天气信息city_name,today_date,today_weather,now,today_wind,tomorrow,tomorrow_weather,tomorrow_max,tomorrow_min,tomorrow_wind = get_weather()# 获取每日情话daily_love = get_daily_love()#获取每日一句英语note_ch, note_en = get_ciba()# 公众号推送消息for user in users:send_message(user, accessToken, city_name,today_date,today_weather,now,today_wind,tomorrow,tomorrow_weather,tomorrow_max,tomorrow_min,tomorrow_wind,daily_love,note_ch, note_en)os.system("pause")

4、步骤四

代码部分讲完了,需要来讲一下公众号测试号的设置

两个温度版:

参考以上模板,{{xx.DATA}}就是你代码里return出来的各个值,把其填到相应位置即可,

纯文字方便复制版:

{{date.DATA}} 

宝贝现在位于:{{city.DATA}}

{{today.DATA}}天气{{today_weather.DATA}},今天的最高温度为{{today_max.DATA}},最低温度为{{today_min.DATA}},风力为{{today_wind.DATA}}

顺便给宝贝播报一下{{tomorrow.DATA}}的天气:{{tomorrow_weather.DATA}},最高温度{{tomorrow_max.DATA}},最低温度{{tomorrow_min.DATA}},风力{{tomorrow_wind.DATA}}

今天是我们在一起的第{{love_day.DATA}}天

距离宝贝的生日还有{{birthday1.DATA}}天

{{daily_love.DATA}}

{{note_ch.DATA}}{{note_en.DATA}} 

 文字+注释版:

{{date.DATA}}  #日期+星期几

宝贝现在位于:{{city.DATA}} #城市名字

{{today.DATA}} 天气{{today_weather.DATA}},今天的最高温度为{{today_max.DATA}},最低温度为{{today_min.DATA}},风力为{{today_wind.DATA}} #(今天)天气(怎么样),今天的最高温度为(多少),最低温度为(多少),风力为(多少),括号的值均为代码里的对应值

顺便给宝贝播报一下{{tomorrow.DATA}}的天气:{{tomorrow_weather.DATA}},最高温度{{tomorrow_max.DATA}},最低温度{{tomorrow_min.DATA}},风力{{tomorrow_wind.DATA}} #同上

今天是我们在一起的第{{love_day.DATA}}天 #恋爱天数

距离宝贝的生日还有{{birthday1.DATA}}天 #离生日多少天那个值

{{daily_love.DATA}} #每日一句情话

{{note_ch.DATA}}{{note_en.DATA}}  #每日一句英语

一个温度版:

{{date.DATA}}

宝贝现在位于:{{city.DATA}}

{{today.DATA}}天气{{today_weather.DATA}},当前温度为{{now.DATA}},风力为{{today_wind.DATA}}

顺便给宝贝播报一下{{tomorrow.DATA}}的天气:{{tomorrow_weather.DATA}},最高温度{{tomorrow_max.DATA}},最低温度{{tomorrow_min.DATA}},风力{{tomorrow_wind.DATA}}

今天是我们在一起的第{{love_day.DATA}}天

距离宝贝的生日还有{{birthday1.DATA}}天

{{daily_love.DATA}}

{{note_ch.DATA}}{{note_en.DATA}}

 5、步骤五

让对方扫码关注你的测试号,(先自己关注测试一下能不能跑出来吧)

把测试号的appid,app_secret,接受微信号,模板消息,生日、恋爱日子替换即可,注意生日是公历,农历需要自己换算为公历

 GitHub打开好慢,我懒得贴txt了,需要的可以私我,或者自己改一下

全部弄完之后 润一下应该就会播报了

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

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

相关文章

JAVA对接微信公众号(服务号、订阅号)实现模板消息推送功能

最近做了个需求要求对接微信公众号&#xff0c;使用模板进行消息推送&#xff0c;今天抽时间总结一下相关的逻辑。 大概逻辑分为四个步骤&#xff1a; 获取微信调用接口凭证access_token。获取微信模板列表。使用模板进行消息推送。公众号配置服务器URL。 我这里的实现没有使…

微信开发工具实现订阅消息功能

微信开发工具实现订阅消息功能 1、新建文件夹&#xff0c;取名为&#xff1a;push1 2、push1.wxml写下如下代码&#xff1a; <button bindtap"dingyue">订阅</button>3、push1.js写下如下代码&#xff1a; // pages/push1/push1.js Page({/*** 页面…

微信公众号 - Java推送小程序订阅消息给用户

不啰嗦&#xff0c;我们直接开始&#xff01; 本文使用体验版小程序进行调试。 一、开发前小程序准备&#xff1a; 1、登录微信公众平台 点开下面链接&#xff0c;使用微信扫码 微信公众平台 然后选择一个小程序并登录 2、在小程序后台找到Appid、AppSecret、Token、Encod…

微信公众号订阅号开发的学习(二):获取用户发送的消息、简单的自动回复、自定义菜单

获取用户发送的消息 基础 微信服务器会发送两种类型的消息给开发者服务器。 get请求 验证服务器的有效性post请求 微信服务器会将用户发送的数据转发到开发者服务器上 实现 基于微信公众号订阅号开发的学习&#xff08;一&#xff09;&#xff1a;基础知识 auth.js //引…

微信第三方平台集成公众号发送模板消息

最近老板下发了个任务&#xff0c;有一个业务是整合用户的微信公众号&#xff08;服务号&#xff09;&#xff0c;然后在我们的erp系统里给下家客户发送模板消息&#xff0c;找了一下发现微信第三方平台可以实现&#xff0c;那就干起来。 先在微信开放平台&#xff0c;申请一个…

元宇宙iwemeta:元宇宙数字人实践落地应用场景

把虚拟数字人装进你的手机&#xff01;百度、腾讯、讯飞盯准这条新赛道。 短短三个月内&#xff0c;几乎每一家拥有智能语音技术能力的大厂都在采取行动布局虚拟数字人。 百度、华为、阿里等都纷纷引入AI数字人入职&#xff0c;担任技术宣讲员、形象代言人&#xff1b;OPPO、…

考研人常说的“死亡211”和“984.5”是什么学校?

&#x1f603;这几所211院校&#xff0c;真香&#xff01;被称为984.5&#xff01;众所周知&#xff0c;985高校是国内最顶尖的一批名牌大学&#xff0c;每年报考的人都疯狂扎堆&#xff0c;分也很高&#xff0c;想去分一杯羹很难。但考个一般211吧&#xff0c;有时又不甘心&am…

华工计算机网络辅修,【JZT干货】双手献上华工辅修攻略

原标题&#xff1a;【JZT干货】双手献上华工辅修攻略 辅修进行了一个多月&#xff0c;相信小伙伴们也对辅修有了基本的了解。那么各课程的期末考试是怎样的&#xff1f;一些老师上课有什么特点&#xff1f;想了解吗&#xff0c;团仔在此献上纯干货给大家。 当然啦&#xff0c;涉…

z世代消费力白皮书_猫哥清华新传考研|如何让Z世代粉上你?

猫小菇/新传考研猫 不管愿不愿意承认&#xff0c;“Z世代”主宰的未来已经悄然来临了。 每个时代的年轻人都是品牌主最想触及的群体&#xff0c;因为他们代表着市场的未来。 当“千禧一代”仍然是当下消费重点群体时&#xff0c;“Z世代”已经带着与生俱来的敏感力和决策力进入…

本土网络安全公司——上讯信息的“老兵新传”

上讯信息&#xff0c;这个名字听起来很耳熟&#xff0c;但是很多人还是对这个公司有点儿陌生。其实就在今年年初&#xff0c;上讯信息获得了由ISCCC颁发的信息安全风险评估一级服务资质&#xff0c;以及信息安全应急处理二级服务资质&#xff0c;成为金融行业“年度信赖品牌”。…

社工库制作

项目结构 https://github.com/Collapsar-G/social_worker_library 后端使用以下模块&#xff1a; pymsql、flask 前端使用vue搭建 完成过程 在完成上参考了《“系统安全”课程项目&#xff1a;一个实用社工库的建设》&#xff0c;加入了一些自己的理解。 数据初始化 导出为c…

社工库2.0

#大题目 社工库2.0 ###环境 whoosh2.7jieba12306python3.7网上嫖来的网页模板(感谢站长之家 ###实现效果建立的索引文件 好看的页面 更快的查找速度 ###实现过程 具体的实现过程比较简易,毕竟whoosh已经封装的很好了第一步 建立索引并存储schema = Schema(zhanghao=TEXT(sto…

搭建社工库

成品大概是这样子&#xff0c;我把主要源码贴在下面 <!doctype html> <html> <head> <meta charset"utf-8"> <meta name"viewport" content"widthdevice-width,initialscale1"> <title>社工库</title&…

计算机专业的八字,生辰八字自动计算器软件 生辰八字在线计算器

大家对于计算器都很熟悉吧&#xff0c;一点也不陌生&#xff0c;与此同时&#xff0c;那么计算机是大家在日常生活中使用的一个简单软件&#xff0c;在使用的同时&#xff0c;既简单又方便&#xff0c;那么对于计算器大家都有所掌握 &#xff0c;所以这次小编将要给你介绍一下新…

html中如何做出生年月日,出生年月日怎么换成生辰八字

天干有 十个:甲、乙、丙、丁、戊、己、庚、辛、壬、癸。 地支有十二个:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。 二者顺序配合可以产生六十个单位&#xff0c;叫六十甲子。那生出生的年、月、日、时分别用天干、地支配合来表示&#xff0c;正好有八个字&#xff0c;因…

生辰八字计算

年柱、月柱、日柱->根据阴历生日在万年历上查找 时柱计算根据日柱天干以及出生时辰在日上起时表查找 五行属性: 甲属木->阳 乙属木->阴 丙属火->阳 丁属火->阴 戊属土->阳 己属土->阴 庚属金->阳 辛属金->阴 壬属水->阳 癸属水->阴…

找不到电脑C盘下的AppData文件夹怎么办?

电脑C盘下的AppData文件夹消失的解决办法 1. 问题描述2. 解决方案(1) 第一步(2) 第二步(3) 第三步 1. 问题描述 如果找不到电脑C盘下的AppData文件夹&#xff0c;很有可能是该文件夹被隐藏了。 2. 解决方案 (1) 第一步 winR键调出运行框&#xff0c;输入【control folders】…

电脑版微信文件存储在哪个文件夹可以找到

对于办公人员来说电脑上的微信是必不可少的软件&#xff0c;我们通过电脑来传输文件会比手机要方便的多&#xff0c;那么我们的微信文件又存在电脑上的哪个文件夹呢&#xff1f;这类就和大家聊聊电脑版微信文件存储在哪个文件夹可以找到吧。 还有详细的一键重装系统方法 1、当…

电脑版微信dat文件用什么软件打开

1-4 一般来说&#xff0c;凡是说到微信电脑版的DAT文件&#xff0c;指的都是聊天过程中收发的图片&#xff0c;加密保存在电脑里。 这些文件正常情况下也只能在微信登录后&#xff0c;在微信里查看&#xff0c;因为微信加密的当然只有微信才能解密。 那有没有第三方工具可以…

电脑微信的文件在哪里?单独导出某个人的微信聊天记录教程

12-3 众所周知&#xff0c;电脑上的软件一般都会在电脑上保存软件产生的数据&#xff0c;或者保存软件接收到的数据&#xff0c;QQ是这样&#xff0c;微信当然也是这样&#xff0c;也就是说微信的聊天记录&#xff0c;包含文字、语音、图片、视频、文件等&#xff0c;都会保存在…