[js] 顶栏显示天气

bba993775c74c166d044a831a19600f.jpg

分享一个使用高德 API 获取并在顶栏显示天气的 js。每 20 分钟自动从高德 API 拉取一次天气情况,手动点击顶栏天气,实时拉取一次天气情况。

感谢 carlreel 的帖子提供高德 API 的获取方法:通过 QueryView 插件和高德 API 获取天气信息 - 链滴

还要感谢 wilsons 大佬提供的顶栏显示天气的方法:[js] 思源左侧空白区域显示心灵毒鸡汤或倒计时和顶部显示天气 - 链滴

本 js 是在以上两个帖子的基础上,使用 AI 生成的,实现效果如上图。需要使用自己的高德 apikey 和城市代码 citycode。

(function() { // 配置参数(需要用户自行修改) const apiKey = '替换为自己从高德API申请的key'; const cityCode = '替换为自己搜索或问AI得到的自己的城市代码'; const refreshInterval = 20 * 60 * 1000; // 20分钟更新间隔 const showWeather = true; // 天气现象与Emoji映射表 const weatherEmoji = { '晴': '🌟', '雨': '🌧️', '雪': '❄️', '阴': '☁️', '云': '⛅', '雾': '🌫️', '霾': '😷', '雷': '⛈️', '风': '🌪️', '热': '🔥', '冷': '🥶' }; // 时间格式化函数 function formatAPIDateTime(apiDateTime) { const [datePart, timePart] = apiDateTime.split(' '); return `${timePart}`; } function formatLocalDateTime(date) { const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); return `${hours}:${minutes}:${seconds}`; } async function showTodayWeather() { // 清除所有历史天气元素 document.querySelectorAll('.today-weather').forEach(el => el.remove()); if (!showWeather) return; try { // 同时获取实时和预测天气数据 const [baseResponse, allResponse] = await Promise.all([ fetch(`https://restapi.amap.com/v3/weather/weatherInfo?key=${apiKey}&city=${cityCode}&extensions=base`), fetch(`https://restapi.amap.com/v3/weather/weatherInfo?key=${apiKey}&city=${cityCode}&extensions=all`) ]); if (!baseResponse.ok || !allResponse.ok) throw new Error("天气请求失败"); const baseData = await baseResponse.json(); const allData = await allResponse.json(); const weatherData = baseData.lives[0]; const forecastData = allData.forecasts[0]; // 智能匹配天气图标 const weatherIcon = Object.keys(weatherEmoji).find(key => weatherData.weather.includes(key) ) || '🌍'; // 处理预测温度显示 const forecastTips = forecastData.casts.map(cast => { const date = new Date(cast.date); const weekdays = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]; return `📅 ${date.getMonth()+1}/${date.getDate()} ${weekdays[date.getDay()]}:${cast.dayweather},${cast.nighttemp}°C ~ ${cast.daytemp}°C,${cast.daywind}风${cast.daypower}级`; }).join('\n'); await createWeatherElement(ellipsis => { // 构造主显示信息 const mainInfo = [ `|| ${weatherEmoji[weatherIcon]} ${weatherData.weather}`, `🌡${weatherData.temperature}°C`, `🍃${weatherData.windpower}级` ].join(' '); // 构造悬浮提示 const tooltip = [ `📍 ${weatherData.province}省${weatherData.city}`, `🧭 风向: ${weatherData.winddirection}风`, `💧 湿度: ${weatherData.humidity}%`, `🕒 高德更新: ${formatAPIDateTime(weatherData.reporttime)}`, `🕒 本地请求: ${formatLocalDateTime(new Date())}`, '\n天气预测:', forecastTips ].join('\n'); return { content: mainInfo, tooltip }; }); } catch (error) { console.error('天气获取失败:', error); await createWeatherElement(() => ({ content: '⚠️ 天气获取失败', tooltip: `错误信息:${error.message}\n最后尝试时间:${formatLocalDateTime(new Date())}` })); } } async function createWeatherElement(contentGenerator) { await whenElementExist('#toolbar .fn__ellipsis').then(ellipsis => { // 创建统一容器 const weatherDiv = document.createElement('div'); weatherDiv.className = 'today-weather'; weatherDiv.style.cssText = ` position: relative; margin-right: 15px; color: var(--b3-toolbar-color); font-size: 14px; cursor: pointer; `; // 生成内容 const { content, tooltip } = contentGenerator(ellipsis); // 创建内容容器 const contentDiv = document.createElement('div'); contentDiv.title = tooltip; contentDiv.style.display = 'flex'; contentDiv.style.alignItems = 'center'; contentDiv.style.gap = '5px'; contentDiv.style.whiteSpace = 'nowrap'; contentDiv.textContent = content; // 添加点击刷新功能 contentDiv.addEventListener('click', function() { this.style.whiteSpace = this.style.whiteSpace === 'nowrap' ? 'pre' : 'nowrap'; showTodayWeather(); }); weatherDiv.appendChild(contentDiv); ellipsis.before(weatherDiv); }); } function whenElementExist(selector) { return new Promise(resolve => { const check = () => { const el = document.querySelector(selector); el ? resolve(el) : requestAnimationFrame(check); }; check(); }); } // 初始化 showTodayWeather(); setInterval(showTodayWeather, refreshInterval); })();
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    26126 引用 • 108473 回帖
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    192 引用 • 1363 回帖
6 操作
wenbocn 在 2025-05-26 08:56:24 更新了该帖
wenbocn 在 2025-05-26 08:51:24 更新了该帖
wenbocn 在 2025-05-19 09:54:32 更新了该帖
wenbocn 在 2025-05-19 09:44:21 更新了该帖 wenbocn 在 2025-05-18 23:06:16 更新了该帖 wenbocn 在 2025-05-18 22:59:11 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
请输入回帖内容 ...

推荐标签 标签

  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖 • 2 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 155 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 111 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    439 引用 • 1238 回帖 • 589 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 87 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖
  • Visio
    1 引用 • 2 回帖
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    947 引用 • 1460 回帖 • 1 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 122 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖
  • sts
    2 引用 • 2 回帖 • 241 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖 • 2 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 1 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 350 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 81 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    108 引用 • 153 回帖 • 1 关注
  • danl
    176 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 494 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 241 关注
  • Follow
    4 引用 • 12 回帖 • 4 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 109 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    118 引用 • 54 回帖 • 2 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 562 关注