Closed bbtimx closed 5 years ago
Hey,
I wnat to write an app thats:
I have the stack class
from yowsup.stacks import YowStackBuilder from layer import SendLayer from yowsup.layers.auth import AuthError from yowsup.layers import YowLayerEvent from yowsup.layers.network import YowNetworkLayer from yowsup.layers.axolotl.props import PROP_IDENTITY_AUTOTRUST class YowsupStack(object): def __init__(self, credentials, encryptionEnabled = True): stackBuilder = YowStackBuilder() self.stack = stackBuilder\ .pushDefaultLayers(encryptionEnabled)\ .push(SendLayer)\ .build() self.stack.setCredentials(credentials) self.stack.broadcastEvent(YowLayerEvent(YowNetworkLayer.EVENT_STATE_CONNECT)) self.stack.setProp(PROP_IDENTITY_AUTOTRUST, True) def start(self): try: self.stack.loop(timeout = 0.5, discrete = 0.5) except AuthError as e: print("Auth Error, reason %s" % e)
layer.py
from yowsup.layers.interface import YowInterfaceLayer, ProtocolEntityCallback from yowsup.layers.auth import YowAuthenticationProtocolLayer from yowsup.layers import YowLayerEvent, EventCallback from yowsup.layers.network import YowNetworkLayer import threading, sys from yowsup.common import YowConstants from yowsup.layers.protocol_groups.protocolentities import * from yowsup.layers.protocol_presence.protocolentities import * from yowsup.layers.protocol_messages.protocolentities import * from yowsup.layers.protocol_ib.protocolentities import * from yowsup.layers.protocol_iq.protocolentities import * from yowsup.layers.protocol_contacts.protocolentities import * from yowsup.layers.protocol_chatstate.protocolentities import * from yowsup.layers.protocol_privacy.protocolentities import * from yowsup.layers.protocol_media.protocolentities import * from yowsup.layers.protocol_media.mediauploader import MediaUploader from yowsup.layers.protocol_profiles.protocolentities import * from yowsup.common.tools import Jid from yowsup.common.optionalmodules import PILOptionalModule, AxolotlOptionalModule class SendLayer(YowInterfaceLayer): PROP_MESSAGES = "org.openwhatsapp.yowsup.prop.sendclient.queue" DISCONNECT_ACTION_PROMPT = 0 def __init__(self): super(SendLayer, self).__init__() YowInterfaceLayer.__init__(self) self.connected = False self.disconnectAction = self.__class__.DISCONNECT_ACTION_PROMPT self.credentials = None self.ackQueue = [] self.lock = threading.Condition() self.jidAliases = { # "NAME": "PHONE@s.whatsapp.net" } def aliasToJid(self, calias): for alias, ajid in self.jidAliases.items(): if calias.lower() == alias.lower(): return Jid.normalize(ajid) return Jid.normalize(calias) def jidToAlias(self, jid): for alias, ajid in self.jidAliases.items(): if ajid == jid: return alias return jid def setCredentials(self, username, password): self.getLayerInterface(YowAuthenticationProtocolLayer).setCredentials(username, password) return "%s@s.whatsapp.net" % username @EventCallback(YowNetworkLayer.EVENT_STATE_DISCONNECTED) def onStateDisconnected(self,layerEvent): if self.disconnectAction == self.__class__.DISCONNECT_ACTION_PROMPT: self.connected = False else: os._exit(os.EX_OK) def assertConnected(self): if self.connected: return True else: return False def presence_available(self): if self.assertConnected(): entity = AvailablePresenceProtocolEntity() self.toLower(entity) def presence_unavailable(self): if self.assertConnected(): entity = UnavailablePresenceProtocolEntity() self.toLower(entity) def message_send(self, number, content): if self.assertConnected(): outgoingMessage = TextMessageProtocolEntity(content.encode("utf-8") if sys.version_info >= (3,0) else content, to = self.aliasToJid(number)) self.toLower(outgoingMessage) def audio_send(self, number, path): self.media_send(number, path, RequestUploadIqProtocolEntity.MEDIA_TYPE_AUDIO) def media_send(self, number, path, mediaType, caption = None): if self.assertConnected(): jid = self.aliasToJid(number) entity = RequestUploadIqProtocolEntity(mediaType, filePath=path) successFn = lambda successEntity, originalEntity: self.onRequestUploadResult(jid, mediaType, path, successEntity, originalEntity, caption) errorFn = lambda errorEntity, originalEntity: self.onRequestUploadError(jid, path, errorEntity, originalEntity) self._sendIq(entity, successFn, errorFn) self._sendIq(entity, successFn, errorFn) def disconnect(self): if self.assertConnected(): self.broadcastEvent(YowLayerEvent(YowNetworkLayer.EVENT_STATE_DISCONNECT)) def login(self): if self.connected: return False self.getLayerInterface(YowNetworkLayer).connect() return True @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): self.lock.release() sys.stdout.write("Yowsup: Message sent \n") @ProtocolEntityCallback("success") def onSuccess(self, entity): self.connected = True @ProtocolEntityCallback("failure") def onFailure(self, entity): self.connected = False def doSendMedia(self, mediaType, filePath, url, to, ip = None, caption = None): if mediaType == RequestUploadIqProtocolEntity.MEDIA_TYPE_IMAGE: entity = ImageDownloadableMediaMessageProtocolEntity.fromFilePath(filePath, url, ip, to, caption = caption) elif mediaType == RequestUploadIqProtocolEntity.MEDIA_TYPE_AUDIO: entity = AudioDownloadableMediaMessageProtocolEntity.fromFilePath(filePath, url, ip, to) elif mediaType == RequestUploadIqProtocolEntity.MEDIA_TYPE_VIDEO: entity = VideoDownloadableMediaMessageProtocolEntity.fromFilePath(filePath, url, ip, to, caption = caption) self.toLower(entity) def onRequestUploadResult(self, jid, mediaType, filePath, resultRequestUploadIqProtocolEntity, requestUploadIqProtocolEntity, caption = None): if resultRequestUploadIqProtocolEntity.isDuplicate(): self.doSendMedia(mediaType, filePath, resultRequestUploadIqProtocolEntity.getUrl(), jid, resultRequestUploadIqProtocolEntity.getIp(), caption) else: successFn = lambda filePath, jid, url: self.doSendMedia(mediaType, filePath, url, jid, resultRequestUploadIqProtocolEntity.getIp(), caption) mediaUploader = MediaUploader(jid, self.getOwnJid(), filePath, resultRequestUploadIqProtocolEntity.getUrl(), resultRequestUploadIqProtocolEntity.getResumeOffset(), successFn, self.onUploadError, self.onUploadProgress, async=False) mediaUploader.start() def onRequestUploadError(self, jid, path, errorRequestUploadIqProtocolEntity, requestUploadIqProtocolEntity): logger.error("Request upload for file %s for %s failed" % (path, jid)) def onUploadError(self, filePath, jid, url): logger.error("Upload file %s to %s for %s failed!" % (filePath, url, jid)) def onUploadProgress(self, filePath, jid, url, progress): sys.stdout.write("%s => %s, %d%% \r" % (os.path.basename(filePath), jid, progress)) sys.stdout.flush() @ProtocolEntityCallback("error") def onError(self, entity): sys.stdout.write("Yowsup: sent error \n")
and initialized with:
self.whatsapp = stack.YowsupStack(self.auth) self.whatsapp.start()
But from now I cant deal with the SendLayer class function.
How I now implement something like this:
self.whatsapp = stack.YowsupStack(self.auth) self.whatsapp.start() self.whatsapp.layer.presence_available() self.whatsapp.layer.message_send('13245678765', 'Hello') self.whatsapp.layer.presence_available() self.whatsapp.layer.disconnect()
Thx a lot
did you done this
Hey,
I wnat to write an app thats:
I have the stack class
layer.py
and initialized with:
But from now I cant deal with the SendLayer class function.
How I now implement something like this:
Thx a lot