Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Notification Hubs REST API'leri MSDN makalesinde açıklandığı gibi, Notification Hubs REST arabirimini kullanarak bir Java/PHP/Python/Ruby arka ucundan tüm Notification Hubs özelliklerine erişebilirsiniz.
Uyarı
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 makalede şunların nasıl yapıldığını görebilirsiniz:
- 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.
Uyarı
Örneklemin kapsamı yalnızca bildirim göndermekle sınırlıdır ve kayıt yönetimi yapmamaktadır.
İstemci arabirimi
Ana istemci arabirimi , .NET Notification Hubs SDK'sında kullanılabilen yöntemlerin aynısını sağlayabilir. Bu ara birim, bu sitede mevcut olan ve topluluk tarafından internette katkıda bulunulan 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 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 Kullanmaya başlama öğ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
- Bağlantı dizesini ayrıştırma
- Yetkilendirme belirtecini oluşturma
- 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
Uyarı
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övdesini veya bir şablon bildiriminin özelliklerini içeren bir kapsayıcıdır. Biçim (yerel platform veya şablon) ve platforma özgü özellikler (örneğin, Apple süre sonu özelliği ve WNS üst bilgileri) gibi üst bilgileri de içerir.
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, NotificationHub sınıfının içine 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ği etkinleştirildiğinde, HTTP isteği ve yanıt dökümü hakkındaki ayrıntılı günlük bilgilerini ve ayrıntılı bildirim iletisi gönderme sonucunu kaydeder. Notification Hubs TestSend özelliği, bildirim gönderme sonucu hakkında ayrıntılı bilgiler döndürür. Kullanmak için - aşağıdaki kodu kullanarak başlatın:
hub = NotificationHub("myConnectionString", "myNotificationHubName", isDebug)
Sonuç olarak, Bildirim Hub'ı Gönderme isteği HTTP URL'sine bir "test" sorgu dizesi eklenir.
Eğitimi tamamlayın
Artık Python arka uçtan bildirim göndererek Başlarken kılavuzunu tamamlayabilirsiniz.
Notification Hubs istemcinizi başlatın ( başlarken kılavuzunda açıklandığı gibi bağlantı dizesini ve hub adını değiştirin):
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 olmayan)
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ğini etkinleştirme debug
NotificationHub'ı başlatırken hata ayıklama bayrağını etkinleştirdiğinizde, istekte hangi HTTP üst bilgilerinin geçirildiğini ve Bildirim Hub'ından 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 görürsünüz:
Örneğin ayrıntılı Bildirim Hub'ı sonucunu görürsünüz.
- mesaj Anlık Bildirim Hizmeti’ne başarıyla gönderildiğinde.
<Outcome>The Notification was successfully sent to the Push Notification System</Outcome> - Eğer herhangi bir itme bildirimi için hedef bulunamadıysa, muhtemelen yanıt olarak aşağıdaki çıktıyı göreceksiniz (bu, muhtemelen kayıtların bazı eşleşmeyen etiketler içermesi nedeniyle 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 toast bildirimi yayınlama
Windows istemcisine bir yayın açılır bildirim gönderdiğinizde gönderilen başlıklara dikkat edin.
hub.send_windows_notification(wns_payload)
Etiket (veya etiket ifadesi) belirten 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")
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)
Şablonlu bildirim
"Format HTTP üst bilgisinin değiştiğine ve yük gövdesinin HTTP isteği gövdesinin bir parçası olarak gönderildiğine dikkat edin."
Müşteri 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)
Sonraki Adımlar
Bu makalede Notification Hubs için Python REST istemcisinin nasıl oluşturulacağı gösterildi. Buradan yapabilecekleriniz:
- Bu makaledeki tüm kodları içeren tam Python REST sarmalayıcı örneğini indirin.
- Son Dakika Haberleri öğreticisinde Notification Hubs etiketleme özelliği hakkında bilgi edinerek devam edin
- Haberleri Yerelleştirme öğreticisinde Notification Hubs Şablonları özelliğini öğrenmeye devam edin