[PYTHON] Ich habe APN (Remote-Benachrichtigung) mithilfe der Parse.com-REST-API ausprobiert

Parse.com unterstützt Push-Benachrichtigung. Ich kann eine Push-Benachrichtigung vom Dashboard mit einer leicht verständlichen Benutzeroberfläche senden. Alternativ können Sie die REST-API verwenden, um Push-Benachrichtigungen von der App-Seite zu senden. Es war ein wenig schwierig zu verstehen, wie man mit DeviceToken fein steuert, deshalb werde ich darüber schreiben.

An Parse-API senden

Für die Push-Benachrichtigung ist mindestens "alert" erforderlich. Wenn Sie also "curl" verwenden, geben Sie Folgendes an und senden Sie. Die "X-Parse-Anwendungs-ID" (Anwendungs-ID) und "X-Parse-REST-API-Schlüssel" (REST-API-Schlüssel) können aus der Dashboard-Übersicht abgerufen werden. Wenn Sie danach angemeldet sind und das Dokument anzeigen, können Sie es so ausführen, wie es ist, da der Schlüssel direkt in das Codebeispiel eingebettet ist !!

curl -X POST \
  -H "X-Parse-Application-Id: <Application ID>" \
  -H "X-Parse-REST-API-Key: <REST API Key>" \
  -H "Content-Type: application/json" \
  -d '{
        "data": {
          "alert": "The Giants won against the Mets 2-3."
        }
      }' \
  https://api.parse.com/1/push

Informationen zum Parse-Benachrichtigungsformat

Einfach ausgedrückt liegt es im folgenden JSON-Format vor. Da die Bedingung in "where" angegeben ist, können Sie Push Notificaiton an ein bestimmtes Terminal senden, indem Sie hier "deviceToken" angeben.

--Geben Sie iOS- oder Android-Benachrichtigungsdaten anstelle von "Daten" ein

parse_push.py


{'where': {'deviceToken': [],                   #Bedingungsspezifikation unter Verwendung der Abfrage-API
    },
    'push_time': '2013-01-23T12:00:00Z',        #Datum und Uhrzeit des Beginns der Benachrichtigung(iso)
    'expiration_interval': '518400',            #Haltbarkeitsdatum
    'expiration_time': '2013-01-23T21:08:39Z',  #Ablaufdatum und -zeit angegeben(iso)
    'data': {
        'alert': 'message',
        'badge': 'Increment',                   # Number or 'Increment'(iOS only).
        'sound': 'sound bundle',                # iOS only.
        'content-available': '1',               # Newsstand content count(iOS only).
        'action': 'Intent',                     # Android only.
        'title': 'Notification!!',              # Android only.
    }
}

Wenn Sie einen bedingten Operator angeben, sieht dies folgendermaßen aus.

parse_push2.py


{'data': {'alert': 'push notification message!',
          'badge': 'Increment',
          'sound': 'default'},
 'where': {'deviceToken': {'$in': [u'<deviceToken1>', u'<deviceToken2>']}}}

Codebeispiel

In Python geschrieben sieht es so aus.

apn.py


# coding: utf-8

PARSE_API_BASE = 'https://api.parse.com'
PARSE_PUSH_API = '/1/push'
PARSE_PUSH_URL = PARSE_API_BASE + PARSE_PUSH_API
#Geben Sie den Schlüssel an, der für die Push-Benachrichtigung mit HTTP-Header erforderlich ist
HEADERS = {
    "X-Parse-Application-Id": "<Application ID>",
    "X-Parse-REST-API-Key": "<REST API Key>",
    "X-Parse-Master-Key": "<Master Key>",
    "Content-Type": "application/json"
}


class APNMessageQueue(object):
    """ APN(Apple Push notification)Nachrichten speichern für
    """
    structure = {
        'user_id': lambda x: (x is not None and len(x) > 0),
        'notify_token': lambda x: (x is not None and len(x) > 0),
        'message': lambda x: (x is not None and len(x) > 0),
    }

    def __init__(self, *args, **kwargs):
        for k in self.structure.keys():
            self.__setattr__(k, kwargs.get(k, None))

    @classmethod
    def create(cls, user_id, notify_token, message):
        src_props = dict(
            user_id=user_id,
            notify_token=notify_token,
            message=message,
        )
        props = {}

        for k, func in cls.structure.iteritems():
            value = src_props.get(k)
            if func(value):
                props[k] = value

        if props:
            return APNMessageQueue(**props)
        return None


def create_notify_message(message, badge='Increment', sound='default'):
    """Erstellen Sie das Push-Benachrichtigungsformat aus der Benachrichtigungsnachricht

    Args:
        message:Warnmeldung.
        badge:Chargenanzahl('Increment'Ist Parse.com original).
        sound:Benachrichtigungston.

    Return:
String im PushNotification-Format.

    """
    return {'alert': message, 'badge': badge, 'sound': sound}


def create_request_data(notify_token, apn_data):
    """Analysieren des Benachrichtigungsformats Erstellen von Daten im Vorlagenformat

    Args:
        notify_token:Geräte-Token oder Liste davon.
        apn_data:Apple Push-Benachrichtigungsdaten.

    Returns:
Analysieren des Benachrichtigungsformats Daten im Vorlagenformat.

    """
    request_data = {'data': apn_data}
    if isinstance(notify_token, list):
        request_data['where'] = {'deviceToken': {'$in': notify_token}}
    else:
        request_data['where'] = {'deviceToken': notify_token}
    return request_data


def process_do_send(request_data):
    """ParseNotification-Format Senden Sie PushNotification, indem Sie Daten im Vorlagenformat übergeben

    Args:
        request_data:Analysieren des Benachrichtigungsformats Daten im Vorlagenformat

    Returns:
Gibt die normale Beendigung oder den Fehler zurück

    """
    import json
    from urllib2 import Request, urlopen, URLError

    payload = json.dumps(request_data)
    request = Request(PARSE_PUSH_URL, payload, HEADERS)
    try:
        response = urlopen(request)
        data = json.loads(response.read())
        if isinstance(data, dict):
            return data.get('result', False)
    except URLError, e:
        if hasattr(e, 'reason'):
            print 'We failed to reach a server.'
            print 'Reason: %s' % e.reason
        elif hasattr(e, 'code'):
            print 'The server couldn\'t fulfill the request.'
            print 'Error code: %d' % e.code
    return False


def send_notification(notify_queue_list):
    """Push-Benachrichtigung an APNs senden

Broadcast-Push-Benachrichtigungsnachricht an den APN-Server

    Args:
        notify_queue_list:APNMessageQueue-Liste

    """
    from itertools import groupby
    notify_sorted_queue_list = sorted(notify_queue_list, key=lambda x: x.message)
    #Senden Sie die gleiche Nachricht zusammen
    for message, group in groupby(notify_sorted_queue_list, key=lambda x: x.message):
        distict_tokens = list(set([user.notify_token for user in group]))
        aps_data = create_notify_message(message)
        request_data = create_request_data(distict_tokens, aps_data)
        print request_data
        process_do_send(request_data)

Die Benutzerseite ist so

main.py


# coding: utf-8

def send_push_parse_for_apn(message):
    import models
    import apn

    #Rufen Sie eine Liste der deviceTokens for Notification aus Benutzerdaten ab
    targets = [x for x in models.User.find_by_existing_notify_token() if x is not None]
    notify_token_list = [apn.APNMessageQueue(x.user_id, x.notify_token, message) for x in targets]

    if len(notify_token_list) > 0:
        #Starten
        apn.send_notification(notify_token_list)

if __name__ == '__main__':
    send_push_parse_for_apn('Abo!!')

Recommended Posts

Ich habe APN (Remote-Benachrichtigung) mithilfe der Parse.com-REST-API ausprobiert
Ich habe versucht, Remote API mit GAE / J zu verwenden
Ich habe versucht, die checkio-API zu verwenden
Ich habe versucht, YOUTUBE Data API V3 zu verwenden
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
Ich habe versucht, die BigQuery-Speicher-API zu verwenden
Ich habe versucht, die Detect Labels-API von AWS Rekognition zu verwenden
Ich habe versucht, die Google Cloud Vision-API zu verwenden
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe versucht, Coturn zu verwenden
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, "Anvil" zu verwenden.
Ich habe versucht, Hubot zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, Ipython zu verwenden
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, doctest zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
[Ich habe versucht, Pythonista 3 zu verwenden] Einführung
Ich habe versucht, easydict (Memo) zu verwenden.
Ich habe versucht, das Gesicht mit Face ++ zu erkennen
Ich habe versucht, RandomForest zu verwenden
Ich habe versucht, BigQuery ML zu verwenden
Ich habe versucht, Git Inspector zu verwenden
Ich habe versucht, Magenta / TensorFlow zu verwenden
Ich habe versucht, AWS Chalice zu verwenden
Ich habe versucht, Slack Emojinator zu verwenden
Ich habe versucht, Videos mit der Youtube Data API (Anfänger) zu suchen.
Ich habe versucht, die Gesichtserkennungs-API von Microsoft für Cognitive Services zu verwenden
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
[Für Anfänger] Ich habe versucht, die Tensorflow-Objekterkennungs-API zu verwenden
Ich habe versucht, Rotrics Dex Arm # 2 zu verwenden
Abrufen von Salesforce-Daten mithilfe der REST-API
Ich habe versucht, eine Quip-API zu erstellen
Ich habe die Naro-Roman-API 2 ausprobiert
Ich habe versucht, Rotrics Dex Arm zu verwenden
Ich habe versucht, GrabCut von OpenCV zu verwenden
Ich habe versucht, einen Transvestitenwettbewerb mit der Detect-API von Face ++ zu bewerten
Ich habe versucht, die COTOHA-API zu verwenden (es gibt auch Code auf GitHub).
Ich habe versucht, meinen Lieblingssänger (SHISHAMO) mit der Spotify-API zu analysieren
Ich habe versucht, Thonny (Python / IDE) zu verwenden.
Ich habe Teslas API berührt
Ich habe versucht, mit dem Server-Client über tmux zu kommunizieren
Ich habe die neuartige API von Naruro ausprobiert