[backcolor=transparent]3. 接收消息示例程序
通过 HTTP 协议接收消息,请参考以下示例代码。
- [backcolor=transparent]#encoding:utf-8
- [backcolor=transparent]import[backcolor=transparent] [backcolor=transparent]ConfigParser
- [backcolor=transparent]import[backcolor=transparent] httplib
- [backcolor=transparent]import[backcolor=transparent] json
- [backcolor=transparent]import[backcolor=transparent] time
- [backcolor=transparent]from[backcolor=transparent] urlparse [backcolor=transparent]import[backcolor=transparent] urlparse
- [backcolor=transparent]from[backcolor=transparent] [backcolor=transparent]Util[backcolor=transparent] [backcolor=transparent]import[backcolor=transparent] parseURL[backcolor=transparent],[backcolor=transparent]calSignature
- [backcolor=transparent]"""
- [backcolor=transparent]消息订阅者
- [backcolor=transparent]"""
- [backcolor=transparent]class[backcolor=transparent] [backcolor=transparent]HttpConsumer[backcolor=transparent]([backcolor=transparent]object[backcolor=transparent]):
- [backcolor=transparent] [backcolor=transparent]def[backcolor=transparent] __init__[backcolor=transparent]([backcolor=transparent]self[backcolor=transparent]):
- [backcolor=transparent] [backcolor=transparent]"""签名字段"""
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]signature [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"Signature"
- [backcolor=transparent] [backcolor=transparent]"""Consumer ID"""
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]consumerid [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"ConsumerID"
- [backcolor=transparent] [backcolor=transparent]"""消费主题"""
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]topic [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"Topic"
- [backcolor=transparent] [backcolor=transparent]"""访问码"""
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]ak [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"AccessKey"
- [backcolor=transparent] [backcolor=transparent]"""配置文件解析器"""
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]cf [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]ConfigParser[backcolor=transparent].[backcolor=transparent]ConfigParser[backcolor=transparent]()
- [backcolor=transparent] [backcolor=transparent]"""
- [backcolor=transparent] 订阅消息流程
- [backcolor=transparent] """
- [backcolor=transparent] [backcolor=transparent]def[backcolor=transparent] process[backcolor=transparent]([backcolor=transparent]self[backcolor=transparent]):
- [backcolor=transparent] [backcolor=transparent]"""开始读取配置文件"""
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]cf[backcolor=transparent].[backcolor=transparent]read[backcolor=transparent]([backcolor=transparent]"user.properties"[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]"""读取主题"""
- [backcolor=transparent] topic [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]cf[backcolor=transparent].[backcolor=transparent]get[backcolor=transparent]([backcolor=transparent]"property"[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]"Topic"[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]"""存储消息的URL路径"""
- [backcolor=transparent] url [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]cf[backcolor=transparent].[backcolor=transparent]get[backcolor=transparent]([backcolor=transparent]"property"[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]"URL"[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]"""访问码"""
- [backcolor=transparent] ak [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]cf[backcolor=transparent].[backcolor=transparent]get[backcolor=transparent]([backcolor=transparent]"property"[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]"Ak"[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]"""密钥"""
- [backcolor=transparent] sk [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]cf[backcolor=transparent].[backcolor=transparent]get[backcolor=transparent]([backcolor=transparent]"property"[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]"Sk"[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]"""Consumer ID"""
- [backcolor=transparent] cid [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]cf[backcolor=transparent].[backcolor=transparent]get[backcolor=transparent]([backcolor=transparent]"property"[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]"ConsumerID"[backcolor=transparent])
- [backcolor=transparent] newline [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"\n"
- [backcolor=transparent] [backcolor=transparent]"""获取URL主机域名地址"""
- [backcolor=transparent] urlname [backcolor=transparent]=[backcolor=transparent] urlparse[backcolor=transparent]([backcolor=transparent]url[backcolor=transparent]).[backcolor=transparent]hostname
- [backcolor=transparent] [backcolor=transparent]"""连接存储消息的服务器"""
- [backcolor=transparent] conn [backcolor=transparent]=[backcolor=transparent] httplib[backcolor=transparent].[backcolor=transparent]HTTPConnection[backcolor=transparent]([backcolor=transparent]parseURL[backcolor=transparent]([backcolor=transparent]urlname[backcolor=transparent]))
- [backcolor=transparent] [backcolor=transparent]while[backcolor=transparent] [backcolor=transparent]True[backcolor=transparent]:
- [backcolor=transparent] [backcolor=transparent]try[backcolor=transparent]:
- [backcolor=transparent] [backcolor=transparent]"""时间戳"""
- [backcolor=transparent] date [backcolor=transparent]=[backcolor=transparent] repr[backcolor=transparent]([backcolor=transparent]int[backcolor=transparent]([backcolor=transparent]time[backcolor=transparent].[backcolor=transparent]time[backcolor=transparent]()[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent] [backcolor=transparent]1000[backcolor=transparent]))[[backcolor=transparent]0[backcolor=transparent]:[backcolor=transparent]13[backcolor=transparent]]
- [backcolor=transparent] [backcolor=transparent]"""构造签名字符串"""
- [backcolor=transparent] signString [backcolor=transparent]=[backcolor=transparent] topic [backcolor=transparent]+[backcolor=transparent] newline [backcolor=transparent]+[backcolor=transparent] cid [backcolor=transparent]+[backcolor=transparent] newline [backcolor=transparent]+[backcolor=transparent] date
- [backcolor=transparent] [backcolor=transparent]"""计算签名值"""
- [backcolor=transparent] sign [backcolor=transparent]=[backcolor=transparent] calSignature[backcolor=transparent]([backcolor=transparent]signString[backcolor=transparent],[backcolor=transparent]sk[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]"""请求消息HTTP头部"""
- [backcolor=transparent] headers [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]signature [backcolor=transparent]:[backcolor=transparent] sign[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]ak [backcolor=transparent]:[backcolor=transparent] ak[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]consumerid [backcolor=transparent]:[backcolor=transparent] cid
- [backcolor=transparent] [backcolor=transparent]}
- [backcolor=transparent] [backcolor=transparent]"""开始发送获取消息的HTTP请求"""
- [backcolor=transparent] conn[backcolor=transparent].[backcolor=transparent]request[backcolor=transparent]([backcolor=transparent]method[backcolor=transparent]=[backcolor=transparent]"GET"[backcolor=transparent],[backcolor=transparent]url[backcolor=transparent]=[backcolor=transparent]url[backcolor=transparent]+[backcolor=transparent]"/message/?topic="[backcolor=transparent]+[backcolor=transparent]topic[backcolor=transparent]+[backcolor=transparent]"&time="[backcolor=transparent]+[backcolor=transparent]date[backcolor=transparent]+[backcolor=transparent]"&num=32"[backcolor=transparent],[backcolor=transparent]headers[backcolor=transparent]=[backcolor=transparent]headers[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]"""获取HTTP应答消息"""
- [backcolor=transparent] response [backcolor=transparent]=[backcolor=transparent] conn[backcolor=transparent].[backcolor=transparent]getresponse[backcolor=transparent]()
- [backcolor=transparent] [backcolor=transparent]"""验证应答消息状态值"""
- [backcolor=transparent] [backcolor=transparent]if[backcolor=transparent] response[backcolor=transparent].[backcolor=transparent]status [backcolor=transparent]!=[backcolor=transparent] [backcolor=transparent]200[backcolor=transparent]:
- [backcolor=transparent] [backcolor=transparent]continue
- [backcolor=transparent] [backcolor=transparent]"""从应答消息中读取实际的消息内容"""
- [backcolor=transparent] msg [backcolor=transparent]=[backcolor=transparent] response[backcolor=transparent].[backcolor=transparent]read[backcolor=transparent]()
- [backcolor=transparent] [backcolor=transparent]"""将实际的消费消息进行解码"""
- [backcolor=transparent] messages [backcolor=transparent]=[backcolor=transparent] json[backcolor=transparent].[backcolor=transparent]loads[backcolor=transparent]([backcolor=transparent]msg[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]if[backcolor=transparent] len[backcolor=transparent]([backcolor=transparent]messages[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]==[backcolor=transparent] [backcolor=transparent]0[backcolor=transparent]:
- [backcolor=transparent] time[backcolor=transparent].[backcolor=transparent]sleep[backcolor=transparent]([backcolor=transparent]2[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]continue
- [backcolor=transparent] [backcolor=transparent]"""依次获取每条消费消息"""
- [backcolor=transparent] [backcolor=transparent]for[backcolor=transparent] message [backcolor=transparent]in[backcolor=transparent] messages[backcolor=transparent]:
- [backcolor=transparent] [backcolor=transparent]"""计算时间戳"""
- [backcolor=transparent] date [backcolor=transparent]=[backcolor=transparent] repr[backcolor=transparent]([backcolor=transparent]int[backcolor=transparent]([backcolor=transparent]time[backcolor=transparent].[backcolor=transparent]time[backcolor=transparent]()[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent] [backcolor=transparent]1000[backcolor=transparent]))[[backcolor=transparent]0[backcolor=transparent]:[backcolor=transparent]13[backcolor=transparent]]
- [backcolor=transparent] [backcolor=transparent]"""构建删除消费消息URL路径"""
- [backcolor=transparent] delUrl [backcolor=transparent]=[backcolor=transparent] url [backcolor=transparent]+[backcolor=transparent] [backcolor=transparent]"/message/?msgHandle="[backcolor=transparent]+[backcolor=transparent]message[backcolor=transparent][[backcolor=transparent]'msgHandle'[backcolor=transparent]][backcolor=transparent] [backcolor=transparent]+[backcolor=transparent] [backcolor=transparent]"&topic="[backcolor=transparent]+[backcolor=transparent]topic[backcolor=transparent]+[backcolor=transparent]"&time="[backcolor=transparent]+[backcolor=transparent]date
- [backcolor=transparent] [backcolor=transparent]"""构造签名字符串"""
- [backcolor=transparent] signString [backcolor=transparent]=[backcolor=transparent] topic [backcolor=transparent]+[backcolor=transparent] newline [backcolor=transparent]+[backcolor=transparent] cid [backcolor=transparent]+[backcolor=transparent] newline [backcolor=transparent]+[backcolor=transparent] message[backcolor=transparent][[backcolor=transparent]'msgHandle'[backcolor=transparent]][backcolor=transparent] [backcolor=transparent]+[backcolor=transparent] newline [backcolor=transparent]+[backcolor=transparent] date
- [backcolor=transparent] [backcolor=transparent]"""进行签名"""
- [backcolor=transparent] sign [backcolor=transparent]=[backcolor=transparent] calSignature[backcolor=transparent]([backcolor=transparent]signString[backcolor=transparent],[backcolor=transparent]sk[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]"""构造删除消费消息HTTP头部"""
- [backcolor=transparent] delheaders [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]signature [backcolor=transparent]:[backcolor=transparent] sign[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]ak [backcolor=transparent]:[backcolor=transparent] ak[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]consumerid [backcolor=transparent]:[backcolor=transparent] cid[backcolor=transparent],
- [backcolor=transparent] [backcolor=transparent]}
- [backcolor=transparent] [backcolor=transparent]"""发送删除消息请求"""
- [backcolor=transparent] conn[backcolor=transparent].[backcolor=transparent]request[backcolor=transparent]([backcolor=transparent]method[backcolor=transparent]=[backcolor=transparent]"DELETE"[backcolor=transparent],[backcolor=transparent] url[backcolor=transparent]=[backcolor=transparent]delUrl[backcolor=transparent],[backcolor=transparent] headers[backcolor=transparent]=[backcolor=transparent]delheaders[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]"""获取请求应答"""
- [backcolor=transparent] response [backcolor=transparent]=[backcolor=transparent] conn[backcolor=transparent].[backcolor=transparent]getresponse[backcolor=transparent]()
- [backcolor=transparent] [backcolor=transparent]"""读取应答内容"""
- [backcolor=transparent] msg [backcolor=transparent]=[backcolor=transparent] response[backcolor=transparent].[backcolor=transparent]read[backcolor=transparent]()
- [backcolor=transparent] [backcolor=transparent]print[backcolor=transparent] [backcolor=transparent]"delete msg:"[backcolor=transparent]+[backcolor=transparent]msg
- [backcolor=transparent] [backcolor=transparent]except[backcolor=transparent] [backcolor=transparent]Exception[backcolor=transparent],[backcolor=transparent]e[backcolor=transparent]:
- [backcolor=transparent] [backcolor=transparent]print[backcolor=transparent] e
- [backcolor=transparent] conn[backcolor=transparent].[backcolor=transparent]close[backcolor=transparent]()
- [backcolor=transparent]"""启动入口"""
- [backcolor=transparent]if[backcolor=transparent] __name__ [backcolor=transparent]==[backcolor=transparent] [backcolor=transparent]'__main__'[backcolor=transparent]:
- [backcolor=transparent] [backcolor=transparent]"""构造消息订阅者"""
- [backcolor=transparent] consumer [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]HttpConsumer[backcolor=transparent]()
- [backcolor=transparent] [backcolor=transparent]"""开始启动消息订阅者"""
- [backcolor=transparent] consumer[backcolor=transparent].[backcolor=transparent]process[backcolor=transparent]()
[backcolor=transparent]4. 工具方法示例程序
以下为示例中使用的工具方法。
- [backcolor=transparent]#encoding:utf-8
- [backcolor=transparent]import[backcolor=transparent] socket
- [backcolor=transparent]import[backcolor=transparent] hmac
- [backcolor=transparent]from[backcolor=transparent] hashlib [backcolor=transparent]import[backcolor=transparent] sha1
- [backcolor=transparent]"""
- [backcolor=transparent]解析URL
- [backcolor=transparent]"""
- [backcolor=transparent]def[backcolor=transparent] parseURL[backcolor=transparent]([backcolor=transparent]url[backcolor=transparent]):
- [backcolor=transparent] iplist [backcolor=transparent]=[backcolor=transparent] socket[backcolor=transparent].[backcolor=transparent]gethostbyname_ex[backcolor=transparent]([backcolor=transparent]url[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]if[backcolor=transparent] len[backcolor=transparent]([backcolor=transparent]iplist[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]==[backcolor=transparent] [backcolor=transparent]0[backcolor=transparent]:
- [backcolor=transparent] [backcolor=transparent]return[backcolor=transparent] [backcolor=transparent]None
- [backcolor=transparent] ips [backcolor=transparent]=[backcolor=transparent] iplist[backcolor=transparent][[backcolor=transparent]2[backcolor=transparent]]
- [backcolor=transparent] [backcolor=transparent]if[backcolor=transparent] len[backcolor=transparent]([backcolor=transparent]ips[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]==[backcolor=transparent] [backcolor=transparent]0[backcolor=transparent]:
- [backcolor=transparent] [backcolor=transparent]return[backcolor=transparent] [backcolor=transparent]None
- [backcolor=transparent] [backcolor=transparent]return[backcolor=transparent] ips[backcolor=transparent][[backcolor=transparent]0[backcolor=transparent]]
- [backcolor=transparent]"""
- [backcolor=transparent]认证签名
- [backcolor=transparent]"""
- [backcolor=transparent]def[backcolor=transparent] calSignature[backcolor=transparent]([backcolor=transparent]signString[backcolor=transparent],[backcolor=transparent] sk[backcolor=transparent]):
- [backcolor=transparent] mac [backcolor=transparent]=[backcolor=transparent] hmac[backcolor=transparent].[backcolor=transparent]new[backcolor=transparent]([backcolor=transparent]sk[backcolor=transparent],[backcolor=transparent] signString[backcolor=transparent],[backcolor=transparent] sha1[backcolor=transparent])
- [backcolor=transparent] [backcolor=transparent]return[backcolor=transparent] mac[backcolor=transparent].[backcolor=transparent]digest[backcolor=transparent]().[backcolor=transparent]encode[backcolor=transparent]([backcolor=transparent]'base64'[backcolor=transparent]).[backcolor=transparent]rstrip[backcolor=transparent]()