android - 如何在 Python 中实现 GCM HTTP 服务器同时避免我的服务器 IP 被谷歌列入黑名单?

标签 android python google-cloud-messaging

我正在使用 Apache、WSGI (mod_wsgi) 和 Python 来实现 GCM HTTP 服务器,如 Android 开发者网站所述:

developer.android.com/google/gcm/server.html

起初,我在服务器端实现的用于处理向 GCM 发送消息的代码如下:

def send_to_gcm(data):
   url = 'https://android.googleapis.com/gcm/send'
   no = 1
   while True:
     try:
        request = Request(url=url, data=json.dumps(data))
        request.add_header('Authorization','key=AIzXXX')
        request.add_header('Content-Type', 'application/json')
        res = urlopen(request)

        if res.getcode() == 200: return
    except Exception: pass

    no += 1

    #Discard the message
    if no == 16: return 

    #Exponential backoff
    tts = randint(2**(no-1), (2**no) -1)
    sleep(tts)

data = dict(registration_id=[regid], data=dict(mymessage=themessage))
thread = Thread(target=send_to_gcm, args=(data,))
thread.start()  

一段时间后(大约一天)GCM 停止接受服务器发送的消息。所以我开始在 GCM 的文档中到处挖掘,我发现了一个我之前错过的规范的重要部分:

developer.android.com/google/gcm/http.html#response

“如果 Retry-After header 包含在来自 GCM 服务器的响应中,则尊重它。...导致问题的发件人有被列入黑名单的风险。...当 HTTP 状态代码介于 501 和 599 之间时,或者当结果数组中 JSON 对象的错误字段不可用。”

所以我按如下方式修补了我的服务器代码:

def send_to_gcm(data, environ):
   url = 'https://android.googleapis.com/gcm/send'
   no = 1
   while True:
      try:
         request = Request(url=url, data=json.dumps(data))
         request.add_header('Authorization','key=AIzXXX')
         request.add_header('Content-Type', 'application/json')
         res = urlopen(request)

         if res.getcode() == 200: return
      except HTTPError as error:

         if error.headers.has_key('Retry-After'):
            try: tts = int(response_headers['Retry-After'])
            except ValueError:
               until = datetime.strptime(response_headers, '%a, %d %b %Y %H:%M:%S GMT')
               diff = until - datetime.now()
               tts = int(diff.total_seconds()) +1
            sleep(tts)

      no += 1

      #Discard the message
      if no == 16: return 

      #Exponential backoff
      tts = randint(2**(no-1), (2**no) -1)
      sleep(tts)

但实际上我的服务器很可能已被列入黑名单,对于发送的任何请求,我都会收到 401 状态代码和“未经授权”的错误消息。这是我的问题:

我最新的服务器实现有问题吗?
我的服务器的静态 IP 地址是否会被解禁?如果是,什么时候?

最佳答案

我正在搜索相同的主题。 这个模块可以帮助你 https://github.com/geeknam/python-gcm

关于android - 如何在 Python 中实现 GCM HTTP 服务器同时避免我的服务器 IP 被谷歌列入黑名单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23720564/

相关文章:

android - 使用 Jenkins 构建 Unity 项目失败

Python:如何编辑数组中元素的顺序?

python - 创建项目后,创建一个继承全局站点包的 PyCharm 项目?

android - 在 Android 中取消订阅 Azure 通知中心标签

android - 用增强现实概念测量液体

java - JSON 数组中的参数

java - 如何在Android应用程序中实现FCM?我们是否可以使用 GCM 和 FCM 相同的监听器、接收器方法?

java - 获取注册错误 :Account missing when integrating GCM for pushwoosh in android

android - Codenameone Google Play 警告 : SSL Error Handler Vulnerability

python - 在python中使用webbrowser打开URL时如何清除终端输出?