『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 553|回复: 24

[基础教程] 在Linux中搭建lunar(农历)API服务器

[复制链接]

7

主题

134

帖子

967

积分

高级会员

Rank: 4

积分
967
金钱
833
HASS币
0
发表于 2024-4-8 16:31:16 | 显示全部楼层 |阅读模式
前言:

用于调用“农历”的API提供商,或因“跑路”,或因“收费”,或因“次数限制”等各种问题,使获取农历信息不太稳定。


所以几经考虑,搭建(农历)本地离线库。


个人使用环境:


         平台:PVE (LXC)
         系统:Debian12
         软件:node.js
      离线库:lunar-JavaScript       {lunar (6tail.cn)}
         接入:node-red


注意:

因网络原因,安装较慢,耐心等待。
API服务器可用于内网获取,也可用于公网环境获取{(无验证措施)不建议 }。

过程:

使用root账户登录


修改Debian源为国内源   debian | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

更新软件包
apt update
使用NVM(Node Version Manager)来安装Node.js

必要依赖安装
apt install curl git sudo
安装必要依赖.png

安装NVM
<span style="color: rgba(0, 0, 0, 0.8); font-family: SFMono-Regular, Menlo, Monaco, Consolas, &quot;Liberation Mono&quot;, &quot;Courier New&quot;, monospace; font-size: 13.6px; background-color: rgb(247, 247, 249);">bash -c "$(curl -fsSL https://gitee.com/RubyMetric/nvm-cn/raw/main/install.sh)"</span>
安装完成后重新启动终端
安装NVM.png

使用NVM 安装 Node.js  npm
<span style="color: rgba(0, 0, 0, 0.85); font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, &quot;Noto Sans&quot;, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;; white-space: pre; background-color: rgb(255, 255, 255);">nvm install --lts</span>
安装node.js.png

安装lunar-javascript
npm init -y
npm install lunar-javascript


新建test.js脚本     
nano /root/test.js


粘贴下方代码,按Ctrl键+X,按Y保存。
const http = require('http');
const lunar = require('lunar-javascript');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'application/json; charset=utf-8' });

  const lunarDate = lunar.Lunar.fromDate(new Date());
  
  const eightCharString = lunarDate.getEightChar().toString();

  const responseData = {
    Lunar: {
      LYear: lunarDate.getMonthShengXiaoExact(),
      LMonth: lunarDate.getMonthInChinese(),
      LDay: lunarDate.getDayInChinese(),
      TimeInGanZhi: lunarDate.getTimeInGanZhi(),
      Week: lunarDate.getWeekInChinese(),
      LJie: lunarDate.getOtherFestivals(),
      TianGanYear: lunarDate.getYearInGanZhiExact(),
      TianGanMonth: lunarDate.getMonthInGanZhiExact(),
      TianGanDay: lunarDate.getDayInGanZhiExact(),
      DayLu: lunarDate.getDayLu(),
      JieQi: lunarDate.getPrevJieQi(true),
          Xiu: lunarDate.getXiu(),
          Animal: lunarDate.getAnimal(),
          XinLuck: lunarDate.getXiuLuck(),
          Zheng: lunarDate.getZheng(),
          Gong: lunarDate.getGong(),
      PengZuGan: lunarDate.getPengZuGan(),
      PengZuZhi: lunarDate.getPengZuZhi(),
      XiShen: lunarDate.getDayPositionXi() + ' = ' + lunarDate.getDayPositionXiDesc(),
      YangGui: lunarDate.getDayPositionYangGui() + ' = ' + lunarDate.getDayPositionYangGuiDesc(),
      YinGui: lunarDate.getDayPositionYinGui() + ' = ' + lunarDate.getDayPositionYinGuiDesc(),
      FUShen: lunarDate.getDayPositionFu() + ' = ' + lunarDate.getDayPositionFuDesc(),
      CaiShen: lunarDate.getDayPositionCai() + ' = ' + lunarDate.getDayPositionCaiDesc(),
      TaiShen: lunarDate.getDayPositionTai(),
      ChongSha: lunarDate.getDayChongDesc() + ' ' + lunarDate.getDaySha(),
      WinXingNaYear: lunarDate.getYearNaYin(),
      WuxingNaMonth: lunarDate.getMonthNaYin(),
      WuxingNaDay: lunarDate.getDayNaYin(),
      WuXingZhiXing: lunarDate.getDayNaYin() + ' ' + lunarDate.getZhiXing(),
      BaZi: eightCharString,
      Yi: lunarDate.getDayYi(),
      Ji: lunarDate.getDayJi(),
      JiShen: lunarDate.getDayJiShen(),
      XiongShen: lunarDate.getDayXiongSha(),
      YueXiang: lunarDate.getYueXiang(),
    }
  };

  const jsonResponse = JSON.stringify(responseData);
  
  res.end(jsonResponse);
});

const port = 3000;
server.listen(port, () => {
  console.log(`Server is running at http://localhost:${port}/`);
});


创建开机启动
新建my-nodejs-service.service
nano /etc/systemd/system/my-nodejs-service.service
在文件中添加以下内容
注意:需要更改ExecStart= 的node安装路径和test.js脚本路径
粘贴下方代码,按Ctrl键+X,按Y保存。
[Unit]
Description=My Node.js Service
After=network.target

[Service]
ExecStart=/usr/bin/node /root/test.js
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=nodejs-example

[Install]
WantedBy=multi-user.target

查找node.js路径
which node
启用和启动服务
systemctl enable my-nodejs-service
systemctl start my-nodejs-service
检查服务状态
systemctl status my-nodejs-service


验证  
使用浏览器打开 http://localhost:3000/       将localhost 替换为主机IP地址

{
    "Lunar": {
        "LYear": "龙",
        "LMonth": "二",
        "LDay": "三十",
        "TimeInGanZhi": "甲辰",
        "Week": "一",
        "LJie": [],
        "TianGanYear": "甲辰",
        "TianGanMonth": "戊辰",
        "TianGanDay": "壬寅",
        "DayLu": "亥命互禄 甲命进禄",
        "JieQi": {
            "_p": {
                "name": "清明",
                "solar": {
                    "_p": {
                        "year": 2024,
                        "month": 4,
                        "day": 4,
                        "hour": 15,
                        "minute": 2,
                        "second": 15
                    }
                },
                "jie": true,
                "qi": false
            }
        },
        "Xiu": "心",
        "Animal": "狐",
        "XinLuck": "凶",
        "Zheng": "月",
        "Gong": "东",
        "PengZuGan": "壬不泱水更难提防",
        "PengZuZhi": "寅不祭祀神鬼不尝",
        "XiShen": "离 = 正南",
        "YangGui": "震 = 正东",
        "YinGui": "巽 = 东南",
        "FUShen": "巽 = 东南",
        "CaiShen": "离 = 正南",
        "TaiShen": "仓库炉 房内南",
        "ChongSha": "(丙申)猴 北",
        "WinXingNaYear": "覆灯火",
        "WuxingNaMonth": "大林木",
        "WuxingNaDay": "金箔金",
        "WuXingZhiXing": "金箔金 开",
        "BaZi": "甲辰 戊辰 壬寅 甲辰",
        "Yi": [
            "嫁娶",
            "开光",
            "出行",
            "出火",
            "拆卸",
            "进人口",
            "开市",
            "立券",
            "交易",
            "挂匾",
            "入宅",
            "移徙",
            "安床",
            "栽种"
        ],
        "Ji": [
            "祈福",
            "入殓",
            "祭祀",
            "作灶",
            "安葬",
            "探病"
        ],
        "JiShen": [
            "王日",
            "五富",
            "普护",
            "五合",
            "青龙",
            "鸣吠对"
        ],
        "XiongShen": [
            "游祸",
            "血支",
            "归忌"
        ],
        "YueXiang": "晦"
    }
}


test.rar

830 Bytes, 下载次数: 1

test.js

评分

参与人数 3金钱 +40 收起 理由
DDDear + 10 感谢楼主分享!node-red中完美部署..
dscao + 20 感谢楼主分享!node-red中完美部署.
book123 + 10 高手,这是高手!

查看全部评分

回复

使用道具 举报

12

主题

417

帖子

2288

积分

金牌会员

HomeAssistant

Rank: 6Rank: 6

积分
2288
金钱
1866
HASS币
20
发表于 2024-4-9 08:31:30 | 显示全部楼层
感谢楼主分享,试了下NR的function可以实现
[{"id":"4a78b42b10349264","type":"tab","label":"流程 1","disabled":false,"info":"","env":[]},{"id":"70ae69524990ab10","type":"function","z":"4a78b42b10349264","name":"function 4","func":"const lunarDate = lunar.Lunar.fromDate(new Date());\n\nconst eightCharString = lunarDate.getEightChar().toString();\n\nconst responseData = {\n    Lunar: {\n        LYear: lunarDate.getMonthShengXiaoExact(),\n        LMonth: lunarDate.getMonthInChinese(),\n        LDay: lunarDate.getDayInChinese(),\n        TimeInGanZhi: lunarDate.getTimeInGanZhi(),\n        Week: lunarDate.getWeekInChinese(),\n        LJie: lunarDate.getOtherFestivals(),\n        TianGanYear: lunarDate.getYearInGanZhiExact(),\n        TianGanMonth: lunarDate.getMonthInGanZhiExact(),\n        TianGanDay: lunarDate.getDayInGanZhiExact(),\n        DayLu: lunarDate.getDayLu(),\n        JieQi: lunarDate.getPrevJieQi(true),\n        Xiu: lunarDate.getXiu(),\n        Animal: lunarDate.getAnimal(),\n        XinLuck: lunarDate.getXiuLuck(),\n        Zheng: lunarDate.getZheng(),\n        Gong: lunarDate.getGong(),\n        PengZuGan: lunarDate.getPengZuGan(),\n        PengZuZhi: lunarDate.getPengZuZhi(),\n        XiShen: lunarDate.getDayPositionXi() + ' = ' + lunarDate.getDayPositionXiDesc(),\n        YangGui: lunarDate.getDayPositionYangGui() + ' = ' + lunarDate.getDayPositionYangGuiDesc(),\n        YinGui: lunarDate.getDayPositionYinGui() + ' = ' + lunarDate.getDayPositionYinGuiDesc(),\n        FUShen: lunarDate.getDayPositionFu() + ' = ' + lunarDate.getDayPositionFuDesc(),\n        CaiShen: lunarDate.getDayPositionCai() + ' = ' + lunarDate.getDayPositionCaiDesc(),\n        TaiShen: lunarDate.getDayPositionTai(),\n        ChongSha: lunarDate.getDayChongDesc() + ' ' + lunarDate.getDaySha(),\n        WinXingNaYear: lunarDate.getYearNaYin(),\n        WuxingNaMonth: lunarDate.getMonthNaYin(),\n        WuxingNaDay: lunarDate.getDayNaYin(),\n        WuXingZhiXing: lunarDate.getDayNaYin() + ' ' + lunarDate.getZhiXing(),\n        BaZi: eightCharString,\n        Yi: lunarDate.getDayYi(),\n        Ji: lunarDate.getDayJi(),\n        JiShen: lunarDate.getDayJiShen(),\n        XiongShen: lunarDate.getDayXiongSha(),\n        YueXiang: lunarDate.getYueXiang(),\n    }\n};\nmsg.payload = responseData;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[{"var":"lunar","module":"lunar-javascript"}],"x":620,"y":280,"wires":[["1b8965e5394db4e0"]]},{"id":"728e1bca1d88064a","type":"inject","z":"4a78b42b10349264","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":450,"y":280,"wires":[["70ae69524990ab10"]]},{"id":"1b8965e5394db4e0","type":"debug","z":"4a78b42b10349264","name":"debug 30","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":780,"y":280,"wires":[]}]

评分

参与人数 1金钱 +8 收起 理由
hhh. + 8 高手,这是高手!

查看全部评分

回复

使用道具 举报

7

主题

1072

帖子

3361

积分

论坛元老

Rank: 8Rank: 8

积分
3361
金钱
2289
HASS币
0
发表于 2024-4-8 16:50:20 | 显示全部楼层
大佬,能否搞个docker版的?
回复

使用道具 举报

11

主题

359

帖子

1900

积分

金牌会员

Rank: 6Rank: 6

积分
1900
金钱
1541
HASS币
0
发表于 2024-4-8 16:55:14 | 显示全部楼层
有农历插件呀,和工作日休息日一起的,自动化设置闹钟爽的很
回复

使用道具 举报

4

主题

254

帖子

2393

积分

金牌会员

Rank: 6Rank: 6

积分
2393
金钱
2139
HASS币
0
发表于 2024-4-8 17:01:15 | 显示全部楼层
jjss520 发表于 2024-4-8 16:55
有农历插件呀,和工作日休息日一起的,自动化设置闹钟爽的很

自动化啥闹钟??Android的?
回复

使用道具 举报

21

主题

554

帖子

2344

积分

金牌会员

Rank: 6Rank: 6

积分
2344
金钱
1790
HASS币
0
发表于 2024-4-8 17:13:58 | 显示全部楼层
果然,,一入HA之后,,,,感觉自己的快成半个IT界的人了,,,,,,,,,,
不得搞个万能服务器在家跑着都对不起HA,什么都本地架起来跑。
回复

使用道具 举报

21

主题

554

帖子

2344

积分

金牌会员

Rank: 6Rank: 6

积分
2344
金钱
1790
HASS币
0
发表于 2024-4-8 17:15:19 | 显示全部楼层
jjss520 发表于 2024-4-8 16:55
有农历插件呀,和工作日休息日一起的,自动化设置闹钟爽的很

那个不是本土化的吧,,应该没有农历数据中其余的信息,比如今天适不适合行,房什么的
回复

使用道具 举报

7

主题

1072

帖子

3361

积分

论坛元老

Rank: 8Rank: 8

积分
3361
金钱
2289
HASS币
0
发表于 2024-4-8 18:21:47 | 显示全部楼层
a_dongde 发表于 2024-4-8 17:15
那个不是本土化的吧,,应该没有农历数据中其余的信息,比如今天适不适合行,房什么的 ...

行房还要看黄历嘛?哪个黄历还讲宜不宜行房?
回复

使用道具 举报

41

主题

1299

帖子

5342

积分

论坛元老

Rank: 8Rank: 8

积分
5342
金钱
4038
HASS币
20
发表于 2024-4-8 19:30:04 | 显示全部楼层
如果是nodejs,那么nodered干这个很合适,下载npm包,在nr的函数里面调用就行了
折腾精神永存,感恩感谢论坛每一位愿意分享和帮助过我的大佬,论坛有你更精彩
回复

使用道具 举报

7

主题

134

帖子

967

积分

高级会员

Rank: 4

积分
967
金钱
833
HASS币
0
 楼主| 发表于 2024-4-8 19:36:33 | 显示全部楼层
jjcs 发表于 2024-4-8 19:30
如果是nodejs,那么nodered干这个很合适,下载npm包,在nr的函数里面调用就行了 ...

我使用的是加载项node-red,不好加载离线库,斟酌利弊,最终觉得搭建API服务器比较好。
回复

使用道具 举报

41

主题

1299

帖子

5342

积分

论坛元老

Rank: 8Rank: 8

积分
5342
金钱
4038
HASS币
20
发表于 2024-4-8 19:46:33 | 显示全部楼层
hhh. 发表于 2024-4-8 19:36
我使用的是加载项node-red,不好加载离线库,斟酌利弊,最终觉得搭建API服务器比较好。 ...

可以的,要进入nr容器内部,cd到nr的包文件夹,下载就行了,然后用专门的节点unsafe-function,引用就行了,我之前用的坐标偏移npm就是加载项的,望大佬出一个nr版本
折腾精神永存,感恩感谢论坛每一位愿意分享和帮助过我的大佬,论坛有你更精彩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-5-2 15:28 , Processed in 0.274218 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表