赞
踩
首先我们知道,我们不可能完全凭借python直接向手机发送短信的,就算有牛人做出了这样的技术,那么运营商也是绝对不会允许这样的情况发生的
可以用于用户注册验证/手机认证/紧急通知等场景
好了,言归正传,我们该怎么做才能让自己的python向指定手机发送短信呢?
首先,我们需要选择一个提供相关API服务的平台,这里以短信宝为例,其官网地址为: 短信宝官网…(不是,这次真的不打广告了,这个平台速度挺快的)
进入官网后,进行常规的注册/登陆
当你注册/登陆后,就是关键的一步了
因为。。。。。。这要看你是否着急进行开发搭建,着急的请直接跳到"使用平台已提供的demo",不着急的可以继续看下面的文章
首先,自己写代码需要阅读开发文档以了解各接口的使用方式和返回的值代表的含义,此外,有一点非常重要!
那就是短信格式要求
1.测试短信时,也请发送正规内容短信,如验证码、订单通知等,千万不要发送无意义的内容:例如 测一下、您好。
正确范例:【万千购】您的验证码是1234,30秒内有效.若非本人操作请忽略此消息
2.短信内容中必须含短信签名格式为:【公司签名】 ,【】中间的文字可以是公司简称、网站简称、注册商标名称,3~10个字符,如 好乐迪,志邦橱柜。不能是无意义的签名,例如【测一下】【试试看】等。
这些规则基本是所有短信平台通用的,由运营商规定,必须遵守的。
下面,我们来到其开发文档页面,可以看到,关于短信接口的文章有”国内短信API”和“国际短信API”两个。
这里我们一般的业务只需要用到国内短信API即可,我们点击它就可以看到如何利用API向国内的手机号发送短信了。
根据文档我们看到,其主要功能接口地址是
http://api.smsbao.com/sms?u=USERNAME&p=PASSWORD&m=PHONE&c=CONTENT
这个就是它的接口了,而它的安全接口其实就是进行了SSL加密,使用了HTTPS协议,我们以http情况为例。
首先,我们需要确认我们要向接口传输什么数据
可以看到,这个接口在发送短信时需要向接口内传入4个参数,其中参数P较为特殊,是平台登录密码MD5后的值,这个值我们可以通过
hashlib.md5().update(str.encode("utf8"))
来得到一个MD5加密值,到这一步后事情就简单起来了,因为我们可以看到接口是支持GET请求的,所以我们最简单粗暴的办法就是直接拼接出一个URL地址,进行get请求即可完成一次发送,我们来试一下,首先我们导入需要的库,并且写出负责加密工作的代码,这里请求也可以使用requests
import urllib #发送请求
import hashlib #加密
def md5s(strs):
m = hashlib.md5()
m.update(strs.encode("utf8")) #进行加密
return m.hexdigest()
然后我们需要拼接数据并发送出去,参照文档,我们可以这样写这段代码
smsapi = "http://api.smsbao.com/"
# 短信平台账号
user = '用户名'
# 短信平台密码
password = md5s('您设置的密码')
# 要发送的短信内容
content = str(“这里需要注意格式,一点要加【】”)
# 要发送短信的手机号码
phone = str("111-------")
data = urllib.parse.urlencode({'u': user, 'p': password, 'm': phone, 'c': content}) #参数
send_url = smsapi + 'sms?' + data #拼接url
urllib.request.urlopen(send_url) #发送请求
代码里面已经对变量进行了详细注释。至此,您的脚本已经可以实现进行一次单线的请求了,也就是脚本仅确保发送任务执行完成了,不能确保发送成功了或者内容正确了,所以,我们需要接收平台反馈回来的参数,通过它们来判断短信发送的状态。
根据官方文档可以编写一个字典格式的状态码对照表出来
statusStr = {
'0': '短信发送成功',
'-1': '参数不全',
'-2': '服务器不支持,请确认支持curl或者fsocket,联系您的空间商解决或者更换空间',
'30': '密码错误',
'40': '账号不存在',
'41': '余额不足',
'42': '账户已过期',
'43': 'IP地址限制',
'50': '内容含有敏感词',
'51':'手机号码不正确'
}
那么我们就需要接收平台反馈的参数,我们需要修改上面的发送请求部位的代码,然后将反馈值代入字典中查询对应状态情况,具体操作如下
the_page = response.read().decode('utf-8') #the_page参数将会接收反馈的数据
#这里用简单的校验方法
try:
print(statusStr[the_page])
except:
print('短信发送出现未知错误')
#log_text('短信发送出现未知错误%s' %the_page) 这里可以写您程序自己的日志记录代码
稍加改进,写入到类里面,并让它可以表达的更加具体,方便我们修改
def smsbao(phone,text): #短信宝接口对接 statusStr = { '0': '短信发送成功', '-1': '参数不全', '-2': '服务器不支持,请确认支持curl或者fsocket,联系您的空间商解决或者更换空间', '30': '密码错误', '40': '账号不存在', '41': '余额不足', '42': '账户已过期', '43': 'IP地址限制', '50': '内容含有敏感词', '51':'手机号码不正确' } smsapi = "http://api.smsbao.com/" # 短信平台账号 user = '*****' # 短信平台密码 password = md5s('*****') # 要发送的短信内容 content = str(text) # 要发送短信的手机号码 phone = str(phone) data = urllib.parse.urlencode({'u': user, 'p': password, 'm': phone, 'c': content}) send_url = smsapi + 'sms?' + data response = urllib.request.urlopen(send_url) the_page = response.read().decode('utf-8') try: print(statusStr[the_page]) return (statusStr[the_page]) except: print('短信发送出现未知错误') log_text('短信发送出现未知错误%s' %the_page) return '未知错误' #业务调用部分 duanx=smsbao(phone,'【火毅网络】该手机号正在申请实名认证,您的验证码为%s,如非本人操作请勿理会。' %yzm)#调用短信宝接口对接,也就是smsbao方法 if duanx != '短信发送成功': #判断是否为成功 print('短信发送失败【%s】' %duanx) #这里可以写您在短信发送失败后如何提醒用户 else: file=open('y%s.txt' %ipd,'w') file.write('%s,%s,%s' %(yzm,phone,times)) file.close() #这里可以写您的短信发送完毕后如何提醒用户
至此,您的脚本已经具备了较为完善的短信发送模块了,可以用于
用户注册验证/手机认证/紧急通知等场景
斯,既然你跳下来了,那么,一个不介意我说一句话吧
选这个的嘛,其实你们已经可以脱离我们这种教程了,官方的文档中已经有可以调用的demo了,本文章仅分析了demo的原理和写法,并加以实际应用。
好啦,祝您好运~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。