【乾貨】如何使用python發送一條短信[附完整demo]

讓您的python會發短信

首先我們知道,我們不可能完全憑藉python直接向手機發送短信的,就算有牛人做出了這樣的技術,那麼運營商也是絕對不會允許這樣的情況發生的
在這裏插入圖片描述
可以用於用戶註冊驗證/手機認證/緊急通知等場景
好了,言歸正傳,我們該怎麼做才能讓自己的python向指定手機發送短信呢?

短信API平臺

首先,我們需要選擇一個提供相關API服務的平臺,這裏以短信寶爲例,其官網地址爲: 短信寶官網…(不是,這次真的不打廣告了,這個平臺速度挺快的)
進入官網後,進行常規的註冊/登陸在這裏插入圖片描述

方法-步驟

當你註冊/登陸後,就是關鍵的一步了
在這裏插入圖片描述
因爲。。。。。。這要看你是否着急進行開發搭建,着急的請直接跳到"使用平臺已提供的demo",不着急的可以繼續看下面的文章

自己寫代碼(python 3.x下)-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了,本文章僅分析了demo的原理和寫法,並加以實際應用。
好啦,祝您好運~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章