Seite 1 von 1

Python class in defination

Verfasst: Mittwoch 21. Oktober 2020, 13:31
von fynnpf

Code: Alles auswählen

from selenium import webdriver
from datetime import datetime
from time import sleep
from chrome2 import Chrome

class Whatsapp:
    
    def __init__(self):
        self.selectors = {
            'qrcode': 'canvas',
            'search_input':  '#side .copyable-text.selectable-text',
            'search_result': '#side span[title="{}"]',
            'message_input': '#main footer div.copyable-text.selectable-text',
            'message_send':  '#main footer button span[data-icon="send"]'
        }
        
        url = 'http://web.whatsapp.com'
        
        self.chrome = Chrome.instance
        
               
        
    def _ensure_page_load(self):
        pass
        
    def _check_valid_qrcode(self):
        # Not logged in
        small_timeout = 5
        while not self.chrome.element_exists_at(self.selectors['search_input'], timeout=small_timeout):
            qrcode = self.chrome.wait_for(self.selectors['qrcode'], timeout=small_timeout)
            self.chrome.screenshot('screens/qrcode.png')
            
            print('Look for whatsapp QRCode inside your running directory.')
            sleep(small_timeout)
        
        print('Whatsapp successfully logged in...')
        self.chrome.screenshot('screens/1.png')

    def _search_for_chat(self, to):
        self.chrome.wait_for(self.selectors['search_input']).send_keys(to)
        self.chrome.wait_for(self.selectors['search_result'].format(to)).click()
        self.chrome.screenshot('screens/2.png')
    
    def _type_message(self, message):
        self.chrome.wait_for(self.selectors['message_input']).send_keys(message + '\n')
        # self.chrome.wait_for(selectors['message_send']).click()  # replaced by '\n' on previous line
        self.chrome.screenshot('screens/3.png')
    
    def send(self, message, to):
        
        try:
            self._check_valid_qrcode()
            self._search_for_chat(to)
            self._type_message(message)
            
        except Exception as e:
            print('An unexpected error occured. Quiting chrome now')
            self.chrome.screenshot('screens/error.png')
            self.chrome.quit()
            
            raise e
            
            
    def load_chats(self):
        '''
            return a triple (name, timestamp) for every chat open
        '''
        return_chats = []
        sel = '#pane-side'
        
        timeout = 15
        chatbox = self.chrome.wait_for('#pane-side', timeout=timeout)
        chats = chatbox.find_elements_by_css_selector('div[tabindex]')
        
        self.chrome.screenshot('screens/4.png')
        
        # print('chats', chats)
        for chat in chats:
            # print('---')
            items = chat.text.split('\n')
            print(items[1], items[0])
            return_chats.append( (items[1], items[0]) )
        

if __name__ == '__main__':
    message = 'Auftrag\r\r\nneue Spalte!!!!'
    to = 'Test'
    
    whats = Whatsapp()
    whats.send(message, to)
    

Code: Alles auswählen

def create(person):
    """
    This function creates a new person in the people structure
    based on the passed in person data
    :param person:  person to create in people structure
    :return:        201 on success, 406 on person exists
    """
    lname = person.get("lname", None)
    fname = person.get("fname", None)

    # Does the person exist already?
    if lname not in PEOPLE and lname is not None:
        PEOPLE[lname] = {
            "lname": lname,
            "fname": fname,
            "timestamp": get_timestamp(),
        }
        return make_response(
	
	#CODE SOLL HIER AUSFEFÜHRT WERDEN
	
        )
    else:
        abort(
            406
        )
Wie bekommte ich es hin, dass der erste Code an der Stelle return make_response (#CODE SOLL HIER AUSFEFÜHRT WERDEN) ausgeführt wird???

Re: Python class in defination

Verfasst: Mittwoch 21. Oktober 2020, 13:45
von Sirius3
Welcher "class test"? Woher kommt lname?
Benutze keine Abkürzungen. Bei lname, fname sind das l und f doch total nichtssagend.

Re: Python class in defination

Verfasst: Mittwoch 21. Oktober 2020, 13:53
von fynnpf
Es geht allgemein darum, wie ich "class test" in "def create" ausführen kann.

Re: Python class in defination

Verfasst: Mittwoch 21. Oktober 2020, 13:56
von __blackjack__
@fynnpf: Du willst da ziemlich sicher keine ``class`` in der Funktion definieren. Und Klassen führt man nicht aus. Klassen sind nichts ausführbares, Klassen sind eine Vorlage für Objekte die man damit erstellen kann. Was trivial ist, also sicher nicht die Frage sein kann. Ich glaube hier weiss keiner was Du tatsächlich machen willst.

Re: Python class in defination

Verfasst: Mittwoch 21. Oktober 2020, 13:59
von fynnpf
Ich habe die Frage aktualisiert!!!

Re: Python class in defination

Verfasst: Mittwoch 21. Oktober 2020, 14:03
von snafu
Falls ich es richtig rate:

Code: Alles auswählen

make_response(Test())

Re: Python class in defination

Verfasst: Mittwoch 21. Oktober 2020, 14:17
von fynnpf
TypeError: The view function did not return a valid response.

Re: Python class in defination

Verfasst: Mittwoch 21. Oktober 2020, 14:21
von __blackjack__
@fynnpf: Ich könnte jetzt anfangen zu raten was denn eine „view function“ in diesem Kontext ist, und welches Rahmenwerk Du vielleicht verwendest. Du könntest solche Sachen aber auch einfach mal von Dir aus verraten.

Was sagt denn die Dokumentation was man da zurückgeben darf? Und was ist `make_response()`?

Re: Python class in defination

Verfasst: Mittwoch 21. Oktober 2020, 14:29
von fynnpf
@__blackjack__ Das ist eine REST-API. make_response() hat ursprünglich einen Dialog ausgegeben.
Ich möchte jetzt aber, dass die class Whatsapp ausgeführt wird, wenn make_response() ausgeführt wird, also die Daten erfolreich verarbeitet worden sind.

Zu der Fehlermeldung: TypeError: The view function did not return a valid response. The return type must be a string, dict, tuple, reponse instance, or wsgi callable, but it was a Whatsapp.

Re: Python class in defination

Verfasst: Mittwoch 21. Oktober 2020, 15:00
von snafu
Dann muss offenbar WhatsApp von Response erben und sich entsprechend der geforderten Schnittstelle verhalten. Da du nur häppchenweise Infos lieferst, könnte das noch ein lustiges Frage-Antwort-Spiel werden. :)

Re: Python class in defination

Verfasst: Mittwoch 21. Oktober 2020, 15:20
von __blackjack__
Ich würde sagen das ist kein so guter Rat, denn ich glaube nicht das zwischen `Whatsapp` und `Response`, offenbar von einem Webrahmenwerk, eine „ist-ein(e)“-Beziehung besteht. Vererbung wäre da das falsche Mittel.

Die Frage ist ja was denn da an den Client ausgeliefert werden soll. Text/HTML(-Fragment) für eine Webseite? Ein JSON-Objekt? Ein Objekt mit dem man Nachrichten per Whatsapp verschicken kann, macht da nicht wirklich Sinn an der Stelle.

Re: Python class in defination

Verfasst: Mittwoch 21. Oktober 2020, 16:14
von fynnpf
Hallo, ich bin noch neu was Python angeht.
Was ich aber zusätlich sagen kann, dass class Whatsapp funktioniert, wenn es in einer einzelnen .py Datei ist. Das Whatsapp script wird dann ausgeführt.
Ich versuche halt, dass die REST API wenn ein neuer Eintrag erstellt wird, das script ausführt. In python2 war es execfile, was ich soweit auch zum laufen bekomme.
Ich weiss nur nicht, wie ich die Daten von der einen zu der anderen Python Datei bekomme, also z.B. lname, deshalb habe ich die class Whatsapp in die andere Python datei eingefügt, weil ich dann direkt mit variablen arbeiten kann. Wenn also make_response() ausgeführt wird, soll ganz simpel die class bzw. das script whatsapp ausfeführt werden.

Re: Python class in defination

Verfasst: Mittwoch 21. Oktober 2020, 16:27
von fynnpf
Entscheidene Zusatzinfo: Das ganze ist eine REST-API mit Flask, in der dann nach dem return response bzw. make response die class ausgeführ werden soll. Hilft das als information???

Re: Python class in defination

Verfasst: Mittwoch 21. Oktober 2020, 17:26
von Sirius3
Eine Whatsapp-Klasse kann man nicht per REST-API zurückgeben. Man kann nur in einer Funktion, die per REST-API aufgerufen wird, irgendwas mit der Whatsapp-Klasse machen, so wie Du das ja schon in einer einzlnen py-Datei machst.