开发天气情况采集程序

开发天气情况采集程序

天气情况采集程序

每天都要记录时间日志,从最初的九宫格到目前的 UniLog ,已经经历了好多个版本。其中天气的情况记录十分有用,但是获取天气的信息是个比较麻烦的事情,作为一个 IT 工作者,怎能被这种问题所耽搁?

背景

每天都要记录时间日志,从最初的九宫格到目前的 UniLog ,已经经历了好多个版本。

九宫格中的天气情况我觉得很有用,有时候都可以借此回顾当天的具体情形。

这样的好天气,怎么能没有你?

——韦礼安《好天气》

自然,在 UniLog 中,也继承了天气的填写,信息更全:

⛅,26 ~ 32℃,🌪东北风3-4级,💧97%,🌱32

是不是看起来很不错?

但是处理很费时间,打开网页或手机,到处找这些信息……

一个搞 IT 的怎么能让这种问题难倒?

需求

写个脚本什么的,一键复制就好了。

分析

数据源

自然是天气预报了,仔细看了下,墨迹天气会比较好些。具体用网页还是API呢?默认API,为什么我就不说了,感觉API会比较稳定些。

阿里云市场中有墨迹的API提供,使用免费版本即可:

https://market.aliyun.com/products/57096001/cmapi023656.html

对应接口主要有:

  • 精简预报3天;全天预报,比较稳定,但是没有湿度和AQI信息;
  • 精简预报实况:实时信息;
  • 精简AQI:只有空气质量信息;

从不同的API取对应的信息即可,好烦……☹️

数据处理

获取了数据,就很好办了:

  1. 处理原始文本,替换图标或者增加图标;
  2. 拼接成最终结果;

其他

有几个额外的需求:

  1. 没空看结果如何,所以最好语音提示,用say命令就好了;
  2. 保存到剪贴板中;
  3. 不要给我弹出对话框:那就用Automator来生成app就好了。

解决方案

代码放在了Github中:getWeather

将下述内容保存为`getMojiWeather.py'

#!/bin/env python
# -*- coding=utf-8 -*-

__author__ = u'Rex Kang'
__description__ = u'根据需求,调用墨迹API生成一句话简介。'
__license__ = u'GPL - http://www.fsf.org/licenses/gpl.txt';
__history__ = {
    u'1.0': [u'2017/05/19', u'调用墨迹API,完成基本功能'],
    u'1.1': [u'2017/06/08', u'调用墨迹API,完成基本功能']
}
import urllib, urllib2, sys, json


def mojiAPI(apiDict, cityID, appCode):
    method = 'POST'
    querys = ''
    bodys = {}
    url = apiDict['host'] + apiDict['path']

    # CityID来自于https://github.com/IceblueSakura/GetWeather/blob/master/Cityid.xml
    bodys['cityId'] = cityID
    bodys['token'] = apiDict['token']
    post_data = urllib.urlencode(bodys)
    request = urllib2.Request(url, post_data)
    request.add_header('Authorization', 'APPCODE ' + appCode)
    # 根据API的要求,定义相对应的Content-Type
    request.add_header('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')
    response = urllib2.urlopen(request)
    content = response.read()
    if (content):
        contentDict = {}
        try:
            contentDict = json.loads(content)
        except Exception, err:
            pass
        finally:
            return contentDict

def getCityID(city=u'海口市'):
    cities = {
        u'海口市': '1020',
        u'三亚市': '1022',
        u'乌鲁木齐市': '2505',
        u'西安市': '2182',
    }
    return cities.get(city, '海口市')

# v1.1 Modified Start
def getWetaherIcon(w=u'晴'):
    weatherIcon = {
        u'晴': u'☀️',
        u'阴': u'☁️',
        u'多云': u'⛅',
        u'阵雨': u'🌦',
        u'雨': u'🌧',
        u'中雨': u'⛈',
    }
    return weatherIcon.get(w, '🌤')

def getAOIIcon(aqi=40):
    icon = u'🌱'
    if int(aqi) > 150:
        icon = u'🍂'
    elif int(aqi) > 75:
        icon =  u'🍃'
    return icon
# v1.1 Modified end

def main():
    API = {
        'BriefForecast': {
            'name': u'精简预报3天',
            'host': 'http://freecityid.market.alicloudapi.com',
            'path': '/whapi/json/alicityweather/briefforecast3days',
            'token': '677282c2f1b3d718152c4e25ed434bc4'
        },
        'BriefCondition': {
            'name': u'精简预报实况',
            'host': 'http://freecityid.market.alicloudapi.com',
            'path': '/whapi/json/alicityweather/briefcondition',
            'token': '46e13b7aab9bb77ee3358c3b672a2ae4'
        },
        'AQI': {
            'name': u'精简AQI',
            'host': 'http://freecityid.market.alicloudapi.com',
            'path': '/whapi/json/alicityweather/briefaqi',
            'token': '4dc41ae4c14189b47b2dc00c85b9d124'
        }
    }

    city = u'YourCity'
    appCode = 'YourAppCode'
    resultOfCondition = mojiAPI(API['BriefCondition'], getCityID(city), appCode)
    resultOfForecast = mojiAPI(API['BriefForecast'], getCityID(city), appCode)
    resultOfAQI = mojiAPI(API['AQI'], getCityID(city), appCode)

    strList = ['']*8

    try:
        if resultOfCondition and 'data' in resultOfCondition:
            cond = resultOfCondition['data']['condition']
            strList[0] = getWetaherIcon(cond['condition']) # v1.1 Modified
            strList[5] = cond['humidity']

        if resultOfForecast and 'data' in resultOfForecast:
            fore = resultOfForecast['data']['forecast'][1]
            strList[1] = fore['tempNight']
            strList[2] = fore['tempDay']
            strList[3] = fore['windDirDay']
            strList[4] = fore['windLevelDay']

        if resultOfAQI and 'data' in resultOfAQI:
            strList[7] = resultOfAQI['data']['aqi']['value']
            strList[6] = getAOIIcon(strList[7]) # v1.1 Modified
    except Exception, err:
        print Exception,err
    finally:
        str = u'%s,%s ~ %s℃,%s%s级,湿度%s%%,%s%s' % tuple(strList)
        print str.encode('utf-8')

将下述内容在 Automator保存为getWeather.app

cd ScriptDir
python MojiWeatherFromAPI.py
[ $? -eq 0 ] && say 'Weather copied.' && exit
say 'Error occurred.' && exit 1

其他

CityID

CityID可以用下述方式获取,将海口换成对应的城市:

  1. 访问链接地址:http://tianqi.moji.com/api/citysearch/海口
  2. 第一个cityid就是了,海口为1020
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容