概述

Android

iOS

REST API

服务端SDK

服务端V1版Rest API介绍

本文档已过期,建议使用服务端V2版Rest Api,但本接口文档仍然有效

1 概述

1.1 推送服务简介

推送消息针对anroid设备进行推送,包括广播、点播、组播消息的推送。

1.2 请求数据包格式

a、URL

anroid 推送地址:http://androidmis.ixintui.com:8001/push

b、请求方式

所有的接口仅支持POST请求方式。

c、参数编码

所有请求的参数需要进行UTF-8编码

d、响应编码

所有的响应数据包的格式为json,头部设置为application/json;charset=utf-8响应输出内容正常,则result字段为0,否则设置相应的错误码
正确响应示例:

{
    "desc": "OK", 
    "msgid": 51, 
    "result": 0
}

错误响应示例

{
    "desc": "sign not correct", 
    "result": 401
}

1.3 常见错误码定义

result decription 备注
400 input error 参数错误
401 sign not correct 签名不正确
500 internal error 服务器内部错误

1.4 签名算法

java版签名算法DEMO
php版(<5.4)签名算法DEMO
php版(>=5.4)签名算法DEMO
js版签名算法DEMO

对输入的json数据的key按字典序排序,json字符串中的json分隔符(,";{}[]等)之间不能留空白,拼接上app的secret_key 求md5签名后放入输入json中的sign字段。
例如:输入参数为

{"message": "hello,world", "appkey": 10086},

sign=md5({"appkey":10086,"message":"hello,world"}your-secret_key)

python示例代码:

## -*- coding: utf-8 -*-
import json
import hashlib
import sys
reload(sys)
sys.setdefaultencoding("utf8")

data = dict()
#这里只是列举了部分参数,如果参数不止这些需要更改data数组,保存data中存储了除sign之外的所有参数
data["message"] = "message 测试"
data["appkey"] = "1245227470"
data["period"]  = 1000
#默认is_notif 为 0
## 若为通知,则可打开如下注释
#data["is_notif"]  = 1
#data["title"] = "message title"
#data["sound"] = True
#data["vibrate"] = True
#data["unremovable"] = False
#data["click_action"] = "open_url"
#data["open_url"] = "http://www.ixintui.com"
#data["extra"] = "海贼王我当定了"
#此处需要替换your_secret_key为应用的secret_key
sign = hashlib.md5(json.dumps(data,separators=(",",":"),ensure_ascii=False, encoding="utf8",sort_keys=True) + "your_secret_key").hexdigest()
print sign
data["sign"] = sign
input_json = json.dumps(data,separators=(",",":"),ensure_ascii=False, encoding="utf8",sort_keys=True)
print input_json

2 Android MIS API列表

api列表包括发送广播、点播、组播消息的api。
广播消息和组播消息的区别是,组播有filter字段,按指定的tag来发送消息。
广播消息和点播消息的区别是,点播消息有token或alias字段,指定发给某个用户。
点播可使用别名发送,即alias字段,每个别名最多对应10个设备,在发送消息时,可指定是否给所有的设备发送消息,默认只给最活跃的设备发送消息,通过alias_send_all来设置。

2.1 参数列表

参数名字 类型 广播 组播 点播 描述
appkey string 必需 必需 必需 app唯一标识
message string 必需 必需 必需 消息内容,最多4096个字节
period uint32 可选 可选 可选 消息存活时间,单位秒,取值范围[60s,604800s]
is_notif uint32 必需 必需 必需 0 透传消息1 通知
qps uint32 可选 不支持 不支持 消息发送速度。速度过快,可能导致应用的并发访问过大,单位:个/s
filter string 必需 组播过滤器
sign uint64 必需 必需 必需 签名
token string 或 list token,alias至少有一个 用户手机唯一标识
alias string 或 list token,alias至少有一个 用户手机唯一标识
alias_send_all int 可选 是否给该别名对应的所有设备发送,1是,默认0
filter_v2 json对象 可选 组播过滤器,支持与或,具体参考2.4组播的参数部分
optfilter json对象 可选 组播过滤器,具体见2.4组播的参数部分,最大长度为2000个字节

若is_notif为1,代表为通知,通知的参数列表如下:

参数名字 类型 是否必须 描述
title string 消息标题,最多128个字节
sound bool 是否有声音,默认无
vibrate bool 是否震动,默认无
unremovable bool 是否可移除,默认否
click_action string 点击后的动作{open_app、open_url、intent}
open_app bool 当click_action=”open_app”时,该参数必需 是否打开应用主界面
open_url string 当click_action=”open_url”时,该参数为必需 点击消息后,打开的url
intent string 当click_action=”intent”时,该参数为必需 URI格式,遵循anroid标准
extra string 附加信息,可随意指定
is_upgrade_download int 是否为升级下载的通知,默认为0,取值为0和1
download_url string 当is_upgrade_download=1时,该参数必须 点击升级下载通知后触发的地址

intent字段示例:
intent:#Intent;action=android.intent.action.MAIN;
category=android.intent.category.LAUNCHER;
launchFlags=0x10000000;
component=com.sina.weibo/.MainTabActivity;

假设 appkey = "1425830916"
secrety_key = "7sbKpsq5LhnFk4SYeVYLdBMcDKBXMfaMqUDSm2OgzOTS9c2Uze6Q9DOXOZU50wqL"
作为以下发送消息的示例参数。

2.2 广播接口

请求示例:

给appkey为1425830916的应用,以每秒10000个用户的速度推送内容为hello,world的广播消息 ,请求如下:

curl -H "Content-type: application/json" -d '{"appkey": "1425830916", "qps": 10000, "message": "hello,world", "sign":"fece7d3d156ff26082ea716d1851fc1f"}' 
http://androidmis.ixintui.com:8001/push"

2.3 点播接口

a. 按token发送
请求示例:

给appkey为1425830916的应用,用户标识为1487168775739423346的用户推送消息,内容为hello,world,消息的生存周期为1000秒。
设置period参数后,若用户一直不在线,则1000秒以后,该消息将不再发送。

curl -H "Content-type: application/json"   -d '{"appkey": "1425830916", "token": "1487168775739423346", "period": 1000, "message": "hello,world", 
"sign": "c49362c03fc608c73bddaca9b9d46345"}' http://androidmis.ixintui.com:8001/push

b. 按别名给最活跃的设备发送

给appkey为1425830916的应用,用户标识为burke的用户推送消息,内容为hello,world,消息的生存周期为1000秒。 设置period参数后,若用户一直不在线,
则1000秒以后,该消息将不再发送。

curl -H "Content-type: application/json"   -d '{"appkey": "1425830916", "alias": "burke", "period": 1000, "message": "hello,world", 
"sign": "24dabfb852b4c002f8d59ad38d61b288"}' http://androidmis.ixintui.com:8001/push

c. 按别名给该别名对应的所有设备发送

给appkey为1425830916的应用,用户标识为burke的用户推送消息,内容为hello,world,消息的生存周期为1000秒。 设置period参数后,若用户一直不在线,
则1000秒以后,该消息将不再发送。

curl -H "Content-type: application/json"   -d '{"appkey": "1425830916", "alias": "burke", "alias_send_all":1, "period": 1000, "message": "hello,world", 
"sign": "41cb4bfc28bd0b93eeb64455e556dab9"}' http://androidmis.ixintui.com:8001/push

2.4 组播接口

参数列表(其他参数见参数列表

参数名字 类型 是否必须 描述
filter json对象 可选 组播过滤器,该参数已过期,不建议使用。示例[1,2,3],与关系tag的过滤器,取值范围[-32727, 32767]
filter_v2 json对象 可选 组播过滤器,支持与或,示例 [ [1,2,3], [4,5,6] ],取值范围为[-32727, 32767]
optfilter json对象 可选 组播过滤器

参数之间的关系

  • filter和filter_v2不能同时出现,optfilter 与两者都是与关系
  • filter字段为与关系的tag过滤器, 格式为tag的列表。该参数已过期,不推荐使用,可使用filter_v2最为替代参数 该参数不能和filter_v2同时出现。
  • filter字段中的值的取值范围为[-32767, 32767] .比如 [1,2,3] 表示给同时有 1,2,3 的tag的用户发送消息

如何添加tag 请参照 此链接的 增加标签接口

用户 tag列表 是否收到消息
A 1,2,3
B 1,2
C 2,3,4
D 2,3,5
E 2,3,4
F 1,2,3,100

filter_v2字段支持与或关系, 结构为与关系的或组合。 比如: [ [1,2,3], [2,3,4] ], 表示给同时有1,2,3的tag的用户或者是同时有2,3,4这样的用户发送消息。 值的取值范围为范围为[-32727, 32767]

用户 tag列表 是否收到消息
A 1,2,3
B 1,2
C 2,3,4
D 2,3,5
E 2,3,4
F 1,2,3,100

optfilter: 支持按地域、app版本,app渠道, 操作系统版本,手机品牌, 运营商、应用活跃度进行推送 格式为:

{
  "locate": ["北京市", "天津市"], 
  "activity_7": {"<=": 30, ">=": 10}, 
  "activity_30": {"=": 100}, 
  "activity_90": {"<=": 100, ">=": 100}, 
  "appversion": ["1.1.0", "2.1.1"], 
  "phone": ["htc"], 
  "operator": ["cm", "cu"], 
  "osversion": ["4.0.4", "2.2.1"], 
  "activity_1": {"<": 10, ">": 1},
  "channel": ["91", "wandoujia"]
}

大小写敏感,编码为utf-8,必须完全匹配才会发送消息 参数列表如下:

参数名字 类型 是否必须 描述
locate string列表 非必须 地域选项,取值见附录
osversion string列表 非必须 操作系统选项
appversion string列表 非必须 应用的版本选项
channel string列表 非必须 应用的渠道选项
phone string列表 非必须 手机品牌选项
operator string列表 非必须 运营商选项,取值见附录
activity_1 kv列表 非必须 1天内应用打开次数选项,支持>, <, >=, <=, =
activity_7 kv列表 非必须 7天内应用打开次数选项,支持>, <, >=, <=, =
activity_30 kv列表 非必须 30天内应用打开次数选项,支持>, <, >=, <=, =
activity_90 kv列表 非必须 90天内应用打开次数选项,支持>, <, >=, <=, =

这些选项之间是与关系,选项内部是或关系。比如: {"locate": ["北京市"], "osversion": ["4.0.4", "2.2.1"]} 给在北京市且 (用户手机版本为4.0.4或2.2.1)的用户发送消息

请求示例:

a.给appkey为1425830916的应用,tag同时包括1,2,3(与关系)的用户推送内容为hello,world的消息,消息的存活周期为1000秒

curl -H "Content-type: application/json"  -d  '{"appkey": "1425830916", "filter": [1, 2, 3], "message": "hello,world", "period": 1000, 
"sign": "812200c17cfd4fcbad973f47385ab4fe"}' http://androidmis.ixintui.com:8001/push

使用filter_v2参数为:

curl -H "Content-type: application/json"  -d  '{"appkey": "1425830916", "filter_v2": [[1, 2, 3]], "message": "beijing abcdt1421308132.2", 
"sign": "e2d422e3cffbe4bc3b7a2607263c8259"}' http://androidmis.ixintui.com:8001/push

b.给appkey为1425830916的应用,tag同时包括1,2,3(与关系) 或 同时包含2,7的用户推送内容为hello,world的消息,消息的存活周期为1000秒

curl -H "Content-type: application/json"  -d  '{"appkey": "1425830916", "filter_v2": [[1, 2, 3], [2, 7]], "message": "beijing abcdt1421308049.09", 
"sign": "19a012bd6a2672c00eb7650d0ef62099"}' http://androidmis.ixintui.com:8001/push

c. 给appkey为1425830916的应用,地域为北京市和上海且应用版本为1.0和2.0且渠道为91的用户发送消息

curl -H "Content-type: application/json"  -d  '{"appkey": "1425830916", "optfilter": {"locate": ["\u5317\u4eac\u5e02", "\u4e0a\u6d77\u5e02"], "appversion": ["1.0", "2.0"],
 "channel": ["91"]}, "message": "beijing abcdt1421308397.16", "sign": "bb8126ea79caa35364e7d0a307e769e4"}' http://androidmis.ixintui.com:8001/push

d. 给appkey为1425830916的应用, tag同时包含1,2 或同时包含4,5,且渠道为91的用户发送消息:

curl -H "Content-type: application/json"  -d  '{"appkey": "1425830916", "filter_v2": [[1, 2], [4, 5]], "message": "beijing abcdt1421308690.5", 
"optfilter": {"channel": ["91"]}, "sign": "3912f7f3d11ce5446cdace48acc92c27"}' http://androidmis.ixintui.com:8001/push

e. 给appkey为1425830916的应用,在1天内打开次数大于等于10次的用户发消息

curl -H "Content-type: application/json"  -d  '{"appkey": "1425830916", "optfilter": {"activity_1": {">=": 10}}, "message": "hello", 
"sign": "db4795a26f91dc502d00b3b664a6d6c8"}' http://androidmis.ixintui.com:8001/push

f.给appkey为1425830916的应用,在30天内未打开应用的用户发送消息

curl -H "Content-type: application/json"  -d  '{"appkey": "1425830916", "optfilter": {"activity_30": {"=": 0}}, "message": "hello", 
"sign": "8e0eea8e802091f8903fa0ba5da66556"}' http://androidmis.ixintui.com:8001/push

g.给appkey为1425830916的应用,在7天内未打开,在30天内打开次数小于等于30的用户发送消息

curl -H "Content-type: application/json"  -d  '{"appkey": "1425830916", "optfilter": {"activity_7": {"=": 0}, "activity_30": {"<=": 30}}, "message": "hello", 
"sign": "95e6bcc89ae2c1872df7119444b662e9"}' http://androidmis.ixintui.com:8001/push

2.5 定时消息发送接口

该接口可以将消息发给ixintui服务器,服务器在用户设定的时间将消息推给用户。定时消息可以发送消息的定时区间为3天以内,10分钟以后,精度为分钟

接口 time_msg
方法 POST
参数列表(其他参数见参数列表):
参数名字 类型 是否必须 描述
send_time string 消息的定时发送时间

send_time 的格式必须按照%Y-%m-%d %H:%M的格式(eg. 2014-09-05 14:05), 时间必须是在10分钟以后

请求示例:

给appkey为1425830916的应用,定时在2014-09-05 12:10推送内容为hello,world的广播消息 ,请求如下:

curl -H "Content-type: application/json" -d '{"appkey": "1425830916", "sound": true, "unremovable": false, "extra": "我是要成为海贼王的男人", 
"title": "", "period": 100000, "vibrate": true, "sign": "e5ffacde44cce57a7483489b6d41af1a", "qps": 0, "is_notif": "1", 
"intent": "http://www.ixintui.com", "send_time": "2014-09-05 11:46", "click_action": "intent",
 "message": "定时广播消息 2014-09-05 11:16:54 1425830916 2014-09-05 11:46"}'  http://androidmis.ixintui.com:8001/timed_msg

返回值:

{
    "desc": "ok", 
    "result": 0, 
    "task_key": "1409888760@37_1425830916_B"
}

task_key 用来取消定时消息使用

2.6 定时消息取消接口

该接口用来取消未发送的定时消息,调用该接口的时间,必须得在消息未发送之前调用

接口 time_msg
方法 DELETE

参数列表:

参数名字 类型 是否必须 描述
appkey string appkey
task_key string 定时消息返回的taskkey
sign string 签名(计算见1.4)

请求示例:

curl  -H "Content-type: application/json" -X DELETE  -d '{"appkey": "1425830916", "sign": "f2facbf99bf25d262fd8caaa39252b29", 
"task_key": "1409888760@37_1425830916_B"}' http://androidmis.ixintui.com:8001/timed_msg

返回值:

{
    "desc": "ok",
    "result": 0,
}

2.7 点播多token或多alias接口

a. 多token接口
token的参数为list,最多支持1000个token,token可以重复,若token重复,代表给该用户发送多次。

请求示例:

给appkey为1425830916的应用,用户标识为148716877573942334,234718762339423323,2351387552312382739,2351387552312382739的用户推送消息,内容为hello, world,消息的生存周期为1000秒。(2351387552312382739将收到两次该消息,因为token列表中它出现两次)

curl -H "Content-type: application/json" -d  '{"appkey": "1425830916", "is_notif": "0", "period": 100000, "sign": "42ecba2cd66ebe10022ad1d7fc04e7ec", "token": ["148716877573942334", "234718762339423323", "2351387552312382739", "2351387552312382739"], "qps": 10000, "message": "hello,world"}' http://androidmis.ixintui.com:8001/push

返回值:

{
  "result": 0,
  "desc": "",
  "details": [
    {
      "desc": "token not found",
      "msgid": 0,
      "pos": 0,
      "result": 401,
      "token": "148716877573942334"
    },
    {
      "desc": "token not found",
      "msgid": 0,
      "pos": 1,
      "result": 401,
      "token": "234718762339423323"
    },
    {
      "desc": "OK",
      "msgid": 94621924,
      "pos": 2,
      "result": 0,
      "token": "2351387552312382739"
    },
    {
      "desc": "OK",
      "msgid": 94621927,
      "pos": 3,
      "result": 0,
      "token": "2351387552312382739"
    }
  ]
}

返回值说明, result字段表明本次请求是否成功, desc对结果进行描述,details中对每个token的结果进行说明,指明每个token是否成功, 其中msgid表明该消息的id, pos指明该token在token发送列表中的位置。

b. 多alias接口

alias的参数为list,最多支持1000个token,alias可以重复,若alias重复,则只发送一次。

请求示例:

给appkey为1425830916的应用,用户标识为buker1, burke2, burke3的用户推送消息,内容为hello, world,消息的生存周期为1000秒。

curl -H "Content-type: application/json" -d  '{"appkey": "1425830916", "is_notif": "0", "period": 100000, "sign": "f91f51c2c20da9d5d3844254e4b669c9", "alias": ["burke1", "burke2", "burke3"], "qps": 10000, "message": "hello,world"}' http://androidmis.ixintui.com:8001/push

返回值:

{
  "result": 0,
  "details": [
    {
      "alias": "burke1", 
      "fail_num": 0, 
      "succ_num": 1 
    }, 
    {
      "alias": "burke2", 
      "fail_num": 0, 
      "succ_num": 0
    }, 
    {
      "alias": "burke3", 
      "fail_num": 0, 
      "succ_num": 0
    }
  ], 
  "desc": "" 
}

返回值说明, result字段表明本次请求是否成功, desc对结果进行描述,
details中对每个alias的结果进行说明,指明每个alias的发送结果。

2.8 广播消息取消接口

已经发送的广播消息,若广播消息用户还未收到,可以调用该接口来取消消息,这样未收到该消息的用户将不会在收到该消息。比如,发送了一个广播消息,已经有1000个用户收到,但还有900000个用户没有收到,可以调用该接口,这样未收到该消息的用户将不在接收该消息。说明: 新注册的用户不会收到注册之前的消息,比如,在产品发版之前发送了一些广播消息,但发版后,新用户将不会收到之前的测试时的广播消息,不用来调用该接口来取消。

参数列表

参数名字 类型 是否必须 描述
appkey string app唯一标识
msgid uint64 要取消的消息id
sign string 签名(计算见1.4)

请求示例:

curl -H 'Content-type: application/json' -X DELETE -d '{"appkey": "1425830916", "msgid": "9", "sign": "c4a090f94acbfcd9789c6a1e0f4f9942"}' http://push.ixintui.com:8001/push

返回值:

{
  "desc": "cancel succ",
  "result": 0,
}

2.9 获取点播消息的接收信息

该接口获取指定应用发送的所有点播信息的接收信息,每次返回从指定位置开始的最多1000条记录,每条记录包含已经确认接收消息的token及点播消息id(该ID为发送消息时我方返回的ID)。
使用该接口需要注意的地方:

  • 服务器只保留两天的消息接收信息,起始时间点从用户收到消息的时间点算起(非消息发送时间)
  • 接收信息获取有15分钟延迟 ,即用户收到信息后15分钟后,才能通过该接口获取的该消息的接收情况。比如手机用户在16:00接收的消息,16:15分可以通过本接口获取到该信息的接收信息。
  • 如需获取指定消息ID的接收信息,用户需要持续读取接收信息,并从中过滤出自己需要的消息ID;为防止丢失特定消息的接收信息,读取持续时间应比消息存活期长至少15分钟;
  • 该接口可以多次重复调用,使用同一个位置信息,可以重复读取已读取的接收信息;
  • 该接口对应用默认不开放,如需使用,请联系我们。

调用地址: http://androidmis.ixintui.com:8001/getAckInfo
接口的输入/输出均为json格式,请求数据格式见1.2 部分

参数列表

参数名字 类型 是否必须 描述
appkey string app唯一标识
示例 string 上次获取ACK的位置,第一次请求设为0即可
示例 string 签名(计算见1.4)
reqno int 每次返回的个数, 默认值1000,取值范围(0,1000]

请求示例:

curl -H 'Content-type: application/json' -X POST -d '{"reqno": 3, "appkey": "1425830916", "pos": 0, "sign": "ba0eb5b71d9b127e5c660ab1f39d4aac"}' http://androidmis.ixintui.com:8001/getAckInfo

响应示例:

{ 
  "ack_info_list": [ 
    { 
      "msgid": 650041232, 
      "token": "6562110519428123318" 
    }, 
    { 
      "msgid": 650143110, 
      "token": "97583663092345565" 
    }, 
    { 
      "msgid": 650143739, 
      "token": "219874452234413458" 
    }
  ], 
  "desc": "OK", 
  "has_more": true, 
  "pos": "201412291100@0@3", 
  "result": 0 
}

调用方式:
a 第一次将pos设为0,并设定reqno(如无该参数,默认为1000)发送请求,保存获取的结果中的pos
b.判断返回结果中的result字段, 如果为0继续,否则表示请求失败,请根据返回的desc描述信息来判断原因。
c.检查返回结果中的has_more字段,如为true,则表示还有数据需要继续请求,之后的请求将上次请求的返回结果中取出pos,作为本次请求返回的pos字段的值,再次请求;否则,即所有当前接收消息已经获取完毕,建议等待30秒后,用本次请求返回的pos字段再次请求

python示例代码:

import urllib2
import json
import hashlib
import sys

def send_message(data_str):
    req = urllib2.Request("http://androidmis.ixintui.com:8001/getAckInfo")
    req.add_header("Content-Type", "application/json")
    response = urllib2.urlopen(req, data_str)
    html = response.read()
    response.close()
    return html

def add_sign(jsondata, secret_key):
    strdata = json.dumps(jsondata, ensure_ascii=False, encoding='utf8', separators=(',',':'), sort_keys=True)
    m = "{s}{p}".format(s=strdata, p=secret_key.strip())
    newSign = hashlib.md5(m).hexdigest()
    jsondata["sign"] = newSign
    return json.dumps(jsondata)

appkey="1425830916"
secret_key="7sbKpsq5LhnFk4SYeVYLdBMcDKBXMfaMqUDSm2OgzOTS9c2Uze6Q9DOXOZU50wqL"

pos = 0

i=0
while True:
    try:
        jsondata = dict(appkey=appkey, pos=pos)
        jsondata["reqno"] =  3
        data = add_sign(jsondata, secret_key)
        res = send_message(data)
        print res
        res_json = json.loads(res)
        result = res_json["result"]
        if result != 0:
            desc = res_json["desc"]
            print "error happend result[{r}] desc[{d}]".format(r=result, d=desc)
            break
        ack_info_list = res_json["ack_info_list"]
        for ack_info in ack_info_list:
            msgid = ack_info["msgid"]
            token = ack_info["token"]
            #print msgid,token
        has_more = res_json["has_more"]
        if not has_more:
            print "all ack has fetch"
            break
        pos = res_json["pos"]
    except Exception,e:
        print "exception happend e[{e}]".format(e=e)
        break

3 示例程序

3.1 将数据添加sign的示例程序

java版签名算法DEMO
php版(<5.4)签名算法DEMO
php版(>=5.4)签名算法DEMO
js版签名算法DEMO

执行:

python  get_data.py  '7sbKpsq5LhnFk4SYeVYLdBMcDKBXMfaMqUDSm2OgzOTS9c2Uze6Q9DOXOZU50wqL'  '{"appkey": "1425830916",  "sign": "100","message": "hello,world", "period": 1000, "filter":[1,2,3]}'

输出:

{"appkey": "1425830916", "filter": [1, 2, 3], "message": "hello,world", "period": 1000, "sign": "812200c17cfd4fcbad973f47385ab4fe"}

get_data.py 程序

import hashlib
import json
import sys
reload(sys)
sys.setdefaultencoding("utf8") 

if len(sys.argv) != 3:
    print "USAGE:",sys.argv[0]," secret_key jsondata"
    sys.exit(1)
private_key=sys.argv[1]
str=sys.argv[2]
try:
    jsondata=json.loads(str);
    if jsondata.has_key("sign"):
        del jsondata["sign"]
    strdata = json.dumps(jsondata, ensure_ascii=False, encoding="utf8", separators=(",",":"), sort_keys=True)
    newSign = hashlib.md5(strdata + private_key).hexdigest()
except Exception, e:
    print "data must be json"
    sys.exit(2)
jsondata["sign"] = newSign
print json.dumps(jsondata)

3.2 发送带声音的消息

执行 python message.py 如下:

#-*- coding:utf-8 -*-
import json
import hashlib
import sys
reload(sys)
sys.setdefaultencoding("utf8")

appkey="1590588220"
secret_key="rVkOj9uO9fDqX0IYDzwhMXsgThV8euGbPspH1bWS0OniD1wNFjzQ15h0gWxmEsbC"
message = "这个是广播消息"
is_notif="1"
period = 1000
qps = 10000

filter=""

#notif info only  is_notif = 1
title = "广播消息"
title = title.encode("utf-8")

sound = True
vibrate = True
unremovable = True
click_action = "open_url"
open_url = "http://www.ixintui.com"
extra="我是要成为海贼王的男人"
message=dict(appkey=appkey, message=message, is_notif=is_notif, period=period, qps=qps)

if is_notif == "1":
    message["title"] = title
    message["sound"] = sound
    message["vibrate"] = vibrate
    message["unremovable"] = unremovable
    message["click_action"] = click_action
    message["open_url"] = open_url
    message["extra"] = extra
str=json.dumps(message,ensure_ascii=False, encoding="utf8");
try:
    jsondata=json.loads(str);
    if jsondata.has_key("sign"):
        del jsondata["sign"]
    strdata = json.dumps(jsondata, ensure_ascii=False, encoding="utf8", separators=(",",":"), sort_keys=True)
    newSign = hashlib.md5(strdata + secret_key).hexdigest()
except "ValueFormatError":
    print "data must be json"
    sys.exit(2)
jsondata["sign"] = newSign
print json.dumps(jsondata, message,ensure_ascii=False, encoding="utf8");

响应:

{"appkey": "1590588220", "sound": true, "open_url": "http://www.ixintui.com", "unremovable": true, "extra": "我是要成为海贼王的男人", "title": "广播消息",
 "period": 1000, "vibrate": true, "sign": "794e5f5cbbc1492d86997d4aff1cf083", "is_notif": "1", "qps": 10000, "click_action": "open_url", "message": "这个是广播消息"}

3.3 完整的python发送消息示例

执行

python send_message.py 1425830916  7sbKpsq5LhnFk4SYeVYLdBMcDKBXMfaMqUDSm2OgzOTS9c2Uze6Q9DOXOZU50wqL
#-*- coding:utf-8 -*-
import urllib2
import json
import hashlib
import time
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

def send_message(data_str):
    req = urllib2.Request("http://androidmis.ixintui.com:8001/push")
    req.add_header("Content-Type", "application/json")
    print data_str
    response = urllib2.urlopen(req, data_str)
    html = response.read()
    response.close()
    return html

def add_sign(jsondata, secret_key):
    strdata = json.dumps(jsondata, ensure_ascii=False, encoding="utf8", separators=(",",":"), sort_keys=True)
    m = "{s}{p}".format(s=strdata, p=secret_key.strip())
    newSign = hashlib.md5(m).hexdigest()
    jsondata["sign"] = newSign
    return json.dumps(jsondata)

if len(sys.argv) != 3:
    print "USAGE: {} appkey secret_key".format(sys.argv[0])
    sys.exit(-1)

appkey=sys.argv[1]
secret_key=sys.argv[2]

try:
    jsondata = dict(appkey=appkey, message="这里是消息内容")
    jsondata["is_notif"] = 1
    jsondata["title"] = "这是标题"
    jsondata["sound"] = True
    jsondata["vibrate"] = True
    jsondata["unremovable"] = False
    jsondata["click_action"] = "open_url"
    jsondata["open_url"] = "http://www.ixintui.com"
    jsondata["extra"] = "extra data"

    data = add_sign(jsondata, secret_key)
    res = send_message(data)
    print res
except Exception,e:
    print "exception happend e[{e}]".format(e=e)

响应:

{
  "desc": "OK",
  "msgid": 19,
  "result": 0
}

附录:

1.optfilter中 地域 选项的取值范围

上海市
云南省
内蒙古自治区
北京市
台湾省
吉林省
四川省
天津市
宁夏回族自治区
安徽省
山东省
山西省
广东省
广西壮族自治区
新疆维吾尔自治区
江苏省
江西省
河北省
河南省
浙江省
海南省
湖北省
湖南省
澳门特别行政区
甘肃省
福建省
西藏自治区
贵州省
辽宁省
重庆市
陕西省
青海省
香港特别行政区
黑龙江省

2.optfilter中 运营商 选项的取值范围 因为手机提供的运营商的标识各种各样,我们对运营商进行了转换,对未覆盖的需要使用原始的字符串才能匹配

运营商 对应取值
中国移动 cm
中国电信 ct
中国联通 cu
阿里通信 aliall
京东通信 jd
U.S. Cellular us-cellular

我们将很多中国移动的子品牌(例如全球通、中国移动4G、G3伴侣等)也转换成了cm,同理中国联通的子品牌转换成cu, 中国电信的子品牌转成成了ct,在此不再一一列举,如需帮助,请联系我们