1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

[Python] Bot funktioniert nicht.

Dieses Thema im Forum "Support & Discussion" wurde erstellt von Cascraft, 8. August 2017.

  1. Cascraft

    Cascraft New Member

    Registriert seit:
    13. Juli 2017
    Beiträge:
    15
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    Hallo, ich habe versucht einigermaßen mit mühe den Sourcecode von Thunderbyte wieder neu zu schreiben, aber es funktioniert irgendwie nicht. Es gibt mir die Fehlermeldung:
    Hier einmal die Pakets von Spiel Daimonin:

    [Server auswählen]
    Mit Wireshark:(Hex)
    01008C647620302E31302E372070762039393130333120736E20333137337C6661336232653863206D7A20313778313720736B6620343235357C34376330643162302073706620333237397C363236373361376520627066203332363137307C61653138366364642073746620323538397C623634383035633220616D66203335333230357C633736333133626200
    Mit Python converter:
    \x01\x00\x8cdv 0.10.7 pv 991031 sn 3173|fa3b2e8c mz 17x17 skf 4255|47c0d1b0 spf 3279|62673a7e bpf 326170|ae186cdd stf 2589|b64805c2 amf 353205|c76313bb\x00
    ------------------------------------------------------------------------>
    [Login]
    Mit Wireshark:(Hex)
    04001300746573743931003132333435366F6B617900
    Mit Python converter:
    \x04\x00\x13\x00test91\x00123456okay\x00
    ------------------------------------------------------------------------>
    [Character auswählen]
    Mit Wireshark:(Hex)
    0700055472796600
    Mit Python converter:
    \x07\x00\x05Tryf\x00



    Hier der Sourcecode:
    Code (Python):

    import sys
    import socket
    import binascii
    import re

    def move(direction):
        if direction == "left":
            direction = "\x05"
        elif direction == "right":
            direction = "\x05"
        elif direction == "top":
            direction = "\x05"
        elif direction == "bottom":
            direction = "\x05"
        else:
            direction = "\x02"
            s.send("\x09"+direction+"\x00")


    GAME_IP = '144.76.98.166'
    GAME_PORT = 13326
    BUFFER_SIZE = 4096

    LOGIN_1_PAKET = "\x01\x00\x8cdv 0.10.7 pv 991031 sn 3173|fa3b2e8c mz 17x17 skf 4255|47c0d1b0 spf 3279|62673a7e bpf 326170|ae186cdd stf 2589|b64805c2 amf 353205|c76313bb\x00"
    username = "test91"
    password = "123456okay"
    LOGIN_2_PAKET = "\x04\x00\x13\x00"+str(username)+"\x00"+str(password)+"\x00"
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((GAME_IP, GAME_PORT))
    s.send('LOGIN_1_PAKET)'.encode(encoding='utf-8'))

    data = ""
    while data == "":
        data = s.recv(BUFFER_SIZE)

    data = binascii.hexlify(b'hex')

    characters = re.search(b"54727966(.*)00", data)

    if not characters:
        sys.exit("No Usernames were found. Exiting.")
    character1 = characters.group(1).decode(b'hex')

    s.send('\x07\x00\x05'+character1+'\x00')


    while  True:


        data = s.recv(BUFFER_SIZE)
        time.sleep(2)
        print ("working...")
        move(left)

     


    Kann mir bitte jemand sagen warum das nicht funktioniert?
     
    Zuletzt bearbeitet: 9. August 2017
  2. krusty

    krusty Moderator Mitarbeiter Moderator

    Registriert seit:
    1. Juli 2017
    Beiträge:
    43
    Zustimmungen:
    26
    Punkte für Erfolge:
    18
    Geschlecht:
    männlich
    Ort:
    Wadiya
  3. Cascraft

    Cascraft New Member

    Registriert seit:
    13. Juli 2017
    Beiträge:
    15
    Zustimmungen:
    0
    Punkte für Erfolge:
    1

    #Ja, es werden mir immer die gleichen Pakets anzeigt und ich bin mir auch zu 100% sicher, dass das die richtigen Pakets sind.

    Ich kann leider kein Syntaxhighlighter für Python wählen, daher blieb mir nur die Wahl "allgemeiner code" zu verwenden.
     
  4. source++

    source++ New Member

    Registriert seit:
    3. Juli 2017
    Beiträge:
    24
    Zustimmungen:
    22
    Punkte für Erfolge:
    3
    Geschlecht:
    männlich
    Bei deinem Problem kann ich dir leider nicht helfen sorry, aber beim Syntaxhighlighter, du musst das manuell einfügen:

    [ code=Python ]

    Dein Code ...

    [ /code ]

    ohne Leerzeichen ...
     
    hantoren und Cascraft gefällt das.
  5. krusty

    krusty Moderator Mitarbeiter Moderator

    Registriert seit:
    1. Juli 2017
    Beiträge:
    43
    Zustimmungen:
    26
    Punkte für Erfolge:
    18
    Geschlecht:
    männlich
    Ort:
    Wadiya
    Hast du mit wireshark mal deine pakete gesnifft und geschaut, ob sie komplett übereinstimmen?
     
  6. SilverHazard

    SilverHazard Moderator Mitarbeiter Moderator

    Registriert seit:
    2. Juli 2017
    Beiträge:
    68
    Zustimmungen:
    51
    Punkte für Erfolge:
    18
    Geschlecht:
    männlich
    Hi,

    Ist das der richtige Quellcode order ging da beim Einfügen was verloren?

    Code (Python):
    s.send('LOGIN_1_PAKET)'.encode(encoding='utf-8'))
    Das sendet den Text 'LOGIN_1_PAKET)' an den Server, vermutlich sollte das eher sowas sein:
    Code (Python):
    s.send(LOGIN_1_PAKET.encode(encoding='utf-8'))
    Außerdem schickst du nie LOGIN_2_PAKET ab, du meldest dich also nie tatsächlich an.


    EDIT:
    Bevor du das Regex laufen lässt, ersetzt du data durch die Hex-Repräsentation von "hex". Du überschreibst damit die Werte, die du vom Server gekriegt hast.
     
    Zuletzt bearbeitet: 9. August 2017
  7. Cascraft

    Cascraft New Member

    Registriert seit:
    13. Juli 2017
    Beiträge:
    15
    Zustimmungen:
    0
    Punkte für Erfolge:
    1

    Ich habe das nochmal bearbeitet, bekomme aber immer noch den Fehler:
    Code (Python):
    import sys
    import socket
    import binascii
    import re

    def move(direction):#Bewegt den Charakter auf der Map
        if direction == "left":
            direction = "\x05"
        elif direction == "right":
            direction = "\x05"
        elif direction == "top":
            direction = "\x05"
        elif direction == "bottom":
            direction = "\x05"
        else:
            direction = "\x02"
            s.send("\x09"+direction+"\x00")


    GAME_IP = '144.76.98.166'
    GAME_PORT = 13326
    BUFFER_SIZE = 4096

    LOGIN_1_PAKET = "\x01\x00\x8cdv 0.10.7 pv 991031 sn 3173|fa3b2e8c mz 17x17 skf 4255|47c0d1b0 spf 3279|62673a7e bpf 326170|ae186cdd stf 2589|b64805c2 amf 353205|c76313bb\x00"
    username = "test91"
    password = "123456okay"
    LOGIN_2_PAKET = "\x04\x00\x13\x00"+str(username)+"\x00"+str(password)+"\x00"
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((GAME_IP, GAME_PORT))#Zum Server verbinden
    s.send(LOGIN_1_PAKET.encode(encoding='utf-8'))#Sendet das Paket zum auswahl des Servers

    data = "" #Data Variable erstellen
    while data == "":#Solange kein Paket als antwort gekommen ist
        data = s.recv(BUFFER_SIZE)#Prüfe ob ein Paket gekommen ist
    s.send(LOGIN_2_PAKET.encode(encoding='utf-8'))#Sendet das Login Paket




    data = binascii.hexlify(b'hex')#Paket als Hex umwandeln



    characters = re.search(b"54727966(.*)00", data)#Nach den Usernamen suchen

    if not characters:
        sys.exit("No Usernames were found. Exiting.")
    character1 = characters.group(1).decode('hex')#Name zurück codieren


    s.send('\x07\x00\x05'+character1+'\x00')#Sendet das Paket zum Character auswahl
    while  True:
        data = s.recv(BUFFER_SIZE)
        time.sleep(2)
        print ("working...")
        move(left)
     
    Sorry, aber ich verstehe nicht wie du das meinst...
     
  8. SilverHazard

    SilverHazard Moderator Mitarbeiter Moderator

    Registriert seit:
    2. Juli 2017
    Beiträge:
    68
    Zustimmungen:
    51
    Punkte für Erfolge:
    18
    Geschlecht:
    männlich
    Hinweis: Folgende Analyse bezieht sich primär auf den zuerst geposteten Quellcode, Anpassungen für den neuen Code stehen am Ende

    Ich habe es geschafft, mich erfolgreich mit dem Server zu verbinden und mich auf der Map zu bewegen. Dabei ist mir einiges aufgefallen:
    1. Code (Python):
      GAME_PORT = 13326
      Dieser Port wird nur verwendet, um eine Liste der verfügbaren Server zu erhalten. Der Server "Main" verwendet allerdings den Port 13327.
    2. Code (Python):
      s.send('LOGIN_1_PAKET)'.encode(encoding='utf-8'))
      Wie schon erwähnt, sendet diese Zeile den Text 'LOGIN_1_PAKET)' an den Server. Du willst aber den Inhalt von LOGIN_1_PAKET senden.
      LOGIN_1_PAKET.encode('utf-8') fügt aus irgendeinem Grund ein Zeichen hinzu, es funktioniert aber, wenn du es bei der Definition gleich zu bytes verwandelst:
      Code (Python):
      LOGIN_1_PAKET = b"\x01\x00\x8cdv 0.10.7..."
    3. Nachdem du LOGIN_1_PAKET gesendet hast, musst du noch LOGIN_2_PAKET mit den Benutzerdaten senden:
      Code (Python):
      username = b"test91"
      password = b"123456okay"
      LOGIN_2_PAKET = b"\x04\x00\x13\x00"+username+b"\x00"+password+b"\x00"
      # ...
      s.send(LOGIN_2_PAKET)
      data = ""
      while data == "":
          data = s.recv(BUFFER_SIZE)
       
    4. Code (Python):
      data = binascii.hexlify(b'hex')
      Hier ersetzt du data durch die hexadezimale Version von 'hex', also b'686578'. Vermutlich wolltest du aber data in einen hex-string verwandeln:
      Code (Python):
      data = binascii.hexlify(data)
    5. Code (Python):
      characters = re.search(b"54727966(.*)00", data)
      data hat den Wert "1c0900005472796600010001", wobei "54727966" den Namen deines Charakters, den du eigentlich auslesen willst, repräsentiert. Dein Regex bibt dir also nur "00010". Um den Namen auszulesen, hilft dir sowas:
      Code (Python):
      characters = re.search(b"0000(.*?)00010001", data)
    6. Code (Python):
      character1 = characters.group(1).decode(b'hex')
      characters.group(1) ist ein bytestring, decode() wandelt es zurück in einen normalen String, allerdings sind es dann trotzdem nur die Hex-Werte. b'hex' ist kein unterstützter Parameter für decode. Um die Hexwerte wieder in Ascii zurückzuverwandelt brauchst du binascii.unhexlify(data):
      Code (Python):
      character1 = binascii.unhexlify(characters.group(1))
    7. Code (Python):
      s.send('\x07\x00\x05'+character1+'\x00')[/Python]
      [I]s.send[/I] braucht bytes als Parameter. [I]character1 [/I]ist bereits ein bytestring, die anderen beiden Teile jedoch nicht:
      [code=Python]s.send(b'\x07\x00\x05'+character1+b'\x00')
    8. Code (Python):
      time.sleep(2)
      Damit das funktioniert, musst du noch time mittels import time importieren
    9. Code (Python):
      move(left)
      left ist keine Variable; deine Funktion erwartet einen String:
      Code (Python):
      move("left")

    Während ich das geschrieben hatte, kam ein neuer Quellcode, deswegen wie angekündigt hier die Anpassungen:

    Soweit ich das erkenne, besteht die Änderung hauptsächlich darin, dass du LOGIN_2_PAKET sendest. Allerdings fehlt noch das Abrufen der Daten (siehe 3.).

    Dein Versuch, data in hex zu verwandeln, wandelt eigentlich nur 'hex' in Hex um und speichert es in data. binascii.hexlify kriegt auch nirgendwo den Wert von data.


    Code (Python):
    import sys
    import socket
    import binascii
    import re
    import time

    def move(direction):
        if direction == "left":
            direction = "\x05"
        elif direction == "right":
            direction = "\x05"
        elif direction == "top":
            direction = "\x05"
        elif direction == "bottom":
            direction = "\x05"
        else:
            direction = "\x02"
            s.send("\x09"+direction+"\x00")
         
    GAME_IP = '144.76.98.166'
    GAME_PORT = 13327
    BUFFER_SIZE = 1024
    LOGIN_1_PAKET = b"\x01\x00\x8cdv 0.10.7 pv 991031 sn 3173|fa3b2e8c mz 17x17 skf 4255|47c0d1b0 spf 3279|62673a7e bpf 326170|ae186cdd stf 2589|b64805c2 amf 353205|c76313bb\x00"
    username = b"test91"
    password = b"123456okay"
    LOGIN_2_PAKET = b"\x04\x00\x13\x00"+username+b"\x00"+password+b"\x00"
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((GAME_IP, GAME_PORT))
    s.send(LOGIN_1_PAKET)

    data = ""

    while data == "":
        data = s.recv(BUFFER_SIZE)

    print(data)


    s.send(LOGIN_2_PAKET)
    data = ""
    while data == "":
        data = s.recv(BUFFER_SIZE)

    data = binascii.hexlify(data)
    print(data)
    characters = re.search(b"0000(.*?)00010001", data)

    if not characters:
        print("Here")
        sys.exit("No Usernames were found. Exiting.")
    character1 = binascii.unhexlify(characters.group(1))
    print(character1)

    s.send(b'\x07\x00\x05'+character1+b'\x00')


    while  True:
        data = s.recv(BUFFER_SIZE)
        print(data)
        time.sleep(2)
        print ("working...")
        move("left")
     


    Nimms mir bitte nicht übel, aber hat sehr stark den Anschein, als ob du von Python recht wenig Ahnung hast...
     
    hantoren, CptVince, Cascraft und 3 anderen gefällt das.
  9. Cascraft

    Cascraft New Member

    Registriert seit:
    13. Juli 2017
    Beiträge:
    15
    Zustimmungen:
    0
    Punkte für Erfolge:
    1

Diese Seite empfehlen

Die Seite wird geladen...