gdesklet für ogame

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
xijo

hallo,

ich versuche grade ein desklet für das browserspiel ogame zu schreiben. das ist vermutlich keine große aufgabe und auch an sich nur ne spielerei, aber ich habe bisher noch nicht viel programmiert (bzw nicht viel was nachher auch funktionierte) und möchte einfach ein wenig üben.

das prog soll folgendes können:

login in http://ofame.de/login_ver.php? mit den angaben Uni, name und pass
aktualisierung der seite, optimalerweise ohne relogin, also 1x einloggen, sessionid nehmen und immer wieder aktualisieren
nach dem login suche nach einer bestimmten wortpassage ('feindliche flotte')

bisher habe ich versucht mir das weather desklet vorzunehmen, leider etwas erfolglos :) - habt ihr nen paar tips für mich wie ich das ganze am besten anpacke ?

danke schonmal für jede antwort,

gruß
xijo
piddon
Gründer
Beiträge: 410
Registriert: Dienstag 30. Juli 2002, 18:03
Wohnort: Oestrich-Winkel
Kontaktdaten:

Mir stellt sich die Frage, ob das überhaupt zulässig ist, bei OGame.

Alle Browsergames die ich gespielt habe oder spiele (keine Deutschen) haben in deren Regelwerk stehen, dass keine Bots, oder andere Tools ausser dem Webbrowser an sich zulässig sind.

(Bevor jemand fragt, ich spiele seit langer Zeit die Mutter aller Browsergames Planetarion und einige Runden Planetia.)
irc: #python.de @ irc.freenode.net | [url=http://pythonwiki.pocoo.org]python-wiki[/url] | [url=http://www.pythonwiki.de/PythonDeForum/Faq]python-forum FAQ[/url]
Gast

eigentlich gehts mir nicht drum etwas unzulässiges zu tun (schließlich läuft mein ogame sowieso immer wenn mein rechner an ist, und wenn er aus ist könnte ein desklet auch nicht erkennen ob ich angegriffen werde :) ) - man könnte das als bot werten, ok das stimmt - aber meine motivation ist es überhaupt mal was funktionierendes zu schreiben -.. und wenn es den punktestand auslesen würde wär ich auch zufrieden :)

es geht nur drum mal überhaupt sowas zu schreiben und weniger ums 'betrügen' - hoffe ich wurde nicht missverstanden, denn ein brower-spiel-betrüger bin ich nicht *gg*

gruß
xijo
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi xijo,

ich würde erstmal das holen der Seite und das Einloggen usw. machen, mit einer kleinen Schnittstelle für die Bash.

Code: Alles auswählen

#!/usr/bin/env python

from time import sleep

def connect(url):
    pass # hier zur seite connecten
    return con

def closecon(con):
    pass # hier connection schließen
    
def login(con, name, pw, uni):
    pass # hier einloggen und cookies (mit sessionID) holen
    return sessionID

def reconnect(url, sessionID):
    pass # hier reconnecten mit sessionID

def getpage(con):
    pass # Seite holen
    return page

if __name__ == "__main__":
    import sys
    if len(sys.argv) != 4:
        print "usage: %s url password uni" % __file__
        sys.exit()
    url, pw, uni = sys.argv[1:]
    first = True
    while True:
        if first:
            con = connect(url)
            sessID = login(con, name, pw, uni)
            first = False
        else:
            reconnect(url, sessID)
        page = getpage(con)
        print con
        sleep(10)
das währ mal ein Gerüst. Du könntest dir auch mein ExternIP Desklet anschauen.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
xijo

thx ich wurschtel mich mal rein, hab noch ein paar verständnisprobs beim letzten teil aber wenn ich fragen hab poste ich einfach hier wieder :) -- schön nen forum zu finden, in dem man schnell so hilfbereite leute findet *daumenhoch*

das externip desklet is übrigens ziemlich praktisch - ich schau mal dass ich noch nen display für den psi-theme bastel, oder vllt auch in das netzwerkdisplay einbaue :)

gruß
xijo
piddon
Gründer
Beiträge: 410
Registriert: Dienstag 30. Juli 2002, 18:03
Wohnort: Oestrich-Winkel
Kontaktdaten:

Anonymous hat geschrieben: es geht nur drum mal überhaupt sowas zu schreiben und weniger ums 'betrügen' - hoffe ich wurde nicht missverstanden, denn ein brower-spiel-betrüger bin ich nicht *gg*
Um Himmels Willen, ich will dich nicht als Betrüger bezeichnen. Ich wollte nur meine Gedanken dazu kundtun, auch wenn diese Offtopic sind, aber ich bin Admin und Betreiber, ich darf das :P Nein, im Ernst: Es ist wichtig ein Ziel zu haben wenn man das erste mal etwas in einer neuen Programmiersprache entwickelt, sonst lernt man es nie! Also mach weiter! :)
irc: #python.de @ irc.freenode.net | [url=http://pythonwiki.pocoo.org]python-wiki[/url] | [url=http://www.pythonwiki.de/PythonDeForum/Faq]python-forum FAQ[/url]
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

meinst Du mit letztem Teil, das da ?

Code: Alles auswählen

# Teste ob script direkt gestartet wurde oder als modul importiert
if __name__ == "__main__": # direkt gestartet!
    import sys
    if len(sys.argv) != 4: # nicht 3 Argumente an Script übergeben?
        print "usage: %s url password uni" % __file__ # usagetext ausgeben
        sys.exit() # fertig das wars

    # hier gehts weiter wenn wir 3 Argumente bekommen haben
    # in sys.argv[0] steht der Pfad des Scripts, brauchen wir hier nicht
    url, pw, uni = sys.argv[1:] #Augumente 1-3 holen und zuweisen
    first = True # Flag für ersten Durchlauf
    while True: # Endlosschleife
        if first: # Erster Durchlauf?
            # wenn ja dann normal connecten und login machen
            con = connect(url)
            sessID = login(con, name, pw, uni)
            first = False # flag für weitere Durchläufe kein Login nötig
        else:
            reconnect(url, sessID)
        page = getpage(con) # Seite holen
        print con # Seite ausgeben, hier kannst Du auch den Inhalt auswerten
        sleep(10) # 10 Sekunden warten
Ich habs jetzt mal ausführlich kommentiert, bei weiteren Fragen, einfach her damit.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
xijo
User
Beiträge: 2
Registriert: Samstag 17. Juli 2004, 13:13
Kontaktdaten:

:D ausgezeichnet, dankeschön :)

eine frage hab ich da auch direkt nochmal: habt ihr ein tutorial, oder auch ein buch, das ihr mir zum einstieg in python bei wenig vorbildung empfehlen würdet ?

Da ich am Anfang wohl sowieso nur Nonsence schreibe finde ich es persönlich wichtig, dass man ein (mehr oder weniger) nützliches Ergebnis sieht am Ende :) - ich denke ich werde das Desklet dann auch sowieso online stellen :)

Danke für eure Hilfe,

gruß
xijo
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

falls du es noch nicht kennst:
http://www.way2python.de/
http://www.freenetpages.co.uk/hp/alan.gauld/german/

sind imho für Pythoneinsteiger zu empfehlen.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
xijo
User
Beiträge: 2
Registriert: Samstag 17. Juli 2004, 13:13
Kontaktdaten:

moin,

ich les mich grade so rein und komme auch ganz gut klar, allerdings wäre es sehr hilfreich wenn es eine deutsche übersetzung zum module-reference-guide gäbe - gibts sowas ? :)

hab schon gegooglet ohne ende, aber leider nix gefunden :(

gruß
xijo
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Mahlzeit ;)

hmm da wüsste ich auch nichts. Eigentlich komme ich mit der englischen Referenz ganz gut klar. Wenn ich mal einen Begriff nicht weiss, schlag ich in "ding" nach. Und sonst gibts ja auch noch das Forum :)


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Habe Mal zum Login 'ne Frage...

undzwar, als erstes sende ich die Parameter ('login' und 'pass') für den Login an die OGame-Startseite mittels "requests.session().post(ogame_startseite, data={'login' : email, 'pass' : passwort})" und dann ...? Was hat es mit den Cookies auf sich?

Und wann wird eigentlich ein Cookie verwendet bzw ab wann überliefert man Cookies?

Code: Alles auswählen

def login(con, name, pw, uni):
    pass # hier einloggen und cookies (mit sessionID) holen
    return sessionID
Außerden, was für eine Session_ID?

Es gibt zwar auch eine Lib (pip install ogame) , aber ich möchte das auch seöber können.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ui, den Thread hast du aber schon aus der Nah-Kompostierung geholt.

Was Cookies und Sessions sind, kann man eigentlich ganz gut recherchieren. Denn das sind allgemeine Konzepte in eigentlich allen nicht-trivialen Webanwendungen. Kurz gesagt: ein Cookie ist ein Stueck Daten, das der Server an den Client schickt in der Erwartung, das dieser das in folgenden Requensts immer wieder mitliefert. Und dadurch identifizierbar wird/bleibt. Was damit dann konkret gemacht wird, ist unterschiedlich. Sessions sind ein Ding. Du bekommst halt mit dem blauen Baendchen auf dem Festival fuer eine beschraenkte Zeit Zugang zu bestimmten Dingen. Das Baendchen ist das Cookie. Und der Zeitraum, in dem du Zugriff auf bestimmte Dinge hast, die Session.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Was meinst mit "Nahkompostierung"?
Weil der Thread schon sehr alt ist? :D

Hatte nun, aufgrund von Freistunde, Zeit mich da einzulesen.
Also mit einem Cookie speichert man Infos, die man beibehalten mag, sollte ein Verbindungsfehler auftreten bzw. wenn man innerhalb einer Seite auf eine andere Wechselt (bzw zum Beispiel wenn man auf seinem Account klickt) dann können ja so Infos/Daten gespeichert werden, richtig?
Ich verstehe nur einfach nicht, wozu diese Daten bei OGame benötigt werden? Etwa (nur) für den Login?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Entweder du gibst bei jedem Request deine Login-Daten mit, dann weiss der Server wer du bist. Aber dann kannst du immer noch nur genau EINMAL mit dem System interagieren. Wenn du aber zwei unterschiedliche Sessions aufmachen willst (zB zwei Browser-Tabs), was dann? Und zusaetzlich erhoeht sich das Risiko wenn wirklich JEDES request die Credentials beinhaltet. Da ist es besser nur einmal am Anfang eines zu machen, und fuer den Rest der Zeit ein Cookie zu liefern.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Asoo! Ahhh... Ich dachte mit requests.session().post() sendet man z. B die Logindaten und dann bleibt man eingeloggt, kein Wunder wieso mein einer Versuch in meinem Tool nicht funktioniert. xD
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Okay, ich habe mal ein Codebeispiel (selbst geschrieben).
Der Login ist erfolgreich, dennoch komme ich nicht auf die Übersichtsseite von

Ogame, also das Login erfolgt so:
Logindaten eingeben - Button klick - Seite lädt - Button klicken - Seite lädt (Universumauswahl) - Button klicken - Übersichtsseite lädt (das eigentliche Spiel sozusagen)

Mein Beispiel:

Code: Alles auswählen

from bs4 import BeautifulSoup as bs
import requests



class OGame_Tool():
    def __init__(self):
        self.email          = ""
        self.passwort       = ""
        self.user_agent     = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36"
        self.game_url       = "https://s159-de.ogame.gameforge.com/game/index.php?page=overview"
        self.php_sessid     = "" #Unter Entwicklertools - "Application"
        self.prsess         = ""
        self.login_string   = ""
        self.login()

    def login(self):
        login_data  = {'login':self.email , 'pass':self.passwort}
        cookie      = {'PHPSESSID':self.php_sessid , 'prsess_106290':self.prsess , 'login_106290':self.login_string}
        
        session = requests.session()

        session.post(self.game_url, data=login_data, cookies=cookie)
        overlay = session.get(self.game_url)
        print("Current URL: "+overlay.url+"\n")


        
tool = OGame_Tool()
Allerdings gelange ich nur auf die Seite, die nach dem Einloggen geladen wird, also noch nicht das eigentliche Spiel.
Doch ich verstehe nicht wieso - Login funzt, liegts an den Cookies? Sollte doch auch stimmen - oder nicht?

Wobei, mir fällt gerade ein, dass "prsess_106290 " & "login_106290" (nur die Zahlen nach "prsess_" bzw "login_") , sowie self.php_sessid, self.prsess und self.login_string sich ständig ändert. Wie erhalte ich diese Werte dynamisch?
Im HTMl-Code stehen diese nicht, sondern in "Entwicklertools"-"Application".
Antworten