开发者社区 问答 正文

使用HTTP 接入Python 收发消息如何实现?(2)


[backcolor=transparent]3. 接收消息示例程序
通过 HTTP 协议接收消息,请参考以下示例代码。

  1. [backcolor=transparent]#encoding:utf-8
  2. [backcolor=transparent]import[backcolor=transparent] [backcolor=transparent]ConfigParser
  3. [backcolor=transparent]import[backcolor=transparent] httplib
  4. [backcolor=transparent]import[backcolor=transparent] json
  5. [backcolor=transparent]import[backcolor=transparent] time
  6. [backcolor=transparent]from[backcolor=transparent] urlparse [backcolor=transparent]import[backcolor=transparent] urlparse
  7. [backcolor=transparent]from[backcolor=transparent] [backcolor=transparent]Util[backcolor=transparent] [backcolor=transparent]import[backcolor=transparent] parseURL[backcolor=transparent],[backcolor=transparent]calSignature
  8. [backcolor=transparent]"""
  9. [backcolor=transparent]消息订阅者
  10. [backcolor=transparent]"""
  11. [backcolor=transparent]class[backcolor=transparent] [backcolor=transparent]HttpConsumer[backcolor=transparent]([backcolor=transparent]object[backcolor=transparent]):
  12. [backcolor=transparent]        [backcolor=transparent]def[backcolor=transparent] __init__[backcolor=transparent]([backcolor=transparent]self[backcolor=transparent]):
  13. [backcolor=transparent]        [backcolor=transparent]"""签名字段"""
  14. [backcolor=transparent]        [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]signature [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"Signature"
  15. [backcolor=transparent]        [backcolor=transparent]"""Consumer ID"""
  16. [backcolor=transparent]        [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]consumerid [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"ConsumerID"
  17. [backcolor=transparent]        [backcolor=transparent]"""消费主题"""
  18. [backcolor=transparent]        [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]topic [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"Topic"
  19. [backcolor=transparent]        [backcolor=transparent]"""访问码"""
  20. [backcolor=transparent]        [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]ak [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"AccessKey"
  21. [backcolor=transparent]        [backcolor=transparent]"""配置文件解析器"""
  22. [backcolor=transparent]        [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]cf [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]ConfigParser[backcolor=transparent].[backcolor=transparent]ConfigParser[backcolor=transparent]()
  23. [backcolor=transparent]    [backcolor=transparent]"""
  24. [backcolor=transparent]    订阅消息流程
  25. [backcolor=transparent]    """
  26. [backcolor=transparent]    [backcolor=transparent]def[backcolor=transparent] process[backcolor=transparent]([backcolor=transparent]self[backcolor=transparent]):
  27. [backcolor=transparent]        [backcolor=transparent]"""开始读取配置文件"""
  28. [backcolor=transparent]        [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]cf[backcolor=transparent].[backcolor=transparent]read[backcolor=transparent]([backcolor=transparent]"user.properties"[backcolor=transparent])
  29. [backcolor=transparent]        [backcolor=transparent]"""读取主题"""
  30. [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])
  31. [backcolor=transparent]        [backcolor=transparent]"""存储消息的URL路径"""
  32. [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])
  33. [backcolor=transparent]        [backcolor=transparent]"""访问码"""
  34. [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])
  35. [backcolor=transparent]        [backcolor=transparent]"""密钥"""
  36. [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])
  37. [backcolor=transparent]        [backcolor=transparent]"""Consumer ID"""
  38. [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])
  39. [backcolor=transparent]        newline [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]"\n"
  40. [backcolor=transparent]        [backcolor=transparent]"""获取URL主机域名地址"""
  41. [backcolor=transparent]        urlname [backcolor=transparent]=[backcolor=transparent] urlparse[backcolor=transparent]([backcolor=transparent]url[backcolor=transparent]).[backcolor=transparent]hostname
  42. [backcolor=transparent]        [backcolor=transparent]"""连接存储消息的服务器"""
  43. [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]))
  44. [backcolor=transparent]        [backcolor=transparent]while[backcolor=transparent] [backcolor=transparent]True[backcolor=transparent]:
  45. [backcolor=transparent]            [backcolor=transparent]try[backcolor=transparent]:
  46. [backcolor=transparent]                [backcolor=transparent]"""时间戳"""
  47. [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]]
  48. [backcolor=transparent]                [backcolor=transparent]"""构造签名字符串"""
  49. [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
  50. [backcolor=transparent]                [backcolor=transparent]"""计算签名值"""
  51. [backcolor=transparent]                sign [backcolor=transparent]=[backcolor=transparent] calSignature[backcolor=transparent]([backcolor=transparent]signString[backcolor=transparent],[backcolor=transparent]sk[backcolor=transparent])
  52. [backcolor=transparent]                [backcolor=transparent]"""请求消息HTTP头部"""
  53. [backcolor=transparent]                headers [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]{
  54. [backcolor=transparent]                    [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]signature [backcolor=transparent]:[backcolor=transparent] sign[backcolor=transparent],
  55. [backcolor=transparent]                    [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]ak [backcolor=transparent]:[backcolor=transparent] ak[backcolor=transparent],
  56. [backcolor=transparent]                    [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]consumerid [backcolor=transparent]:[backcolor=transparent] cid
  57. [backcolor=transparent]                    [backcolor=transparent]}
  58. [backcolor=transparent]                [backcolor=transparent]"""开始发送获取消息的HTTP请求"""
  59. [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])
  60. [backcolor=transparent]                [backcolor=transparent]"""获取HTTP应答消息"""
  61. [backcolor=transparent]                response [backcolor=transparent]=[backcolor=transparent] conn[backcolor=transparent].[backcolor=transparent]getresponse[backcolor=transparent]()
  62. [backcolor=transparent]                [backcolor=transparent]"""验证应答消息状态值"""
  63. [backcolor=transparent]                [backcolor=transparent]if[backcolor=transparent] response[backcolor=transparent].[backcolor=transparent]status [backcolor=transparent]!=[backcolor=transparent] [backcolor=transparent]200[backcolor=transparent]:
  64. [backcolor=transparent]                    [backcolor=transparent]continue
  65. [backcolor=transparent]                [backcolor=transparent]"""从应答消息中读取实际的消息内容"""
  66. [backcolor=transparent]                msg [backcolor=transparent]=[backcolor=transparent] response[backcolor=transparent].[backcolor=transparent]read[backcolor=transparent]()
  67. [backcolor=transparent]                [backcolor=transparent]"""将实际的消费消息进行解码"""
  68. [backcolor=transparent]                messages [backcolor=transparent]=[backcolor=transparent] json[backcolor=transparent].[backcolor=transparent]loads[backcolor=transparent]([backcolor=transparent]msg[backcolor=transparent])
  69. [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]:
  70. [backcolor=transparent]                    time[backcolor=transparent].[backcolor=transparent]sleep[backcolor=transparent]([backcolor=transparent]2[backcolor=transparent])
  71. [backcolor=transparent]                    [backcolor=transparent]continue
  72. [backcolor=transparent]                [backcolor=transparent]"""依次获取每条消费消息"""
  73. [backcolor=transparent]                [backcolor=transparent]for[backcolor=transparent] message [backcolor=transparent]in[backcolor=transparent] messages[backcolor=transparent]:
  74. [backcolor=transparent]                    [backcolor=transparent]"""计算时间戳"""
  75. [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]]
  76. [backcolor=transparent]                    [backcolor=transparent]"""构建删除消费消息URL路径"""
  77. [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
  78. [backcolor=transparent]                    [backcolor=transparent]"""构造签名字符串"""
  79. [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
  80. [backcolor=transparent]                    [backcolor=transparent]"""进行签名"""
  81. [backcolor=transparent]                    sign [backcolor=transparent]=[backcolor=transparent] calSignature[backcolor=transparent]([backcolor=transparent]signString[backcolor=transparent],[backcolor=transparent]sk[backcolor=transparent])
  82. [backcolor=transparent]                    [backcolor=transparent]"""构造删除消费消息HTTP头部"""
  83. [backcolor=transparent]                       delheaders [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]{
  84. [backcolor=transparent]                           [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]signature [backcolor=transparent]:[backcolor=transparent] sign[backcolor=transparent],
  85. [backcolor=transparent]                        [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]ak [backcolor=transparent]:[backcolor=transparent] ak[backcolor=transparent],
  86. [backcolor=transparent]                        [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]consumerid [backcolor=transparent]:[backcolor=transparent] cid[backcolor=transparent],
  87. [backcolor=transparent]                [backcolor=transparent]}
  88. [backcolor=transparent]                    [backcolor=transparent]"""发送删除消息请求"""
  89. [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])
  90. [backcolor=transparent]                    [backcolor=transparent]"""获取请求应答"""
  91. [backcolor=transparent]                    response [backcolor=transparent]=[backcolor=transparent] conn[backcolor=transparent].[backcolor=transparent]getresponse[backcolor=transparent]()
  92. [backcolor=transparent]                    [backcolor=transparent]"""读取应答内容"""
  93. [backcolor=transparent]                    msg [backcolor=transparent]=[backcolor=transparent] response[backcolor=transparent].[backcolor=transparent]read[backcolor=transparent]()
  94. [backcolor=transparent]                    [backcolor=transparent]print[backcolor=transparent] [backcolor=transparent]"delete msg:"[backcolor=transparent]+[backcolor=transparent]msg
  95. [backcolor=transparent]            [backcolor=transparent]except[backcolor=transparent] [backcolor=transparent]Exception[backcolor=transparent],[backcolor=transparent]e[backcolor=transparent]:
  96. [backcolor=transparent]                [backcolor=transparent]print[backcolor=transparent] e
  97. [backcolor=transparent]        conn[backcolor=transparent].[backcolor=transparent]close[backcolor=transparent]()
  98. [backcolor=transparent]"""启动入口"""
  99. [backcolor=transparent]if[backcolor=transparent] __name__ [backcolor=transparent]==[backcolor=transparent] [backcolor=transparent]'__main__'[backcolor=transparent]:
  100. [backcolor=transparent]    [backcolor=transparent]"""构造消息订阅者"""
  101. [backcolor=transparent]    consumer [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]HttpConsumer[backcolor=transparent]()
  102. [backcolor=transparent]    [backcolor=transparent]"""开始启动消息订阅者"""
  103. [backcolor=transparent]    consumer[backcolor=transparent].[backcolor=transparent]process[backcolor=transparent]()

[backcolor=transparent]4. 工具方法示例程序
以下为示例中使用的工具方法。
  1. [backcolor=transparent]#encoding:utf-8
  2. [backcolor=transparent]import[backcolor=transparent] socket
  3. [backcolor=transparent]import[backcolor=transparent] hmac
  4. [backcolor=transparent]from[backcolor=transparent] hashlib [backcolor=transparent]import[backcolor=transparent] sha1
  5. [backcolor=transparent]"""
  6. [backcolor=transparent]解析URL
  7. [backcolor=transparent]"""
  8. [backcolor=transparent]def[backcolor=transparent] parseURL[backcolor=transparent]([backcolor=transparent]url[backcolor=transparent]):
  9. [backcolor=transparent]    iplist [backcolor=transparent]=[backcolor=transparent] socket[backcolor=transparent].[backcolor=transparent]gethostbyname_ex[backcolor=transparent]([backcolor=transparent]url[backcolor=transparent])
  10. [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]:
  11. [backcolor=transparent]        [backcolor=transparent]return[backcolor=transparent] [backcolor=transparent]None
  12. [backcolor=transparent]    ips [backcolor=transparent]=[backcolor=transparent] iplist[backcolor=transparent][[backcolor=transparent]2[backcolor=transparent]]
  13. [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]:
  14. [backcolor=transparent]        [backcolor=transparent]return[backcolor=transparent] [backcolor=transparent]None
  15. [backcolor=transparent]    [backcolor=transparent]return[backcolor=transparent] ips[backcolor=transparent][[backcolor=transparent]0[backcolor=transparent]]
  16. [backcolor=transparent]"""
  17. [backcolor=transparent]认证签名
  18. [backcolor=transparent]"""
  19. [backcolor=transparent]def[backcolor=transparent] calSignature[backcolor=transparent]([backcolor=transparent]signString[backcolor=transparent],[backcolor=transparent] sk[backcolor=transparent]):
  20. [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])
  21. [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]()

展开
收起
猫饭先生 2017-10-27 10:21:29 1681 分享 版权
0 条回答
写回答
取消 提交回答