微信-公众号/订阅号推送消息(js版本)

news2024/11/15 17:33:56

1.登录或注册微信测试号

(测试号的名称由官方自动生成,不能更改)

微信测试号入口:微信公众平台

2.登录进去后会看到自己的appId和appsecret

(这两个参数都需填入代码中)

3.检查是否安装nodeJs,使用node -v可检查是否安装;

node -v

没有就去官网下载进行安装

Node.js — Run JavaScript Everywhere

4.扫码关注测试二维码

(微信号需要拿到,后期填入代码中)

6.编辑测试号需要发送的信息模版,得到一个模版ID

(模板ID后期需放在代码中)

今天是:{{date.DATA}} 
土味情话:{{QingHua.DATA}} 
距离生日还有:{{Birthday.DATA}} 天 
今天是我们在一起第:{{jiNianDay.DATA}} 天 
【网易云时间】:{{wangyiyun.DATA}}

6.直接copy代码,然后将上面的4个参数填进去

(代码提供了单条发送和多条发送的,按需切换)

// 需要填写的地方已经标出
// 一共4个地方 appID、appsecret、模板ID、微信用户的openid
const axios = require("axios");
const moment = require("moment");
let openId = ""; // 关注者ID
let params = {}; // 装参用的

// 设置跨域请求头
axios.defaults.headers.post["Content-Type"] = "application/json; charset=utf-8";

// 定义post请求方法
const axiosPost = function (url, params) {
  return new Promise((resolve, reject) => {
    axios
      .post(url, params)
      .then((res) => {
        resolve(res);
      })
      .catch((err) => {
        reject(err);
      });
  });
};

// 定义get请求方法
const axiosGet = function (url, params) {
  return new Promise((resolve, reject) => {
    axios
      .get(url, {
        params,
      })
      .then((res) => {
        resolve(res);
      })
      .catch((err) => {
        reject(err);
      });
  });
};

//  定义获取token方法
async function getToken() {
  const params = {
    grant_type: "client_credential",
    appid: "", // 你的appid  1
    secret: "", // 你的secret 2
  };
  let res = await axiosGet("https://api.weixin.qq.com/cgi-bin/token", params);
  return res.data.access_token;
}

// 1、随机一句土味情话
async function getQingHua() {
  let res = await axiosGet("https://api.uomg.com/api/rand.qinghua?format=json");
  return res.data.content;
}

// 2、舔狗日记
// async function getTianGou() {
//     let res = await axiosGet('http://api.weijieyue.cn/api/tgrj/api.php')
//     return res.data;
// }

// 3、网易云热评
async function getWangYiYun() {
  let res = await axiosGet("https://keai.icu/apiwyy/api");
  return res.data;
}

// 天气 暂时不可用
// async function getWeather() {
//     let res = await axiosGet('https://api.vvhan.com/api/weather?city=长沙');
//     console.log(res,'4')
//     return res.data.info;
// }

// 4、计算还有多少天过生日(公历)
function getDaysToBirthday(month, day) {
  let now = new Date();
  let thisYear = now.getFullYear();
  //今年的生日
  let birthday = new Date(thisYear, month - 1, day);
  if (birthday < now) {
    birthday.setFullYear(now.getFullYear() + 1);
  }
  let timeDec = birthday - now;
  let days = timeDec / (24 * 60 * 60 * 1000);
  return Math.ceil(days);
}
// 5、纪念日
function getJiNianDays(time) {
  let startTime = new Date(time).getTime(); // 开始时间
  let nowTime = new Date().getTime(); // 今天
  let duration = -moment(startTime).diff(nowTime) / (1000 * 3600 * 24); // 时间戳转化为天数
  return Math.ceil(duration); // 取整数
}
// 6、当前时间
function getDays() {
  let date = new Date();
  // 获取时间:时分秒
  const hour = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
  const minute =
    date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
  const secound =
    date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
  // this.datetime = hour + ':' + minute + ':' + secound

  // 获取日期:年月日
  const year = date.getFullYear();
  const month = date.getMonth() + 1;
  const day = date.getDate();
  // this.nowDate = month + "月" + day + "日"
  // this.nowYear = year + "年"

  // 获取星期几
  const weeks = new Array(
    "星期日",
    "星期一",
    "星期二",
    "星期三",
    "星期四",
    "星期五",
    "星期六"
  );
  // weeks[new Date().getDay()];
  return (
    year +
    "年" +
    month +
    "月" +
    day +
    "日 " +
    hour +
    ":" +
    minute +
    ":" +
    secound +
    " " +
    weeks[new Date().getDay()]
  );
}

async function getParams() {
  const token = await getToken();
  const QingHua = await getQingHua();
  // const tiangou = await getTianGou();
  const wangyyun = await getWangYiYun();
  const birthday = getDaysToBirthday(7, 28); // 填入生日(公历)
  const nowTime = getDays();
  const jiNianDay = getJiNianDays("2020-08-25"); // 按照格式填入 年-月-日

  params = {
    // touser: '', // 用户openid 3 就是扫码关注的那个微信号
    template_id: "", // 模板id 4 就是那个测试模板的ID
    // url: 'http://www.baidu.com',
    topcolor: "#FF0000",
    data: {
      date: {
        value: nowTime,
        color: "#FCA60B",
      },
      QingHua: {
        value: QingHua,
        color: "#ff1a75",
      },
      Birthday: {
        value: birthday,
        color: "#1E90FF",
      },
      jiNianDay: {
        value: jiNianDay,
        color: "#3399cc",
      },
      qinghua: {
        value: QingHua,
        color: "#33FF33",
      },
      // tiangou: {
      //     "value": tiangou,
      //     "color": "#007f80"
      // },
      wangyiyun: {
        value: wangyyun.content + "-- by " + wangyyun.user,
        color: "#2B9D4A",
      },
    },
  };
  // console.log('------------------------------------------')
  // console.log('打印消息: ',QingHua, '--', tiangou, '--', wangyyun, '--', birthday, '---', jiNianDay)
  // console.log('------------------------------------------')

  if (token) {
    // 单个openid,直接发送
    openId = ''; // 用户openid 3 就是扫码关注的那个微信号
    templateMessageSend(openId, token);

    // 获取批量openId,批量发送
    // axiosGet(
    //   `https://api.weixin.qq.com/cgi-bin/user/get?access_token=${token}&next_openid=${openId}`
    // ).then((res) => {
    //   const opemIdArr = res.data.data.openid;
    //   opemIdArr.forEach((element) => {
    //     openId = element;
    //     templateMessageSend(openId, token);
    //     // return openId;
    //   });
    // });
  }
}

// end定义发送消息模板
async function templateMessageSend(openId, token) {
  params = {
    ...params,
    touser: openId, // 用户openid 3 就是扫码关注的那个微信号
  };

  const url =
    "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" +
    token;

  let res = await axiosPost(url, params);
  console.log("res: ", res.data);
}
//  执行发送订阅消息
// templateMessageSend();

// 先装参再执行发送订阅消息
getParams();

7.运行;

npm install axios

npm install moment

node ./文件名

8.结果查看

如果有问题,多检查那4个参数;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-3-启动浏览器(详细教程)

软件测试微信群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 通过前边两篇文章跟随宏哥学习想必到这里已经将环境搭建好了&#xff0c;今天就在Java项目搭建环境中简单地实践一下&#xff1a; 启动两大浏览器。按市场份额来说&#xff0c…

[极客大挑战 2019]BuyFlag1

这个题目比较常规&#xff0c;算是我遇到的简单题&#xff0c;也是这段时间第一个独立解出的&#xff0c;有点小开心。 首先打开靶机&#xff0c;一个平平无奇的纳新页面&#xff0c;很容易找到 /pay.php 看一下pay.php 这里说了几个条件&#xff1a;需要100000000&#xff0c…

【iOS】copystrong原理+深浅拷贝+完全拷贝

Copy&Strong原理 Copy探究 在回答copy的各种问题前&#xff0c;我们需要先了解我们为什么要使用copy。 拷贝的目的 &#xff1a; 产生一个副本对象&#xff0c;跟源对象互不影响 修改了源对象&#xff0c;不会影响副本对象修改了副本对象&#xff0c;不会影响源对象 iOS…

量化方法怎么选?如何评估量化后的大模型LLM?

文章内容总结自&#xff1a;Evaluating Quantized Large Language Models&#xff08;https://arxiv.org/abs/2402.18158&#xff09; 如果想深入了解量化的基本概念和如何用代码实现请参考&#xff1a; Michael&#xff1a;用python代码深入浅出量化概念 &#xff08;https…

YOLOv10改进 | 注意力篇 | YOLOv10引入SpatialGroupEnhance注意力机制,并构建C2f_SGE

1. SGE介绍 1.1 摘要:卷积神经网络(CNN)通过收集语义子特征的层次和不同部分来生成复杂对象的特征表示。这些子特征通常可以以分组的形式分布在每层的特征向量中[43,32],代表各种语义实体。然而,这些子特征的激活通常在空间上受到相似模式和噪声背景的影响,从而导致错误…

虚拟机win server安装配置DNS服务器

准备工作 创建DNS服务器前将自己的网卡地址设置为静态IP&#xff0c;选择自己的网卡。因为本机作为DNS服务器所以将DNS服务器地址设为了自己的回环地址。 一、使用服务器管理安装 DNS 服务器 1、登录服务器后&#xff0c;服务器会默认启用“服务器管理”页面&#xff0c;选择…

提前批测开三面,已OC!

大家好&#xff0c;我是洋子 近期百度提前批已经开始有一段时间了&#xff0c;甚至已经有不少 25 届的同学 oc 了&#xff0c;这里分享一位已经顺利 oc 百度提前批测开岗位同学的三轮面试面经 整个三轮技术面试总体难度不高&#xff0c;但考察知识广度比较广&#xff0c;如果…

搭建 STM32 网关服务器的全流程:集成嵌入式 C++、TCP/IP 通信、Flash 存储及 JWT 认证(含代码示例)

引言 随着物联网&#xff08;IoT&#xff09;技术的快速发展&#xff0c;基于 STM32 的服务器&#xff08;类似网关&#xff09;在数据采集、设备控制等方面的应用越来越广泛。本文将介绍搭建一个基于 STM32 的服务器所需的技术栈&#xff0c;以及详细的搭建步骤和代码示例。 …

好的养宠空气净化器是智商税吗?好的养宠空气净化器用户体验

家里养了两只“超级掉毛怪”,家里的猫毛满天飞&#xff0c;衣服床餐具等到处都是&#xff01;感受一下40度高温的养猫人&#xff0c;给掉毛怪疏毛浮毛飘飘&#xff0c;逃不过的饮水机&#xff0c;各个角落&#xff0c;多猫拉臭传来的异味。 一、养猫需要解决的问题 掉毛&#…

Tsan-ThreadSanitizer之As if synchronized via sleep

最近在调试ffmpeg的时候&#xff0c;加入了tsan&#xff0c;结果出现了下面提示&#xff1a; 具体什么意思呢&#xff0c;找了很久找到了官方介绍&#xff1a; https://github.com/google/sanitizers/wiki/ThreadSanitizerReportFormat

大数据-61 Kafka 高级特性 消息消费02-主题与分区 自定义反序列化 拦截器 位移提交 位移管理 重平衡

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Git的一些简单使用

下列内容适用于git初学者&#xff0c;从创建本地git仓库到提交的一个基本过程1. 1.创建git仓库 在想创建git仓库的路径下打开git bash&#xff0c;输入以下命令行创建仓库&#xff08;一般来说&#xff0c;我觉得直接在code workspace得地方创建git仓库就可以了&#xff0c;这…

acme.sh生成https证书

前言 SSL 价格并不便宜, 本节介绍如何使用 acme.sh 生成免费的 SSL 证书 证书生成原理 CA && Let’s Encrypt 证书颁发机构&#xff08;CA&#xff0c;Certificate Authority&#xff09;是一个负责颁发数字证书的实体。数字证书用于在互联网上验证实体的身份&…

注册或购买的谷歌账号的辅助邮箱是否需要设置?有什么用?设置的要点是什么?

今天早上&#xff0c;有个朋友联系到GG账号服务&#xff0c;问我谷歌账号辅助邮箱怎么用。说实在的这个问题有点抽象&#xff0c;哈哈。 然后我详细了解了一下&#xff0c;原来是这样的&#xff1a; 他的谷歌账号提示异常&#xff08;这个时候账号肯定是被停用了的&#xff09…

【Linux应用编程】Day12线程

线程 与进程类似&#xff0c;线程是允许应用程序并发执行多个任务的一种机制&#xff0c;线程参与系统调度&#xff1b; 事实上&#xff0c;系统调度的最小单元是线程、而并非进程。 ⚫ 线程的基本概念&#xff0c;线程 VS 进程&#xff1b; ⚫ 线程标识&#xff1b; ⚫ 线…

电脑上有什么好用的记笔记软件吗?试试这3款笔记软件,功能丰富又实用

笔记软件千千万&#xff0c;日常使用方便最关键&#xff01;&#xff01; 推荐3个各有亮点的笔记软件&#xff0c;不止是记笔记这么简单&#xff1a; 1、FlowUs 推荐指数&#xff1a;☆☆☆☆☆ 关键词&#xff1a;文档笔记软件 下载链接>>flowus.cn FlowUs是一款在…

ADI - 通过5 V至24 V输入提供双极性、双向DC-DC流入和流出电流

大部分电子系统都依赖于正电压轨或负电压轨&#xff0c;但是有些应用要求单电压轨同时为正负电压轨。在这种情况下&#xff0c;正电源或负电源由同一端子提供&#xff0c;也就是说&#xff0c;电源的输出电压可以在整个电压范围内调节&#xff0c;并且可以平稳转换极性。例如&a…

【mars3d】实现线面内插值计算效果

面插值计算效果展示&#xff1a; &#xff08;离屏渲染方式&#xff09;面插值效果展示&#xff1a; 面内插值计算插点效果展示&#xff1a; 线插值效果展示&#xff1a; &#xff08;离屏渲染方式&#xff09;高密度线内插值计算效果展示&#xff1a; 相关代码&#xff1a; i…

docker二进制包部署(带arm版自动部署包)

文章目录 1.概述2.Docker二进制包下载3.安装脚本制作4.安装5.卸载6.注意事项7.分享一个arm版自动部署安装包8.懒人 X86 版安装包 1.概述 最近需要在Linux上部署docker&#xff0c;于是自己做了一个自动部署包。脚本的写法不区分X86或arm&#xff0c;通用的。 2.Docker二进制包…

网络安全和数据安全到底有什么区别?(非常详细)零基础入门到精通,收藏这一篇就够了

随着信息技术的迅猛发展&#xff0c;网络安全和数据安全已经成为当今社会不可忽视的重要议题。两者在保障信息系统安全、防范数据泄露和保障用户权益方面起着至关重要的作用。然而&#xff0c;尽管网络安全与数据安全在某些方面有着密切的联系&#xff0c;但它们在定义、目标和…