2013-08-11 39 views
6

Ho un file zip memorizzato su Google Drive (è condiviso pubblicamente). Voglio sapere come scaricarlo in Golang. Questo codice corrente solo crea un file vuoto denominato "file.zip":Scarica file pubblico da Google Drive - Golang

package main 

import (
    "fmt" 
    "io" 
    "net/http" 
    "os" 
) 

func main() { 
    url := "https://docs.google.com/uc?export=download&id=0B2Q7X-dUtUBebElySVh1ZS1iaTQ" 
    fileName := "file.zip" 
    fmt.Println("Downloading file...") 

    output, err := os.Create(fileName) 
    defer output.Close() 

    response, err := http.Get(url) 
    if err != nil { 
     fmt.Println("Error while downloading", url, "-", eerrror) 
     return 
    } 
    defer response.Body.Close() 

    n, err := io.Copy(output, response.Body) 

    fmt.Println(n, "bytes downloaded") 
} 
+1

cosa ha la variabile di errore? –

+0

Il valore di errore è nullo. – DanielTA

+0

Ho provato a eseguire il codice localmente. Lo stato della risposta è 403 Proibito. Non so cosa lo stia causando. Inoltre, non utilizzare mai "errore" come variabile. Stai oscurando il tipo di "errore" dell'universo. –

risposta

5
+0

Grazie mille !!! Ho cercato su Internet per 2 ore per risolvere questo problema e tu sei stato l'unico a farlo. Potete fornire la fonte della risposta? –

+0

Siamo spiacenti, è stato un po 'di tempo fa. Penso che sia stata una qualche pagina di aiuto di Google relativa a qualcos'altro e ho pensato di vedere se avrebbe funzionato anche per questo, e così è stato. – DanielTA

+1

Questo non sembra funzionare più. –

7

Questo sembra essere un bug, sia con trazione Google o con golang, non sono sicuro che!

Il problema è che il primo URL hai dato reindirizza a un secondo URL che sembra qualcosa di simile

https://doc-00-c8-docs.googleusercontent.com/docs/securesc/ha0ro937gcuc7l7deffksulhg5h7mbp1/8i67l6m6cdojptjuh883mu0qqmtptds1/1376330400000/06448503420061938118/*/0B2Q7X-dUtUBebElySVh1ZS1iaTQ?h=16653014193614665626&e=download

Nota la * nell'URL che è legale secondo this stack overflow question. Tuttavia ha un significato speciale come delimitatore.

Go recupera l'URL con l'* codificato come %2A come questo

https://doc-00-c8-docs.googleusercontent.com/docs/securesc/ha0ro937gcuc7l7deffksulhg5h7mbp1/8i67l6m6cdojptjuh883mu0qqmtptds1/1376330400000/06448503420061938118/%2A/0B2Q7X-dUtUBebElySVh1ZS1iaTQ?h=16653014193614665626&e=download

Quali Google risponde "403 Forbidden" a.

Google non sembra risolvere il %2A in un *.

Secondo this article on wikipedia caratteri riservati (di cui * è uno) utilizzati in uno schema URI: se è necessario utilizzare tale carattere per altri scopi, il carattere deve essere codificato in percentuale.

Non sono abbastanza esperto in questo per dire chi ha ragione, ma dal momento che Google ha scritto entrambe le parti del problema è sicuramente colpa loro da qualche parte!

Here is the program I was using for testing

+0

Grazie per la spiegazione. Ho trovato una soluzione. Lo posterò presto. – DanielTA

+0

È il 2015 e Google continua a non accettare '% 2A'. È stata un'esperienza infernale rintracciare il problema, dal momento che il traffico è protetto con HTTPS. Grazie per questa risposta, è stato davvero utile! – GreenScape

3

Sto ancora indagando sul perché questo sta accadendo, nel frattempo è possibile utilizzare questa soluzione:

http://play.golang.org/p/SzGBAiZdGJ

CheckRedirect viene chiamato quando si verifica un reindirizzamento ed è possibile aggiungere un percorso opaco per evitare di avere l'URL con codifica URL.

Francesc

+0

Questo ha funzionato con CheckRedirect. Per la cronaca, utilizza ora l'URL di Drive: https://drive.google.com/uc?export=download&id=ID –

+0

Inoltre, utilizza l'ID nell'URL della condivisione, non l'ID del file effettivo. –

Problemi correlati