yowsup отправить сообщение и получить ответ - PullRequest
0 голосов
/ 12 сентября 2018

Мне нужно отправить простое текстовое сообщение, ожидая ответа и отправить сообщение с этим контактом на другой номер.Код ниже отправляет первое сообщение, но я не знаю, как правильно запустить клиент echo.Что я делаю не так?С уважением.

from yowsup.layers.interface                           import YowInterfaceLayer, ProtocolEntityCallback
from yowsup.layers.protocol_messages.protocolentities  import TextMessageProtocolEntity
from yowsup.common.tools import Jid
import threading
import logging
logger = logging.getLogger(__name__)
from yowsup.stacks import  YowStackBuilder
from yowsup.layers.auth import AuthError
from yowsup.layers import YowLayerEvent
from yowsup.layers.auth import YowAuthenticationProtocolLayer
from yowsup.layers.network import YowNetworkLayer
from yowsup.layers import YowLayer
from yowsup.env import YowsupEnv

Отправить создание слоя

class SendLayer(YowInterfaceLayer):

    #This message is going to be replaced by the @param message in YowsupSendStack construction
    #i.e. list of (jid, message) tuples
    PROP_MESSAGES = "org.openwhatsapp.yowsup.prop.sendclient.queue"


    def __init__(self):
        super(SendLayer, self).__init__()
        self.ackQueue = []
        self.lock = threading.Condition()

    #call back function when there is a successful connection to whatsapp server
    @ProtocolEntityCallback("success")
    def onSuccess(self, successProtocolEntity):
        self.lock.acquire()
        #for target in self.getProp(self.__class__.PROP_MESSAGES, []):
        #getProp() is trying to retreive the list of (jid, message) tuples, if none exist, use the default []
        phones = ['phone numbers']
        message = 'text message'
        for phone in phones:
            messageEntity = TextMessageProtocolEntity(message, to = Jid.normalize(phone))
            #append the id of message to ackQueue list
            #which the id of message will be deleted when ack is received.
            self.ackQueue.append(messageEntity.getId())
            self.toLower(messageEntity)
            self.lock.release()

    #after receiving the message from the target number, target number will send a ack to sender(us)
    @ProtocolEntityCallback("ack")
    def onAck(self, entity):
        self.lock.acquire()
        #if the id match the id in ackQueue, then pop the id of the message out
        if entity.getId() in self.ackQueue:
            self.ackQueue.pop(self.ackQueue.index(entity.getId()))

        if not len(self.ackQueue):
            self.lock.release()
            logger.info("Message sent")
            #raise KeyboardInterrupt()

        self.lock.release()

Создать общий стек.

class YowsupStack(object):
    def __init__(self, credentials, messages, encryptionEnabled = True):
        """
        :param credentials:
        :param messages: list of (jid, message) tuples
        :param encryptionEnabled:
        :return:
        """
        stackBuilder = YowStackBuilder()

        self.stack = stackBuilder\
            .pushDefaultLayers(encryptionEnabled)\
            .push(SendLayer)\
            .push(EchoLayer)\
            .build()

        self.stack.setProp(SendLayer.PROP_MESSAGES, messages)
        self.stack.setProp(YowAuthenticationProtocolLayer.PROP_PASSIVE, True)
        self.stack.setCredentials(credentials)

    def start(self):
        self.stack.broadcastEvent(YowLayerEvent(YowNetworkLayer.EVENT_STATE_CONNECT))
        try:
            self.stack.loop()
        except AuthError as e:
            print("Authentication Error: %s" % e.message)

Создание echo_client.

class EchoLayer(YowLayer):

    def receive(self, protocolEntity):
        if protocolEntity.getTag() == "message":
            self.onMessage(protocolEntity)

        def onMessage(self, messageProtocolEntity):
            income_message = messageProtocolEntity.getBody()
            print('income message = ', income_message,'tel number = ', messageProtocolEntity.getFrom())

            if income_message == 'condition':
                outgoingMessageProtocolEntity = TextMessageProtocolEntity(
                    messageProtocolEntity.getFrom(),
                    to = 'phone number'
                )
                self.toLower(outgoingMessageProtocolEntity)

credentials = ("###", "pw")
text_messages= ['messages']
stack = YowsupStack(credentials,mess)
stack.start()
...