注意:因为目前大部分短息服务提供商提供的SDK均为Python2.7版本,因此本篇文章使用的Python版本号为2.x!
在前面的章节中,我们已经成功的开发了第一个通过邮件推送的新闻提醒小程序。但是在现实生活中,特别是在偏远的地方时,因为网络不通的问题,通过邮件推送并不是一个很好的方法。因此,本篇文章讲解如何申请并购买服务商的短信接口,通过短信来提醒我们有什么重要的事情发生。本篇文章的所有代码,你仍然可以在GitHub上下载并运行。需要提醒的是,本篇文章并不会涉及到具体的服务商名称,如果你对此有什么困惑或者需要解答的,欢迎在达人课的讨论区中和我讨论。
####申请短信模板
可能大家在日常生活中,多多少少会遇到一些商家的商品推送短信。不知道大家有没有注意到:这些推送短信的格式大部分都是相同的,像是出自一个模板。
没错,和直接发送邮件不同,我们在使用短信服务商提供的短信接口时,需要向短息服务商申请一个短信模板。短信模板里面包括了我们发送短信时需要修改的字段,以及固定好的字段。短信服务商通过你申请的短信模板后,我们才能够使用该模板发送短信。
让我们看一个常见的验证码短信模板:
【Spideric】验证码${code},您正进行Spideric网站的身份验证
其中,【Spideric】
是我们自己定义的短信签名,短信签名是作为短信发送者属性的一种标识,一方面能够让接受者知道我们的提供服务的名称,另一方面也是短息服务提供商用来判定我们是否正常使用短信接口的一种方式。验证码${code},您正进行Spideric网站的身份验证
是我们短信的模板。使用该模板发送的短信,其展示形式必须和模板内容相同;${code}
是我们短信模板中的变量,这意味着我们可以通过程序传递参数给它,使得发送给接收人的每一条验证码都不相同。
####使用API接口发送短信
目前大部分的短信服务提供商,都会提供相应的API接口文档。常见的API接口文档一般分为两种:一种是基于Token验证的API接口;一种是直接提供SDK。
-
基于Token验证的API接口
基于Token验证的API接口目前广泛应用于各个服务提供商提供的服务中,比如我们经常使用的百度地图API
接口:http://api.map.baidu.com/geocoder/v2/?address=北京市海淀区上地十街10号&output=json&ak=您的ak&callback=showLocation //GET请求
在上述的API地址中,
ak
就是我们用来验证用户信息的Token。系统在后台为每个用户的不同应用都提供了一个独一无二的ak
字符串。只有用户提供了正确的ak
字符串,系统才会返回正确的结果。 -
SDK方式的API接口
使用Token验证的方法提供API接口,的确大大方便了开发者的开发过程,但是也随之带来了很多的问题,比如编码错误、请求的文字太多系统无法处理等等。
这个时候,各大厂商便提供了第二种方法:使用厂商提供的SDK进行短信发送。目前比较常见的短信服务提供商,例如阿里巴巴、腾讯、百度等,大都推出各自的短息SDK,向开发者提供短信发送服务。
####项目实战
讲了那么多知识点,还是没有写代码,可能很多同学都开始烦躁起来了——那我们就做一个天气预报的短信通知服务,约定每天8点的时候,短信通知我们今天的天气如何吧!
#####申请天气预报API接口
我们直接使用百度提供的天气预报接口。
首先登陆百度开放平台首页,进入控制台。第一次进入控制台时会要求进行验证,大家直接输入相应的信息即可。然后点击创建新应用
,输入应用名称这里我们称它为天气预报
,下面不要做改动,直接点击确认即可。
返回控制台页面,我们可以看到天气预报
所对应的ak
值。
我们暂时把它记住,方便后续使用。
通过查血API文档可以知道,百度的天气预报API请求接口为
http://api.map.baidu.com/telematics/v3/weather?location=点&output=json&ak=你的ak值
这里我们选择城市为杭州,输入上面的ak
值,使用浏览器访问,得到的返回结果如下:
{"error":0,"status":"success","date":"2018-06-28","results":[{"currentCity":"杭州","pm25":"42","index":[{"des":"天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。","zs":"炎热","tipt":"穿衣指数","title":"穿衣"},{"des":"较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。","zs":"较适宜","tipt":"洗车指数","title":"洗车"},{"des":"各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。","zs":"少发","tipt":"感冒指数","title":"感冒"},{"des":"天气较好,但风力较强,在户外要选择合适的运动,另外考虑到天气炎热,建议停止高强度运动。","zs":"较不宜","tipt":"运动指数","title":"运动"},{"des":"属中等强度紫外线辐射天气,外出时建议涂擦SPF高于15、PA+的防晒护肤品,戴帽子、太阳镜。","zs":"中等","tipt":"紫外线强度指数","title":"紫外线强度"}],"weather_data":[{"date":"周四 06月28日 (实时:30℃)"}]}]}
返回结果是json格式的数据,因此我们在编写程序的时候,需要对json数据进行处理,得到我们自己需要的结果:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
import json
url = ' http://api.map.baidu.com/telematics/v3/weather?location=杭州&output=json&ak=你的AK值'
web_data = requests.get(url)
result = web_data.text
fin = json.loads(result)
print fin["results"][0]["pm25"] #pm2.5
print fin["results"][0]["weather_data"][0]["temperature"] ##今天的温度
print fin["results"][0]["weather_data"][0]["weather"] ##今天的天气情况
print fin["results"][0]["weather_data"][0]["wind"] ##今天的风向
#####申请短信接口
我们申请的短息接口模板如下:
【Git天气】亲爱的Gitic,今天的天气为${1},温度${2},风向${3},PM2.5浓度为${4}
#####整合代码
首先我们先配置好百度天气预报接口返回的数据
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
import json
def get_info(url):
web_data = requests.get(url)
result = web_data.text
fin = json.loads(result)
pm=fin["results"][0]["pm25"]
temperature=fin["results"][0]["weather_data"][0]["temperature"] ##今天的温度
weather=fin["results"][0]["weather_data"][0]["weather"] ##今天的天气情况
wind=fin["results"][0]["weather_data"][0]["wind"] ##今天的风向
return "【Git天气】亲爱的Gitic,今天的天气为{0},温度{1},风向{2},PM2.5浓度为{3}".format(weather,temperature,wind,pm)
然后处理发送短信的部分:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib
import time
import sys
import httplib
def send_sms(apikey, text, mobile):
sms_host = "sms.XXXXX.com"
port = 443
version = "v2"
sms_send_uri = "/" + version + "/sms/single_send.json"
params = urllib.urlencode({'apikey': apikey, 'text': text, 'mobile': mobile})
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
conn = httplib.HTTPSConnection(sms_host, port=port, timeout=30)
conn.request("POST", sms_send_uri, params, headers)
response = conn.getresponse()
response_str = response.read()
conn.close()
return response_str
最后整合全部的代码:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from chapter8.crawl_info import get_info
from chapter8.text_sdk import send_sms
if __name__ == '__main__':
url = ' http://api.map.baidu.com/telematics/v3/weather?location=杭州&output=json&ak=你的ak值'
text = get_info(url)
send_sms("自己的接口私钥",text,"发送的手机号")
####本章总结
- 本篇文章从基础讲述了如何申请短信模板和短信接口的使用方式,大家可以自行寻找正规的短信服务提供商,作者在此不做任何的推荐;
- 本文涉及到了Json格式的数据,Json格式是目前常用的一种网站相应格式,如果是有时间,你可以查阅这篇文章了解Json格式的具体表现形式。
- 必须承认,使用短息服务商的短信接口需要花费一些钱。那么,有没有“线上掉馅饼”的事情呢?答案是有的,下一章我们讨论如何使用“免费”的短信接口。