yowsup - Integration senden und empfangen
Hintergrund:
Ich würde gerne integrieren yowsup zu meinem home-automation-Projekt. Ich habe gesehen, ein einfaches Beispiel, wie Nachrichten empfangen und nach einigen kleinen änderungen ist es fein arbeiten.
Problem:
Mein problem beginnt, wenn es um die Integration der sende-Nachricht Funktion. Das sind die zwei Dateien die ich benutze:
run.py
from layer import EchoLayer
from yowsup.layers.auth import YowAuthenticationProtocolLayer
from yowsup.layers.protocol_messages import YowMessagesProtocolLayer
from yowsup.layers.protocol_receipts import YowReceiptProtocolLayer
from yowsup.layers.protocol_acks import YowAckProtocolLayer
from yowsup.layers.protocol_presence import YowPresenceProtocolLayer
from yowsup.layers.network import YowNetworkLayer
from yowsup.layers.coder import YowCoderLayer
from yowsup.common import YowConstants
from yowsup.layers import YowLayerEvent
from yowsup.stacks import YowStack, YOWSUP_CORE_LAYERS
from yowsup import env
CREDENTIALS = ("phone", "pwd")
if __name__ == "__main__":
layers = (
EchoLayer,
(YowAuthenticationProtocolLayer, YowMessagesProtocolLayer, YowReceiptProtocolLayer, YowAckProtocolLayer, YowPresenceProtocolLayer)
) + YOWSUP_CORE_LAYERS
stack = YowStack(layers)
# Setting credentials
stack.setProp(YowAuthenticationProtocolLayer.PROP_CREDENTIALS, CREDENTIALS)
# WhatsApp server address
stack.setProp(YowNetworkLayer.PROP_ENDPOINT, YowConstants.ENDPOINTS[0])
stack.setProp(YowCoderLayer.PROP_DOMAIN, YowConstants.DOMAIN)
stack.setProp(YowCoderLayer.PROP_RESOURCE, env.CURRENT_ENV.getResource())
# Sending connecting signal
stack.broadcastEvent(YowLayerEvent(YowNetworkLayer.EVENT_STATE_CONNECT))
# Program main loop
stack.loop()
layer.py
from yowsup.layers.interface import YowInterfaceLayer, ProtocolEntityCallback
from yowsup.layers.protocol_messages.protocolentities import TextMessageProtocolEntity
from yowsup.layers.protocol_receipts.protocolentities import OutgoingReceiptProtocolEntity
from yowsup.layers.protocol_acks.protocolentities import OutgoingAckProtocolEntity
from yowsup.layers.protocol_presence.protocolentities import PresenceProtocolEntity
import threading
import logging
logger = logging.getLogger(__name__)
class EchoLayer(YowInterfaceLayer):
@ProtocolEntityCallback("message")
def onMessage(self, messageProtocolEntity):
#send receipt otherwise we keep receiving the same message over and over
print str(messageProtocolEntity.getFrom()) + ' - ' + str(messageProtocolEntity.getBody())
receipt = OutgoingReceiptProtocolEntity(messageProtocolEntity.getId(), messageProtocolEntity.getFrom())
self.toLower(receipt)
@ProtocolEntityCallback("send_message")
def sendMessage(self, destination, message, messageProtocolEntity):
outgoingMessageProtocolEntity = TextMessageProtocolEntity(
message,
to = destination + "@s.whatsapp.net")
self.toLower(outgoingMessageProtocolEntity)
@ProtocolEntityCallback("receipt")
def onReceipt(self, entity):
ack = OutgoingAckProtocolEntity(entity.getId(), "receipt", "delivery")
self.toLower(ack)
# List of (jid, message) tuples
PROP_MESSAGES = "org.openwhatsapp.yowsup.prop.sendclient.queue"
def __init__(self):
super(EchoLayer, self).__init__()
self.ackQueue = []
self.lock = threading.Condition()
@ProtocolEntityCallback("success")
def onSuccess(self, successProtocolEntity):
self.lock.acquire()
for target in self.getProp(self.__class__.PROP_MESSAGES, []):
phone, message = target
if '@' in phone:
messageEntity = TextMessageProtocolEntity(message, to = phone)
elif '-' in phone:
messageEntity = TextMessageProtocolEntity(message, to = "%[email protected]" % phone)
else:
messageEntity = TextMessageProtocolEntity(message, to = "%[email protected]" % phone)
self.ackQueue.append(messageEntity.getId())
self.toLower(messageEntity)
self.lock.release()
@ProtocolEntityCallback("ack")
def onAck(self, entity):
self.lock.acquire()
if entity.getId() in self.ackQueue:
self.ackQueue.pop(self.ackQueue.index(entity.getId()))
if not len(self.ackQueue):
logger.info("Message sent")
#raise KeyboardInterrupt()
self.lock.release()
Fragen:
- Wo soll ich rufen Sie die Methode send_message, so dass ich Nachrichten senden kann, wo ich ihn brauche?
- Ist es ein regelmäßiger event (auslösendes jede Sekunde oder so), die ich verwenden könnte, zu senden meine Nachrichten?
InformationsquelleAutor | 2015-03-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der avove code
sendMessage
genannt zu werden,protocolEntity.getTag() == "send_message"
werdenTrue
. Sie brauchen es nicht, um Nachricht zu senden.layer.py
Senden Nachricht definieren Sie eine Funktion
send_message
im stackrun.py
. Sie können auch importieren run.py und verwenden Sie die Funktion vom anderen Skript.Nun können Sie die Nachricht senden durch den Aufruf
send_message('1234567890','Howdy')
an und erhalten Sie Nachricht durch den Aufrufrecv_message()
.send_message
ist in run.py. Sie können laufenpython run.py number message
. Oder importieren run.py erhalten Sie Zugang zusend_message
Funktion.Hallo. Getestet habe ich, wie Sie vorgeschlagen. Es scheint, der code bleibt in einer endlos-Schleife. Das ist die einzige Meldung die ich bekomme: Kein Handler gefunden werden konnte, der für den logger "yowsup.Stapel.yowstack"
Hi gib mir mehr info, so kann ich helfen.
InformationsquelleAutor Nizam Mohamed