每天5分钱,用python给关心的人发送天气信息和你的关怀
起因:女朋友是个非常粗心大意的人,经常一变天就要感冒。自己又很忙,不能每次都提醒,于是乎就想写个python脚本,每天获取当日的天气信息,用短信的形式发给她。
一、获取天气信息
中国天气,天气API没啥限制,直接调用就可以。
先获取目标城市的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.申请短信模板和短信签名
审核通过后得到短信模板的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)
然后把刚刚得到的天气发给你要关心的人吧~
四、每天四分钱,送出你每天早上最真挚的关怀~
业务逻辑实现了,接下来需要linux在每天早上6点执行我们的脚本咯。
编写定时任务:
#crontab -e
0 6 * * * python3 /opt/sendMsg.py
保存。每天清晨 6:00:01,用python3执行/opt/sendMsg.py文件。至此,你的祝福跟关心就能每天早上到达她的手机咯~
0 条评论
想说点什么呢