2013-08-11 14 views
6

Mam plik zip zapisany na Dysku Google (jest udostępniany publicznie). Chcę wiedzieć, jak pobrać go w Golang. Prąd ten kod tylko tworzy pusty plik o nazwie „file.zip”:Pobierz plik publiczny z 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

co zawiera zmienna błędu? –

+0

Wartość błędu wynosi zero. – DanielTA

+0

Próbowałem uruchomić twój kod lokalnie. Status odpowiedzi to 403 Zakazane. Nie wiem, co jest przyczyną tego. Nigdy też nie używaj "błędu" jako zmiennej. Cieniujesz typ "błędu" wszechświata. –

Odpowiedz

5

znalazłem rozwiązanie. Zastosowanie: https://googledrive.com/host/ID

Zamiast: https://docs.google.com/uc?export=download&id=ID

+0

Dziękuję bardzo! Przeszukałem internet przez 2 godziny, aby rozwiązać ten problem, a ty byłeś jedynym, który to zrobił. Czy możesz podać źródło swojej odpowiedzi? –

+0

Niestety, minęło trochę czasu. Myślę, że to była jakaś strona pomocy Google odnosząca się do czegoś innego i pomyślałam, że sprawdzę, czy to też zadziała, i tak się stało. – DanielTA

+1

To nie wydaje się już działać. –

7

Wydaje się to być błąd, albo z napędem Google lub z golang, nie jestem pewien, który!

Problem polega na tym, że pierwszy URL daliście przekierowuje do drugiego adresu URL, który wygląda mniej więcej tak

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

Zanotować * w adresie URL, który jest legalny według this stack overflow question. Jednak ma specjalne znaczenie jako ogranicznik.

Go pobiera URL z * zakodowany jako %2A jak ten

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

projektów odpowiedzi Google "403 Forbidden", aby.

Google wydaje się nie rozwiązywać %2A w *.

Zgodnie z this article on wikipedia zarezerwowanymi znakami (z których * jest jeden) używanymi w schemacie URI: jeśli konieczne jest użycie tego znaku w jakimś innym celu, znak musi być zakodowany w procentach.

Nie jestem ekspertem w tej dziedzinie, aby powiedzieć, kto ma rację, ale ponieważ Google napisał obie części problemu, to na pewno ich wina gdzieś!

Here is the program I was using for testing

+0

Dzięki za wyjaśnienie. Znalazłem rozwiązanie. Wkrótce opublikuję. – DanielTA

+0

Jest rok 2015, a Google nadal nie akceptuje "% 2A". To było piekielne doświadczenie, aby wyśledzić problem, ponieważ ruch jest zabezpieczony za pomocą protokołu HTTPS. Dzięki za odpowiedź, to było naprawdę pomocne! – GreenScape

3

ja wciąż badają dlaczego tak się dzieje, w międzyczasie można korzystać z tego rozwiązania:

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

CheckRedirect jest wywoływany, gdy nastąpi przekierowanie i można dodać nieprzezroczystą ścieżkę, aby uniknąć zakodowania adresu URL URL.

Francesc

+0

To działało z CheckRedirect. Do tego celu użyj adresu URL Dysku teraz: https://drive.google.com/uc?export=download&id=ID –

+0

Użyj też identyfikatora w adresie URL udziału, a nie rzeczywistego identyfikatora pliku. –