微信订阅号定时发送消息的工具

为什么做

之前在掘金上看到很多人分享,给女朋友或“任何人”每天定时推送消息,像是纪念日提醒、每日一句关心这类的。感觉有点意思于是想着也给我家那位整个。

怎么做

实现方式五花八门,我为了方便利用微信服务号给推送模版信息,定时任务用了laravel的任务调度(其实就只是用它一个定时任务,不用框架也完全可以)。

实现原理

  • 调用天行数据的api,获取自己想要的数据,封装起来
  • 调用easywechat的接口,实现给微信好友发送消息
  • 添加定时任务,实现定时发送

实现步骤

  1. 创建微信模版消息

    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}}
  2. 调用天行数据接口,获取天气预报

    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
    62
    public 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": "天气寒冷,冬季着装:棉衣、羽绒服、冬大衣、皮夹克加羊毛衫、厚呢外套、呢帽、手套等;年老体弱者尽量少外出。空气质量较差,敏感人群建议减少体力消耗类户外活动。"
    }
    }
    */
    }
  3. 组合模版消息

    计算恋爱天数

    1
    2
    3
    4
    5
    public static function getLoveDays(): int{
    $start_date = self::$loveDays;

    return Carbon::now()->diffInDays($start_date);
    }

    计算生日剩余天数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public 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"
    ],
    ],
    ];
  4. 给指定微信好友推送消息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    use 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);
  5. 添加定时任务

Linux crontab

* * * * * cd /你的项目路径 && php artisan schedule:run >> /dev/null 2>&1

最后

完整代码点这里

微信在2023年5月对模版消息作出调整,把自定义颜色、表情符号、备注内容等移除了,具体可见公告,所以以上代码中的自定义颜色、remark都已不生效,但是也不影响正常使用。