Mon apprentissage de python avec Ogame ^^

3 décembre 2009 par Gaëtan Laisser une réponse »

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 :

  1. og = Ogame()
  2. og.setSessionCookie(
  3.  "le contenu du cookie phpsessid de votre univers",
  4.  "le contenu du cookie prssess de votre univers",
  5.  "le contenu du cookie loginC de votre univers",
  6.  "le parametre de l'url &session=…",
  7.  "uniXX.ogame.fr"votre#univers
  8. )
  9. 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).

  1. #!/usr/bin/python
  2. # -*- coding:Utf-8 -*-
  3. from threading import Thread
  4. from threading import Semaphore
  5. import random
  6. import httplib
  7. import time
  8. import re
  9.  
  10. class Ogame:
  11.  def __init__(self):
  12.   self.userAgent = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.3a1pre) Gecko/20091021 Ubuntu/9.10 (karmic) Minefield/3.7a1pre"
  13.   self.login     = ""
  14.   self.password  = ""
  15.   self.PHPSessId = ""
  16.   self.prSess    = ""
  17.   self.loginString= ""
  18.   self.session   = ""
  19.   self.urlGame   = ""
  20.   self.univers   = ""
  21.   self.cookie    = ""
  22.   self.referer = ""
  23.  
  24.  def setSessionCookie(self,sessid="",prsess="",loginString="",session="",univers=""):
  25.   self.PHPSessId = sessid
  26.   self.prSess    = prsess
  27.   self.loginString= loginString
  28.   self.session   = session
  29.   self.urlGame   = "/game/index.php?page=overview&session="+session
  30.   self.univers   = univers
  31.   self.cookie    = "PHPSESSID="+self.PHPSessId+";prsess_165647="+self.prSess+";login_165647="+self.loginString+";"
  32.   self.referer = "http://"+self.univers+self.urlGame
  33.  
  34.  def getPlanetResource(self,id):
  35.   op = OgamePlanet(self,id)
  36.   return op.getResource()
  37.  def planetAddBuilding(self,id,batiment):
  38.   op = OgamePlanet(self,id)
  39.   return op.addBuilding(batiment)
  40.  
  41.  
  42. class OgamePlanet:
  43.  def __init__(self,ogame,id):
  44.   self.planetId=id
  45.   self.ogame=ogame
  46.   self.res=""
  47.  def getPlanets(ogame):
  48.   ht = httplib.HTTPConnection(ogame.univers)
  49.   ht.request("GET",ogame.urlGame,{},{"Cookie" :o game.cookie,"User-Agent" :o game.userAgent,"Referer" :o game.referer})
  50.   rq=ht.getresponse()
  51.   data=rq.read()
  52.   ht.close()
  53.   select=re.search("<select[^>]*>([\w\W\n\t\r]*)</select>",data)
  54.   res=re.findall("&cp=([^&]*)&[^>]*>([^<]*)<.*\[([^\]]*)\]",select.group(0))
  55.   return res
  56.  getPlanets = staticmethod(getPlanets)
  57.  def getResource(self):
  58.   reque=self.ogame.urlGame+"&cp="+self.planetId+"&mode=&gid=&messageziel=&re=0"
  59.   ht = httplib.HTTPConnection(self.ogame.univers)
  60.   ht.request("GET",reque,{},{"Cookie":self.ogame.cookie,"User-Agent":self.ogame.userAgent,"Referer":self.ogame.referer})
  61.   self.ogame.referer=reque
  62.   rq=ht.getresponse()
  63.   data=rq.read()
  64.   ht.close()
  65.   table=re.search("<table class='header' id='resources'[^>]*>([\w\W\n\t\r]*?)</table>",data)
  66.   res=re.findall("<font[^>]*>([.0-9]*)</font>",table.group(0))
  67.   self.res=res
  68.   return res
  69.  #1 metal 2 cristal 3 deuterium 4 electricite
  70.  def addBuilding(self, batiment):
  71.   ht = httplib.HTTPConnection(self.ogame.univers)
  72.   url = "/game/index.php?page=b_building&session="+self.ogame.session+"&cp="+self.planetId+"&mode=&gid=&messageziel=&re=0"
  73.   ht.request("GET",url,{},{"Cookie":self.ogame.cookie,"User-Agent":self.ogame.userAgent,"Referer":self.ogame.referer})
  74.   rq=ht.getresponse()
  75.   data = rq.read()
  76.   link=re.search("modus=add&techid="+batiment,data)
  77.   if str(link) == "None":
  78.    ti=re.search("pp='([0-9]+)';",data)
  79.    if(str(ti)!="None"):
  80.     tps = ti.groups(0)
  81.     returnint(tps[0])#just to say that another things is being constructed Need to change farmer
  82.    else:
  83.     return -3#Don't get the url to create building
  84.   ht.close()
  85.   time.sleep(random.randint(1,2))
  86.   reque="/game/index.php?page=b_building&session="+self.ogame.session+"&modus=add&techid="+batiment+"&planet="+self.planetId
  87.   ht.request("GET",reque,{},{"Cookie":self.ogame.cookie,"User-Agent":self.ogame.userAgent,"Referer":url})
  88.   self.ogame.referer=reque
  89.   rq=ht.getresponse()
  90.   data=rq.read()
  91.   ht.close()
  92.   link=re.search("modus=add&techid="+batiment,data)
  93.   if str(link) == "None":#no link so it's OK
  94.    ti=re.search("pp='([0-9]+)';",data)
  95.    if(str(ti)!="None"):
  96.     tps = ti.groups(0)
  97.     return tps[0]
  98.    else:
  99.     return -1
  100.   else:
  101.    return -2
  102.  
  103. #Farming function …
  104. class Farmer(Thread):
  105.  
  106.  def __init__(self,og,planet,batiments):
  107.   Thread.__init__(self)
  108.   self.og = og
  109.   self.planet = planet
  110.   self.batiments = batiments
  111.  
  112.  def run(self):
  113.   for batiment in self.batiments:
  114.    self.sec=-1
  115.    print "On contruit un batiment : "+str(batiment)+" sur : "+self.planet
  116.    while(self.sec<0):
  117.     self.sec = self.og.planetAddBuilding(self.planet,str(batiment))
  118.     if self.sec<0 and self.sec>-4:
  119.      addTime=360 + random.randint(10,120)
  120.      print "Ajout d'un temps additionnel de "+str(addTime)+" sec(s) avant le prochain batiment"
  121.      time.sleep(addTime)
  122.     elif self.sec<-4:
  123.      print "Un batiment est déjà en construction pour encore "+str(-self.sec)+" sec(s)"
  124.      time.sleep(-self.sec)
  125.     else:
  126.      print "On va attendre "+str(self.sec)+" secondes avant le prochain batiment"
  127.      time.sleep(float(self.sec)+2)
  128.    
  129.  def buildInChainsPlanets(og,planets,batiments):
  130.   list=[]
  131.   #maxCon = 1 default 1 ^^
  132.   pool_sema = Semaphore()
  133.    
  134.   for index,planet in enumerate(planets):
  135.    pool_sema.acquire()
  136.    tmp = Farmer(og,planet,batiments[index])
  137.    list.append(tmp)
  138.    tmp.start()
  139.    time.sleep(random.randint(2,5))
  140.    pool_sema.release()
  141.   for l in list:
  142.    l.join()
  143.  buildInChainsPlanets = staticmethod(buildInChainsPlanets)
Publicité

Laisser un commentaire