index.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. const express = require('express');
  2. const router = express.Router();
  3. const crypto = require('crypto');
  4. const fs = require('fs');
  5. router.all('/', (req, res, next) => {
  6. fs.promises
  7. .access('./.env')
  8. .then(() => {
  9. res.render('info', {
  10. message: '服务已在运行。',
  11. });
  12. // pushMessage(
  13. // req,
  14. // res,
  15. // `请注意,ip 地址为 ${req.ip} 的用户访问了你的消息通知服务,如果非你本人,则你的私有消息通知服务可能已被泄露,当前版本无法阻止其他用户通过本系统向你发送消息。`
  16. // );
  17. })
  18. .catch(() => {
  19. res.render('configure');
  20. });
  21. });
  22. router.post('/configure', (req, res, next) => {
  23. fs.promises
  24. .access('./.env')
  25. .then(() => {
  26. res.render('message', {
  27. message: '.env 文件已经存在,请手动删除该文件后重试!',
  28. });
  29. })
  30. .catch(() => {
  31. let content =
  32. `APP_ID=${req.body.APP_ID}\n` +
  33. `APP_SECRET=${req.body.APP_SECRET}\n` +
  34. `TOKEN=${req.body.TOKEN}\n` +
  35. `TEMPLATE_ID=${req.body.TEMPLATE_ID}\n` +
  36. `OPEN_ID=${req.body.OPEN_ID}`;
  37. fs.promises
  38. .writeFile('./.env', content, 'utf8')
  39. .then(() => {
  40. res.render('message', {
  41. message:
  42. '.env 文件写入成功,程序即将自动关闭以应用写入的新的环境变量,需要进程守护程序自动重启应用或者手动重启。',
  43. });
  44. process.exit();
  45. })
  46. .catch((e) => {
  47. res.render('info', {
  48. message: '在尝试写入 .env 文件时发生错误:' + e,
  49. });
  50. });
  51. });
  52. });
  53. router.all('/verify', (req, res, next) => {
  54. // 验证消息来自微信服务器:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html
  55. const { signature, timestamp, nonce, echostr } = req.query;
  56. const token = process.env.TOKEN;
  57. let tmp_array = [token, timestamp, nonce].sort();
  58. let tmp_string = tmp_array.join('');
  59. tmp_string = crypto.createHash('sha1').update(tmp_string).digest('hex');
  60. if (tmp_string === signature) {
  61. res.send(echostr);
  62. } else {
  63. res.send('verification failed');
  64. }
  65. });
  66. router.all('/push', (req, res, next) => {
  67. let content = req.query.content || req.body.content;
  68. pushMessage(req, res, content);
  69. });
  70. router.get('/favicon.ico', (req, res, next) => {
  71. res.sendStatus(404);
  72. });
  73. router.all('/:content', (req, res, next) => {
  74. let content = req.params.content;
  75. pushMessage(req, res, content);
  76. });
  77. module.exports = router;