2010-09-28 7 views

Répondre

0

Résumé: Vous ne pouvez pas attendre que issue 2590 soit corrigé, ce qui peut prendre un certain temps car Google a closed this issue as WontFix. Il existe des solutions de contournement que vous pouvez essayer d'atteindre le même résultat final, mais en l'état, vous ne pouvez pas simplement télécharger un fichier KML à l'aide de l'API de données Google Maps.

Version longue:

Je ne pas n'a pas de code Python pour ce faire, mais le Google Maps Data API vous permet de le faire avec une série de requêtes HTTP. Voir Uploading KML dans la section Protocole HTTP du Developers Guide pour la documentation sur la façon de procéder. Donc, une solution Python possible serait d'utiliser quelque chose comme httplib dans la bibliothèque standard pour faire les requêtes HTTP appropriées pour vous. Après plusieurs modifications et vos commentaires dans les commentaires, voici un script qui prend un nom d'utilisateur et un mot de passe Google via la ligne de commande (attention à l'utilisation!) Pour obtenir la variable authorization_token en faisant ClientLogin authentication request. Avec un nom d'utilisateur et un mot de passe valides, le jeton d'authentification peut être utilisé dans l'en-tête Authorization pour l'envoi des données KML à l'API de données Maps.

#!/usr/bin/env python 
import httplib 
import optparse 
import sys 
import urllib 

class GoogleMaps(object): 
    source = "daybarr.com-kmluploader-0.1" 

    def __init__(self, email, passwd): 
     self.email = email 
     self.passwd = passwd 
     self._conn = None 
     self._auth_token = None 

    def _get_connection(self): 
     if not self._auth_token: 
      conn = httplib.HTTPSConnection("www.google.com") 
      params = urllib.urlencode({ 
       "accountType": "HOSTED_OR_GOOGLE", 
       "Email": self.email, 
       "Passwd": self.passwd, 
       "service": "local", 
       "source": self.source, 
      }) 
      headers = { 
       "Content-type": "application/x-www-form-urlencoded", 
       "Accept": "text/plain", 
      } 
      conn.request("POST", "/accounts/ClientLogin", params, headers) 
      response = conn.getresponse() 
      if response.status != 200: 
       raise Exception("Failed to login: %s %s" % (
        response.status, 
        response.reason)) 
      body = response.read() 
      for line in body.splitlines(): 
       if line.startswith("Auth="): 
        self._auth_token = line[5:] 
        break 
      if not self._auth_token: 
       raise Exception("Cannot find auth token in response %s" % body) 
     if not self._conn: 
      self._conn = httplib.HTTPConnection("maps.google.com") 
     return self._conn 

    connection = property(_get_connection) 

    def upload(self, kml_data): 
     conn = self.connection 
     headers = { 
      "GData-Version": "2.0", 
      "Authorization": 'GoogleLogin auth=%s' % (self._auth_token,), 
      "Content-Type": "application/vnd.google-earth.kml+xml", 
     } 
     conn.request("POST", "/maps/feeds/maps/default/full", kml_data, headers) 
     response = conn.getresponse() 
     if response.status != 200: 
      raise Exception("Failed to upload kml: %s %s" % (
       response.status, 
       response.reason)) 
     return response.read() 

if __name__ == "__main__": 
    parser = optparse.OptionParser() 
    parser.add_option("-e", "--email", help="Email address for login") 
    parser.add_option("-p", "--passwd", help="Password for login") 
    options, args = parser.parse_args() 
    if not (options.email and options.passwd): 
     parser.error("email and passwd required") 
    if args: 
     kml_file = open(args[0], "r") 
    else: 
     kml_file = sys.stdin 
    maps = GoogleMaps(options.email, options.passwd) 
    print maps.upload(kml_file.read()) 

Malheureusement, même en utilisant les informations de connexion valides pour obtenir une autorisation valide jeton et en utilisant un fichier KML valide contenant exactement l'exemple comme indiqué dans la documentation, l'API répond au poste KML avec un 400 Bad Request. Apparemment, il s'agit d'un problème connu (2590 signalé le 22 juillet 2010). Veuillez donc voter et commenter si vous souhaitez que Google corrige.

En attendant, sans ce bogue fixe, vous pouvez essayer

  1. Créer la carte sans télécharger KML, puis télécharger KML propose, le cas échéant, comme le suggère comment #9 on the issue de Google, quand ils ont confirmé que le bug existe.
  2. uploading XML ou uploading CSV au lieu de KML si ces méthodes prennent en charge ce que vous avez besoin pour faire
  3. jongler avec le format de vos données KML. This post dans le groupe Google pour l'API suggère que cela pourrait aider, mais il semble compliqué.

Bonne chance

+0

désolé, mais je reçois un 400 Bad Request demande Bad et je ne sais pas comment débugger. –

+0

@ Jörg Beyer Strange. Vous obtenez normalement un 400 seulement si la demande n'est pas une requête HTTP valide pour une raison quelconque. J'ai mis à jour ma réponse, s'il vous plaît donnez le script un aller, devrait être exécutable tel quel. – Day

+0

Je reçois toujours une "400 Bad Request". Je suis confiant, que l'authentification est OK, parce que je reçois un 401 quand je modifie mon jeton fraîchement généré. –

Questions connexes