Coder Social home page Coder Social logo

wurzelimperiumbot's Introduction

wurzelimperiumbot's People

Contributors

dependabot[bot] avatar masterzydra avatar mrflamez avatar pazze12 avatar xruffkez avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

wurzelimperiumbot's Issues

error unix install script

wimpbot.service - WurzelimperiumBot
     Loaded: loaded (/lib/systemd/system/wimpbot.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-07-21 15:34:23 CEST; 1min 27s ago
   Main PID: 6320 (worker.sh)
      Tasks: 2 (limit: 4915)
        CPU: 42.906s
     CGroup: /system.slice/wimpbot.service
             ├─6320 /bin/bash /home/pazze/GIT/worker.sh
             └─6423 sleep 60

Jul 21 15:35:06 raspberrypi worker.sh[6422]: Traceback (most recent call last):
Jul 21 15:35:06 raspberrypi worker.sh[6422]:   File "/home/pazze/GIT/wurzelbot/data/automated_script.py", line 5, in <module>
Jul 21 15:35:06 raspberrypi worker.sh[6422]:     from src.WurzelBot import WurzelBot
Jul 21 15:35:06 raspberrypi worker.sh[6422]:   File "/home/pazze/GIT/wurzelbot/data/src/WurzelBot.py", line 10, in <module>
Jul 21 15:35:06 raspberrypi worker.sh[6422]:     from src.HTTPCommunication import HTTPConnection
Jul 21 15:35:06 raspberrypi worker.sh[6422]:   File "/home/pazze/GIT/wurzelbot/data/src/HTTPCommunication.py", line 14, in <module>
Jul 21 15:35:06 raspberrypi worker.sh[6422]:     from lxml import html, etree
Jul 21 15:35:06 raspberrypi worker.sh[6422]:   File "/home/pazze/.local/lib/python3.9/site-packages/lxml/html/__init__.py", line 53, in <mo>
Jul 21 15:35:06 raspberrypi worker.sh[6422]:     from .. import etree
Jul 21 15:35:06 raspberrypi worker.sh[6422]: ImportError: libxslt.so.1: cannot open shared object file: No such file or directory

Erkennung von Bienenverfügbarkeit funktioniert nicht korrekt

Beim Testen vom Bienen senden, wurden keine Bienen gesendet, obwohl schon drei Bienenstöcke freigeschaltet sind.
Die Logik in HttpConnection.isHoneyFarmAvailable() schaut, ob ein gestimmtes Geschenk vorhanden ist.
Bei mir ist diese Geschenk jedoch nicht im Trophäenschrank.

Hier müssen wir eine andere Prüfung finden.

AttributeError

Hey, ich versuche seit 2-3 Tagen das ganze zum laufen zu bringen erst mit Version 3.11 von Python jetzt mittlerweile auf 3.9 runter da es auf 3.11 nicht funktioniert hat mit lxml.
Nun bekomme ich ständig den fehler mit i18n dieser lautet: AttributeError: 'function' object has no attribute 'append'
Habe schon halb Google durchsucht aber leider keine Lösung zu diesem Thema gefunden ich hoffe ihr könnt mir hierbei helfen.

Vielen Dank

Script errors

'''
Alle Pflanzen gießen...
Täglichen Login Bonus abholen...
Traceback (most recent call last):
File "/home/wimp/wimpbot/./automated_script.py", line 55, in
wurzelBot.getDailyLoginBonus()
File "/home/wimp/wimpbot/src/WurzelBot.py", line 446, in getDailyLoginBonus
self.bonus.getDailyLoginBonus()
File "/home/wimp/wimpbot/src/Bonus.py", line 10, in getDailyLoginBonus
bonus_data = self.__httpConn.readUserDataFromServer(data_type="dailyloginbonus")['dailyloginbonus']
File "/home/wimp/wimpbot/src/HTTPCommunication.py", line 452, in readUserDataFromServer
headers = self.__getHeaders()
File "/home/wimp/wimpbot/src/HTTPCommunication.py", line 362, in __getHeaders
headers = {'Cookie': 'PHPSESSID=' + self.__Session.getSessionID() + '; ' +
TypeError: can only concatenate str (not "NoneType") to str
root@server:/home/wimp/wimpbot#
'''

Pläne

Hi cool, dass du die Entwicklung des Bots übernommen hast.
Ich habe auch angefangen mit der Vorlage von Flammez.
Bin aber bei Pytohn 2,7 geblieben.

Ich versuche mich gerade am Wassergarten, stoße aber dabei auf Probleme mit der Vererbung der Klasse Garden

aber ich denke ich werde mir deins mal forken und gleich hier weiter machen.

Hast du schonmal überlegt es eventuell so anzupassen, dass man es zb in PiContainer laufen lassen könnte und dabei einen Controller hat der Pods mit den jeweiligen Aufträgen starten kann. Also zb ein Account soll alle zwei Stunden seine Bienen los schicken. Dann würden die Slaves dem Controller nur die Infos des Accounts schicken wie Level,Geld,Zeiten und der Controller kann dann reagieren. Wäre halt für zb 100 Accounts sinnvoller als zb das MainSkript im Loop laufen zu lassen.

Ich habe akutell nur eine CSV mit 200 Accounts und lasse zb per Cronjob einmal am Tag den LoginBonus holen.

growPlantsInGardens pflanzt die falsche Anzahl Produkte an

Der Funktion growPlantsInGardens kann übergeben werden, wie viel eines Produkts angebaut werden soll. Jedoch erfolgt das pro Garten. Das heißt, sollen 10 Salate angebaut werden, multiplizieren sich die 10 mit der Anzahl der Gärten. Besser wäre hier die Absolutzahl über alle Gärten hinweg zu berücksichtigen. So kann man die Gärten besser beplanen.

Zur Not kann man es noch konfigurierbar machen mit einem Flag. Absolute Zahl oder pro Garten.

Mindestbestand festlegen für Wimp-Verkäufe

Eine sinnvolle Erweiterung beim Verkaufen an Wimps wäre die Übergabe einer Mindestbestandmenge.

def checkWimpsRequiredAmount(self, minimal_balance, products, stock_list):

Das Problem:
Durch den automatischen Verkauf bleibt der Bestand klein, für das Erfüllen von Quests kommt die benötigte Menge damit nur sehr schwierig zusammen.
Es gibt zwar den Parameter minimum Balance, dieser ist aber „global“ für alle Accounts.

Die Idee:
In dem Notizblock des Accounts kann eine allgemeine Mindestmenge hinterlegt werden (z. B. minStock: 100)
Damit kann die Menge je nach Bedarf ohne Änderungen am Quellcode angepasst werden.

  • Implementiert, siehe README zur Verwendung

Optional:
Pro Produkt kann eine Mindestmenge festgelegt werden. Sinnvoll bei Quests: Wenn 1000 Äpfel benötigt werden, bleibt der Mindestbestand für alle anderen Produkte beim Standard. (z. B. minStock(Apfel): 1000)

  • Implementiert, siehe README zur Verwendung

@MrFlamez @xRuffKez Wie findet ihr die Idee?

Contribution Pläne

Meine Pläne:

  • Argument -ign und --ignore-event-plants um Pflanzen für Events beim anpflanzen zu ignorieren. (z.B. Pfingstrose)
  • Daily login per Bot claimen
  • Docker Container implementierung
  • Web Control Panel (sqlite)
  • Marktstand Autosell Integration inkl. config Siehe hier
  • Deamon für Linux inkl. config (Cronjob ist schon nice aber nicht so elegant)
  • Installer für Linux & Updater

@MasterZydra Kannst du mir einen Branch dafür aufmachen?

Unkraut wird nicht mehr entfernt

Unkraut wird nicht mehr entfernt.
Es wird die Meldung "Konnte nicht alle Gärten von Unkraut befreien." ausgegeben. Die Unkraut-Pflanze bleibt im Garten.
wT sind mehr als genug da.

@xRuffKez Hast du einen Idee, ob eine Änderung von dir das auslösen könnte?

Rechtschreibfehler

XXXXX anpflanzen...
Im Garten 1 wurden 6 Pflanzen gepflant.
Im Garten 2 wurden 6 Pflanzen gepflant.

"gepflanzt" statt "gepflant"

Crash if input for grow command is not found in stock list

Grow Zuhini...
Traceback (most recent call last):
  File "/Users/davidhein/Dropbox/_Development/Wurzelimperium-Bot-master/console.py", line 119, in <module>
    main()
  File "/Users/davidhein/Dropbox/_Development/Wurzelimperium-Bot-master/console.py", line 24, in main
    elif inputLower.startswith('grow'): grow(userInput)
  File "/Users/davidhein/Dropbox/_Development/Wurzelimperium-Bot-master/console.py", line 83, in grow
    wurzelBot.growPlantsInGardens(args[0])
  File "/Users/davidhein/Dropbox/_Development/Wurzelimperium-Bot-master/src/WurzelBot.py", line 223, in growPlantsInGardens
    if (product.isProductPlantable()):
AttributeError: 'NoneType' object has no attribute 'isProductPlantable'

Anzahl der Gärten konnte nicht ermittelt werden

Anzahl der Gärten konnte nicht ermittelt werden.
Entferne Unkraut aus allen Gärten...
Es gibt momentan nichts zu ernten.

Seit dem Mergen der PRs kommt die Meldung, dass die Anzahl der Gärten nicht ermittelt werden kann. Die nachfolgenden Schritte laufen trotzdem durch.
@xRuffKez kannst du mal schauen was die Meldung auslöst?

Sonderzeichen im Syntax

Das automated_script.py kann bei Übergabe der Syntax (z.B. Sonderzeichen im Passwort) fehlerhaft ausgeführt werden.

Lösung fürs erste:

Statt...
5 Gertrude passwort!2016
...sollte als Abhilfe...
5 Gertrude "passwort!2016"
...als Syntax genommen werden.

PRs und Birdpost

Kann einer bitte ein feedback zur birdpost methode geben und eventuell sagen was ich verändern kann?
Diese funktioniert zwar mehr oder weniger ist aber noch nicht perfekt , was ist zb wenn ich einen job skippe wie er höht er dann den zähler?

Zudem ist derzeit kein wt check drin also es kann sein, dass ihr wt verliert - fyi

Portallogin - Error in neuer Version

Hi ich glaube von euch nutzt niemand den Portallogin aber in der Python 3 geht dieser nicht.

    def logInPortal(self, loginDaten):
        """
        Führt einen login durch und öffnet eine Session.
        """
        serverURL = SERVER_URLS[loginDaten.language]
        parameter = urlencode({'portserver': 'server' + str(loginDaten.server),
                               'portname': loginDaten.user,
                               'portpass': loginDaten.password,
                               'portsubmit': 'Einloggen'})

        headers = {'Content-type': 'application/x-www-form-urlencoded',
                   'Connection': 'keep-alive'}
        print(f'Headers: {headers}')
        try:
            response, content = self.__webclient.request(f'https://www.wurzelimperium.de/portal/game2port_login.php', \
                                                         'POST', \
                                                         parameter, \
                                                         headers)
            print(f'response: {response}')
            self.__getTokenFromURLPORT(response['location'])
            self.__getunrFromURLPORT(response['location'])
            self.__getportunrFromURLPORT(response['location'])
        except:
            raise

        headers = {'Content-type': 'application/x-www-form-urlencoded',
                   'Connection': 'keep-alive',
                   'wunr': f'{self.__unr}'}
        print(f'Headers2: {headers}')
        try:
            loginadresse = f'https://s1.wurzelimperium.de/logw.php?port=1&unr={self.__unr}&portunr={self.__portunr}&hash={self.__token}&sno=1'
            print(f'Loginadresse: {loginadresse}')
            response = self.__webclient.request(loginadresse, 'GET', headers=headers)
            print(f'response2: {response}')
            #self.__checkIfHTTPStateIsFOUND(response)
        except:
            raise
        else:
            print('================================================')
            cookie = SimpleCookie(response['set-cookie'])
            cookie.load(str(response["set-cookie"]).replace("secure, ", "", -1))
            print(cookie)
            self.__Session.openSession(cookie['PHPSESSID'].value, str(loginDaten.server), serverURL)
            self.__cookie = cookie
            self.__userID = cookie['wunr'].value
            print('================================================')

ich bin mir auch nicht sicher warum es nur hier in python3 nicht geht

Marktstand Anfrage String

Moin,

ich bin seit einer längerem daran den Markstand für den Bot flott zu machen, jedoch scheitere ich daran ein Angebot tatsächlich rauszuhauen... Folgendes benutze ich

https://s17.wurzelimperium.de/stadt/marktstand.php?p_anzahl=1&p_preis1=0&p_preis2=44&p_id=3&verkaufe_markt=OK

Wenn ich das während einer aktiven Session abschicke, passiert jedoch nichts.

Wenn ich das hinbekomme, kann ich die HTTPCommunication.py erweitern und die erforderlichen functions hinzufügen.

[Feature] Unkraut vernichten

Moin,

ich möchte eine Funktion für den Bot einbauen, damit dieser das Unkraut in den Gärten vernichtet.
Wie bekomme ich die ID's aus der json der Gärten?

Neue Feature

Hi i'll try to add new feature on my list are:

  • shroomgarden (water, plant, buy shrooms)
  • bonsaigarden (buy equipment)
  • birds (start jobs, finish jobs, feed birds, buy new birds)
  • mining (start jobs, finish jobs, feed worker)
  • snails (train, build candy, feed snail)

I have good progress with collect all data but currently i struggle hard with the shop.

Maybe u have some tips, i want to buy for example 1 salat from the shop

    def buyFromShop(self):
        headers = self.__getHeaders()
        server = self.__getServer()
        adresse = f'{server}stadt/shop.php?s=2'
        parameter = urlencode({'s': 2,
                               'page': 1,
                               'change_page_only': 0,
                               'produkt[0]': 2,
                               'preis[0]': 0.08,
                               'anzahl[0]': 1,
                               'produkt[1]': 3,
                               'preis[1]': 0.44,
                               'anzahl[1]': 0,
                               'produkt[2]': 5,
                               'preis[2]': 0.5,
                               'anzahl[2]': 0,
                               'produkt[3]': 6,
                               'preis[3]': 0.06,
                               'anzahl[3]': 0,
                               'produkt[4]': 9,
                               'preis[4]': 1.76,
                               'anzahl[4]': 0,
                               'produkt[5]': 12,
                               'preis[5]': 0.14,
                               'anzahl[5]': 0,
                               'produkt[6]': 14,
                               'preis[6]': 0.22,
                               'anzahl[6]': 0,
                               'produkt[7]': 36,
                               'preis[7]': 2.1,
                               'anzahl[7]': 0})
        print(headers)
        print(adresse)
        print(parameter)
        try:
            response, content = self.__webclient.request(adresse, 'POST', parameter, headers=headers)
            self.__checkIfHTTPStateIsOK(response)
            print(response)
            print(content)
        except:
            return ''

For later i guess ill create a list with items per shop available to iterate over the shops

Have u planned anything to add?

Bug - Non plantable Garden Items

Iterating through pruductlist will break planting if "Fichte", "Buchsbaum" or "Palme" (Non plantable inventory Items for Garden) are lowest products on automated script.

Account gebanned

Ich glaube ich habe einen IP-Bann bekommen xD

500 Accounts wurden gebannt LEL

Portallogin

Hinzufügen eines Parameters

class Session(object): 

   def __init__(self):
       """
       Initialisierung aller Attribute mit einem Standardwert.
       """
       self.__logSession = logging.getLogger('bot.Session')
       self.__sessionID = None
       self.__server = None
       self.__startTime = None
       self.__endTime = None
       self.__secure = ''

   def openSession(self, sessionID, server, secure=''):
       """
       Anlegen einer neuen Session mit allen notwendigen Daten.
       """
       self.__sessionID = sessionID
       self.__server = server
       self.__secure = secure

       self.__startTime = time.time()
       self.__endTime = self.__startTime + (self.__lifetime - self.__lifetime_reserve)

       sID = str(self.__sessionID)
       self.__logSession.info("Session (ID: " + sID + ") geöffnet")

   def getSecure(self):
       """
       Gibt die Https zurück.
       """
       return self.__secure

In der Httpcommunication.py

adresse = 'http' + str(self.__Session.getSecure()) + '://s' + str(
            self.__Session.getServer()) + '.wurzelimperium.de

Bei den Requests ergänzen, geht dann für beide login methoden

und für den Login habe ich:

UNR:

def __getunrFromURLPORT(self, url):
        """
        Ermittelt aus einer übergebenen URL den security token.
        """
        # token extrahieren
        split = re.search(r'.*portal/port_logw.php.*unr=([a-f0-9]{6}).*port', url)
        iErr = 0
        if split:
            tmpunr = split.group(1)
            if (tmpunr == ''):
                iErr = 1
        else:
            iErr = 1

        if (iErr == 1):
            self.__logHTTPConn.debug(tmpunr)
            raise JSONError('Fehler bei der Ermittlung des tokens')
        else:
            self.__unr = tmpunr

PORTUNR:

    def __getportunrFromURLPORT(self, url):
        """
        Ermittelt aus einer übergebenen URL den security token.
        """
        # token extrahieren
        split = re.search(r'.*portal/port_logw.php.*portunr=([a-f0-9]{7})', url)
        iErr = 0
        if split:
            tmpportunr = split.group(1)
            if (tmpportunr == ''):
                iErr = 1
                else:
            iErr = 1

        if (iErr == 1):
            self.__logHTTPConn.debug(tmpportunr)
            raise JSONError('Fehler bei der Ermittlung des tokens')
        else:
            self.__portunr = tmpportunr

PORTTOKEN:

 def __getTokenFromURLPORT(self, url):
        """
        Ermittelt aus einer übergebenen URL den security token.
        """
        # token extrahieren
        split = re.search(r'.*portal/port_logw.php.*token=([a-f0-9]{32})', url)
        iErr = 0
        if split:
            tmpToken = split.group(1)
            if (tmpToken == ''):
                iErr = 1
        else:
            iErr = 1

        if (iErr == 1):
            self.__logHTTPConn.debug(tmpToken)
            raise JSONError('Fehler bei der Ermittlung des tokens')
        else:
            self.__token = tmpToken

LOGIN:

def logIn2(self, loginDaten):
        """
        Führt einen login durch und öffnet eine Session.
        """
        parameter = urlencode({'portserver': 'server' + str(loginDaten.server),
                               'portname': loginDaten.user,
                               'portpass': loginDaten.password,
                               'portsubmit': 'Einloggen'})

        headers = {'Content-type': 'application/x-www-form-urlencoded',
                   'Connection': 'keep-alive'}

        try:
            response, content = self.__webclient.request('https://www.wurzelimperium.de/portal/game2port_login.php', \
                                                         'POST', \
                                                         parameter, \
                                                         headers)
            # print response
            # print response['location']
            self.__getTokenFromURLPORT(response['location'])
            # print "Token " + str(self.__token)
            self.__getunrFromURLPORT(response['location'])
            # print "UNR " + str(self.__unr)
            self.__getportunrFromURLPORT(response['location'])
            # print "PortUNR: " + str(self.__portunr)
        except:
            raise

        headers = {'Content-type': 'application/x-www-form-urlencoded',
                   'Connection': 'keep-alive',
                   'Cookie': self.__unr}

        try:
            loginadresse = 'https://s1.wurzelimperium.de/logw.php?port=1&unr=' + self.__unr + '&portunr=' + self.__portunr + '&hash=' + self.__token + '&sno=1'
            # print "Loginadresse: " + str(loginadresse)
            response, content = self.__webclient.request(loginadresse, 'GET', headers=headers)
            # print "Login2content: " + str(content)
            # print "Login2response: " + str(response)
            self.__checkIfHTTPStateIsFOUND(response)
        except:
            raise
        else:
            # print response['set-cookie']
            cookie = SimpleCookie(response['set-cookie'])
            self.__Session.openSession(cookie['PHPSESSID'].value, str(loginDaten.server), "s")
            self.__cookie = cookie
            self.__userID = self.__unr

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.