Foros del Web » Programando para Internet » Python »

duda API Phyton

Estas en el tema de duda API Phyton en el foro de Python en Foros del Web. Hola a todos Necesitaría de vuestra ayuda para terminar de crear un script en phyton para modificar por API ciertas variables. No soy ducho en ...
  #1 (permalink)  
Antiguo 20/05/2015, 03:57
 
Fecha de Ingreso: mayo-2015
Mensajes: 4
Antigüedad: 9 años, 6 meses
Puntos: 0
duda API Phyton

Hola a todos

Necesitaría de vuestra ayuda para terminar de crear un script en phyton para modificar por API ciertas variables.
No soy ducho en programación y me he atascado.

Tengo un script para obtener datos, pero necesito otro para añadir por el API

Esto es lo que he creado, pero no funciona y no tengo mensajes de cual es el error o que falta.
..................
Código Python:
Ver original
  1. #!/usr/bin/python
  2.  
  3. import os,sys,string
  4. import httplib, urllib
  5. import json
  6.  
  7. # Variables globales estaticas
  8. SERVER = "my.site.com"
  9. PAGE_SIZE = 125
  10. PAGE_NUM = 0
  11.  
  12.  
  13. URI = "/api/prov/v1/sites/configure/acl"
  14. api_id = "xxxxx"
  15. api_key = "xxxxxxxxxx"
  16. site_id = "xxxxx"
  17. rule_id = "api.acl.blacklisted_ips"
  18. ips = "44.44.44.44,66.66.66.66"
..................


Este es el script que recopila información y en el que me he basado, sabiendo que funciona:
..................
Código Python:
Ver original
  1. #!/usr/bin/python
  2.  
  3. import os,sys,string
  4. import httplib, urllib
  5. import json,requests
  6.  
  7. # Variables globales estaticas
  8. SERVER_INCAPSULA = "my.incapsula.com"
  9. PAGE_SIZE = 125
  10. PAGE_NUM = 0
  11.  
  12. def getBandwidthSite(site_id):
  13.  
  14.   c = httplib.HTTPSConnection(SERVER)
  15.   if (time_range == "custom"):
  16.      params = urllib.urlencode({'api_id':api_id,'api_key':api_key,'site_id':site_id,'stats':'bandwidth_timeseries','time_range':time_range,'start':start_time,'end':end_time})
  17.   else :
  18.      params = urllib.urlencode({'api_id':api_id,'api_key':api_key,'site_id':site_id,'stats':'bandwidth_timeseries','time_range':time_range})
  19.   headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
  20.   c.request("POST", "/api/stats/v1",params,headers)
  21.   response = c.getresponse()
  22.   data = response.read()
  23.   c.close()
  24.   json_data = json.loads(data)
  25.   total = 0
  26.  
  27.   for i in json_data["bandwidth_timeseries"][0]["data"]:
  28.     cont = 0
  29.     for j in i:
  30.        cont+=1
  31.        if (cont%2 == 0):
  32.             total=total+j
  33.             #print "total bytes:%s" %total
  34.  
  35.   return total
  36.  
  37.  
  38. def getSitesList():
  39.  
  40.   # Devuelve una lista con los sites que hay en esa cuenta
  41.   # con los valores de api_id y api_key ya sabe el account_id
  42.   URI = "/api/prov/v1/sites/list"
  43.   c = httplib.HTTPSConnection(SERVER)
  44.   params = urllib.urlencode({'api_id':api_id,'api_key':api_key,'page_size':PAGE_SIZE,'page_num':PAGE_NUM})
  45.   headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
  46.   c.request("POST", URI,params,headers)
  47.   response = c.getresponse()
  48.   data = response.read()
  49.   c.close()
  50.   json_data = json.loads(data)
  51.   #  print "Site_id = %s" %json_data["sites"][1]["site_id"]
  52.   #  print "Domain = %s" %json_data["sites"][1]["domain"]  
  53.   site_id_list= []
  54.   domain_list = []
  55.   for i in json_data["sites"]:
  56.      #print "Site_id => %s" %i["site_id"]
  57.      #print "Domain => %s" %i["domain"]
  58.      site_id_list.append(i["site_id"])
  59.      domain_list.append(i["domain"])
  60.   return site_id_list,domain_list
  61.  
  62.  
  63. def getVisits(site_id):
  64.  
  65.   c = httplib.HTTPSConnection("my.incapsula.com")
  66.   if (time_range == "custom"):
  67.      params = urllib.urlencode({'api_id':api_id,'api_key':api_key,'site_id':site_id,'stats':'visits_timeseries','time_range':time_range,'start':start_time,'end':end_time})
  68.   else :
  69.      params = urllib.urlencode({'api_id':api_id,'api_key':api_key,'site_id':site_id,'stats':'visits_timeseries','time_range':time_range})
  70.   headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
  71.   c.request("POST", "/api/stats/v1",params,headers)
  72.   response = c.getresponse()
  73.   data = response.read()
  74.   c.close()
  75.   json_data = json.loads(data)
  76.   visitas_humanas = 0
  77.  
  78.   for i in json_data["visits_timeseries"][0]["data"]:  # visitas humanas
  79.     cont = 0
  80.     for j in i:
  81.        cont+=1
  82.        if (cont%2 == 0):
  83.             visitas_humanas=visitas_humanas+j
  84.             #print "total visitas humanas :%s" %visitas_humanas
  85.  
  86.   visitas_bots = 0
  87.   for i in json_data["visits_timeseries"][1]["data"]:  # visitas bots
  88.     cont = 0
  89.     for j in i:
  90.        cont+=1
  91.        if (cont%2 == 0):
  92.             visitas_bots=visitas_bots+j
  93.             #print "total visitas bots :%s" %visitas_bots
  94.  
  95.  
  96.   return visitas_humanas,visitas_bots,visitas_humanas+visitas_bots
  97.  
  98.  
  99.  
  100. def getHits(site_id):
  101.  
  102.   c = httplib.HTTPSConnection("my.site.com")
  103.  
  104.   if (time_range == "custom"):
  105.      params = urllib.urlencode({'api_id':api_id,'api_key':api_key,'site_id':site_id,'stats':'hits_timeseries','time_range':time_range,'start':start_time,'end':end_time})
  106.   else :
  107.      params = urllib.urlencode({'api_id':api_id,'api_key':api_key,'site_id':site_id,'stats':'hits_timeseries','time_range':time_range})
  108.   headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
  109.   c.request("POST", "/api/stats/v1",params,headers)
  110.   response = c.getresponse()
  111.   data = response.read()
  112.   c.close()
  113.   json_data = json.loads(data)
  114.   hits_humanos = 0
  115.  
  116.   for i in json_data["hits_timeseries"][0]["data"]:  # hits humanos
  117.     cont = 0
  118.     for j in i:
  119.        cont+=1
  120.        if (cont%2 == 0):
  121.             hits_humanos=hits_humanos+j
  122.             #print "total hits humanos :%s" %hits_humanos
  123.  
  124.   hits_bots = 0
  125.   for i in json_data["hits_timeseries"][1]["data"]:  # hits bots
  126.     cont = 0
  127.     for j in i:
  128.        cont+=1
  129.        if (cont%2 == 0):
  130.             hits_bots=hits_bots+j
  131.            # print "total hits bots :%s" %hits_bots
  132.  
  133.  
  134.   return hits_humanos,hits_bots,hits_humanos+hits_bots
  135.  
  136.  
  137. def generateCSVReport():
  138.   file = open("./report.csv","w")
  139.   file.write("Site,Human Visits,Bot Visits,Total Visits,Hits,Bandwidth (MB),SQL Injection,Illegal Resource Access,Cross Site Scripting,Bad Bots,DDoS\n")
  140.   j = 0
  141.   for site in lista_sites[0]:
  142.      #print "Site: %s (%s) => Ancho de banda (%s)" %(lista_sites[1][j],site,getBandwidthSite(site))
  143.      visitas_list = getVisits(site)
  144.      hits_list = getHits(site)
  145.      threat_list = getThreats(site)
  146.      bandwidth = round(getBandwidthSite(site)/float(1024*1024),2)
  147.      domain = lista_sites[1][j]
  148.      file.write(domain+" (" + str(site) + ")," + str(visitas_list[0]) + "," + str(visitas_list[1]) + "," + str(visitas_list[2]) + "," + str(hits_list[2]) + "," + str(bandwidth) + ","  + str(threat_list[0]) + "," + str(threat_list[1]) + "," + str(threat_list[2]) + "," + str(threat_list[3]) + "," + str(threat_list[4]) + "\n")
  149.      j+=1
  150.      print "%s/%s Sites Completados: %s " %(j,len(lista_sites[0]),lista_sites[1][j-1])
  151.  
  152.   file.close()
  153.   return
  154.  
  155.  
  156. def getThreats(site_id):
  157.  
  158.   c = httplib.HTTPSConnection("my.site.com")
  159.   if (time_range == "custom"):
  160.      params = urllib.urlencode({'api_id':api_id,'api_key':api_key,'site_id':site_id,'stats':'threats','time_range':time_range,'start':start_time,'end':end_time})
  161.   else :
  162.      params = urllib.urlencode({'api_id':api_id,'api_key':api_key,'site_id':site_id,'stats':'threats','time_range':time_range})
  163.   headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"}
  164.   c.request("POST", "/api/stats/v1",params,headers)
  165.   response = c.getresponse()
  166.   data = response.read()
  167.   c.close()
  168.   json_data = json.loads(data)
  169.   sql_injection = 0
  170.   illegal_resource = 0
  171.   xss = 0
  172.   bad_bots = 0
  173.   ddos = 0
  174.  
  175.  
  176.    
  177. #  print "XSS -> %s" %xss
  178.   return sql_injection,illegal_resource,xss,bad_bots,ddos
  179.  
  180.  
  181.  
  182. if __name__ == "__main__" :
  183.  
  184.   api_id = "xxxxxx"
  185.   api_key = "xxxxxxxxxxxxx"
  186.  
  187.  
  188.   # 1 de Enero 2015 a las 00:00:00h en milisegundos
  189.   #start_time = "1420070400000"
  190.   # 31 de Enero 2015 a las 23.59.59h en milisegundos
  191.   #end_time = "1422748799000"
  192.   start_time = "1428883200000"
  193.   end_time = "1429487999000"
  194.   time_range = "custom"
  195.   lista_sites = getSitesList()
  196.   generateCSVReport()
  197.  
  198.   # Probar un site especifico
  199.   ##visitas = getVisits("1872262")
  200.   ##print "Visitas humanas => %s " %visitas[0]
  201.   ## print "Visitas bots => %s " %visitas[1]
  202.   ##print "Total Visitas => %s " %visitas[2]
  203.  
  204.  
  205.   #  print "lista de dominios => %s" %lista_sites[1]i
  206.   #  print "site id => %s " %lista_sites[0]i
  207.   #j = 0
  208.   #for site in lista_sites[0]:
  209.   #   print "Site: %s (%s) => Ancho de banda (%s)" %(lista_sites[1][j],site,getBandwidthSite(site))
  210.   #   j+=1
  211.  
  212.  
  213.   #for site in lista_sites[0]:
  214.   #    visitas_list = getVisits(site)
  215.   #    print "Visitas humanas => %s " %visitas_list[0]
  216.   #    print "Visitas bots => %s " %visitas_list[1]
  217.   #    print "Total Visitas => %s " %visitas_list[2]
  218.    
  219.   #hits_list = getHits(site)
  220.   #for site in lista_sites[0]:
  221.   #    print "Hits humanos => %s " %hits_list[0]
  222.   #    print "Hits bots => %s " %hits_list[1]
  223.   #    print "Hits Totales => %s " %hits_list[2]
  224.  
  225.   #threats_list = getThreats(site)
  226.   #for site in lista_sites[0]:
  227.   #    print "SQLi => %s " %threats_list[0]
  228.   #    print "Illegal Resource => %s " %threats_list[1]
  229.   #    print "XSS => %s " %threats_list[2]
  230.   #    print "Bad Bots => %s " %threats_list[3]
.................

Última edición por AlvaroG; 20/05/2015 a las 09:47 Razón: highlight
  #2 (permalink)  
Antiguo 20/05/2015, 09:50
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: duda API Phyton

En tu código solamente estás definiendo variables, no estás realmente haciendo nada. ¿podrías explicar mejor el problema?
  #3 (permalink)  
Antiguo 22/05/2015, 14:50
 
Fecha de Ingreso: mayo-2015
Mensajes: 4
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: duda API Phyton

Si, perdonar.

En el segundo script, (que funciona bien) recoge datos y crea un csv.

El que necesito y he creado una parte, el primero, quiero que envíe con el API los datos de esas variables, pero no se como. Según he leido es POST, pero no se mas como avanzar.

Gracias
  #4 (permalink)  
Antiguo 24/05/2015, 17:50
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: duda API Phyton

Luego de ver el código en más detalle, lo que veo es que no tenés ninguna función que haga algo parecido a lo que necesitás: todas las funciones obtienen datos, pero ninguna los envía para almacenarse.

Lo primero que tenés que hacer es buscar en la API de InCapsula la URL y los parámetros que tenés que usar. Una vez que sabés eso, el código que necesitás es básicamente lo mismo que tenés entre las líneas 14 y 23.
  #5 (permalink)  
Antiguo 28/05/2015, 11:43
 
Fecha de Ingreso: mayo-2015
Mensajes: 4
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: duda API Phyton

Gracias AlvaroG

Los parámetros que necesito modificar son los que muestra el primer script, countries, ips, etc

Mi problema es que no se hacer una función para que envíe las variables.



En la ayuda de Incapsula muestra estas instrucciones:
-----------------------------------------------------------------------
Modify whiltelists configuration
Use this operation to set whitelists to security rules or ACLs. To update an existing whitelist, send its ID in the id parameter. If the id parameter does not exist a new whitelist will be created.

/api/prov/v1/sites/configure/whitelists

Parameters:
Name Description Optional
api_id API authentication identifier
api_key API authentication identifier
site_id Numeric identifier of the site to operate on.
countries A comma seperated list of country codes Yes
continents A comma seperated list of continent codes Yes
ips A comma seperated list of IPs or IP ranges, e.g: 192.168.1.1, 192.168.1.1-192.168.1.100 or 192.168.1.1/24 Yes
-----------------------------------------------------------------------
  #6 (permalink)  
Antiguo 28/05/2015, 12:49
 
Fecha de Ingreso: mayo-2015
Mensajes: 4
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: duda API Phyton

Viendo un ejemplo de otra página he modificado el primer script, pero tampoco va, sale error:
...
Traceback (most recent call last):
File "countries-IP4.py", line 15, in <module>
response = requests.post(api_id=api_id, api_key=api_key, site_id=site_id, rule_id=rule_id, ips=ips)
TypeError: post() takes at least 1 non-keyword argument (0 given)
...

.................................................. .................................................. .......................
#!/usr/bin/python

import json
import requests

# Set the request parameters
URI = "/api/prov/v1/sites/configure/acl"
api_id = "xxxxx"
api_key = "xxxxxxxxxx"
site_id = "xxxxx"
rule_id = "api.acl.blacklisted_ips"
ips = "44.44.44.44,66.66.66.66"

# Do the HTTP post request
response = requests.post(api_id=api_id, api_key=api_key, site_id=site_id, rule_id=rule_id, ips=ips)

# Report success
print('FIN')
.................................................. .................................................. .......................
  #7 (permalink)  
Antiguo 28/05/2015, 14:39
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: duda API Phyton

request.post requiere un argumento posicional (la URL).

Ademas, si no mal recuerdo recibe un argumento llamado data donde ahí le pasas los parámetros del POST.
  #8 (permalink)  
Antiguo 28/05/2015, 14:58
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 8 meses
Puntos: 1329
Respuesta: duda API Phyton

En resumen, le la documentación de requests.
__________________
Grupo Telegram Docker en Español

Etiquetas: api, funcion, ip, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:13.