起因:每周都会写周报,但是有时候因为太忙真的会忘记,有时候实在没办法就定几个闹钟,闹钟一响就开始写周报。但是这也不是长久之计。后来有段时间关注的微信公众号时不时会推送一些技术或者科技相关的文章,当时就想,如果能通过微信每天定时推送给我写周报的消息就好了。。。。。
第一反应就是,先找某宝,肯定有,但是后面就给忙忘了。那天想起来,就百度搜了一下,发现有教程,刚好用到了服务器,我也有,所以说干就干!
首先,本教程参考了csdn上申也老师的教程《用微信公众号给女朋友自定义推送天气与课表》,链接:用微信公众号给女朋友自定义推送天气与课表_微信推送天气-CSDN博客
我这里只使用的python的实现方式,申也老师还有js版本的实现方式。如果有需要可以直接参考申也老师的这篇文章。
首先需要先列举出需要用到的装备:
1.一台服务器
2.一个开发者测试使用的微信公众号
3.能跑起来的代码
这里说一下第二个微信公众号,通过这个网址扫码登录:微信公众平台 (qq.com)
登录后记录下appID
和appsecret
,后面会用到

然后往下滑,有个测试号二维码,这个地方是记录用于推送给某人消息的用户列表,扫码后添加到列表,最多可以推送给20个用户,将推送人的微信号同样也记录下来后面也会用到

再往下滑,模板消息接口这一栏,点击新增测试模板,按照测试模板要求创建一个模板,我这里使用的模板是再申也老师模板的基础上修改的,大家可以根据自己的需求定制自己的模板
今天是{{date.DATA}} 城市:{{city.DATA}} 天气:{{weather.DATA}} 最低气温: {{min_temperature.DATA}} 最高气温: {{max_temperature.DATA}} 距离生日还有{{birthday.DATA}}天 --------周报填写提醒-------- 某某某项目周报填写提醒:{{weeklyDayLtx.DATA}} 某某项目周报填写提醒:{{weeklyDayErp.DATA}}

创建好模板后,同样记录下,模板id,后面也会用到

然后就是代码部分,需要用到的库如下
from time import time, localtime
import cityinfo
import config
from requests import get, post
from datetime import datetime, date, timedelta
通过上述模板,我需要获取的数据有:
1.城市 2.天气 3.气温 4.生日 5.周报
因为是参考了申也老师的代码,大部分代码都是可用的,只有周报部分需要自己做改造,这里讲下代码解析:
首先,整体有三部分组成:1.main.py 2.config.py 3.cityinfo.py。这三部分分别为,需要执行的python文件,用于配置执行文件的配置文件以及用于获取城市信息的配置文件
根据这三部分进行依次讲解,循序由上的倒叙讲解:
cityinfo.py:
这部分其实就是一个字典,用于在执行的main.py中根据传入的地区与城市获取区域id,然后调用天气api从而查询天气数据,代码如下,这里需要注意,在最上方我添加了#coding=UTF-8,用于设置字符集,根据不同的python版本自行添加
#coding=UTF-8
cityInfo = {
"北京": {
"北京": {
"AREAID": "101010100"
}
},
"上海": {
"上海": {
"AREAID": "101020100"
}
},
"天津": {
"天津": {
"AREAID": "101030100"
}
},
"重庆": {
"重庆": {
"AREAID": "101040100"
}
},
"黑龙江": {
"哈尔滨": {
"AREAID": "101050101"
},
"齐齐哈尔": {
"AREAID": "101050201"
},
"牡丹江": {
"AREAID": "101050301"
},
"佳木斯": {
"AREAID": "101050401"
},
"绥化": {
"AREAID": "101050501"
},
"黑河": {
"AREAID": "101050601"
},
"大兴安岭": {
"AREAID": "101050701"
},
"伊春": {
"AREAID": "101050801"
},
"大庆": {
"AREAID": "101050901"
},
"七台河": {
"AREAID": "101051002"
},
"鸡西": {
"AREAID": "101051101"
},
"鹤岗": {
"AREAID": "101051201"
},
"双鸭山": {
"AREAID": "101051301"
}
},
"吉林": {
"长春": {
"AREAID": "101060101"
},
"吉林": {
"AREAID": "101060201"
},
"延边": {
"AREAID": "101060306"
},
"四平": {
"AREAID": "101060401"
},
"通化": {
"AREAID": "101060501"
},
"白城": {
"AREAID": "101060601"
},
"辽源": {
"AREAID": "101060701"
},
"松原": {
"AREAID": "101060801"
},
"白山": {
"AREAID": "101060901"
}
},
"辽宁": {
"沈阳": {
"AREAID": "101070101"
},
"大连": {
"AREAID": "101070201"
},
"鞍山": {
"AREAID": "101070301"
},
"抚顺": {
"AREAID": "101070401"
},
"本溪": {
"AREAID": "101070501"
},
"丹东": {
"AREAID": "101070601"
},
"锦州": {
"AREAID": "101070701"
},
"营口": {
"AREAID": "101070801"
},
"阜新": {
"AREAID": "101070901"
},
"辽阳": {
"AREAID": "101071001"
},
"铁岭": {
"AREAID": "101071101"
},
"朝阳": {
"AREAID": "101071201"
},
"盘锦": {
"AREAID": "101071301"
},
"葫芦岛": {
"AREAID": "101071401"
}
},
"内蒙古": {
"呼和浩特": {
"AREAID": "101080101"
},
"包头": {
"AREAID": "101080201"
},
"乌海": {
"AREAID": "101080301"
},
"乌兰察布": {
"AREAID": "101080405"
},
"通辽": {
"AREAID": "101080501"
},
"赤峰": {
"AREAID": "101080601"
},
"鄂尔多斯": {
"AREAID": "101080701"
},
"巴彦淖尔": {
"AREAID": "101080811"
},
"锡林郭勒": {
"AREAID": "101080902"
},
"呼伦贝尔": {
"AREAID": "101081013"
},
"兴安盟": {
"AREAID": "101081108"
},
"阿拉善盟": {
"AREAID": "101081213"
}
},
"河北": {
"石家庄": {
"AREAID": "101090101"
},
"保定": {
"AREAID": "101090201"
},
"张家口": {
"AREAID": "101090301"
},
"承德": {
"AREAID": "101090402"
},
"唐山": {
"AREAID": "101090501"
},
"廊坊": {
"AREAID": "101090601"
},
"沧州": {
"AREAID": "101090701"
},
"衡水": {
"AREAID": "101090801"
},
"邢台": {
"AREAID": "101090901"
},
"邯郸": {
"AREAID": "101091001"
},
"秦皇岛": {
"AREAID": "101091101"
},
"雄安新区": {
"AREAID": "101091201"
}
},
"山西": {
"太原": {
"AREAID": "101100101"
},
"大同": {
"AREAID": "101100201"
},
"阳泉": {
"AREAID": "101100301"
},
"晋中": {
"AREAID": "101100401"
},
"长治": {
"AREAID": "101100501"
},
"晋城": {
"AREAID": "101100601"
},
"临汾": {
"AREAID": "101100701"
},
"运城": {
"AREAID": "101100801"
},
"朔州": {
"AREAID": "101100901"
},
"忻州": {
"AREAID": "101101001"
},
"吕梁": {
"AREAID": "101101100"
}
},
"陕西": {
"西安": {
"AREAID": "101110101"
},
"咸阳": {
"AREAID": "101110200"
},
"延安": {
"AREAID": "101110300"
},
"榆林": {
"AREAID": "101110401"
},
"渭南": {
"AREAID": "101110501"
},
"商洛": {
"AREAID": "101110601"
},
"安康": {
"AREAID": "101110701"
},
"汉中": {
"AREAID": "101110801"
},
"宝鸡": {
"AREAID": "101110901"
},
"铜川": {
"AREAID": "101111001"
},
"杨凌": {
"AREAID": "101111101"
}
},
"山东": {
"济南": {
"AREAID": "101120101"
},
"青岛": {
"AREAID": "101120201"
},
"淄博": {
"AREAID": "101120301"
},
"德州": {
"AREAID": "101120401"
},
"烟台": {
"AREAID": "101120501"
},
"潍坊": {
"AREAID": "101120601"
},
"济宁": {
"AREAID": "101120701"
},
"泰安": {
"AREAID": "101120801"
},
"临沂": {
"AREAID": "101120901"
},
"菏泽": {
"AREAID": "101121001"
},
"滨州": {
"AREAID": "101121101"
},
"东营": {
"AREAID": "101121201"
},
"威海": {
"AREAID": "101121301"
},
"枣庄": {
"AREAID": "101121401"
},
"日照": {
"AREAID": "101121501"
},
"莱芜": {
"AREAID": "101121601"
},
"聊城": {
"AREAID": "101121701"
}
},
"新疆": {
"乌鲁木齐": {
"AREAID": "101130101"
},
"克拉玛依": {
"AREAID": "101130201"
},
"石河子": {
"AREAID": "101130301"
},
"昌吉": {
"AREAID": "101130401"
},
"吐鲁番": {
"AREAID": "101130501"
},
"巴音郭楞": {
"AREAID": "101130609"
},
"阿拉尔": {
"AREAID": "101130701"
},
"阿克苏": {
"AREAID": "101130801"
},
"喀什": {
"AREAID": "101130901"
},
"伊犁": {
"AREAID": "101131012"
},
"塔城": {
"AREAID": "101131101"
},
"哈密": {
"AREAID": "101131201"
},
"和田": {
"AREAID": "101131301"
},
"阿勒泰": {
"AREAID": "101131401"
},
"克州": {
"AREAID": "101131505"
},
"博尔塔拉": {
"AREAID": "101131604"
},
"图木舒克": {
"AREAID": "101131701"
},
"五家渠": {
"AREAID": "101131801"
},
"铁门关": {
"AREAID": "101131901"
},
"昆玉": {
"AREAID": "101131920"
},
"北屯": {
"AREAID": "101132101"
},
"双河": {
"AREAID": "101132201"
},
"可克达拉": {
"AREAID": "101132301"
}
},
"西藏": {
"拉萨": {
"AREAID": "101140101"
},
"日喀则": {
"AREAID": "101140201"
},
"山南": {
"AREAID": "101140301"
},
"林芝": {
"AREAID": "101140401"
},
"昌都": {
"AREAID": "101140501"
},
"那曲": {
"AREAID": "101140601"
},
"阿里": {
"AREAID": "101140701"
}
},
"青海": {
"西宁": {
"AREAID": "101150101"
},
"海东": {
"AREAID": "101150207"
},
"黄南": {
"AREAID": "101150305"
},
"海南": {
"AREAID": "101150402"
},
"果洛": {
"AREAID": "101150507"
},
"玉树": {
"AREAID": "101150601"
},
"海西": {
"AREAID": "101150702"
},
"海北": {
"AREAID": "101150804"
}
},
"甘肃": {
"兰州": {
"AREAID": "101160101"
},
"定西": {
"AREAID": "101160201"
},
"平凉": {
"AREAID": "101160301"
},
"庆阳": {
"AREAID": "101160401"
},
"武威": {
"AREAID": "101160501"
},
"金昌": {
"AREAID": "101160601"
},
"张掖": {
"AREAID": "101160701"
},
"酒泉": {
"AREAID": "101160801"
},
"天水": {
"AREAID": "101160901"
},
"陇南": {
"AREAID": "101161010"
},
"临夏": {
"AREAID": "101161101"
},
"甘南": {
"AREAID": "101161209"
},
"白银": {
"AREAID": "101161301"
},
"嘉峪关": {
"AREAID": "101161401"
}
},
"宁夏": {
"银川": {
"AREAID": "101170101"
},
"石嘴山": {
"AREAID": "101170201"
},
"吴忠": {
"AREAID": "101170301"
},
"固原": {
"AREAID": "101170401"
},
"中卫": {
"AREAID": "101170501"
}
},
"河南": {
"郑州": {
"AREAID": "101180101"
},
"安阳": {
"AREAID": "101180201"
},
"新乡": {
"AREAID": "101180301"
},
"许昌": {
"AREAID": "101180401"
},
"平顶山": {
"AREAID": "101180501"
},
"信阳": {
"AREAID": "101180601"
},
"南阳": {
"AREAID": "101180701"
},
"开封": {
"AREAID": "101180801"
},
"洛阳": {
"AREAID": "101180901"
},
"商丘": {
"AREAID": "101181001"
},
"焦作": {
"AREAID": "101181101"
},
"鹤壁": {
"AREAID": "101181201"
},
"濮阳": {
"AREAID": "101181301"
},
"周口": {
"AREAID": "101181401"
},
"漯河": {
"AREAID": "101181501"
},
"驻马店": {
"AREAID": "101181601"
},
"三门峡": {
"AREAID": "101181701"
},
"济源": {
"AREAID": "101181801"
}
},
"江苏": {
"南京": {
"AREAID": "101190101"
},
"无锡": {
"AREAID": "101190201"
},
"镇江": {
"AREAID": "101190301"
},
"苏州": {
"AREAID": "101190401"
},
"南通": {
"AREAID": "101190501"
},
"扬州": {
"AREAID": "101190601"
},
"盐城": {
"AREAID": "101190701"
},
"徐州": {
"AREAID": "101190801"
},
"淮安": {
"AREAID": "101190901"
},
"连云港": {
"AREAID": "101191001"
},
"常州": {
"AREAID": "101191101"
},
"泰州": {
"AREAID": "101191201"
},
"宿迁": {
"AREAID": "101191301"
}
},
"湖北": {
"武汉": {
"AREAID": "101200101"
},
"襄阳": {
"AREAID": "101200201"
},
"鄂州": {
"AREAID": "101200301"
},
"孝感": {
"AREAID": "101200401"
},
"黄冈": {
"AREAID": "101200501"
},
"黄石": {
"AREAID": "101200601"
},
"咸宁": {
"AREAID": "101200701"
},
"荆州": {
"AREAID": "101200801"
},
"宜昌": {
"AREAID": "101200901"
},
"恩施": {
"AREAID": "101201001"
},
"十堰": {
"AREAID": "101201101"
},
"神农架": {
"AREAID": "101201201"
},
"随州": {
"AREAID": "101201301"
},
"荆门": {
"AREAID": "101201401"
},
"天门": {
"AREAID": "101201501"
},
"仙桃": {
"AREAID": "101201601"
},
"潜江": {
"AREAID": "101201701"
}
},
"浙江": {
"杭州": {
"AREAID": "101210101"
},
"湖州": {
"AREAID": "101210201"
},
"嘉兴": {
"AREAID": "101210301"
},
"宁波": {
"AREAID": "101210401"
},
"绍兴": {
"AREAID": "101210507"
},
"台州": {
"AREAID": "101210601"
},
"温州": {
"AREAID": "101210701"
},
"丽水": {
"AREAID": "101210801"
},
"金华": {
"AREAID": "101210901"
},
"衢州": {
"AREAID": "101211001"
},
"舟山": {
"AREAID": "101211101"
}
},
"安徽": {
"合肥": {
"AREAID": "101220101"
},
"蚌埠": {
"AREAID": "101220201"
},
"芜湖": {
"AREAID": "101220301"
},
"淮南": {
"AREAID": "101220401"
},
"马鞍山": {
"AREAID": "101220501"
},
"安庆": {
"AREAID": "101220601"
},
"宿州": {
"AREAID": "101220701"
},
"阜阳": {
"AREAID": "101220801"
},
"亳州": {
"AREAID": "101220901"
},
"黄山": {
"AREAID": "101221001"
},
"滁州": {
"AREAID": "101221101"
},
"淮北": {
"AREAID": "101221201"
},
"铜陵": {
"AREAID": "101221301"
},
"宣城": {
"AREAID": "101221401"
},
"六安": {
"AREAID": "101221501"
},
"池州": {
"AREAID": "101221701"
}
},
"福建": {
"福州": {
"AREAID": "101230101"
},
"厦门": {
"AREAID": "101230201"
},
"宁德": {
"AREAID": "101230301"
},
"莆田": {
"AREAID": "101230401"
},
"泉州": {
"AREAID": "101230501"
},
"漳州": {
"AREAID": "101230601"
},
"龙岩": {
"AREAID": "101230701"
},
"三明": {
"AREAID": "101230801"
},
"南平": {
"AREAID": "101230901"
},
"钓鱼岛": {
"AREAID": "101231001"
}
},
"江西": {
"南昌": {
"AREAID": "101240101"
},
"九江": {
"AREAID": "101240201"
},
"上饶": {
"AREAID": "101240301"
},
"抚州": {
"AREAID": "101240401"
},
"宜春": {
"AREAID": "101240501"
},
"吉安": {
"AREAID": "101240601"
},
"赣州": {
"AREAID": "101240701"
},
"景德镇": {
"AREAID": "101240801"
},
"萍乡": {
"AREAID": "101240901"
},
"新余": {
"AREAID": "101241001"
},
"鹰潭": {
"AREAID": "101241101"
}
},
"湖南": {
"长沙": {
"AREAID": "101250101"
},
"湘潭": {
"AREAID": "101250201"
},
"株洲": {
"AREAID": "101250301"
},
"衡阳": {
"AREAID": "101250401"
},
"郴州": {
"AREAID": "101250501"
},
"常德": {
"AREAID": "101250601"
},
"益阳": {
"AREAID": "101250700"
},
"娄底": {
"AREAID": "101250801"
},
"邵阳": {
"AREAID": "101250901"
},
"岳阳": {
"AREAID": "101251001"
},
"张家界": {
"AREAID": "101251101"
},
"怀化": {
"AREAID": "101251201"
},
"永州": {
"AREAID": "101251401"
},
"湘西": {
"AREAID": "101251509"
}
},
"贵州": {
"贵阳": {
"AREAID": "101260101"
},
"遵义": {
"AREAID": "101260201"
},
"安顺": {
"AREAID": "101260301"
},
"黔南": {
"AREAID": "101260413"
},
"黔东南": {
"AREAID": "101260506"
},
"铜仁": {
"AREAID": "101260601"
},
"毕节": {
"AREAID": "101260701"
},
"六盘水": {
"AREAID": "101260803"
},
"黔西南": {
"AREAID": "101260906"
}
},
"四川": {
"成都": {
"AREAID": "101270101"
},
"攀枝花": {
"AREAID": "101270201"
},
"自贡": {
"AREAID": "101270301"
},
"绵阳": {
"AREAID": "101270401"
},
"南充": {
"AREAID": "101270501"
},
"达州": {
"AREAID": "101270601"
},
"遂宁": {
"AREAID": "101270701"
},
"广安": {
"AREAID": "101270801"
},
"巴中": {
"AREAID": "101270901"
},
"泸州": {
"AREAID": "101271001"
},
"宜宾": {
"AREAID": "101271101"
},
"内江": {
"AREAID": "101271201"
},
"资阳": {
"AREAID": "101271301"
},
"乐山": {
"AREAID": "101271401"
},
"眉山": {
"AREAID": "101271501"
},
"凉山": {
"AREAID": "101271601"
},
"雅安": {
"AREAID": "101271701"
},
"甘孜": {
"AREAID": "101271801"
},
"阿坝": {
"AREAID": "101271901"
},
"德阳": {
"AREAID": "101272001"
},
"广元": {
"AREAID": "101272101"
}
},
"广东": {
"广州": {
"AREAID": "101280101"
},
"韶关": {
"AREAID": "101280201"
},
"惠州": {
"AREAID": "101280301"
},
"梅州": {
"AREAID": "101280401"
},
"汕头": {
"AREAID": "101280501"
},
"深圳": {
"AREAID": "101280601"
},
"珠海": {
"AREAID": "101280701"
},
"佛山": {
"AREAID": "101280800"
},
"肇庆": {
"AREAID": "101280901"
},
"湛江": {
"AREAID": "101281001"
},
"江门": {
"AREAID": "101281101"
},
"河源": {
"AREAID": "101281201"
},
"清远": {
"AREAID": "101281301"
},
"云浮": {
"AREAID": "101281401"
},
"潮州": {
"AREAID": "101281501"
},
"东莞": {
"AREAID": "101281601"
},
"中山": {
"AREAID": "101281701"
},
"阳江": {
"AREAID": "101281801"
},
"揭阳": {
"AREAID": "101281901"
},
"茂名": {
"AREAID": "101282001"
},
"汕尾": {
"AREAID": "101282101"
}
},
"云南": {
"昆明": {
"AREAID": "101290101"
},
"大理": {
"AREAID": "101290201"
},
"红河": {
"AREAID": "101290301"
},
"曲靖": {
"AREAID": "101290401"
},
"保山": {
"AREAID": "101290501"
},
"文山": {
"AREAID": "101290601"
},
"玉溪": {
"AREAID": "101290701"
},
"楚雄": {
"AREAID": "101290801"
},
"普洱": {
"AREAID": "101290901"
},
"昭通": {
"AREAID": "101291001"
},
"临沧": {
"AREAID": "101291101"
},
"怒江": {
"AREAID": "101291201"
},
"迪庆": {
"AREAID": "101291305"
},
"丽江": {
"AREAID": "101291401"
},
"德宏": {
"AREAID": "101291501"
},
"西双版纳": {
"AREAID": "101291602"
}
},
"广西": {
"南宁": {
"AREAID": "101300101"
},
"崇左": {
"AREAID": "101300201"
},
"柳州": {
"AREAID": "101300301"
},
"来宾": {
"AREAID": "101300401"
},
"桂林": {
"AREAID": "101300501"
},
"梧州": {
"AREAID": "101300601"
},
"贺州": {
"AREAID": "101300701"
},
"贵港": {
"AREAID": "101300801"
},
"玉林": {
"AREAID": "101300901"
},
"百色": {
"AREAID": "101301001"
},
"钦州": {
"AREAID": "101301101"
},
"河池": {
"AREAID": "101301201"
},
"北海": {
"AREAID": "101301301"
},
"防城港": {
"AREAID": "101301401"
}
},
"海南": {
"海口": {
"AREAID": "101310101"
},
"三亚": {
"AREAID": "101310201"
},
"东方": {
"AREAID": "101310202"
},
"临高": {
"AREAID": "101310203"
},
"澄迈": {
"AREAID": "101310204"
},
"儋州": {
"AREAID": "101310205"
},
"昌江": {
"AREAID": "101310206"
},
"白沙": {
"AREAID": "101310207"
},
"琼中": {
"AREAID": "101310208"
},
"定安": {
"AREAID": "101310209"
},
"屯昌": {
"AREAID": "101310210"
},
"琼海": {
"AREAID": "101310211"
},
"文昌": {
"AREAID": "101310212"
},
"保亭": {
"AREAID": "101310214"
},
"万宁": {
"AREAID": "101310215"
},
"陵水": {
"AREAID": "101310216"
},
"乐东": {
"AREAID": "101310221"
},
"五指山": {
"AREAID": "101310222"
},
"三沙": {
"AREAID": "101310301"
}
},
"香港": {
"香港": {
"AREAID": "101320101"
}
},
"澳门": {
"澳门": {
"AREAID": "101330101"
}
},
"台湾": {
"台北": {
"AREAID": "101340101"
},
"高雄": {
"AREAID": "101340201"
},
"台中": {
"AREAID": "101340401"
}
}
}
config.py
这部分主要是为了让main.py文件调用配置文件中的配置信息,后面大家可以通过修改配置文件的方式配置自己的地区以及id信息,不需要修改其他的代码即可快速上手使用(如果获取的内容没有改动的话)
#coding=UTF-8
# 公众号配置
# 公众号appId
app_id = "替换成上面记录的appId"
# 公众号appSecret
app_secret = "替换成上面记录的appSecret"
# 模板消息id
template_id = "替换成上面记录的templateId"
# 这是openid,这里是一个数组,可以添加多个用户id,每个用户通过逗号隔开
user = ["替换成上面扫码记录的用户id"]
# 信息配置
# 所在省份,填写的省份务必和城市信息配置文件中的相同
province = "根据自己所在的省份填写"
# 所在城市,填写的城市务必和城市信息配置文件中的相同
city = "根据自己所在的城市填写"
# 生日,如果月份或者日期小于10,直接用对应的数字即可,例如1997-1-1
birthday = "填写自己的生日"
# 在一起的日子,格式同上,这部分我没有使用,大家可以根据自己的需求配置
love_date = "2001-1-1"
# 课程 从周一开始,这部分我没有使用,大家可以根据自己的需求配置
classes = [
[['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', '']],
[['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', ''],
['', '', '', '', '']
]
]
main.py
这部分是整体需要执行的部分,一共分为6部分也分开来讲:
1.获取accessToken:
# 获取用户token信息
accessToken = get_access_token()
这部分首先获取config.py文件中配置的app_id和app_secret,通过post请求调用微信获取用户token的api获取用户的token信息并返回获取到的token用于后面公众号推送消息
def get_access_token():
# appId
app_id = config.app_id
# appSecret
app_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))
print(get(post_url).json())
access_token = get(post_url).json()['access_token']
# print(access_token)
return access_token
2.通过配置文件获取被推送的用户信息用于后面公众号推送消息:
# 接收的用户,获取config.py文件中配置的用户数组信息
user = config.user
3.获取城市信息用于后面获取天气信息与公众号推送消息:
# 传入省份和市获取天气信息
province, city = config.province, config.city
4.获取天气信息
# 获取天气信息
weather, max_temperature, min_temperature = get_weather(province, city)
这部分首先通过配置文件中配置好的省份和城市获取cityinfo.py文件中的区域id(AREAID
),然后通过获取到的AREAID通过get请求调用天气api获取天气信息,从获取到的天气信息中抓取,天气、最高气温、最低气温这几个信息并返回,返回的信息用于后面公众号推送消息
5.获取周报填写天数信息:
# 获取周四周报天数
weekly_thursday = days_until_next_thursday()
# 获取周五周报天数
weekly_friday = days_until_next_friday()
这部分是自己添加的部分,通过localtime获取年月日然后通过today.weekday()获取周四与周五( 周四的weekday()是3,周五是4
),判断如果今天是周四或之后,则下一个周四在当前周之后,否则下一个周四在当前周,获取下周的天数,通过获取的天数计算下一个周四的日期。后面添加另外一个判断,当今天是周四/周五的时候返回0表示当前为需要填写周报的日期(周四/周五),否则则返回下一个周的天数,这部分的数据用于后面公众号推送消息
def days_until_next_thursday():
year = localtime().tm_year
month = localtime().tm_mon
day = localtime().tm_mday
today = datetime.date(datetime(year=year, month=month, day=day))
# 计算下一个周四的日期
# 如果今天是周四或之后,则下一个周四在当前周之后
# 否则,下一个周四在当前周
if today.weekday() >= 3: # 周四的weekday()是3,周五是4,依此类推
next_thursday = 7 - (today.weekday()-3)
else:
next_thursday = 3 - today.weekday()
# 计算下一个周四的日期
next_thursday = today + timedelta(days=next_thursday) # 直接使用timedelta,而不是datetime.timedelta
# 如果今天是周四,days_difference将为0
if today.weekday() == 3:
days_difference = 0
else:
days_difference = (next_thursday - today).days
return days_difference
def days_until_next_friday():
year = localtime().tm_year
month = localtime().tm_mon
day = localtime().tm_mday
today = datetime(year=year, month=month, day=day)
# 计算下一个周五的日期
# 如果今天是周五或之后,则下一个周五在下周
# 否则,下一个周五在当前周
today1 = today.weekday()
if today.weekday() >= 4: # 周五的weekday()是4
next_friday = 7 - (today.weekday() - 4)
else:
next_friday = 4 - today.weekday()
# 使用timedelta计算下一个周五的日期
next_friday_date = today + timedelta(days=next_friday)
# 如果今天是周五,days_difference将为0
if today.weekday() == 4:
days_difference = 0
else:
days_difference = (next_friday_date - today).days
return days_difference
6.公众号推送消息:
# 公众号推送消息
send_message(user, accessToken, city, weather, max_temperature, min_temperature,weekly_thursday,weekly_friday)
这部分就是最终的公众号消息推送的代码了。之前上面做的铺垫就是为了公众号向配置号的推送用户进行消息推送用的,这部分我没有使用之前的几个信息(课表,在一起的日子
),添加了周报的天数信息,那这里我就只说一下添加的周报天数,其他的没有用到的代码我也没有删除,因为运行来看大概并不影响,如果大家需要使用可以直接调整模板用上这些信息就行
周报这里我通过判断传入的周报天数参数判断是否为0,如果是则是填写周报的日期,返回今天就是周四/五,记得填写周报!否则返回离周四/五还有x天,记得填写周报。
后面将这些计算好的信息以推送信息api需要的入参格式的json中,遍历推送的用户id数组,将数据通过post请求调用推送信息的api推送给用户
def send_message(to_user, access_token, city_name, weather, max_temperature, min_temperature, weekly_thursday, weekly_friday):
url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={}".format(access_token)
week_list = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
year = localtime().tm_year
month = localtime().tm_mon
day = localtime().tm_mday
today = datetime.date(datetime(year=year, month=month, day=day))
# 获取离周四填写周报天数
if weekly_thursday == 0:
thursday = "今天就是周四,记得填写周报!"
else:
thursday = "离周四还有"+str(weekly_thursday)+"天,记得填写周报。"
# 获取离周五填写周报天数
if weekly_friday == 0:
friday = "今天就是周五,记得填写周报!"
else:
friday = "离周五还有"+str(weekly_friday)+"天,记得填写周报。"
week = week_list[today.weekday()]
# 获取在一起的日子的日期格式
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]
# 获取生日的月和日
birthday_month = int(config.birthday.split("-")[1])
birthday_day = int(config.birthday.split("-")[2])
# 今年生日
year_date = date(year, birthday_month, birthday_day)
# 计算生日年份,如果还没过,按当年减,如果过了需要+1
if 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 = 0
else:
birth_date = year_date
birth_day = str(birth_date.__sub__(today)).split(" ")[0]
for i in range(len(to_user)):
theClass = classes[i][today.weekday()]
theuser=to_user[i]
data = {
"touser": theuser,
"template_id": config.template_id,
"url": "http://weixin.qq.com/download",
"topcolor": "#FF0000",
"data": {
"date": {
"value": "{} {}".format(today, week),
"color": "#00FFFF"
},
"city": {
"value": city_name,
"color": "#808A87"
},
"weather": {
"value": weather,
"color": "#ED9121"
},
"min_temperature": {
"value": min_temperature,
"color": "#00FF00"
},
"max_temperature": {
"value": max_temperature,
"color": "#FF6100"
},
"love_day": {
"value": love_days,
"color": "#87CEEB"
},
"birthday": {
"value": birth_day,
"color": "#FF8000"
},
"weeklyDayLtx": {
"value": thursday,
"color": "#FF8000"
},
"weeklyDayErp": {
"value": friday,
"color": "#FF8000"
},
"firstClass": {
"value": theClass[0],
"color": "#FF8000"
},
"secondClass": {
"value": theClass[1],
"color": "#FF8000"
},
"thirdClass": {
"value": theClass[2],
"color": "#FF8000"
},
"fourthClass": {
"value": theClass[3],
"color": "#FF8000"
},
"fifthClass": {
"value": theClass[4],
"color": "#FF8000"
}
}
}
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)
print(response.text)
这就是所有的代码部分,整体的main.py文件代码如下:
#coding=UTF-8
from time import time, localtime
import cityinfo
import config
from requests import get, post
from datetime import datetime, date, timedelta
def get_access_token():
# appId
app_id = config.app_id
# appSecret
app_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))
print(get(post_url).json())
access_token = get(post_url).json()['access_token']
# print(access_token)
return access_token
def get_weather(province, city):
# 城市id
city_id = cityinfo.cityInfo[province][city]["AREAID"]
# city_id = 101280101
# 毫秒级时间戳
t = (int(round(time() * 1000)))
headers = {
"Referer": "http://www.weather.com.cn/weather1d/{}.shtml".format(city_id),
'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'
}
url = "http://d1.weather.com.cn/dingzhi/{}.html?_={}".format(city_id, t)
response = get(url, headers=headers)
response.encoding = "utf-8"
response_data = response.text.split(";")[0].split("=")[-1]
response_json = eval(response_data)
print(response_json)
weatherinfo = response_json["weatherinfo"]
# 天气
weather = weatherinfo["weather"]
# 最高气温
temp = weatherinfo["temp"]
# 最低气温
tempn = weatherinfo["tempn"]
return weather, temp, tempn
def days_until_next_thursday():
year = localtime().tm_year
month = localtime().tm_mon
day = localtime().tm_mday
today = datetime.date(datetime(year=year, month=month, day=day))
# 计算下一个周四的日期
# 如果今天是周四或之后,则下一个周四在当前周之后
# 否则,下一个周四在当前周
if today.weekday() >= 3: # 周四的weekday()是3,周五是4,依此类推
next_thursday = 7 - (today.weekday()-3)
else:
next_thursday = 3 - today.weekday()
# 计算下一个周四的日期
next_thursday = today + timedelta(days=next_thursday) # 直接使用timedelta,而不是datetime.timedelta
# 如果今天是周四,days_difference将为0
if today.weekday() == 3:
days_difference = 0
else:
days_difference = (next_thursday - today).days
return days_difference
def days_until_next_friday():
year = localtime().tm_year
month = localtime().tm_mon
day = localtime().tm_mday
today = datetime(year=year, month=month, day=day)
# 计算下一个周五的日期
# 如果今天是周五或之后,则下一个周五在下周
# 否则,下一个周五在当前周
today1 = today.weekday()
if today.weekday() >= 4: # 周五的weekday()是4
next_friday = 7 - (today.weekday() - 4)
else:
next_friday = 4 - today.weekday()
# 使用timedelta计算下一个周五的日期
next_friday_date = today + timedelta(days=next_friday)
# 如果今天是周五,days_difference将为0
if today.weekday() == 4:
days_difference = 0
else:
days_difference = (next_friday_date - today).days
return days_difference
def send_message(to_user, access_token, city_name, weather, max_temperature, min_temperature, weekly_thursday, weekly_friday):
url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={}".format(access_token)
week_list = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
year = localtime().tm_year
month = localtime().tm_mon
day = localtime().tm_mday
today = datetime.date(datetime(year=year, month=month, day=day))
# 获取离周四填写周报天数
if weekly_thursday == 0:
thursday = "今天就是周四,记得填写周报!"
else:
thursday = "离周四还有"+str(weekly_thursday)+"天,记得填写周报。"
# 获取离周五填写周报天数
if weekly_friday == 0:
friday = "今天就是周五,记得填写周报!"
else:
friday = "离周五还有"+str(weekly_friday)+"天,记得填写周报。"
week = week_list[today.weekday()]
# 获取在一起的日子的日期格式
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]
# 获取生日的月和日
birthday_month = int(config.birthday.split("-")[1])
birthday_day = int(config.birthday.split("-")[2])
# 今年生日
year_date = date(year, birthday_month, birthday_day)
# 计算生日年份,如果还没过,按当年减,如果过了需要+1
if 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 = 0
else:
birth_date = year_date
birth_day = str(birth_date.__sub__(today)).split(" ")[0]
for i in range(len(to_user)):
theClass = classes[i][today.weekday()]
theuser=to_user[i]
data = {
"touser": theuser,
"template_id": config.template_id,
"url": "http://weixin.qq.com/download",
"topcolor": "#FF0000",
"data": {
"date": {
"value": "{} {}".format(today, week),
"color": "#00FFFF"
},
"city": {
"value": city_name,
"color": "#808A87"
},
"weather": {
"value": weather,
"color": "#ED9121"
},
"min_temperature": {
"value": min_temperature,
"color": "#00FF00"
},
"max_temperature": {
"value": max_temperature,
"color": "#FF6100"
},
"love_day": {
"value": love_days,
"color": "#87CEEB"
},
"birthday": {
"value": birth_day,
"color": "#FF8000"
},
"weeklyDayLtx": {
"value": thursday,
"color": "#FF8000"
},
"weeklyDayErp": {
"value": friday,
"color": "#FF8000"
},
"firstClass": {
"value": theClass[0],
"color": "#FF8000"
},
"secondClass": {
"value": theClass[1],
"color": "#FF8000"
},
"thirdClass": {
"value": theClass[2],
"color": "#FF8000"
},
"fourthClass": {
"value": theClass[3],
"color": "#FF8000"
},
"fifthClass": {
"value": theClass[4],
"color": "#FF8000"
}
}
}
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)
print(response.text)
if __name__ == '__main__':
# 获取accessToken
accessToken = get_access_token()
# print('token', accessToken)
# 接收的用户
user = config.user
# print('user:',user)
# 传入省份和市获取天气信息
province, city = config.province, config.city
classes = config.classes
weather, max_temperature, min_temperature = get_weather(province, city)
# 获取周四周报天数
weekly_thursday = days_until_next_thursday()
# 获取周五周报天数
weekly_friday = days_until_next_friday()
# 公众号推送消息
send_message(user, accessToken, city, weather, max_temperature, min_temperature,weekly_thursday,weekly_friday)
注意:这三个文件的代码我都在最上方添加了#coding=UTF-8,因为版本原因可以会有编码问题,所以根据自己的情况自行添加
后面就用到了我们的服务器,我这里因为之前就是用的宝塔,所以就直接使用了宝塔这里自带的定时调度功能
首先打开自己的宝塔界面,找到计划任务

添加计划任务:

执行的脚本代码,需要将刚才编写好的三个python文件上传到服务器上的某个目录中:
#!/bin/bash
python /存放的文件的文件夹/main.py
调整好时间然后就可以保存了,我这里每天是早上9点提醒,如果没问题的话点击执行也可以手动触发,在被推送用户的微信上就能收到消息啦,如果有报错可以根据报错信息调整对应的报错代码并再次尝试

执行成功后的结果:

自此整个使用python实现微信公众号定时推送消息的实现方式就完成了,以后每天都可以街道自己需要的信息了