一,友盟消息推送python服務端sdk地址和文檔地址
1.sdk地址:http://dev.umeng.com/system/resources/W1siZiIsIjIwMTYvMDgvMTkvMTdfNDFfMzhfNzg2X3B1c2hfc2VydmVyX3B5c2RrLnppcCJdXQ/push-server-pysdk.zip
2.文檔:http://dev.umeng.com/push/android/api-doc
二、python官方sdk代碼中的錯誤(沒錯!官方代碼有錯。)

三、推送類型
sdk中有六中消息類型,分別為單播(unicast)、列播(listcast)、廣播(broadcast)、組播(groupcast)、文件播(filecast)、自定義播(customizedcast)六中
1.參數說明:
- Appkey:應用唯一標識。友盟消息推送服務提供的appkey和友盟統計分析平台使用的同一套appkey。
- App Master Secret:服務器秘鑰,用於服務器端調用API請求時對發送內容做簽名驗證。
- device_token: 友盟消息推送服務對設備的唯一標識。Android的device_token是44位字符串,iOS的device_token是64位。
- alias: 開發者自有賬號,開發者可以在SDK中調用setAlias(alias, alias_type)接口將alias+alias_type與device_token做綁定,之后開發者就可以根據自有業務邏輯篩選出alias進行消息推送。
- 單播(unicast): 向指定的設備發送消息。
- 列播(listcast): 向指定的一批設備發送消息。
- 廣播(broadcast): 向安裝該App的所有設備發送消息。
- 組播(groupcast): 向滿足特定條件的設備集合發送消息,例如: "特定版本"、"特定地域"等。
- 文件播(filecast): 開發者將批量的device_token或者alias存放到文件,通過文件ID進行消息發送。
- 自定義播(customizedcast): 開發者通過自有的alias進行推送,可以針對單個或者一批alias進行推送,也可以將alias存放到文件進行發送。
- 通知-Android(notification): 消息送達到用戶設備后,由友盟SDK接管處理並在通知欄上顯示通知內容。
- 消息-Android(message): 消息送達到用戶設備后,消息內容透傳給應用自身進行解析處理。
- 通知-iOS: 和APNs定義一致。
- 靜默推送-iOS: 和APNs定義一致。
- 測試模式: 在廣播、組播等大規模發送消息的情況下,為了防止開發者誤將測試消息大面積發給線上用戶,特增加了測試模式。 測試模式下,只會將消息發送給測試設備。測試設備需要到網站上手工添加。
- 測試模式-Android: Android的測試設備是正式設備的一個子集
- 測試模式-iOS: iOS的測試模式對應APNs的開發環境(sandbox), 正式模式對應APNs的生產環境(prod),測試設備和正式設備完全隔離。
- 簽名: 為了保證調用API的請求是合法者發送且參數沒有被篡改,需要在調用API時對發送的所有內容進行簽名。簽名附加在調用地址后面,簽名的計算方式參見附錄K。
- 推送類型: 單播(unicast)、列播(listcast)、自定義播(customizedcast且不帶file_id)統稱為單播類型消息,Web后台不會展示此類消息詳細信息,僅展示前一天的匯總數據;廣播(broadcast)、文件播(filecast)、組播(groupcast)、自定義播(customizedcast且file_id不為空)統稱為任務類型消息,任務支持查詢、撤銷操作,Web后台會展示此類消息詳細信息
2.發送限制
- 廣播(broadcast)默認每天可推送10次
- 組播(groupcast)默認每分鍾可推送5次
- 文件播(filecast)默認每小時可推送300次
- 自定義播(customizedcast, 且file_id不為空)默認每小時可推送300次
3.消息發送
1.功能說明
開發者通過此接口,可向 指定用戶(單播)、 所有用戶(廣播) 或 滿足特定條件的用戶群(組播),發送 通知 或 消息。此外,該接口還支持開發者使用 自有的賬號系統(alias) 來發送消息給指定的賬號或者賬號群。
注意,iOS推送的相關協議,請嚴格按照APNs的協議來填寫,友盟完全遵循APNs的協議
2.調用地址
http接口:http://msg.umeng.com/api/send?sign=mysign
https接口:https://msgapi.umeng.com/api/send?sign=mysign
請求方式:post
3.調用參數
安卓:
{ "appkey":"xx", // 必填,應用唯一標識 "timestamp":"xx", // 必填,時間戳,10位或者13位均可,時間戳有效期為10分鍾 "type":"xx", // 必填,消息發送類型,其值可以為: // unicast-單播 // listcast-列播,要求不超過500個device_token // filecast-文件播,多個device_token可通過文件形式批量發送 // broadcast-廣播 // groupcast-組播,按照filter篩選用戶群, 請參照filter參數 // customizedcast,通過alias進行推送,包括以下兩種case: // - alias: 對單個或者多個alias進行推送 // - file_id: 將alias存放到文件后,根據file_id來推送 "device_tokens":"xx", // 當type=unicast時, 必填, 表示指定的單個設備 // 當type=listcast時, 必填, 要求不超過500個, 以英文逗號分隔 "alias_type": "xx", // 當type=customizedcast時, 必填 // alias的類型, alias_type可由開發者自定義, 開發者在SDK中 // 調用setAlias(alias, alias_type)時所設置的alias_type "alias":"xx", // 當type=customizedcast時, 選填(此參數和file_id二選一) // 開發者填寫自己的alias, 要求不超過500個alias, 多個alias以英文逗號間隔 // 在SDK中調用setAlias(alias, alias_type)時所設置的alias "file_id":"xx", // 當type=filecast時,必填,file內容為多條device_token,以回車符分割 // 當type=customizedcast時,選填(此參數和alias二選一) // file內容為多條alias,以回車符分隔。注意同一個文件內的alias所對應 // 的alias_type必須和接口參數alias_type一致。 // 使用文件播需要先調用文件上傳接口獲取file_id,參照"2.4文件上傳接口" "filter":{}, // 當type=groupcast時,必填,用戶篩選條件,如用戶標簽、渠道等,參考附錄G。 "payload": // 必填,JSON格式,具體消息內容(Android最大為1840B) { "display_type":"xx", // 必填,消息類型: notification(通知)、message(消息) "body": // 必填,消息體。 // 當display_type=message時,body的內容只需填寫custom字段。 // 當display_type=notification時,body包含如下參數: { // 通知展現內容: "ticker":"xx", // 必填,通知欄提示文字 "title":"xx", // 必填,通知標題 "text":"xx", // 必填,通知文字描述 // 自定義通知圖標: "icon":"xx", // 可選,狀態欄圖標ID,R.drawable.[smallIcon], // 如果沒有,默認使用應用圖標。 // 圖片要求為24*24dp的圖標,或24*24px放在drawable-mdpi下。 // 注意四周各留1個dp的空白像素 "largeIcon":"xx", // 可選,通知欄拉開后左側圖標ID,R.drawable.[largeIcon], // 圖片要求為64*64dp的圖標, // 可設計一張64*64px放在drawable-mdpi下, // 注意圖片四周留空,不至於顯示太擁擠 "img": "xx", // 可選,通知欄大圖標的URL鏈接。該字段的優先級大於largeIcon。 // 該字段要求以http或者https開頭。 // 自定義通知聲音: "sound": "xx", // 可選,通知聲音,R.raw.[sound]。 // 如果該字段為空,采用SDK默認的聲音,即res/raw/下的 // umeng_push_notification_default_sound聲音文件。如果 // SDK默認聲音文件不存在,則使用系統默認Notification提示音。 // 自定義通知樣式: "builder_id": xx // 可選,默認為0,用於標識該通知采用的樣式。使用該參數時, // 開發者必須在SDK里面實現自定義通知欄樣式。 // 通知到達設備后的提醒方式,注意,"true/false"為字符串 "play_vibrate":"true/false", // 可選,收到通知是否震動,默認為"true" "play_lights":"true/false", // 可選,收到通知是否閃燈,默認為"true" "play_sound":"true/false", // 可選,收到通知是否發出聲音,默認為"true" // 點擊"通知"的后續行為,默認為打開app。 "after_open": "xx" // 必填,值可以為: // "go_app": 打開應用 // "go_url": 跳轉到URL // "go_activity": 打開特定的activity // "go_custom": 用戶自定義內容。 "url": "xx", // 當after_open=go_url時,必填。 // 通知欄點擊后跳轉的URL,要求以http或者https開頭 "activity":"xx", // 當after_open=go_activity時,必填。 // 通知欄點擊后打開的Activity "custom":"xx"/{} // 當display_type=message時, 必填 // 當display_type=notification且 // after_open=go_custom時,必填 // 用戶自定義內容,可以為字符串或者JSON格式。 }, extra: // 可選,JSON格式,用戶自定義key-value。只對"通知" // (display_type=notification)生效。 // 可以配合通知到達后,打開App/URL/Activity使用。 { "key1": "value1", "key2": "value2", ... } }, "policy": // 可選,發送策略 { "start_time":"xx", // 可選,定時發送時,若不填寫表示立即發送。 // 定時發送時間不能小於當前時間 // 格式: "yyyy-MM-dd HH:mm:ss"。 // 注意,start_time只對任務生效。 "expire_time":"xx", // 可選,消息過期時間,其值不可小於發送時間或者 // start_time(如果填寫了的話), // 如果不填寫此參數,默認為3天后過期。格式同start_time "max_send_num": xx // 可選,發送限速,每秒發送的最大條數。最小值1000 // 開發者發送的消息如果有請求自己服務器的資源,可以考慮此參數。 "out_biz_no": "xx" // 可選,開發者對消息的唯一標識,服務器會根據這個標識避免重復發送。 // 有些情況下(例如網絡異常)開發者可能會重復調用API導致 // 消息多次下發到客戶端。如果需要處理這種情況,可以考慮此參數。 // 注意, out_biz_no只對任務生效。 }, "production_mode":"true/false", // 可選,正式/測試模式。默認為true // 測試模式只會將消息發給測試設備。測試設備需要到web上添加。 // Android: 測試設備屬於正式設備的一個子集。 "description": "xx", // 可選,發送消息描述,建議填寫。 "mipush": "true/false", // 可選,默認為false。當為true時,表示MIUI、EMUI、Flyme系統設備離線轉為系統下發 "mi_activity": "xx", // 可選,mipush值為true時生效,表示走系統通道時打開指定頁面acitivity的完整包路徑。 }
ios:
{ "appkey":"xx", // 必填,應用唯一標識 "timestamp":"xx", // 必填,時間戳,10位或者13位均可,時間戳有效期為10分鍾 "type":"xx", // 必填,消息發送類型,其值可以為: // unicast-單播 // listcast-列播,要求不超過500個device_token // filecast-文件播,多個device_token可通過文件形式批量發送 // broadcast-廣播 // groupcast-組播,按照filter篩選用戶群, 請參照filter參數 // customizedcast,通過alias進行推送,包括以下兩種case: // - alias: 對單個或者多個alias進行推送 // - file_id: 將alias存放到文件后,根據file_id來推送 "device_tokens":"xx", // 當type=unicast時, 必填, 表示指定的單個設備 // 當type=listcast時, 必填, 要求不超過500個, 以英文逗號分隔 "alias_type": "xx", // 當type=customizedcast時, 必填 // alias的類型, alias_type可由開發者自定義, 開發者在SDK中 // 調用setAlias(alias, alias_type)時所設置的alias_type "alias":"xx", // 當type=customizedcast時, 選填(此參數和file_id二選一) // 開發者填寫自己的alias, 要求不超過500個alias, 多個alias以英文逗號間隔 // 在SDK中調用setAlias(alias, alias_type)時所設置的alias "file_id":"xx", // 當type=filecast時,必填,file內容為多條device_token,以回車符分割 // 當type=customizedcast時,選填(此參數和alias二選一) // file內容為多條alias,以回車符分隔。注意同一個文件內的alias所對應 // 的alias_type必須和接口參數alias_type一致。 // 使用文件播需要先調用文件上傳接口獲取file_id,參照"2.4文件上傳接口" "filter":{}, // 當type=groupcast時,必填,用戶篩選條件,如用戶標簽、渠道等,參考附錄G。 "payload": // 必填,JSON格式,具體消息內容(iOS最大為2012B) { "aps": // 必填,嚴格按照APNs定義來填寫 { "alert":""/{ // 當content-available=1時(靜默推送),可選; 否則必填。 // 可為JSON類型和字符串類型 "title":"title", "subtitle":"subtitle", "body":"body" } "badge": xx, // 可選 "sound": "xx", // 可選 "content-available":1 // 可選,代表靜默推送 "category": "xx", // 可選,注意: ios8才支持該字段。 }, "key1":"value1", // 可選,用戶自定義內容, "d","p"為友盟保留字段, // key不可以是"d","p" "key2":"value2", ... }, "policy": // 可選,發送策略 { "start_time":"xx", // 可選,定時發送時間,若不填寫表示立即發送。 // 定時發送時間不能小於當前時間 // 格式: "yyyy-MM-dd HH:mm:ss"。 // 注意,start_time只對任務生效。 "expire_time":"xx", // 可選,消息過期時間,其值不可小於發送時間或者 // start_time(如果填寫了的話), // 如果不填寫此參數,默認為3天后過期。格式同start_time "out_biz_no": "xx" // 可選,開發者對消息的唯一標識,服務器會根據這個標識避免重復發送。 // 有些情況下(例如網絡異常)開發者可能會重復調用API導致 // 消息多次下發到客戶端。如果需要處理這種情況,可以考慮此參數。 // 注意,out_biz_no只對任務生效。 "apns_collapse_id": "xx" // 可選,多條帶有相同apns_collapse_id的消息,iOS設備僅展示 // 最新的一條,字段長度不得超過64bytes }, "production_mode":"true/false" // 可選,正式/測試模式。默認為true // 測試模式只會將消息發給測試設備。測試設備需要到web上添加。 "description": "xx" // 可選,發送消息描述,建議填寫。 }
調用返回:
{ "ret":"SUCCESS/FAIL", // 返回結果,"SUCCESS"或者"FAIL" "data": { // 當"ret"為"SUCCESS"時,包含如下參數: // 單播類消息(type為unicast、listcast、customizedcast且不帶file_id)返回: "msg_id":"xx" // 任務類消息(type為broadcast、groupcast、filecast、customizedcast且file_id不為空)返回 "task_id":"xx" // 當"ret"為"FAIL"時,包含如下參數: "error_code":"xx" // 錯誤碼,詳見附錄I "error_msg":"xx" // 錯誤信息 } }
四、單播demo代碼

五、自定義播demo代碼

六、廣播demo代碼

七、組播demo代碼
def _make_umeng_android_group_entity(umeng_appkey, appMasterSecret, sak_push_data, unread_num, tags):
desc = sak_push_data.get('desc', '') #從數據中獲取desc
filter = {'where': {'or': tags}}
logger.debug("_make_umeng_android_broadcast_entity broadcast desc:%s" % desc)
title = sak_push_data.get('title', '') #從數據中獲取title
message = AndroidGroupcast(umeng_appkey, appMasterSecret)
message.setTicker(desc) # 設置ticker
message.setTitle(title) # 設置title
message.setText(desc) # 設置text
message.setFilter(filter)#設置篩選標簽filter 格式:"where": { "and": [ {"tag":"registered_user"}, // 開發者自定義tag {"app_version":"1.0"}, // app-version {"launch_from":"2014-11-15"} // X天活躍/不活躍 ] }
# and可以替換為or、大於等於小於、not、and/or/not可以組合用
message.goAppAfterOpen()
message.setDisplayType(AndroidNotification.DisplayType.notification)
message.setPredefinedKeyValue("mipush", 'false')
message.setPredefinedKeyValue("mi_activity", 'com.xxxx.umengpush.xxxxxxx')
message = message.setProductionMode()
logger.debug("_make_umeng_android_broadcast_entity message:%s" % message)
return message
八、如何設置任意參數中的字段
# 使用setPredefinedKeyValue(key,value) setPredefinedKeyValue("mipush", 'false') # 使用setPredefinedKeyValue的時候,類中會自動循環判斷參數中的所有key,當key存在時,會設置為value
九、Ticker、Title、Text所以對應的安卓推送通知的位置


