12
votes

Connexion aux APNS pour iPhone à l'aide de Python

J'essaie d'envoyer des notifications push à un iPhone à l'aide de Python. J'ai exporté mon Certificat et clé privée forte> dans un fichier P12 à partir d'accès Keychain, puis converti en fichier PEM à l'aide de la commande suivante:

ssl.SSLError: (1, '_ssl.c:485: 
error:14094416:SSL routines:SSL3_READ_BYTES:sslv3 alert certificate unknown')


1 commentaires

Alors, quel était le problème? Certificat ou service?


5 Réponses :


2
votes

Avez-vous considéré comme le Twisted paquet? Le code ci-dessous est pris à partir de ICI :

from struct import pack
from OpenSSL import SSL
from twisted.internet import reactor
from twisted.internet.protocol import ClientFactory, Protocol
from twisted.internet.ssl import ClientContextFactory

APNS_SERVER_HOSTNAME = "<insert the push hostname from your iPhone developer portal>"
APNS_SERVER_PORT = 2195
APNS_SSL_CERTIFICATE_FILE = "<your ssl certificate.pem>"
APNS_SSL_PRIVATE_KEY_FILE = "<your ssl private key.pem>"

class APNSClientContextFactory(ClientContextFactory):
    def __init__(self):
        self.ctx = SSL.Context(SSL.SSLv3_METHOD)
        self.ctx.use_certificate_file(APNS_SSL_CERTIFICATE_FILE)
        self.ctx.use_privatekey_file(APNS_SSL_PRIVATE_KEY_FILE)

    def getContext(self):
        return self.ctx

class APNSProtocol(Protocol):
    def sendMessage(self, deviceToken, payload):
        # notification messages are binary messages in network order
        # using the following format:
        # <1 byte command> <2 bytes length><token> <2 bytes length><payload>
        fmt = "!cH32cH%dc" % len(payload)
        command = 0
        msg = struct.pack(fmt, command, deviceToken,
                          len(payload), payload)
        self.transport.write(msg)

class APNSClientFactory(ClientFactory):
    def buildProtocol(self, addr):
        print "Connected to APNS Server %s:%u" % (addr.host, addr.port)
        return APNSProtocol()

    def clientConnectionLost(self, connector, reason):
        print "Lost connection. Reason: %s" % reason

    def clientConnectionFailed(self, connector, reason):
        print "Connection failed. Reason: %s" % reason

if __name__ == '__main__':
    reactor.connectSSL(APNS_SERVER_HOSTNAME, 
                       APNS_SERVER_PORT,
                       APNSClientFactory(), 
                       APNSClientContextFactory())
    reactor.run()


1 commentaires

@Coonj Avez-vous essayé cela avec un succès? Avez-vous des exemples d'utilisation du code pour envoyer des messages? Merci.



8
votes

J'ai récemment fait ceci en utilisant django - http: // Leecutsco .de / 2009/07/14 / Push-on-the-iPhone /

peut être utile? Il ne faut utiliser aucune bibliothèque supplémentaire que celles incluses avec Python déjà. Ne prendrait pas beaucoup pour extraire la méthode Send_Message () out.


3 commentaires

Je suggère de mettre le contenu à la réponse au lieu du lien. Finalement, le lien peut être obsolète, auquel cas, d'autres personnes ne peuvent pas bénéficier de la réponse.


Tout comme @walty prédit, le lien s'est cassé. Le nouveau lien est Leecutsco.de/2009/07/14/punsh -on-the-iphone - ce serait bien si le contenu était en réponse.


J'apprécierais si vous recréez l'URL, cela me redirige de ne pas trouver la page.



2
votes

Il y avait quelques bugs dans le code posté à l'origine, voici donc une version corrigée qui fonctionne pour moi. XXX


0 commentaires

0
votes

J'ai essayé les deux APNSWRAPPER et le code de Lee Peckham et que je ne pouvais pas le faire fonctionner sous Snow Leopard avec Python 2.6. Après beaucoup d'essai et d'erreur, il a finalement fonctionné avec pyopenssl .

J'ai déjà fait un post avec des détails et des extraits de code Ici , donc je vais simplement vous référer là-bas.


0 commentaires

1
votes

Essayez de mettre à jour la dernière version APNSWRAPPER (0.4). Il existe une prise en charge de la ligne de commande OpenSSL (OpenSSL S_Client) maintenant.


0 commentaires