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\nimport json\n\nweather_city_code = \"101290101\"#目标城市id\nweather_url = \"http://www.weather.com.cn/data/cityinfo/%s.html\" % weather_city_code\n\nrequest = urllib.request.urlopen(weather_url)\nrs = request.read().decode()\nweatherinfo = json.loads(rs)[\"weatherinfo\"]

    得到如下天气信息:

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

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

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

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

    \"QQ图片20171115160555\"


\"QQ图片20171115091531\"

                                                    \"QQ图片20171115092557\"

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

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

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

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

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

    三、构建代码

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

# ACCESS_KEY_ID/ACCESS_KEY_SECRET 根据实际申请的账号信息进行替换\nACCESS_KEY_ID = \"你的阿里云app_id\"\n\nACCESS_KEY_SECRET = \"你的阿里云secret\"\n\n\nclass AliYunSMS(object):\n    def __init__(self):\n        self.format = \"JSON\"\n        self.version = \"2017-05-25\"\n        self.key = ACCESS_KEY_ID\n        self.secret = ACCESS_KEY_SECRET\n        self.signature = \"\"\n        self.signature_method = \"HMAC-SHA1\"\n        self.signature_version = \"1.0\"\n        self.signature_nonce = str(uuid.uuid4())\n        self.timestamp = datetime.datetime.utcnow().isoformat(\"T\")\n        self.region_id = ALIYUN_API_REGION_ID\n\n        self.gateway = ALISMS_GATEWAY\n        self.action = \"\"\n        self.sign = \"\"\n        self.template = \"\"\n        self.params = {}\n        self.phone = None\n\n    def send_single(self, phone, sign, template, params):\n        self.action = \"SendSms\"\n        self.phone = phone\n        self.sign = sign\n        self.params = params\n        self.template = template\n\n        query_string = self.build_query_string()\n\n        resp = requests.get(self.gateway + \"?\" + query_string)\n        resp = resp.json()\n        return resp\n\n    def build_query_string(self):\n        query = []\n        query.append((\"Format\", self.format))\n        query.append((\"Version\", self.version))\n        query.append((\"AccessKeyId\", self.key))\n        query.append((\"SignatureMethod\", self.signature_method))\n        query.append((\"SignatureVersion\", self.signature_version))\n        query.append((\"SignatureNonce\", self.signature_nonce))\n        query.append((\"Timestamp\", self.timestamp))\n        query.append((\"RegionId\", self.region_id))\n        query.append((\"Action\", self.action))\n        query.append((\"SignName\", self.sign))\n        query.append((\"TemplateCode\", self.template))\n        query.append((\"PhoneNumbers\", self.phone))\n        params = \"{\"\n        for param in self.params:\n            params += \"\"\" + param + \"\"\" + \":\" + \"\"\" + str(self.params[param]) + \"\"\" + \",\"\n        params = params[:-1] + \"}\"\n        query.append((\"TemplateParam\", params))\n        query = sorted(query, key=lambda key: key[0])\n        query_string = \"\"\n        for item in query:\n            query_string += quote(item[0], safe=\"~\") + \"=\" + quote(item[1], safe=\"~\") + \"&\"\n        query_string = query_string[:-1]\n        tosign = \"GET&%2F&\" + quote(query_string, safe=\"~\")\n        secret = self.secret + \"&\"\n        hmb = hmac.new(secret.encode(\"utf-8\"), tosign.encode(\"utf-8\"), \"sha1\").digest()\n        self.signature = quote(base64.standard_b64encode(hmb).decode(\"ascii\"), safe=\"~\")\n        query_string += \"&\" + \"Signature=\" + self.signature\n        return query_string\n\n\n# 可选XML\nALIYUN_API_FORMAT = \"JSON\" \n# 区域,可选\nALIYUN_API_REGION_ID = \"cn-hangzhou\"                             \nALISMS_GATEWAY = \"http://dysmsapi.aliyuncs.com/\"           \nALISMS_SIGN = \"你的短信签名\"          \nALISMS_TPL_REGISTER = \"你的短信模板code\"                  \n       \nsms = AliYunSMS()\n# :param phone: 手机号\n# :param sign: 短信签名\n# :param template: 短信模板\n# :param params: 模板变量(你申请短信模板时候的变量名)\n# sms.send_singe(phone, sign, template, params)\n\n# TODO 调用短信记录查询接口,返回json\nresponse = sms.send_single(\"135XXXXXXXX\", ALISMS_SIGN, ALISMS_TPL_REGISTER, {\"name\": \"11111\", \"weather\": \"多云见晴\"})\nprint(response)

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

\"微信图片_20171115162309\"

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

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

        编写定时任务:

#crontab -e\n\n0 6 * * * python3  /opt/sendMsg.py

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


标签: : 天气预报 python

0 条评论

想说点什么呢