早上出门前,你是不是也习惯刷一下手机看天气?但总忘记开APP,或者被一堆推送淹没了关键信息。其实,用Scala写个轻量级天气提醒小工具,三四十行代码就能搞定,还能跑在树莓派上自动发微信通知——这可不是程序员的玩具,是能塞进日常生活的实用小物。
它干啥用?
每天早上7:30,自动查本地天气,如果预报有雨,就往你微信发一条消息:“今天带伞,出门别湿鞋”。不依赖大平台、不传隐私数据,所有逻辑自己掌控,连家里老人设好一次,就能用半年。
怎么搭起来?
用Scala + Akka HTTP调用免费天气API(比如OpenWeather),再配个轻量定时器。核心逻辑就几块:
import scala.concurrent.Future
import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
def fetchWeather(city: String): Future[String] = {
val url = s"https://api.openweathermap.org/data/2.5/weather?q=$city&appid=your_key&units=metric"
Http().singleRequest(HttpRequest(uri = url)).flatMap { res =>
res.entity.toStrict(3.seconds).map(_.data.utf8String)
}
}拿到JSON后,用Scala原生的ujson或play-json解析,抽“rain”字段或“weather[0].main”判断是否下雨。再用企业微信机器人接口发通知——整个流程串下来,不到200行,编译成jar,扔进Linux定时任务里,每天准时开工。
为什么选Scala?
不是为了炫技。它写异步请求清爽利落,Option处理空值不啰嗦,case class定义天气数据结构一目了然。比如解析温度和天气状态:
case class Weather(main: Main, weather: List[WeatherDesc])
case class Main(temp: Double)
case class WeatherDesc(main: String)
// 解析后直接 pattern match:
val temp = weather.main.temp.toInt
val isRainy = weather.weather.exists(_.main == "Rain")比用Python反复判None、用Java写一堆try-catch省心多了。而且JVM生态稳,一台老笔记本跑十年不卡顿。
真实场景里的小改动
邻居老张把这工具改了改:接入他家阳台的温湿度传感器(串口读数),再结合天气预报,自动控制窗台小风扇开关——下雨+闷热就启动除湿模式。他说:“原来以为编程离生活远,结果就是让窗帘动一动、伞提醒响一声的事。”
工具不在于多酷,而在于你愿不愿意为它调三次参数、改两行判断条件、最后把它放进抽屉最顺手的位置。