Keep It Simple.Stupid.

Don Fisher's Blog

每天5分钱,用python给关心的人发送天气信息和你的关怀

        起因:女朋友是个非常粗心大意的人,经常一变天就要感冒。自己又很忙,不能每次都提醒,于是乎就想写个python脚本,每天获取当日的天气信息,用短信的形式发给她。

        一、获取天气信息

       中国天气,天气API没啥限制,直接调用就可以。

                            QQ图片20171115123722

    先获取目标城市的ID,然后拼接到API地址上http://www.weather.com.cn/data/cityinfo/你的目标城市id.html

    用Python3 urllib.request模块抓取天气信息:

import urllib.request
import json

weather_city_code = '101290101'#目标城市id
weather_url = "http://www.weather.com.cn/data/cityinfo/%s.html" % weather_city_code

request = urllib.request.urlopen(weather_url)
rs = request.read().decode()
weatherinfo = json.loads(rs)['weatherinfo']

    得到如下天气信息:

{'city': '昆明', 'cityid': '101290101', 'temp1': '5℃', 'temp2': '18℃', 'weather': '晴', 'img1': 'n0.gif', 'img2': 'd0.gif', 'ptime': '18:00'}

    二、使用短信接口(用阿里云短信服务示例)

    1.找到短信服务,申请开通短信服务

    2.申请短信模板和短信签名

    QQ图片20171115160555


QQ图片20171115091531

                                                    QQ图片20171115092557

    审核通过后得到短信模板的ID。至此短信模板申请成功。

    注意:为了成功发送一条短信通知,您至少需要完成以下步骤

            在控制台完成短信签名与短信模板的申请,获得调用接口必备的参数

            在“短信签名”页面完成签名的申请,获得短信签名的字符串 签名申请手册

            在“短信模板”页面完成模板的申请,获得模板ID。模板申请手册

    三、构建代码

    由于阿里云短信接口只有python2.x的sdk,使用python3.x的小伙伴就很蛋疼了,怎么办呢?这里有python3版本的简单实现:

# ACCESS_KEY_ID/ACCESS_KEY_SECRET 根据实际申请的账号信息进行替换
ACCESS_KEY_ID = "你的阿里云app_id"

ACCESS_KEY_SECRET = "你的阿里云secret"


class AliYunSMS(object):
    def __init__(self):
        self.format = "JSON"
        self.version = "2017-05-25"
        self.key = ACCESS_KEY_ID
        self.secret = ACCESS_KEY_SECRET
        self.signature = ""
        self.signature_method = "HMAC-SHA1"
        self.signature_version = "1.0"
        self.signature_nonce = str(uuid.uuid4())
        self.timestamp = datetime.datetime.utcnow().isoformat("T")
        self.region_id = ALIYUN_API_REGION_ID

        self.gateway = ALISMS_GATEWAY
        self.action = ""
        self.sign = ""
        self.template = ""
        self.params = {}
        self.phone = None

    def send_single(self, phone, sign, template, params):
        self.action = "SendSms"
        self.phone = phone
        self.sign = sign
        self.params = params
        self.template = template

        query_string = self.build_query_string()

        resp = requests.get(self.gateway + "?" + query_string)
        resp = resp.json()
        return resp

    def build_query_string(self):
        query = []
        query.append(("Format", self.format))
        query.append(("Version", self.version))
        query.append(("AccessKeyId", self.key))
        query.append(("SignatureMethod", self.signature_method))
        query.append(("SignatureVersion", self.signature_version))
        query.append(("SignatureNonce", self.signature_nonce))
        query.append(("Timestamp", self.timestamp))
        query.append(("RegionId", self.region_id))
        query.append(("Action", self.action))
        query.append(("SignName", self.sign))
        query.append(("TemplateCode", self.template))
        query.append(("PhoneNumbers", self.phone))
        params = "{"
        for param in self.params:
            params += """ + param + """ + ":" + """ + str(self.params[param]) + """ + ","
        params = params[:-1] + "}"
        query.append(("TemplateParam", params))
        query = sorted(query, key=lambda key: key[0])
        query_string = ""
        for item in query:
            query_string += quote(item[0], safe="~") + "=" + quote(item[1], safe="~") + "&"
        query_string = query_string[:-1]
        tosign = "GET&%2F&" + quote(query_string, safe="~")
        secret = self.secret + "&"
        hmb = hmac.new(secret.encode("utf-8"), tosign.encode("utf-8"), "sha1").digest()
        self.signature = quote(base64.standard_b64encode(hmb).decode("ascii"), safe="~")
        query_string += "&" + "Signature=" + self.signature
        return query_string


# 可选XML
ALIYUN_API_FORMAT = "JSON" 
# 区域,可选
ALIYUN_API_REGION_ID = "cn-hangzhou"                             
ALISMS_GATEWAY = "http://dysmsapi.aliyuncs.com/"           
ALISMS_SIGN = "你的短信签名"          
ALISMS_TPL_REGISTER = "你的短信模板code"                  
       
sms = AliYunSMS()
# :param phone: 手机号
# :param sign: 短信签名
# :param template: 短信模板
# :param params: 模板变量(你申请短信模板时候的变量名)
# sms.send_singe(phone, sign, template, params)

# TODO 调用短信记录查询接口,返回json
response = sms.send_single("135XXXXXXXX", ALISMS_SIGN, ALISMS_TPL_REGISTER, {"name": "11111", "weather": "多云见晴"})
print(response)

    然后把刚刚得到的天气发给你要关心的人吧~

微信图片_20171115162309

     四、每天四分钱,送出你每天早上最真挚的关怀~

        业务逻辑实现了,接下来需要linux在每天早上6点执行我们的脚本咯。

        编写定时任务:

#crontab -e

0 6 * * * python3  /opt/sendMsg.py

    保存。每天清晨 6:00:01,用python3执行/opt/sendMsg.py文件。至此,你的祝福跟关心就能每天早上到达她的手机咯~


标签: : 天气预报 python

0 条评论

想说点什么呢