Mon apprentissage de python avec Ogame ^^

The kikoolol strike back !! Mon deuxième billets de la soirée …pour pas grand chose en fait.

J’ai voulu apprendre le langage python de façon plutôt ludique en créant un bot qui créer des batiments en boucle pour Ogame … rien d’illégal bien entendu ^^.
Dans le code Python qui va suivre, vous pourrez comprendre (ou pas) comment fonctionne :

  • Les requêtes HTTP en python avec des headers à partir de zéro
  • Les Threads pour les opérations en parallèle
  • Les Semaphores, pour éviter des requêtes en parallèle (pas apprécié par Ogame dans certain cas)

Pour l’utiliser, il suffit ensuite d’ajouter au source qui vont suivre :

og = Ogame()
og.setSessionCookie(
	"le contenu du cookie phpsessid de votre univers",
	"le contenu du cookie prssess de votre univers",
	"le contenu du cookie loginC de votre univers",
	"le parametre de l'url &session=...", 
	"uniXX.ogame.fr"votre#univers
)
Farmer.buildInChainsPlanets(og,["id planete","id planete"],[[4,1,2,4,1,2,4,1,2,4],[4,1,2,4,1,2,4,1,2,4]])

le premier paramètre de buildInChainsPlanets est l’objet og
le second est un tableau de string contenant l’id des planètes à « farmer »
le troisième est un tableau de tableau contenant les séquences des batiments à construire :
1 pour le metal 2 pour le cristal 3 pour le deuterium 4 pour l’electricite.

Et voilà … lorsque vous aurez conquis une planète rajoutez-là au tableau ainsi que la séquence de batiments que vous voulez, puis laissez tourner le script plusieurs jours (faite gaffe avec les sessions qui risque de changer si vous vous reconnectez avec votre navigateur).

#!/usr/bin/python
# -*- coding:Utf-8 -*-
from threading import Thread
from threading import Semaphore
import random
import httplib
import time
import re

class Ogame:
	def __init__(self):
		self.userAgent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.3a1pre) Gecko/20091021 Ubuntu/9.10 (karmic) Minefield/3.7a1pre"
		self.login     = ""
		self.password  = ""
		self.PHPSessId = ""
		self.prSess    = ""
		self.loginString= ""
		self.session   = ""
		self.urlGame   = ""
		self.univers   = ""
		self.cookie    = ""
		self.referer = ""
		
	def setSessionCookie(self,sessid="",prsess="",loginString="",session="",univers=""):
		self.PHPSessId = sessid
		self.prSess    = prsess
		self.loginString= loginString
		self.session   = session
		self.urlGame   = "/game/index.php?page=overview&session="+session
		self.univers   = univers
		self.cookie    = "PHPSESSID="+self.PHPSessId+";prsess_165647="+self.prSess+";login_165647="+self.loginString+";"
		self.referer = "http://"+self.univers+self.urlGame

	def getPlanetResource(self,id):
		op = OgamePlanet(self,id)
		return op.getResource()
	def planetAddBuilding(self,id,batiment):
		op = OgamePlanet(self,id)
		return op.addBuilding(batiment)
		

class OgamePlanet:
	def __init__(self,ogame,id):
		self.planetId=id
		self.ogame=ogame
		self.res=""
	def getPlanets(ogame):
		ht = httplib.HTTPConnection(ogame.univers)
		ht.request("GET",ogame.urlGame,{},{"Cookie":ogame.cookie,"User-Agent":ogame.userAgent,"Referer":ogame.referer})
		rq=ht.getresponse()
		data=rq.read()
		ht.close()
		select=re.search("]*>([\w\W\n\t\r]*)",data)
		res=re.findall("&cp=([^&]*)&[^>]*>([^<]*)<.*\[([^\]]*)\]",select.group(0))
		return res
	getPlanets = staticmethod(getPlanets)
	def getResource(self):
		reque=self.ogame.urlGame+"&cp="+self.planetId+"&mode=&gid=&messageziel=&re=0"
		ht = httplib.HTTPConnection(self.ogame.univers)
		ht.request("GET",reque,{},{"Cookie":self.ogame.cookie,"User-Agent":self.ogame.userAgent,"Referer":self.ogame.referer})
		self.ogame.referer=reque
		rq=ht.getresponse()
		data=rq.read()
		ht.close()
		table=re.search("]*>([\w\W\n\t\r]*?)
",data) res=re.findall("]*>([.0-9]*)",table.group(0)) self.res=res return res #1 metal 2 cristal 3 deuterium 4 electricite def addBuilding(self, batiment): ht = httplib.HTTPConnection(self.ogame.univers) url = "/game/index.php?page=b_building&session="+self.ogame.session+"&cp="+self.planetId+"&mode=&gid=&messageziel=&re=0" ht.request("GET",url,{},{"Cookie":self.ogame.cookie,"User-Agent":self.ogame.userAgent,"Referer":self.ogame.referer}) rq=ht.getresponse() data = rq.read() link=re.search("modus=add&techid="+batiment,data) if str(link) == "None": ti=re.search("pp='([0-9]+)';",data) if(str(ti)!="None"): tps = ti.groups(0) return - int(tps[0])#just to say that another things is being constructed Need to change farmer else: return -3#Don't get the url to create building ht.close() time.sleep(random.randint(1,2)) reque="/game/index.php?page=b_building&session="+self.ogame.session+"&modus=add&techid="+batiment+"&planet="+self.planetId ht.request("GET",reque,{},{"Cookie":self.ogame.cookie,"User-Agent":self.ogame.userAgent,"Referer":url}) self.ogame.referer=reque rq=ht.getresponse() data=rq.read() ht.close() link=re.search("modus=add&techid="+batiment,data) if str(link) == "None":#no link so it's OK ti=re.search("pp='([0-9]+)';",data) if(str(ti)!="None"): tps = ti.groups(0) return tps[0] else: return -1 else: return -2 #Farming function ... class Farmer(Thread): def __init__(self,og,planet,batiments): Thread.__init__(self) self.og = og self.planet = planet self.batiments = batiments def run(self): for batiment in self.batiments: self.sec=-1 print "On contruit un batiment : "+str(batiment)+" sur : "+self.planet while(self.sec<0): self.sec = self.og.planetAddBuilding(self.planet,str(batiment)) if self.sec<0 and self.sec>-4: addTime=360 + random.randint(10,120) print "Ajout d'un temps additionnel de "+str(addTime)+" sec(s) avant le prochain batiment" time.sleep(addTime) elif self.sec<-4: print "Un batiment est déjà en construction pour encore "+str(-self.sec)+" sec(s)" time.sleep(-self.sec) else: print "On va attendre "+str(self.sec)+" secondes avant le prochain batiment" time.sleep(float(self.sec)+2) def buildInChainsPlanets(og,planets,batiments): list=[] #maxCon = 1 default 1 ^^ pool_sema = Semaphore() for index,planet in enumerate(planets): pool_sema.acquire() tmp = Farmer(og,planet,batiments[index]) list.append(tmp) tmp.start() time.sleep(random.randint(2,5)) pool_sema.release() for l in list: l.join() buildInChainsPlanets = staticmethod(buildInChainsPlanets)

Une réflexion sur « Mon apprentissage de python avec Ogame ^^ »

  1. J’ai pas réussi à faire marcher le script sur la version actuelle, il y a certainement certains champs qui ont changé mais je trouve l’idée très cool.

    Merci d’avoir partagé un tel code source

Les commentaires sont fermés.