2022年7月1日 星期五

Python 學習筆記 : Line Notify 訊息推播 (二) : 貼圖

Line Notify 除了可以傳送文字訊息外, 還可以傳送貼圖 (sticker) 與圖片 (image), 本篇先來測試貼圖傳送, Line Notify 可以傳送的貼圖列表參考 :

Line Notify API 文件參考 :


本系列之前的文章參考 : 



1. 使用 Curl 傳送貼圖 :   

從 Line Notify 可傳送的貼圖列表可知, 貼圖被分成不同的群組 (Package), 每一個群組有其群組編號 (stickerPackageId), 每一個貼圖也有其編號 (stickerId), 只要所指定之貼圖編號是 Line Notify 有加入之群組就能傳送此貼圖 (例如群組 1 的貼圖 1~39, 101~139 等). 在 Linux 作業環境下可以用 curl 指令同時傳送文字訊息與貼圖, 指令格式如下 :

curl -X POST https://notify-api.line.me/api/notify -H 'Authorization: Bearer 你的權杖' -F 'message=你的訊息' -F 'stickerPackageId=1' -F 'stickerId=貼圖編號'       

以樹莓派為例 : 

pi@raspberrypi:~ $ curl -X POST https://notify-api.line.me/api/notify -H 'Authorization: Bearer ud7PaDL45fz849A0e1f5oaMCbRIkxMXapQCt7PfNkzz' -F 'message=貼圖測 試' -F 'stickerPackageId=1' -F 'stickerId=1'     
{"status":200,"message":"ok"}  

收到 200 ok 回應表示貼圖編號 1 推播成功, 結果如下 :




下面是傳送貼圖 2 的結果 : 

pi@raspberrypi:~ $ curl -X POST https://notify-api.line.me/api/notify -H 'Authorization: Bearer ud7PaDL45fz849A0e1f5oaMCbRIkxMXapQCt7PfNkzz' -F 'message=貼圖2測試' -F 'stickerPackageId=1' -F 'stickerId=2'
{"status":200,"message":"ok"}




下面是傳送貼圖 139 的結果 : 

pi@raspberrypi:~ $ curl -X POST https://notify-api.line.me/api/notify -H 'Authorization: Bearer ud7PaDL45fz849A0e1f5oaMCbRIkxMXapQCt7PfNkzz' -F 'message=貼圖139測試' -F 'stickerPackageId=1' -F 'stickerId=139'     
{"status":200,"message":"ok"}




但若傳送之貼圖編號不在 Line Notify 所參加的群組 (例如 40, 100, 140 等), 則會出現狀態 400  的 "LINE Notify account doesn't join group which you want to send." 錯誤 : 

pi@raspberrypi:~ $ curl -X POST https://notify-api.line.me/api/notify -H 'Authorization: Bearer ud7PaDL45fz849A0e1f5oaMCbRIkxMXapQCt7PfNkzz' -F 'message=貼圖140測試' -F 'stickerPackageId=1' -F 'stickerId=140'   
{"status":400,"message":"LINE Notify account doesn't join group which you want to send."}   

查詢哪些貼圖是 Line Notify 可傳送的有更方便的方法, 那就是使用 "Flex 開發人員工具".


2. 用 Flex 開發人員工具查詢貼圖 :   

有一位 Line API 高手戴均民開發了一個 "Flex 開發人員工具" 用來查詢貼圖很方便, 只要掃下列 QR code 加入好友, 即可在 Line 中輸入特定訊息查詢貼圖 :




或點下面的超連結亦可 : 






加入好友後發送如下格式的訊息即可查詢指定 PackageId 與 StickerId 之貼圖 : 
  • /replySticker PackageId StickerId
  • /notifySticker PackageId StickerId
兩個指令基本上功能一樣, 但若 PackageId 或 StickerId 錯誤的話 /replySticker 不會有回應; 而 /notifySticker 則會傳回錯誤訊息. 也可以連續查詢 (最多 5 筆), 只要將多個 PackageId StickerId 序列以空格隔開排在後面即可, 格式如下 : 
  • /replySticker PackageId1 StickerId1 PackageId2 StickerId2 .....  (最多 5 個) 
  • /notifySticker PackageId1 StickerId1 PackageId2 StickerId2 .....  (最多 5 個)
例如 : 

/notifySticker 1 1   




/replySticker 1 1




/replySticker 1 1 1 2 1 3 1 4 1 5



/notifySticker 1 140   
/replySticker 1 140




可見對於不可用的貼圖, notify 查詢無回應; 而 reply 查詢則回應錯誤訊息. 

以下是群組 1 內 Line Notify 可傳送的部分貼圖 (1~18, 101~139) : 






3. 用 Python 傳送貼圖 :  

以上對 Line Notify 可傳送之貼圖了解之後便可以測試如何用 Python 來推播貼圖, 從 Line Notify API 文件 POST 方法的 Request 參數列表可知, 只要在 payloads 參數中傳入 stickerPackageId 與 stickerId 這兩個鍵, 指定群組與貼圖編號即可 : 




程式碼如下 : 

import requests

def notifySticker(msg, token, stickerPackageId, stickerId): 
    url="https://notify-api.line.me/api/notify"
    headers={"Authorization": "Bearer " + token}
    payload={"message": msg, 
             "stickerPackageId" : stickerPackageId,  
             "stickerId": stickerId}   
    r=requests.post(url, headers=headers, params=payload)
    if r.status_code==requests.codes.ok:
        return "貼圖發送成功!"
    else:
        return "Line Notify 未加入此群組!"

例如 : 

>>> import requests      
>>> def notifySticker(msg, token, stickerPackageId, stickerId):    
    url="https://notify-api.line.me/api/notify"   
    headers={"Authorization": "Bearer " + token}     
    payload={"message": msg,      
             "stickerPackageId" : stickerPackageId,      
             "stickerId": stickerId}   
    r=requests.post(url, headers=headers, params=payload)   
    if r.status_code==requests.codes.ok:    
        return "貼圖發送成功!"      
    else:     
        return "Line Notify 未加入此群組!"     

>>> msg="test"   
>>> token="ud7PaDL45fz849A0e1f5oaMCbRIkxMXapQCt7PfNkzz"    
>>> notifySticker(msg, token, 1, 4)    # 傳送群組 1 編號 4 貼圖   
'貼圖發送成功!'

結果如下 :




但如果沒有回應的話, 就會顯示 "Line Notify 未加入此群組!", 例如 : 

>>> notifySticker(msg, token, 1, 140)    
'Line Notify 未加入此群組!'       


沒有留言 :