私人订制
给女友、爱人、自己都可以自由定制
暖心每日提醒【展示】
先展示一下,成品图
定时任务:每天的七点自动发送消息给特定的用户或者用户群体
拆分图
制作流程,开干
一、软硬件分析
- 需要一个青龙,不知道什么是青龙的看这个链接,或者直接找我帮挂脚本
- 会一点点编程基础,没有就直接抄
- 用到
wxpusher
,,用来发送消息 - 编程语言用到Python,可以网上下载安装
- 天气提醒,用到高德地图的API
二、wxpusher使用
第一步 注册,创建应用
https://wxpusher.zjiecode.com/admin/
,使用微信扫码登录,无需注册,新用户首次扫码自动注册。
然后创建一个应用,有了应用,别人关注这个应用就能获取消息了
需要获取appToken,保存记录下来,这个就相当于应用的唯一标志。
第二步 关注应用
让别人【要接受消息的人】关注你创建的应用
第三步 获取UID
需要谁接受消息,就获取谁的UID
第四步 读API
会编程的可以读一读,没有编程基础的直接跳过
http接口说明
三、编写脚本【重点】
下载所需的包
from zhdate import ZhDate
import requests
import datetime
import json
需要引入的包如上,有的包不存在需要下载【zhdate、requests】
下载方式:同时按下键盘上的win
+R
,输入cmd
,输入
pip install zhdate
key
app_token = 'AT_XXXXXXXXXXXXXXXXXXXX' # 本处改成自己的应用 APP_TOKEN
uid_myself = 'UID_6XXXXXXXXXXXXXXXXX' # 本处改成自己的 UID
gaode_key='XXXXXXXXXXXXXXXXXX' # 高德地图的key
b_uid = 'UID_XXXXXXXXXXXXXXXXXXXXXX' #b的UID
公共方法
today = datetime.date.today() # 获取当前的日期
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
wxpusher发送消息
# wxpusher发送消息api
def wxpusher_send_by_webapi(msg):
"""利用 wxpusher 的 web api 发送 json 数据包,实现微信信息的发送"""
webapi = 'http://wxpusher.zjiecode.com/api/send/message'
data = {
"appToken":app_token,
"content":msg,
"summary":"早安!", # 该参数可选,默认为 msg 的前10个字符
"contentType":1,
"uids":[ uid_myself,],
}
result = requests.post(url=webapi,json=data)
return result.text
wxpusher_send_by_webapi(‘hello word’)
“summary”:“早安!”,这是发送消息的标题,可以改为[msg:99]
“uids”:[ uid_myself,], 是发送给谁,可以多人
计算纪念日天数
# 计算纪念日的总天数
def datecalculate_to_now(val):
anniversary = datetime.datetime.strptime(val, "%Y-%m-%d").date() # 纪念日
# today = datetime.date.today() # 获取当前的日期
sum_days = today - anniversary
# print(sum_days.days)
days = sum_days.days
return days
sum_days = datecalculate_to_now('1999-1-1')
sum_days = datecalculate_to_now(‘1999-1-1’)
可以计算1999-1-1到现在的天数合
把天数转换成年月日
需要结合上边的程序,把天数转换成年月日
# 把总天数转换为年月日
def date_year_month_day(days):
year = month = day = 0
if days > 365:
year = days // 365
if (days * year) / 30 < 1:
day = (days - 365 * year) % 30
if (days * year) / 30 >= 1:
day = (days - 365 * year) % 30
month = (days - 365 * year) // 30
elif days < 365 and days > 30:
month = days // 30
day = days % 30
else:
day = days
result = str(year)+"年"+str(month)+"月"+str(day)+"日"
return result
sum_days = datecalculate_to_now('1999-1-1')
detaildays = date_year_month_day(sum_days)
每日一言
接口来源:https://developer.hitokoto.cn/sentence/
# 每日一言接口
def get_yiyan(url):
response = requests.get(url,headers=headers)
result = json.loads(response.text)
#print(result)
return result
date_yiyan = get_yiyan("https://v1.hitokoto.cn?c=k")
如果想更改语句类型,get_yiyan(“https://v1.hitokoto.cn?c=k”),把
c=k
改成自己想要更改的,比如:c=a
:动画
农历
# 农历
def lunar(dtime):
date = ZhDate.from_datetime(dtime).chinese()
# print(date)
return date
date_lunar = lunar(datetime.datetime.now())
date_lunar = lunar(datetime.datetime.now()),这是获取当天的农历,如果想自定义,可以lunar(datetime(2022, 1, 1)),获取2022.1.1的农历信息
获取星期信息
#星期获取判断
def day_week_detail():
dayofWeek = datetime.datetime.today().weekday()
if dayofWeek == 0:
week_name = """<span style="color:#CD6155;">星期一</span>"""
elif dayofWeek == 1:
week_name = """<span style="color:#F5B041;">星期二</span>"""
elif dayofWeek == 2:
week_name = """<span style="color:#F4D03F;">星期三</span>"""
elif dayofWeek == 3:
week_name = """<span style="color:#58D68D;">星期四</span>"""
elif dayofWeek == 4:
week_name = """<span style="color:#566573;">星期五</span>"""
elif dayofWeek == 5:
week_name = """<span style="color:#5DADE2;">星期六</span>"""
elif dayofWeek == 6:
week_name = """<span style="color:#A569BD;">星期日</span>"""
# print(week_name)
return week_name
<span style=“color:#CD6155;”>星期一
包含了颜色信息,每个星期的颜色都不一样
获取高德天气数据【实时】
官方使用说明
第一步,申请”web服务 API”密钥(Key);
第二步,拼接HTTP请求URL,第一步申请的Key需作为必填参数一同发送;
第三步,接收HTTP请求返回的数据(JSON或XML格式),解析数据。
如无特殊声明,接口的输入参数和输出数据编码全部统一为UTF-8。
次数限制:
获取当日的天气代码如下
:
def gaode_weather_today(key,citycode):
url = "https://restapi.amap.com/v3/weather/weatherInfo?city="+citycode+"&key="+key
response = requests.get(url,headers=headers)
result = json.loads(response.text)
if result['status'] == '1':
#print(result)
return result
else:
return 0
key
是获取到的高德key
citycode
是城市代码,获取哪个城市天气需要的信息。代码参考地址参考
获取高德天气数据【预测】
可以获取未来三天天气预测信息
def gaode_weather(key,citycode):
url = "https://restapi.amap.com/v3/weather/weatherInfo?city="+citycode+"&key="+key+"&extensions=all"
response = requests.get(url,headers=headers)
result = json.loads(response.text)
if result['status'] == '1':
#print(result)
return result
else:
return 0
设计界面【高雅】
wxpusher支持发送的消息内容格式是text,html,md
text是文本格式:没样式,只有文字,不符合咱们的气质
html网页格式:样式美观,定制化程度高
md是markdown格式:暂时还没涉及,格式主要用来记笔记,列点等
上面已经获取到了数据,单纯的文字展示不够优雅没有高端大气上档次的感觉,不美观。
sum_days = datecalculate_to_now('1999-1-1')
detaildays = date_year_month_day(sum_days)
msg_end = """❤相恋已经<span style="color:#FFB6C1;">"""+detaildays+"""</span>啦,共计<span style="color:#FFB6C1;">"""+str(sum_days)+"""</span>天❤"""
date_yiyan = get_yiyan("https://v1.hitokoto.cn?c=k")
date_week = day_week_detail()
date_lunar = lunar(datetime.datetime.now())
yiyan = """<span style="color:#76D7C4;">「 """+date_yiyan['hitokoto']+""" 」</span>"""
gaode_date = gaode_weather(gaode_key,'110106')
gaode_date_today = gaode_weather_today(gaode_key,'110106')
today_lives = gaode_date_today['lives'][0]
if gaode_date!= 0 and gaode_date_today !=0:
city = gaode_date['forecasts'][0]['city']
province = gaode_date['forecasts'][0]['province']
casts =gaode_date['forecasts'][0]['casts'][0]
casts2 =gaode_date['forecasts'][0]['casts'][1]
dayweather = casts['dayweather']
nightweather = casts['nightweather']
daytemp = casts['daytemp']
nighttemp = casts['nighttemp']
daywind = casts['daywind']
nightwind = casts['nightwind']
daypower = casts['daypower']
nightpower = casts['nightpower']
#第二天天气情况
dayweather2 = casts2['dayweather']
nightweather2 = casts2['nightweather']
daytemp2 = casts2['daytemp']
nighttemp2 = casts2['nighttemp']
daywind2 = casts2['daywind']
nightwind2 = casts2['nightwind']
daypower2 = casts2['daypower']
nightpower2 = casts2['nightpower']
# 当前的天气情况
today_weather = today_lives['weather']
today_temperature = today_lives['temperature']
today_winddirection = today_lives['winddirection']
today_windpower = today_lives['windpower']
today_humidity = today_lives['humidity']
#print(today_weather)
province_city = province+city
对获取到的信息进行整理
接下来就是页面的设计
msg = """
<!DOCTYPE html>
<html>
<body>
<div style="box-shadow: rgba(14, 30, 37, 0.12) 0px 2px 4px 0px, rgba(14, 30, 37, 0.32) 0px 2px 16px 0px;border-radius: 10px;">
<h1 style="text-align: center;margin-top:-10px;margin-bottom:-5px">"""+date_week+"""</h1>
<div style="box-shadow: rgba(67, 71, 85, 0.27) 0px 0px 0.25em, rgba(90, 125, 188, 0.05) 0px 0.25em 1em;border-radius: 5px">
<p style="font-size:60px;margin-top:-10px;margin-bottom:-10px" align="center">"""+today_temperature+"""°</p>
<div style="display:flex; justify-content:space-between;">
<p style="color:#EC7063;font-size:25px;margin-top:10px">🌡️"""+today_weather+"""</p>
<p style="color:#5DADE2;font-size:15px">💧 """+today_humidity+"""%</p>
<p style="color:#58D68D;font-size:15px">🍃 """+today_winddirection+"""风 """+today_windpower+"""级</p>
</div>
<div>
<p style="margin-top:-30px;" align="center"> 🌱<span style="color:#117864;">today</span>☀️ <span style="color:#EC7063">"""+dayweather+"""</span> 🌡"""+daytemp+"""° 🍃<span style="color:#58D68D">"""+daywind+"""风 """+daypower+"""级</span></p>
<p style="margin-top:-15px" align="center"> 🍀<span style="color:#117864;">today</span>🌙️ <span style="color:#EC7063">"""+nightweather+"""</span> 🌡"""+nighttemp+"""° 🍃<span style="color:#58D68D">"""+nightwind+"""风 """+nightpower+"""级</span></p>
<p style="margin-top:-15px" align="center">🍁<span style="color:#7D3C98;">tomorrow</span>☀️ <span style="color:#EC7063">"""+dayweather2+"""</span> 🌡"""+daytemp2+"""° 🍃<span style="color:#58D68D">"""+daywind2+"""风 """+daypower2+"""级</span></p>
<p style="margin-top:-15px;margin-bottom:-25px" align="center">🌹<span style="color:#7D3C98;">tomorrow</span>🌙️ <span style="color:#EC7063">"""+nightweather2+"""</span> 🌡"""+nighttemp2+"""° 🍃<span style="color:#58D68D">"""+nightwind2+"""风 """+nightpower2+"""级</span></p>
</div>
<p align="center" style="color:#AAB7B8;font-size:10px;margin-bottom:-15px">📍 """+province_city+"""</p>
</div>
<div>
<p style="margin-top:-10px">"""+yiyan+"""</p>
<p style="text-align: right;margin-right:2%;margin-top:-25px"><span style="color:#D98880">--"""+date_yiyan['from']+"""</span></p>
</div>
<div style="display:flex; justify-content:space-between;margin-top:-30px;margin-bottom:-20px">
<p >"""+str(today)+"""</p>
<p >"""+date_lunar+"""</p>
</div>
</div>
<p align="center" style="margin-top:-10px">"""+msg_end+"""</p>
</body>
</html>
"""
阴影效果展示,参考来源:来源
颜色参考来源:颜色
<div style=“display:flex; justify-content:space-between;”>
设置两个div元素横向排列
表情来源:表情
最多的就是颜色设置和位置设置,自己定制化开发
完整代码展示
from zhdate import ZhDate
import requests
import datetime
import json
app_token = 'AT_xxxxxxxxxxxxxx' # 本处改成自己的应用 APP_TOKEN
uid_myself = 'UID_xxxxxxxx' # 本处改成自己的 UID
gaode_key='xxxxxx' # 高德地图的key
ztt_uid = 'UID_Uxxxxxxxxxxx' #ztt的UID
today = datetime.date.today() # 获取当前的日期
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
# wxpusher发送消息api
def wxpusher_send_by_webapi(msg):
"""利用 wxpusher 的 web api 发送 json 数据包,实现微信信息的发送"""
webapi = 'http://wxpusher.zjiecode.com/api/send/message'
data = {
"appToken":app_token,
"content":msg,
"summary":"早安!", # 该参数可选,默认为 msg 的前10个字符
"contentType":1,
"uids":[ uid_myself,],
}
result = requests.post(url=webapi,json=data)
return result.text
# 计算纪念日的总天数
def datecalculate_to_now(val):
anniversary = datetime.datetime.strptime(val, "%Y-%m-%d").date() # 纪念日
# today = datetime.date.today() # 获取当前的日期
sum_days = today - anniversary
# print(sum_days.days)
days = sum_days.days
return days
# 把总天数转换为年月日
def date_year_month_day(days):
year = month = day = 0
if days > 365:
year = days // 365
if (days * year) / 30 < 1:
day = (days - 365 * year) % 30
if (days * year) / 30 >= 1:
day = (days - 365 * year) % 30
month = (days - 365 * year) // 30
elif days < 365 and days > 30:
month = days // 30
day = days % 30
else:
day = days
result = str(year)+"年"+str(month)+"月"+str(day)+"日"
return result
# 因为请求过慢,暂时不用
def get_hanxiaohan_loveapi(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
response = requests.get(url,headers=headers,timeout=10)
result = json.loads(response.text)["ishan"]
if len(result) >=20:
get_hanxiaohan_loveapi(url)
else:
print(result)
# 每日一言接口
def get_yiyan(url):
response = requests.get(url,headers=headers)
result = json.loads(response.text)
#print(result)
return result
#星期获取判断
def day_week_detail():
dayofWeek = datetime.datetime.today().weekday()
if dayofWeek == 0:
week_name = """<span style="color:#CD6155;"></span>星期一"""
elif dayofWeek == 1:
week_name = """<span style="color:#F5B041;">星期二</span>"""
elif dayofWeek == 2:
week_name = """<span style="color:#F4D03F;">星期三</span>"""
elif dayofWeek == 3:
week_name = """<span style="color:#58D68D;">星期四</span>"""
elif dayofWeek == 4:
week_name = """<span style="color:#566573;">星期五</span>"""
elif dayofWeek == 5:
week_name = """<span style="color:#5DADE2;">星期六</span>"""
elif dayofWeek == 6:
week_name = """<span style="color:#A569BD;">星期日</span>"""
# print(week_name)
return week_name
# 农历
def lunar(dtime):
date = ZhDate.from_datetime(dtime).chinese()
# print(date)
return date
def gaode_weather(key,citycode):
url = "https://restapi.amap.com/v3/weather/weatherInfo?city="+citycode+"&key="+key+"&extensions=all"
response = requests.get(url,headers=headers)
result = json.loads(response.text)
if result['status'] == '1':
#print(result)
return result
else:
return 0
def gaode_weather_today(key,citycode):
url = "https://restapi.amap.com/v3/weather/weatherInfo?city="+citycode+"&key="+key
response = requests.get(url,headers=headers)
result = json.loads(response.text)
if result['status'] == '1':
#print(result)
return result
else:
return 0
def main():
sum_days = datecalculate_to_now('1999-1-1')
detaildays = date_year_month_day(sum_days)
msg_end = """❤相恋已经<span style="color:#FFB6C1;">"""+detaildays+"""</span>啦,共计<span style="color:#FFB6C1;">"""+str(sum_days)+"""</span>天❤"""
date_yiyan = get_yiyan("https://v1.hitokoto.cn?c=k")
date_week = day_week_detail()
date_lunar = lunar(datetime.datetime.now())
yiyan = """<span style="color:#76D7C4;">「 """+date_yiyan['hitokoto']+""" 」</span>"""
gaode_date = gaode_weather(gaode_key,'110106')
gaode_date_today = gaode_weather_today(gaode_key,'110106')
today_lives = gaode_date_today['lives'][0]
if gaode_date!= 0 and gaode_date_today !=0:
city = gaode_date['forecasts'][0]['city']
province = gaode_date['forecasts'][0]['province']
casts =gaode_date['forecasts'][0]['casts'][0]
casts2 =gaode_date['forecasts'][0]['casts'][1]
dayweather = casts['dayweather']
nightweather = casts['nightweather']
daytemp = casts['daytemp']
nighttemp = casts['nighttemp']
daywind = casts['daywind']
nightwind = casts['nightwind']
daypower = casts['daypower']
nightpower = casts['nightpower']
#第二天天气情况
dayweather2 = casts2['dayweather']
nightweather2 = casts2['nightweather']
daytemp2 = casts2['daytemp']
nighttemp2 = casts2['nighttemp']
daywind2 = casts2['daywind']
nightwind2 = casts2['nightwind']
daypower2 = casts2['daypower']
nightpower2 = casts2['nightpower']
# 当前的天气情况
today_weather = today_lives['weather']
today_temperature = today_lives['temperature']
today_winddirection = today_lives['winddirection']
today_windpower = today_lives['windpower']
today_humidity = today_lives['humidity']
#print(today_weather)
province_city = province+city
'''
print(today)
print(date_week)
print(date_lunar)
print("「 "+date_yiyan['hitokoto']+" 」")
print(date_yiyan['from'])
print(msg_end)
'''
msg = """
<!DOCTYPE html>
<html>
<body>
<div style="box-shadow: rgba(14, 30, 37, 0.12) 0px 2px 4px 0px, rgba(14, 30, 37, 0.32) 0px 2px 16px 0px;border-radius: 10px;">
<h1 style="text-align: center;margin-top:-10px;margin-bottom:-5px">"""+date_week+"""</h1>
<div style="box-shadow: rgba(67, 71, 85, 0.27) 0px 0px 0.25em, rgba(90, 125, 188, 0.05) 0px 0.25em 1em;border-radius: 5px">
<p style="font-size:60px;margin-top:-10px;margin-bottom:-10px" align="center">"""+today_temperature+"""°</p>
<div style="display:flex; justify-content:space-between;">
<p style="color:#EC7063;font-size:25px;margin-top:10px">🌡️"""+today_weather+"""</p>
<p style="color:#5DADE2;font-size:15px">💧 """+today_humidity+"""%</p>
<p style="color:#58D68D;font-size:15px">🍃 """+today_winddirection+"""风 """+today_windpower+"""级</p>
</div>
<div>
<p style="margin-top:-30px;" align="center"> 🌱<span style="color:#117864;">today</span>☀️ <span style="color:#EC7063">"""+dayweather+"""</span> 🌡"""+daytemp+"""° 🍃<span style="color:#58D68D">"""+daywind+"""风 """+daypower+"""级</span></p>
<p style="margin-top:-15px" align="center"> 🍀<span style="color:#117864;">today</span>🌙️ <span style="color:#EC7063">"""+nightweather+"""</span> 🌡"""+nighttemp+"""° 🍃<span style="color:#58D68D">"""+nightwind+"""风 """+nightpower+"""级</span></p>
<p style="margin-top:-15px" align="center">🍁<span style="color:#7D3C98;">tomorrow</span>☀️ <span style="color:#EC7063">"""+dayweather2+"""</span> 🌡"""+daytemp2+"""° 🍃<span style="color:#58D68D">"""+daywind2+"""风 """+daypower2+"""级</span></p>
<p style="margin-top:-15px;margin-bottom:-25px" align="center">🌹<span style="color:#7D3C98;">tomorrow</span>🌙️ <span style="color:#EC7063">"""+nightweather2+"""</span> 🌡"""+nighttemp2+"""° 🍃<span style="color:#58D68D">"""+nightwind2+"""风 """+nightpower2+"""级</span></p>
</div>
<p align="center" style="color:#AAB7B8;font-size:10px;margin-bottom:-15px">📍 """+province_city+"""</p>
</div>
<div>
<p style="margin-top:-10px">"""+yiyan+"""</p>
<p style="text-align: right;margin-right:2%;margin-top:-25px"><span style="color:#D98880">--"""+date_yiyan['from']+"""</span></p>
</div>
<div style="display:flex; justify-content:space-between;margin-top:-30px;margin-bottom:-20px">
<p >"""+str(today)+"""</p>
<p >"""+date_lunar+"""</p>
</div>
</div>
<p align="center" style="margin-top:-10px">"""+msg_end+"""</p>
</body>
</html>
"""
result = wxpusher_send_by_webapi(msg)
print(result)
# get_hanxiaohan_loveapi('https://api.vvhan.com/api/love?type=json')
if __name__ == '__main__':
main()
青龙运行脚本
第一步 创建脚本
在最外层的目录创建py文件,并把代码粘贴复制进去
第二步 安装依赖
在依赖管理里面创建依赖,zhdate
,这个依赖是获取农历的,还需要几个依赖,名单如下:
第三步 定时任务
青龙的定时任务
里面创建新的定时任务
这里的定时规则是每天早上七点定时发送通知
可以一键安装多个依赖:
node
crypto-js
prettytable
dotenv
jsdom
date-fns
tough-cookie
tslib
ws@7.4.3
ts-md5
jsdom -g
jieba
fs
form-data
json5
global-agent
png-js
@types/node
require
typescript
js-base64
axios
moment
python
requests
canvas
ping3
jieba
PyExecJS
aiohttp
linux
bizCode
bizMsg
lxm
扩展
每日喝水提醒,星座日历提醒,每日30S新闻,每三个小时休息提醒、生日日期提醒等等,可玩性很高,自行探索也可以找我一起讨论。