求助:关于templater模板代码在windows下可以运行正常,但是在移动端上就无法正确运行。

遇到的问题

obsidian 版本1.7.7
环境:windows系统;Android也是最新系统。
关于templater模板代码在windows下可以运行正常,但是在移动端Android上就无法正确运行。

预期的效果

希望能在Android系统中也能使用插件templater的模板获取天气信息。

<%*
// 定义默认天气信息
let 当前温度 = '当前温度:℃未获取'
let 天气 = '未获取'
let 温度范围 = '温度:~℃未获取'
let 湿度 = '未获取'
let 风力风向 = '未获取 风级'
let 紫外线 = '未获取'
let 空气质量 = '未获取'
let 日出日落 = '未获取'
let 日期 = '未获取'

try {
    let url = 'https://m.tianqi.com/beijing/'+ Date.now();//Android版网页

    let res = await request({url: url, method: "GET"})
	console.log("获取数据成功:", res)
    res = res.replace(/\n/g, '')
	
    // 使用安全的正则匹配方法
    let rqylnl = /<div class="date">(.*?)<\/div>/.exec(res)
    let dqwd = /<dd class="now">(.*?)<i>°C<\/i><\/dd>/.exec(res)
    let tqwdfw = /<dd class="txt">(.*?) (.*?)<\/dd>/.exec(res)
    let fxfl = /<span class="b3"><i><\/i>(.*?)<\/span>/.exec(res)
    let sidu = /<span class="b2"><i><\/i>湿度 (.*?)<\/span>/.exec(res)
    let kqzl = /<a href="\/air\/fengcheng\/" class="b1"><i><\/i>(.*?)<\/a>/.exec(res)
	
    // 安全赋值,避免空值报错
    if (rqylnl) 日期 =  rqylnl[1]
    if (dqwd) 当前温度 = dqwd[1] + '℃'
    if (tqwdfw) {
        天气 = tqwdfw[1]
        温度范围 = tqwdfw[2]
    }
    if (fxfl) 风力风向 = fxfl[1]
	if (sidu) 湿度 = sidu[1]
    if (kqzl) 空气质量 = kqzl[1]
    
    
} catch (error) {
    console.error('获取天气信息失败:', error)
    // 即使出错也会使用默认值继续执行
}
-%>

> [!info] 🌤️天气
> <% 日期 %>
> 天气⛅:<% 天气 %>
> 温度🌡️:<% 温度范围 %>
> 风力风向:<% 风力风向 %>
> 空气质量:<% 空气质量 %>
> 湿度:<% 湿度 %>
>当前温度: <% 当前温度 %>

已尝试的解决方案

我怀疑问题处在这行代码
let res = await request({url: url, method: “GET”})
变量res无法获得网页数据

在手机上运行结果
image

我这里在Win上也运行不了, 得如下修改:

let url = 'https://m.tianqi.com/prov/beijing/'+ Date.now();
改成
let url = 'https://m.tianqi.com/beijing/'+ Date.now();

才行

谢谢你的提醒, 是我上传代码时的笔误。测试代码地址就是https://m.tianqi.com/beijing/

哦, 没事, 现在 url 对了

我这里测试时在移动端返回了 403, 感觉是太像爬虫了… 需要加个 header 稍微装装样子:

const url = "https://m.tianqi.com/beijing/";
const headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
    "Referer": "https://m.tianqi.com/",
    "Accept-Language": "zh-CN,zh;q=0.9",
};

let res = await request({url: url, method: "GET", headers: headers})
// 这之后代码都一样, 只在这里加了个 header
...
...

之后我能从安卓版看到数据了, 如图

image

至于电脑版为啥不必 header 就能用? 这个不明白


PS. 我这个并不是测试的 Templeter (用的 RunJS), 但道理应该是差不多的,

PS2. 我看 Templeter 文档里有写 <% tp.web.request("https://xxxx") %>tp.web - Templater, 实在不行也可以试试

非常感谢你的指点,在手机端可以顺利的获取天气信息了,让手机端obsidian也有了效率。
对于JScript我是小白,这个header我虽然不太明白,但是我会借助AI沿着你给的方向深入学习一下。
还想请教你一下,你用什么插件在手机端obsidian测试代码的? 我当时无法在手机端测试代码,
移动端obsidian没有控制后台。

困扰我多天的问题,有缘被你拨云见日、春光乍现,真是非常感谢!
在这新春之际,送上我的祝福,祝您:新春快乐,万事如意。

1 个赞

别客气, 大家都是一块学习, header 跟 http 请求时需携带的信息有关, 这里就是为让脚本发的请求更像一个真实浏览器的行为

用什么插件在手机端obsidian测试代码?

我目前是用 zhouhua/obsidian-vconsole 会在仓库根目录生成一个 Log 文件

当然还是在电脑版调试这些更自由, 移动版 debug 属于没办法了, 临时用用 (相信大家基本都是这么做的)


谢谢楼主的祝福~ 相信以楼主的研究精神, 这些技术细节难不倒你, 大家春节快乐~