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

 找回密码
 立即注册
查看: 1458|回复: 8

[教程系列] 昆仑燃气接入Node-RED

[复制链接]

2

主题

11

帖子

143

积分

注册会员

Rank: 2

积分
143
金钱
132
HASS币
0
发表于 2024-4-4 09:43:04 | 显示全部楼层 |阅读模式
原理上如图所示:
流程图.png

应该所有昆仑燃气的都可以通过该方式实现
首先通过网站https://bol.grs.petrochina.com.cn/自行抓包,得到用户名和密码发送端的值
(非明文,其实不太懂,所以不知道是啥编码,应该挺简单的,欢迎知道是啥的朋友放上一个编码器,省掉抓包的步骤)
即可按此步骤使用此方式来实现

1、向https://bol.grs.petrochina.com.cn/api/v1/open/user/passwordLogin发送
{"mobile":"这里是你手机号","password":"这里是你的密码","captcha":"","captchaId":"img_captcha_a671eddd-3833-475f-a647-843ca6ca867b"}
这里通过注入来实现
首次http in中 post的头如图所示
第一次的头.png
2、通过函数处理响应,提取token,函数内部示例:
var token = msg.payload.data.token;
msg.token = token;
msg.payload = {"cid":5000000081,"terminalType":1};
return msg;
3、函数里已经写了第二次post中的json,第二次post是向https://bol.grs.petrochina.com.cn/api/v1/close/user/getUserCode发送
这次的头中应包括token,如图所示:
第二次头.png
4、再用一个函数来注入最后一次post的json,即可获得燃气数据的反馈,用户号在燃气的公众号等可以查到:
msg.payload = {"cid":5000000081,"userCodeId":这里是你的用户号};
return msg;
----请注意,2、4步骤中的cid是否各地不同我没有进行测试,如有不同,请自行抓包修改----
5、最后一次post是向https://bol.grs.petrochina.com.c ... echarge/getUserDebt发送
这次的头与第二次post一致,如此燃气数据则会反馈,可以自行通过函数得到你想要的数据
6、函数举例,例如想要得到燃气余额:
var responseJson = JSON.parse(msg.payload);
var remoteMeterBalance = responseJson.data.remoteMeterBalance;
msg.remoteMeterBalance = Number(remoteMeterBalance);
return msg;
因为第三次post时我设定返回为UTF-8字符串了,所以第一步改为了json,也可将返回直接设定为json对象,则函数的第一句改为var responseJson = msg.payload
如果需要其他数据,可以在第三次post后接一个debug,查看反馈的数据,其中还有更加丰富的内容,如充值记录等
7、现在你可以使用你得到的数据进行其他操作了,例如我设定了余额少于1元,通过小爱音箱发生提醒,我把这一段写在了最后一个函数中,所以事实上我的完整函数为:
var responseJson = JSON.parse(msg.payload);
var remoteMeterBalance = responseJson.data.remoteMeterBalance;
msg.remoteMeterBalance = Number(remoteMeterBalance);
if (msg.remoteMeterBalance < 1){
    msg.payload = "请注意燃气表余额已经不足,仅剩余" + msg.remoteMeterBalance.toFixed(2) + '元';
}else{
    msg.payload = "";
}
return msg;
通过msg.payload注入小爱tts来实现,这个想必各位比我熟练,就不班门弄斧了。

以上,敬谢阅读。








回复

使用道具 举报

17

主题

187

帖子

1781

积分

金牌会员

Rank: 6Rank: 6

积分
1781
金钱
1594
HASS币
0
发表于 2024-4-5 07:19:30 | 显示全部楼层
我家也是昆仑的,用抓包方式用了半年多了,不过每90天需要重新登录一次,程序不用改,就在网页端用手机验证码上登录一次就又可以用90天
回复

使用道具 举报

2

主题

11

帖子

143

积分

注册会员

Rank: 2

积分
143
金钱
132
HASS币
0
 楼主| 发表于 2024-4-6 23:50:41 | 显示全部楼层
csl0524 发表于 2024-4-5 07:19
我家也是昆仑的,用抓包方式用了半年多了,不过每90天需要重新登录一次,程序不用改,就在网页端用手机验证 ...

呃,我考虑的是第一次请求已经传递了用户名、密码,
每次查询应该都是一次重新登录,为啥还要每90天手动登录一次咧……
回复

使用道具 举报

17

主题

187

帖子

1781

积分

金牌会员

Rank: 6Rank: 6

积分
1781
金钱
1594
HASS币
0
发表于 2024-4-7 07:32:37 | 显示全部楼层
冷秋檀 发表于 2024-4-6 23:50
呃,我考虑的是第一次请求已经传递了用户名、密码,
每次查询应该都是一次重新登录,为啥还要每90天手动登 ...

这个也不清楚,我的方法和你一样的,你可以到时候观察一下
回复

使用道具 举报

2

主题

11

帖子

143

积分

注册会员

Rank: 2

积分
143
金钱
132
HASS币
0
 楼主| 发表于 2024-4-7 08:17:48 | 显示全部楼层
csl0524 发表于 2024-4-7 07:32
这个也不清楚,我的方法和你一样的,你可以到时候观察一下

ヽ( ̄▽ ̄)و好的
回复

使用道具 举报

0

主题

54

帖子

216

积分

中级会员

Rank: 3Rank: 3

积分
216
金钱
162
HASS币
0
发表于 2024-4-7 09:40:34 | 显示全部楼层
感谢分享
回复

使用道具 举报

6

主题

186

帖子

1230

积分

金牌会员

Rank: 6Rank: 6

积分
1230
金钱
1044
HASS币
0
发表于 2024-5-10 21:09:26 | 显示全部楼层
求流.......
回复

使用道具 举报

2

主题

11

帖子

143

积分

注册会员

Rank: 2

积分
143
金钱
132
HASS币
0
 楼主| 发表于 2024-6-18 08:29:49 | 显示全部楼层
后面得到的数据怎么处理自己搞一下
把里面写了“你的……”的部分改成自己的


[
    {
        "id": "60a3e8a3dfaa4bd2",
        "type": "http request",
        "z": "f6f2187d.f17ca8",
        "name": "与天然气服务器连接",
        "method": "POST",
        "ret": "obj",
        "paytoqs": "ignore",
        "url": "https://bol.grs.petrochina.com.cn/api/v1/open/user/passwordLogin",
        "tls": "",
        "persist": false,
        "proxy": "",
        "insecureHTTPParser": false,
        "authType": "",
        "senderr": false,
        "headers": [
            {
                "keyType": "Content-Type",
                "keyValue": "",
                "valueType": "other",
                "valueValue": "application/json;charset=UTF-8"
            }
        ],
        "x": 320,
        "y": 360,
        "wires": [
            [
                "4aae056f50fbbbe9"
            ]
        ]
    },
    {
        "id": "170e788526a0dc82",
        "type": "inject",
        "z": "f6f2187d.f17ca8",
        "name": "",
        "props": [
            {
                "p": "payload"
            }
        ],
        "repeat": "",
        "crontab": "0 10-16 * * *",
        "once": false,
        "onceDelay": "5",
        "topic": "",
        "payload": "{\"mobile\":\"这里是你的手机号\",\"password\":\"这里是你的密码\",\"captcha\":\"\",\"captchaId\":\"img_captcha_a671eddd-3833-475f-a647-843ca6ca867b\"}",
        "payloadType": "json",
        "x": 130,
        "y": 360,
        "wires": [
            [
                "60a3e8a3dfaa4bd2"
            ]
        ]
    },
    {
        "id": "df57ca02eb7a2cd9",
        "type": "http request",
        "z": "f6f2187d.f17ca8",
        "name": "向天然气服务器请求响应",
        "method": "POST",
        "ret": "txt",
        "paytoqs": "ignore",
        "url": "https://bol.grs.petrochina.com.cn/api/v1/close/recharge/getUserDebt",
        "tls": "",
        "persist": false,
        "proxy": "",
        "insecureHTTPParser": false,
        "authType": "",
        "senderr": false,
        "headers": [
            {
                "keyType": "Content-Type",
                "keyValue": "",
                "valueType": "other",
                "valueValue": "application/json;charset=UTF-8"
            },
            {
                "keyType": "other",
                "keyValue": "token",
                "valueType": "msg",
                "valueValue": "token"
            }
        ],
        "x": 410,
        "y": 440,
        "wires": [
            [
                "3e3a335c9f2d81b5"
            ]
        ]
    },
    {
        "id": "4aae056f50fbbbe9",
        "type": "function",
        "z": "f6f2187d.f17ca8",
        "name": "处理响应",
        "func": "var token = msg.payload.data.token;\nvar refreshToken = msg.payload.data.refreshToken;\nmsg.token = token;\nmsg.refreshToken = refreshToken;\nmsg.payload = {\"cid\":5000000081,\"terminalType\":1};\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 520,
        "y": 360,
        "wires": [
            [
                "1a851fda782bc939"
            ]
        ]
    },
    {
        "id": "1a851fda782bc939",
        "type": "http request",
        "z": "f6f2187d.f17ca8",
        "name": "",
        "method": "POST",
        "ret": "txt",
        "paytoqs": "ignore",
        "url": "https://bol.grs.petrochina.com.cn/api/v1/close/user/getUserCode",
        "tls": "",
        "persist": false,
        "proxy": "",
        "insecureHTTPParser": false,
        "authType": "",
        "senderr": false,
        "headers": [
            {
                "keyType": "Content-Type",
                "keyValue": "",
                "valueType": "other",
                "valueValue": "application/json;charset=UTF-8"
            },
            {
                "keyType": "other",
                "keyValue": "token",
                "valueType": "msg",
                "valueValue": "token"
            }
        ],
        "x": 680,
        "y": 360,
        "wires": [
            [
                "6ea857fbf60c856a"
            ]
        ]
    },
    {
        "id": "6ea857fbf60c856a",
        "type": "function",
        "z": "f6f2187d.f17ca8",
        "name": "再次处理响应",
        "func": "msg.payload = {\"cid\":5000000081,\"userCodeId\":这里换成你的用户号};\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 160,
        "y": 440,
        "wires": [
            [
                "df57ca02eb7a2cd9"
            ]
        ]
    },
    {
        "id": "3e3a335c9f2d81b5",
        "type": "function",
        "z": "f6f2187d.f17ca8",
        "name": "从响应中获取燃气表余额",
        "func": "var responseJson = JSON.parse(msg.payload);\nvar remoteMeterBalance = responseJson.data.remoteMeterBalance;\nmsg.remoteMeterBalance = Number(remoteMeterBalance);\nif (msg.remoteMeterBalance < 2){\n    msg.payload = \"请注意燃气表余额已经不足,仅剩余\" + msg.remoteMeterBalance.toFixed(2) + '元';\n    msg.testflag = \"flag\";\n}else{\n    msg.payload = \"\";\n    msg.testflag = msg.payload;\n}\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 690,
        "y": 440,
        "wires": [
            [
                "27bddf0a344e92b5",
                "0e4f7fa418b86672",
                "fa499e6bdae09d9d"
            ]
        ]
    }
]
回复

使用道具 举报

1

主题

41

帖子

1000

积分

金牌会员

Rank: 6Rank: 6

积分
1000
金钱
959
HASS币
0
发表于 2024-10-25 19:08:04 | 显示全部楼层
其实大可不必这么麻烦
直接抓包支付宝里面昆仑燃气缴费接口,直接一个post请求结束
https://bol.grs.petrochina.com.cn/api/v1/open/recharge/getUserDebtByUserCode

入参是:
{
    "cid": xxx,
    "userCode": "xxxx",
    "terminalType": 4
}
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-21 20:23 , Processed in 2.168962 second(s), 33 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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