Aracılığıyla paylaş


Python'dan Notification Hubs'ı kullanma

Notification Hubs REST API'leri MSDN makalesinde açıklandığı gibi Notification Hubs REST arabirimini kullanarak Java/PHP/Python/Ruby arka ucundan tüm Notification Hubs özelliklerine erişebilirsiniz.

Not

Bu, Python'da bildirim göndermelerini uygulamaya yönelik örnek bir başvuru uygulamasıdır ve resmi olarak desteklenen Notifications Hub Python SDK'sı değildir. Örnek Python 3.4 kullanılarak oluşturulmuştur.

Bu makale, şunları nasıl yapacağınızı gösterir:

  • Python'da Notification Hubs özellikleri için bir REST istemcisi oluşturun.
  • Python arabirimini kullanarak Bildirim Hub'ı REST API'lerine bildirim gönderin.
  • Hata ayıklama/eğitim amacıyla HTTP REST isteğinin/yanıtının dökümünü alın.

Python'da arka uç bölümünü uygulayarak tercih ettiğiniz mobil platform için Kullanmaya başlama öğreticisini izleyebilirsiniz.

Not

Örneğin kapsamı yalnızca bildirim göndermekle sınırlıdır ve herhangi bir kayıt yönetimi yapmaz.

İstemci arabirimi

Ana istemci arabirimi , .NET Notification Hubs SDK'sında kullanılabilen yöntemlerin aynısını sağlayabilir. Bu arabirim, bu sitede bulunan ve topluluk tarafından İnternet'te katkıda bulunan tüm öğreticileri ve örnekleri doğrudan çevirmenize olanak tanır.

Python REST sarmalayıcı örneğinde bulunan tüm kodu bulabilirsiniz.

Örneğin, bir istemci oluşturmak için:

isDebug = True
hub = NotificationHub("myConnectionString", "myNotificationHubName", isDebug)

Windows bildirim bildirimi göndermek için:

wns_payload = """<toast><visual><binding template=\"ToastText01\"><text id=\"1\">Hello world!</text></binding></visual></toast>"""
hub.send_windows_notification(wns_payload)

Uygulama

Henüz yapmadıysanız, arka ucu uygulamanız gereken son bölüme kadar Başlarken öğreticisini izleyin.

Tam REST sarmalayıcı uygulamayla ilgili tüm ayrıntılar MSDN'de bulunabilir. Bu bölümde Notification Hubs REST uç noktalarına erişmek ve bildirim göndermek için gereken ana adımların Python uygulaması açıklanmaktadır

  1. Bağlantı dizesini ayrıştırma
  2. Yetkilendirme belirtecini oluşturma
  3. HTTP REST API kullanarak bildirim gönderme

Bağlantı dizesini ayrıştırma

Oluşturucu bağlantı dizesini ayrıştıran istemciyi uygulayan ana sınıf aşağıdadır:

class NotificationHub:
    API_VERSION = "?api-version=2013-10"
    DEBUG_SEND = "&test"

    def __init__(self, connection_string=None, hub_name=None, debug=0):
        self.HubName = hub_name
        self.Debug = debug

        # Parse connection string
        parts = connection_string.split(';')
        if len(parts) != 3:
            raise Exception("Invalid ConnectionString.")

        for part in parts:
            if part.startswith('Endpoint'):
                self.Endpoint = 'https' + part[11:].lower()
            if part.startswith('SharedAccessKeyName'):
                self.SasKeyName = part[20:]
            if part.startswith('SharedAccessKey'):
                self.SasKeyValue = part[16:]

Güvenlik belirteci oluşturma

Güvenlik belirteci oluşturma işleminin ayrıntılarına buradan ulaşabilirsiniz. Geçerli isteğin NotificationHub URI'sini ve bağlantı dizesinden ayıklanan kimlik bilgilerini temel alarak belirteci oluşturmak için sınıfına aşağıdaki yöntemleri ekleyin.

@staticmethod
def get_expiry():
    # By default returns an expiration of 5 minutes (=300 seconds) from now
    return int(round(time.time() + 300))


@staticmethod
def encode_base64(data):
    return base64.b64encode(data)


def sign_string(self, to_sign):
    key = self.SasKeyValue.encode('utf-8')
    to_sign = to_sign.encode('utf-8')
    signed_hmac_sha256 = hmac.HMAC(key, to_sign, hashlib.sha256)
    digest = signed_hmac_sha256.digest()
    encoded_digest = self.encode_base64(digest)
    return encoded_digest


def generate_sas_token(self):
    target_uri = self.Endpoint + self.HubName
    my_uri = urllib.parse.quote(target_uri, '').lower()
    expiry = str(self.get_expiry())
    to_sign = my_uri + '\n' + expiry
    signature = urllib.parse.quote(self.sign_string(to_sign))
    auth_format = 'SharedAccessSignature sig={0}&se={1}&skn={2}&sr={3}'
    sas_token = auth_format.format(signature, expiry, self.SasKeyName, my_uri)
    return sas_token

HTTP REST API kullanarak bildirim gönderme

Not

Microsoft Anında İletilen Bildirim Hizmeti (MPNS) kullanım dışı bırakıldı ve artık desteklenmiyor.

İlk olarak, bildirimi temsil eden bir sınıf tanımlamayı kullanalım.

class Notification:
    def __init__(self, notification_format=None, payload=None, debug=0):
        valid_formats = ['template', 'apple', 'gcm',
                         'windows', 'windowsphone', "adm", "baidu"]
        if not any(x in notification_format for x in valid_formats):
            raise Exception(
                "Invalid Notification format. " +
                "Must be one of the following - 'template', 'apple', 'gcm', 'windows', 'windowsphone', 'adm', 'baidu'")

        self.format = notification_format
        self.payload = payload

        # array with keynames for headers
        # Note: Some headers are mandatory: Windows: X-WNS-Type, WindowsPhone: X-NotificationType
        # Note: For Apple you can set Expiry with header: ServiceBusNotification-ApnsExpiry
        # in W3C DTF, YYYY-MM-DDThh:mmTZD (for example, 1997-07-16T19:20+01:00).
        self.headers = None

Bu sınıf, yerel bildirim gövdesi veya şablon bildirimi özellikleri kümesi, biçim (yerel platform veya şablon) ve platforma özgü özellikler (Apple süre sonu özelliği ve WNS üst bilgileri gibi) içeren üst bilgi kümesi için bir kapsayıcıdır.

Kullanılabilir tüm seçenekler için Notification Hubs REST API'leri belgelerine ve belirli bildirim platformlarının biçimlerine bakın.

Şimdi bu sınıfla, sınıfının içinde NotificationHub bildirim gönderme yöntemlerini yazın.

def make_http_request(self, url, payload, headers):
    parsed_url = urllib.parse.urlparse(url)
    connection = http.client.HTTPSConnection(
        parsed_url.hostname, parsed_url.port)

    if self.Debug > 0:
        connection.set_debuglevel(self.Debug)
        # adding this querystring parameter gets detailed information about the PNS send notification outcome
        url += self.DEBUG_SEND
        print("--- REQUEST ---")
        print("URI: " + url)
        print("Headers: " + json.dumps(headers, sort_keys=True,
                                       indent=4, separators=(' ', ': ')))
        print("--- END REQUEST ---\n")

    connection.request('POST', url, payload, headers)
    response = connection.getresponse()

    if self.Debug > 0:
        # print out detailed response information for debugging purpose
        print("\n\n--- RESPONSE ---")
        print(str(response.status) + " " + response.reason)
        print(response.msg)
        print(response.read())
        print("--- END RESPONSE ---")

    elif response.status != 201:
        # Successful outcome of send message is HTTP 201 - Created
        raise Exception(
            "Error sending notification. Received HTTP code " + str(response.status) + " " + response.reason)

    connection.close()


def send_notification(self, notification, tag_or_tag_expression=None):
    url = self.Endpoint + self.HubName + '/messages' + self.API_VERSION

    json_platforms = ['template', 'apple', 'gcm', 'adm', 'baidu']

    if any(x in notification.format for x in json_platforms):
        content_type = "application/json"
        payload_to_send = json.dumps(notification.payload)
    else:
        content_type = "application/xml"
        payload_to_send = notification.payload

    headers = {
        'Content-type': content_type,
        'Authorization': self.generate_sas_token(),
        'ServiceBusNotification-Format': notification.format
    }

    if isinstance(tag_or_tag_expression, set):
        tag_list = ' || '.join(tag_or_tag_expression)
    else:
        tag_list = tag_or_tag_expression

    # add the tags/tag expressions to the headers collection
    if tag_list != "":
        headers.update({'ServiceBusNotification-Tags': tag_list})

    # add any custom headers to the headers collection that the user may have added
    if notification.headers is not None:
        headers.update(notification.headers)

    self.make_http_request(url, payload_to_send, headers)


def send_apple_notification(self, payload, tags=""):
    nh = Notification("apple", payload)
    self.send_notification(nh, tags)


def send_google_notification(self, payload, tags=""):
    nh = Notification("gcm", payload)
    self.send_notification(nh, tags)


def send_adm_notification(self, payload, tags=""):
    nh = Notification("adm", payload)
    self.send_notification(nh, tags)


def send_baidu_notification(self, payload, tags=""):
    nh = Notification("baidu", payload)
    self.send_notification(nh, tags)


def send_mpns_notification(self, payload, tags=""):
    nh = Notification("windowsphone", payload)

    if "<wp:Toast>" in payload:
        nh.headers = {'X-WindowsPhone-Target': 'toast',
                      'X-NotificationClass': '2'}
    elif "<wp:Tile>" in payload:
        nh.headers = {'X-WindowsPhone-Target': 'tile',
                      'X-NotificationClass': '1'}

    self.send_notification(nh, tags)


def send_windows_notification(self, payload, tags=""):
    nh = Notification("windows", payload)

    if "<toast>" in payload:
        nh.headers = {'X-WNS-Type': 'wns/toast'}
    elif "<tile>" in payload:
        nh.headers = {'X-WNS-Type': 'wns/tile'}
    elif "<badge>" in payload:
        nh.headers = {'X-WNS-Type': 'wns/badge'}

    self.send_notification(nh, tags)


def send_template_notification(self, properties, tags=""):
    nh = Notification("template", properties)
    self.send_notification(nh, tags)

Bu yöntemler bildirim hub'ınızın /messages uç noktasına, bildirimi göndermek için doğru gövdeyi ve üst bilgileri içeren bir HTTP POST isteği gönderir.

Ayrıntılı günlüğe kaydetmeyi etkinleştirmek için debug özelliğini kullanma

Notification Hub başlatılırken hata ayıklama özelliğinin etkinleştirilmesi, HTTP isteği ve yanıt dökümü hakkındaki ayrıntılı günlüğe kaydetme bilgilerinin yanı sıra ayrıntılı Bildirim iletisi gönderme sonucu yazar. Notification Hubs TestSend özelliği, bildirim gönderme sonucu hakkında ayrıntılı bilgi döndürür. Bunu kullanmak için - aşağıdaki kodu kullanarak başlatın:

hub = NotificationHub("myConnectionString", "myNotificationHubName", isDebug)

Bildirim Hub'ı Gönderme isteği HTTP URL'sine sonuç olarak bir "test" sorgu dizesi eklenir.

Öğreticiyi tamamlayın

Artık Python arka ucundan bildirim göndererek Başlarken öğreticisini tamamlayabilirsiniz.

Notification Hubs istemcinizi başlatın ( Kullanmaya başlama öğreticisinde açıklandığı gibi bağlantı dizesini ve hub adını kullanın):

hub = NotificationHub("myConnectionString", "myNotificationHubName")

Ardından hedef mobil platformunuza bağlı olarak gönderme kodunu ekleyin. Bu örnek ayrıca platforma göre bildirim göndermeyi etkinleştirmek için daha üst düzey yöntemler de ekler; örneğin, windows için send_windows_notification; send_apple_notification (elma için) vb.

Windows Mağazası ve Windows Phone 8.1 (Silverlight dışı)

wns_payload = """<toast><visual><binding template=\"ToastText01\"><text id=\"1\">Test</text></binding></visual></toast>"""
hub.send_windows_notification(wns_payload)

Windows Phone 8.0 ve 8.1 Silverlight

hub.send_mpns_notification(toast)

iOS

alert_payload = {
    'data':
        {
            'msg': 'Hello!'
        }
}
hub.send_apple_notification(alert_payload)

Android

gcm_payload = {
    'data':
        {
            'msg': 'Hello!'
        }
}
hub.send_google_notification(gcm_payload)

Kindle Fire

adm_payload = {
    'data':
        {
            'msg': 'Hello!'
        }
}
hub.send_adm_notification(adm_payload)

Baidu

baidu_payload = {
    'data':
        {
            'msg': 'Hello!'
        }
}
hub.send_baidu_notification(baidu_payload)

Python kodunuzu çalıştırmak, hedef cihazınızda görünen bir bildirim oluşturmalıdır.

Örnekler

Özelliği etkinleştirme debug

NotificationHub'ı başlatırken hata ayıklama bayrağını etkinleştirdiğinizde, istekte hangi HTTP üst bilgilerinin geçirildiğini ve Notification Hub'dan hangi HTTP yanıtının alındığını anlayabileceğiniz aşağıdaki gibi ayrıntılı HTTP isteği ve yanıt dökümü ile NotificationOutcome'u görürsünüz:

H T T P isteği ve yanıt dökümü ile Bildirim Sonucu iletilerinin ayrıntılarının kırmızıyla özetlenmiş olduğu konsolun ekran görüntüsü.

Örneğin ayrıntılı Bildirim Hub'ı sonucunu görürsünüz.

  • ileti anında iletme bildirimi hizmetine başarıyla gönderildiğinde.
    <Outcome>The Notification was successfully sent to the Push Notification System</Outcome>
    
  • Herhangi bir anında iletme bildirimi için hedef bulunamadıysa, büyük olasılıkla yanıt olarak aşağıdaki çıkışı görürsünüz (bu, büyük olasılıkla kayıtların bazı eşleşmeyen etiketleri olduğu için bildirimi teslim etmek için hiçbir kayıt bulunamadığını gösterir)
    '<NotificationOutcome xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect" xmlns:i="https://www.w3.org/2001/XMLSchema-instance"><Success>0</Success><Failure>0</Failure><Results i:nil="true"/></NotificationOutcome>'
    

Windows'a bildirim yayınlama

Windows istemcisine bir yayın bildirimi gönderirken gönderilen üst bilgiler dikkat edin.

hub.send_windows_notification(wns_payload)

H T T P isteğinin ayrıntılarının ve Service Bus Bildirim Biçimi ile X W N S Türü değerlerinin kırmızıyla özetlenmiş olduğu konsolun ekran görüntüsü.

Etiket (veya etiket ifadesi) belirterek bildirim gönderme

HTTP isteğine eklenen Etiketler HTTP üst bilgisine dikkat edin (aşağıdaki örnekte, bildirim yalnızca 'spor' yüküne sahip kayıtlara gönderilir)

hub.send_windows_notification(wns_payload, "sports")

H T T P isteğinin ayrıntılarını ve Service Bus Bildirim Biçimi, Service Bus Bildirim Etiketi ve X W N S Türü değerlerinin kırmızıyla özetlenmiş olduğu konsolun ekran görüntüsü.

Birden çok etiket belirten bildirim gönderme

Birden çok etiket gönderildiğinde Etiketler HTTP üst bilgisinin nasıl değiştiğine dikkat edin.

tags = {'sports', 'politics'}
hub.send_windows_notification(wns_payload, tags)

H T T P isteği ve Service Bus Bildirim Biçimi, birden çok Service Bus Bildirim Etiketi ve X W N S Türü değerlerinin kırmızıyla özetlenmiş ayrıntılarını içeren bir konsolun ekran görüntüsü.

Şablonlu bildirim

HTTP üst bilgisini biçimlendir değişikliklerinin ve yük gövdesinin HTTP isteği gövdesinin bir parçası olarak gönderildiğine dikkat edin:

İstemci tarafı - kayıtlı şablon:

var template = @"<toast><visual><binding template=""ToastText01""><text id=""1"">$(greeting_en)</text></binding></visual></toast>";

Sunucu tarafı - yükü gönderme:

template_payload = {'greeting_en': 'Hello', 'greeting_fr': 'Salut'}
hub.send_template_notification(template_payload)

H T T P isteğinin ayrıntılarının ve İçerik türü ile Service Bus Bildirim Biçimi değerlerinin kırmızıyla özetlenmiş olduğu konsolun ekran görüntüsü.

Sonraki Adımlar

Bu makalede Notification Hubs için Python REST istemcisinin nasıl oluşturulacağı gösterildi. Burada yapabilecekleriniz: