Marek R
Marek R

Reputation: 38181

Post push notification to C2DM (android) using Django

I found how to send push notification to Android device using Django here (here is the code).

So adopted that and my code looks like this:

def sendAndroidPushNotification(registration_id, collapse_key, a, b) :
    try:
        auth = getNewAndroidAuthorizationToken() # this works I'm fetching new token so this is up to date (its length is 267 characters)
        push_request = urllib2.Request("https://android.apis.google.com/c2dm/send")

        data = urllib.urlencode({'data.testA'     : a,
                                 'data.testB'     : b,
                                 'collapse_key'   : collapse_key,
                                 'registration_id': registration_id
                                 })
        push_request.add_data( data )
        push_request.add_header('Authorization', 'GoogleLogin auth=' + auth)
        push_request.add_header('Content-Type', 'application/x-www-form-urlencoded')
        push_request.add_header('Content-Length', len(data))
        urllib2.build_opener().open(push_request)

    except urllib2.HTTPError as e:
        print 'got exception during push notification'
        print 'Reason: "{0}" code: {1}'.format(e.reason, e.code)

        pass

this give me error: "Reason: "Unauthorized" code: 401" (at some point it was 403). Version which uses httplib.HTTPSConnection instead of urllib2.Request has same problem.

It looks almost the same as code shown here so I'm totally confused. What I'm doing wrong?


Edit:

Just in case, here is how I fetch authorization token (it looks like that it works fine), maybe my parsing is wrong:

def getNewAndroidAuthorizationToken() :
    request = urllib2.Request("https://www.google.com/accounts/ClientLogin")

    data  = urllib.urlencode({'accountType' : 'HOSTED_OR_GOOGLE',
                              'Email'       : '[email protected]',
                              'Passwd'      : 'asdjsdfa',
                              'service'     : 'ac2dm',
                              'source'      : 'com.mycompany.mypackage',})
    request.add_data(data)

    content = urllib2.build_opener().open(request)

    lines = content.readlines()
    for line in lines :
        if line.find("Auth=")==0 :
            return line[5:]
    return

Upvotes: 1

Views: 836

Answers (1)

Akram
Akram

Reputation: 7527

C2DM is deprecated. Developers are encouraged to switch to GCM, C2DM will be supported for a short time. Simple API instead of ClientLogin and oAuth2 which are not supported.

http://developer.android.com/guide/google/gcm/index.html

Upvotes: 2

Related Questions