为什么做
之前在掘金上看到很多人分享,给女朋友或“任何人”每天定时推送消息,像是纪念日提醒、每日一句关心这类的。感觉有点意思于是想着也给我家那位整个。
怎么做
实现方式五花八门,我为了方便利用微信服务号给推送模版信息,定时任务用了laravel的任务调度(其实就只是用它一个定时任务,不用框架也完全可以)。
实现原理
- 调用天行数据的api,获取自己想要的数据,封装起来
- 调用easywechat的接口,实现给微信好友发送消息
- 添加定时任务,实现定时发送
实现步骤
创建微信模版消息
1
2
3
4
5
6
7
8
9
10
11
12❤早安吖❤
{{date.DATA}}{{remark.DATA}}
所在城市:{{city.DATA}}
今天天气:{{weather.DATA}}
气温变化:{{minTemperature.DATA}}~{{maxTemperature.DATA}}
今天建议:{{tips.DATA}}
今天是我们相恋De第{{loveDays.DATA}}天
距离大宝宝的生日还有{{birthDay.DATA}}天
距离小宝宝的生日还有{{childBirthDay.DATA}}天
{{rainbow.DATA}}调用天行数据接口,获取天气预报
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62public static function tianqi(){
try {
$uri = 'https://apis.tianapi.com/tianqi/index';
$client = new Client();
$response = $client->get($uri, [
'query' => [
'key' => 'key',//你自己申请的key
'city' => '郑州',
'type' => '1'
]
]);
file_put_contents('t.json',$response->getBody()->getContents());die;
return json_decode($response->getBody()->getContents())->result;
} catch (\Exception $exception) {
return '';
}
/**
{
"code": 200,
"msg": "success",
"result": {
"date": "2023-12-13",
"week": "星期三",
"province": "河南",
"area": "郑州",
"areaid": "101180101",
"weather": "阴",
"weatherimg": "yin.png",
"weathercode": "yin",
"real": "-0.5℃",
"lowest": "-1℃",
"highest": "0℃",
"wind": "东北风",
"windspeed": "11",
"windsc": "2级",
"sunrise": "07:23",
"sunset": "17:15",
"moonrise": "",
"moondown": "",
"pcpn": "0",
"uv_index": "0",
"aqi": "104",
"quality": "轻度",
"vis": "1",
"humidity": "96",
"alarmlist": [
{
"province": "河南省",
"city": "",
"level": "黄色",
"type": "道路结冰",
"content": "河南省气象台2023年12月12日16时00分继续发布道路结冰黄色预警:预计12月12日16时到13日16时,西部、北中部有雨夹雪或中雪,局部大雪或暴雪,部分县市伴有冻雨;其他县市有小到中雨。全省大部县市路表温度低于0℃,将出现对交通有较大影响的道路结冰,其中黄河以北及三门峡、洛阳、郑州、开封、许昌北部、平顶山北部影响较严重。请注意防范。\n防御指南:\n1.交通运输、公安等部门应按照职责做好道路结冰应对准备工作;\n2.驾驶人员应当注意路况,安全行驶;\n3.行人减少外出,必要外出时尽量少骑自行车,注意防滑。(预警信息来源:国家预警信息发布中心)",
"time": "2023-12-12 16:00:00"
}
],
"tips": "天气寒冷,冬季着装:棉衣、羽绒服、冬大衣、皮夹克加羊毛衫、厚呢外套、呢帽、手套等;年老体弱者尽量少外出。空气质量较差,敏感人群建议减少体力消耗类户外活动。"
}
}
*/
}组合模版消息
计算恋爱天数
1
2
3
4
5public static function getLoveDays(): int{
$start_date = self::$loveDays;
return Carbon::now()->diffInDays($start_date);
}计算生日剩余天数
1
2
3
4
5
6
7
8
9
10
11public static function getBirthDays($start_date){
$birthday = Carbon::parse($start_date);
$birthday->year(date('Y'));
$d = Carbon::now()->diffInDays($birthday, false);
if ($d < 0) {
//计算明年
$birthday->year(date("Y", strtotime("+1 year")));
$d = Carbon::now()->diffInDays($birthday, false);
}
return $d;
}模版消息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48$msg = [
'touser' => $touser,
'template_id' => '2-grcuQ9CVdf0mMrPjf_6ipXBiCN1t0XyVmhn6GC_YM',
'data' => [
'date' => [
date('Y-m-d') . $weather->week,
'#00BFFF'
],
// "❤"
'remark' => $remark,
'city' => [
$weather->area,
''
],
'weather' => [
$weather->weather,
"#1f95c5"
],
'minTemperature' => [
'value' => $weather->lowest,
'color' => '#0ace3c'
],
'maxTemperature' => [
'value' => $weather->highest,
'color' => '#dc1010'
],
'tips' => [
$weather->tips,
""
],
'loveDays' => [
$loveDays,
"#FFA500"
],
'birthDay' => [
$birthDays,
"#FFA500"
],
'childBirthDay' => [
$childBirthDay,
"#FFA500"
],
'rainbow' => [
$rainbow,
"#FF69B4"
],
],
];给指定微信好友推送消息
1
2
3
4
5
6
7
8
9
10
11
12use EasyWeChat\Factory;
$config = [
'app_id' => '',//你自己的appID
'secret' => '',//你自己的appsecret
// 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名
'response_type' => 'array',
//...
];
$this->app = Factory::officialAccount($config);
$result = $this->app->template_message->send($msg);添加定时任务
Linux crontab
* * * * * cd /你的项目路径 && php artisan schedule:run >> /dev/null 2>&1
最后
微信在2023年5月对模版消息作出调整,把自定义颜色、表情符号、备注内容等移除了,具体可见公告,所以以上代码中的自定义颜色、remark都已不生效,但是也不影响正常使用。