Shelly Plus 1 PM脚本开启带身份验证的Shelly 1失败求助
解决Shelly脚本中HTTP身份验证失效的问题
问题背景
我用Shelly Plus 1 PM运行脚本,需要在特定时段将另一台带用户名密码保护的Shelly 1开启10秒。未设置身份验证时,以下脚本可正常运行:
function turnOn() { Shelly.call("http.get", {url: 'http://' + Config.ip + '/relay/0?turn=on&timer=' + JSON.stringify(Config.duration * 60)}); }
添加身份验证后脚本失效,尝试在URL中嵌入用户名密码的写法,但Shelly 1无反应;但用Postman发送完全相同的请求(http://USERNAME:PASSWORD@IP/relay/0?turn=on&timer=10)却能正常生效。
解决方案
Shelly的http.get调用可能无法自动解析URL中的user:pass@格式身份验证信息,Postman会自动将其转换为标准的Authorization请求头,我们可以手动构造这个请求头来解决问题:
方法1:手动添加Basic Auth请求头
function turnOn() { // 将用户名和密码拼接后转成Base64编码 var authToken = btoa(Config.username + ':' + Config.password); Shelly.call("http.get", { url: 'http://' + Config.ip + '/relay/0?turn=on&timer=' + JSON.stringify(Config.duration * 60), headers: { "Authorization": "Basic " + authToken } }); }
补充提示
如果你的用户名或密码包含特殊字符(比如@、:、/等),建议先对其进行URL编码,避免拼接时出错:
function turnOn() { var encodedUser = encodeURIComponent(Config.username); var encodedPass = encodeURIComponent(Config.password); var authToken = btoa(encodedUser + ':' + encodedPass); Shelly.call("http.get", { url: 'http://' + Config.ip + '/relay/0?turn=on&timer=' + JSON.stringify(Config.duration * 60), headers: { "Authorization": "Basic " + authToken } }); }
内容的提问来源于stack exchange,提问作者n11f
相关产品推荐
相关产品推荐

