Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Uploading File into Google Drive (because grive too many dependencies qt, xorg ? )
#!/bin/bash
## uploading to google
## rev: 22 Aug 2012 16:07
det=`date +%F`
browser="Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:13.0) Gecko/20100101 Firefox/13.0.1"
username="user@domain-apps.com"
password="password"
accountype="HOSTED" #gooApps = HOSTED , gmail=GOOGLE
pewede="/tmp"
file="file-$det.tar"
tipe="application/x-tar"
/usr/bin/curl -v --data-urlencode Email=$username --data-urlencode Passwd=$password -d accountType=$accountype -d service=writely -d source=cURL "https://www.google.com/accounts/ClientLogin" > $pewede/login.txt
token=`cat $pewede/login.txt | grep Auth | cut -d \= -f 2`
uploadlink=`/usr/bin/curl -Sv -k --request POST -H "Content-Length: 0" -H "Authorization: GoogleLogin auth=${token}" -H "GData-Version: 3.0" -H "Content-Type: $tipe" -H "Slug: $file" "https://docs.google.com/feeds/upload/create-session/default/private/full?convert=false" -D /dev/stdout | grep "Location:" | sed s/"Location: "//`
/usr/bin/curl -Sv -k --request POST --data-binary "@$file" -H "Authorization: GoogleLogin auth=${token}" -H "GData-Version: 3.0" -H "Content-Type: $tipe" -H "Slug: $file" "$uploadlink" > $pewede/goolog.upload.txt
@xed182x

This comment has been minimized.

Copy link

@xed182x xed182x commented Dec 19, 2012

i was trying to use this script but i dont know if this work .

@jsaada

This comment has been minimized.

Copy link

@jsaada jsaada commented Feb 15, 2013

thanx for sharing this
i ve made few improvements:

file is given by argument, auto detection of mimetype, creditential is now outside of the script:

if [ ! -f $1 ];then
        echo "please provide a file in arg"
        exit -1
fi
creditFile=credits.ini
if [ ! -f $creditFile ];then
        echo "please fill $creditFile (file has just been created)"
        echo "username=$login
password=$pass">$creditFile
        exit -1
fi

file="$1"
browser="Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:13.0) Gecko/20100101 Firefox/13.0.1"
. credits.ini
username=$login
password=$pass
accountype="GOOGLE" #gooApps = HOSTED , gmail=GOOGLE
mime_type=`file -b --mime-type $file`

/usr/bin/curl -v --data-urlencode Email=$username --data-urlencode Passwd=$password -d accountType=$accountype -d service=writely -d source=cURL "https://www.google.com/accounts/ClientLogin" > /tmp/login.txt

token=`cat /tmp/login.txt | grep Auth | cut -d \= -f 2`

uploadlink=`/usr/bin/curl -Sv -k --request POST -H "Content-Length: 0" -H "Authorization: GoogleLogin auth=${token}" -H "GData-Version: 3.0" -H "Content-Type: $mime_type" -H "Slug: $file" "https://docs.google.com/feeds/upload/create-session/default/private/full?convert=false" -D /dev/stdout | grep "Location:" | sed s/"Location: "//`

/usr/bin/curl -Sv -k --request POST --data-binary "@$file" -H "Authorization: GoogleLogin auth=${token}" -H "GData-Version: 3.0" -H "Content-Type: $mime_type" -H "Slug: $file" "$uploadlink" > /tmp/goolog.upload.txt
@peter-budo

This comment has been minimized.

Copy link

@peter-budo peter-budo commented May 31, 2013

How would last curl look with file upload to specific folder on google drive?

@EsterniTY

This comment has been minimized.

Copy link

@EsterniTY EsterniTY commented Jun 12, 2013

Here is an URL I used for second curl to upload file to a specific folder:

https://docs.google.com/feeds/upload/create-session/default/private/full/folder:$folderId/contents?convert=false

instead of

https://docs.google.com/feeds/upload/create-session/default/private/full?convert=false

$folderId can be found from Google Drive URL in your browser, i.e.

https://drive.google.com/?tab=wo&authuser=0#folders/1234567890AB-CDEFGHIJKLMNOPQR
@liderbug

This comment has been minimized.

Copy link

@liderbug liderbug commented Jul 30, 2013

I couldn't get the first curl to work but I was able to get the following to return the Auth string.
curl -s -d Email='me%40gmail.com' -d Passwd='123ABcdE' -d accountType=GOOGLE -d source=Google-cURL-Example -d service=lh2 "https://www.google.com/accounts/ClientLogin

I have a question about the "service=lh2". Research says it's for Picasa Web. I can't find one for GDrive.

When the second curl runs (uploadlink) I get "HTTP/1.1 401 Unauthorized".

Suggestions?
Thanks

@liderbug

This comment has been minimized.

Copy link

@liderbug liderbug commented Jul 30, 2013

Suck-sess - had to change the "lh2" to "writely" and add the mimi_type= line and bingo. Now to see if I can get it to run on my hosted web server.

@liderbug

This comment has been minimized.

Copy link

@liderbug liderbug commented Jul 30, 2013

Suck-sess - had to change the "lh2" to "writely" and add the mimi_type= line and bingo file uploaded. Now to see if I can get it to run on my hosted web server.

Well - no luck. When executing the first curl (Auth) I get "HTTP/1.1 403 Forbidden" with a "-k" added and without I get:

curl: (60) error setting certificate verify locations:
CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none

More details here: http://curl.haxx.se/docs/sslcerts.html

I will continue to play - however, some help from someone with more knowledge would really be nice.

Thanks.

@liderbug

This comment has been minimized.

Copy link

@liderbug liderbug commented Jul 31, 2013

Stumbled across "Google will block access from the location(s) you don't normally use - like home and you can't use the coffee shop - but if you go to https://accounts.google.com/DisplayUnlockCaptcha it give you a few minutes to login from there.

@deanet

This comment has been minimized.

Copy link
Owner Author

@deanet deanet commented Aug 2, 2013

Hi liderbug,

no problem with my environment.. this is running from fresh environment..

[deanet@lumbung ~]$ bash -x bin/google.sh 
++ date +%F
+ det=2013-08-02
+ browser='Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:13.0) Gecko/20100101 Firefox/13.0.1'
+ username=*snip*
+ password='*snip*'
+ accountype=GOOGLE
+ pewede=/tmp
+ file=icecast.tar
+ tipe=application/x-tar
+ /usr/bin/curl -v --data-urlencode Email=*snip* --data-urlencode 'Passwd=*snip*' -d accountType=GOOGLE -d service=writely -d source=cURL https://www.google.com/accounts/ClientLogin
* About to connect() to www.google.com port 443 (#0)
*   Trying 2607:f8b0:4008:803::1014... connected
* Connected to www.google.com (2607:f8b0:4008:803::1014) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* SSL connection using SSL_RSA_WITH_RC4_128_MD5
* Server certificate:
*   subject: CN=www.google.com,O=Google Inc,L=Mountain View,ST=California,C=US
*   start date: Jul 12 08:56:36 2013 GMT
*   expire date: Oct 31 23:59:59 2013 GMT
*   common name: www.google.com
*   issuer: CN=Google Internet Authority,O=Google Inc,C=US
> POST /accounts/ClientLogin HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: www.google.com
> Accept: */*
> Content-Length: 102
> Content-Type: application/x-www-form-urlencoded
> 
} [data not shown]
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0   102      0    423 --:--:-- --:--:-- --:--:--   423< HTTP/1.1 200 OK
< Content-Type: text/plain
< Cache-control: no-cache, no-store
< Pragma: no-cache
< Expires: Mon, 01-Jan-1990 00:00:00 GMT
< Date: Fri, 02 Aug 2013 09:18:02 GMT
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Content-Length: 818
< Server: GSE
< 
{ [data not shown]
115   818  102   818    0   102   2857    356 --:--:-- --:--:-- --:--:-- 15911* Connection #0 to host www.google.com left intact

* Closing connection #0
++ cut -d = -f 2
++ grep Auth
++ cat /tmp/login.txt
+ token=*snip*
++ sed 's/Location: //'
++ grep Location:
++ /usr/bin/curl -Sv -k --request POST -H 'Content-Length: 0' -H 'Authorization: GoogleLogin auth=*snip*' -H 'GData-Version: 3.0' -H 'Content-Type: application/x-tar' -H 'Slug: icecast.tar' 'https://docs.google.com/feeds/upload/create-session/default/private/full?convert=false' -D /dev/stdout
* About to connect() to docs.google.com port 443 (#0)
*   Trying 2607:f8b0:4008:803::1006... connected
* Connected to docs.google.com (2607:f8b0:4008:803::1006) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* warning: ignoring value of ssl.verifyhost
* skipping SSL peer certificate verification
* SSL connection using SSL_RSA_WITH_RC4_128_MD5
* Server certificate:
*   subject: CN=*.google.com,O=Google Inc,L=Mountain View,ST=California,C=US
*   start date: Jul 12 09:00:30 2013 GMT
*   expire date: Oct 31 23:59:59 2013 GMT
*   common name: *.google.com
*   issuer: CN=Google Internet Authority,O=Google Inc,C=US
> POST /feeds/upload/create-session/default/private/full?convert=false HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: docs.google.com
> Accept: */*
> Content-Length: 0
> Authorization: GoogleLogin auth=*snip*
> GData-Version: 3.0
> Content-Type: application/x-tar
> Slug: icecast.tar
> 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0< HTTP/1.1 200 OK
< Location: https://docs.google.com/feeds/upload/create-session/default/private/full?convert=false&upload_id=AEnB2UoISsv6UkzrzkUs5MwLTobAYKQPPWFn0nVJdas9SVtUTOMk6rks66kuGTZ4kfixu05jlRf_x0ijmccdLcWgEj3vp3WlLw
< Date: Fri, 02 Aug 2013 09:18:03 GMT
< Server: HTTP Upload Server Built on Jul 24 2013 17:20:01 (1374711601)
< Content-Length: 0
< Content-Type: text/html; charset=UTF-8
< 
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Connection #0 to host docs.google.com left intact

* Closing connection #0
+ uploadlink='https://docs.google.com/feeds/upload/create-session/default/private/full?convert=false&upload_id=AEnB2UoISsv6Uk'rzkUs5MwLTobAYKQPPWFn0nVJdas9SVtUTOMk6rks66kuGTZ4kfixu05jlRf_x0ijmccdLcWgEj3vp3WlLw
+ /usr/bin/curl -Sv -k --request POST --data-binary @icecast.tar -H 'Authorization: GoogleLogin auth=*snip*' -H 'GData-Version: 3.0' -H 'Content-Type: application/x-tar' -H 'Slug: icecast.tar' 'https://docs.google.com/feeds/upload/create-session/default/private/full?convert=false&upload_id=AEnB2UoISsv6UkzrzkUs5MwLTobAYKQPPWFn0nVJdas9SVtUTOMk6rks66kuGTZ4kfixu05jl'f_x0ijmccdLcWgEj3vp3WlLw
* About to connect() to docs.google.com port 443 (#0)
*   Trying 2607:f8b0:4008:803::1006... connected
* Connected to docs.google.com (2607:f8b0:4008:803::1006) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* warning: ignoring value of ssl.verifyhost
* skipping SSL peer certificate verification
* SSL connection using SSL_RSA_WITH_RC4_128_MD5
* Server certificate:
*   subject: CN=*.google.com,O=Google Inc,L=Mountain View,ST=California,C=US
*   start date: Jul 12 09:00:30 2013 GMT
*   expire date: Oct 31 23:59:59 2013 GMT
*   common name: *.google.com
*   issuer: CN=Google Internet Authority,O=Google Inc,C=US
> POST /feeds/upload/create-session/default/private/full?convert=false&upload_id=AEnB2UoISsv6UkzrzkUs5MwLTobAYKQPPWFn0nVJdas9 HTTP/1.1rks66kuGTZ4kfixu05jlRf_x0ijmccdLcWgEj3vp3WlLw
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: docs.google.com
> Accept: */*
> Authorization: GoogleLogin auth=*snip*
> GData-Version: 3.0
> Content-Type: application/x-tar
> Slug: icecast.tar
> Content-Length: 64307200
> Expect: 100-continue
> 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0 61.3M    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0< HTTP/1.1 100 Continue
} [data not shown]
100 61.3M    0     0  100 61.3M      0  2231k  0:00:28  0:00:28 --:--:-- 1883k< HTTP/1.1 201 Created
< Content-Type: application/atom+xml; charset=UTF-8; type=entry
< Expires: Fri, 02 Aug 2013 09:18:33 GMT
< Date: Fri, 02 Aug 2013 09:18:33 GMT
< Cache-Control: private, max-age=0, must-revalidate, no-transform
< Vary: Accept, X-GData-Authorization, GData-Version
< GData-Version: 3.0
< ETag: "A1BVSgpOHCt7ImBk"
< Location: https://docs.google.com/feeds/default/private/full/file%3A0BzpPZf0yXmAsa0dpRFBEU2o3MWs
< Content-Location: https://docs.google.com/feeds/default/private/full/file%3A0BzpPZf0yXmAsa0dpRFBEU2o3MWs
< Content-Length: 3223
< Server: HTTP Upload Server Built on Jul 24 2013 17:20:01 (1374711601)
< 
{ [data not shown]
100 61.3M  100  3223  100 61.3M    112  2188k  0:00:28  0:00:28 --:--:-- 1561k* Connection #0 to host docs.google.com left intact

* Closing connection #0
[deanet@lumbung ~]$ 

maybe, you need make sure /etc/pki/tls/certs/ is readable.

thanks

@rakeshr

This comment has been minimized.

Copy link

@rakeshr rakeshr commented Apr 29, 2014

How can I overwrite the file if there is existing one?

@ghost

This comment has been minimized.

Copy link

@ghost ghost commented Jun 26, 2014

Hi,

Thanks a lot for this share guys, it helped me a lot.
I had hard time to make it works so i'll share my experience :
As /dev/stdout was not my default ouput, the script wasn't working for me. I'm not really experienced with bash scripts but i found a way working for me and i guess it will work in all cases. As a was updating the script, i also changed it to avoid file input/output on the system. You can see the new script below.

token=$(curl --data-urlencode Email=$username --data-urlencode Passwd=$password -d accountType=$accountype -d service=writely -d source=cURL "https://www.google.com/accounts/ClientLogin" | grep Auth | cut -d \= -f 2)
link=$(curl -X POST -H "Content-Length: 0" -H "Authorization: GoogleLogin auth=${token}" -H "GData-Version: 3.0" -H "Content-Type: $mimetype" -H "Slug: $file" "https://docs.google.com/feeds/upload/create-session/default/private/full/folder:$folderid/contents?convert=false" -D - | grep "Location:" | sed s/"Location: "//)
curl -X POST --data-binary "@$file" -H "Authorization: GoogleLogin auth=${token}" -H "GData-Version: 3.0" -H "Content-Type: $mimetype" -H "Slug: $file" "$link" > /dev/null
@idiomatic

This comment has been minimized.

Copy link

@idiomatic idiomatic commented Jul 6, 2014

evolution happens:

  • automatically gleans MIME type from file
  • uploads multiple files
  • removes directory prefix from filename
  • works with filenames with spaces
  • uses dotfile for configuration and token
  • interactively configuring
  • uploads to target folder if last argument looks like a folder id
  • quieter output
  • uses longer command line flags for readability
  • throttle by adding curl_args="--limit-rate 500K" to $HOME/.gdrive.conf
#!/bin/bash
# based on https://gist.github.com/deanet/3427090
#
# useful $HOME/.gdrive.conf options:
#    curl_args="--limit-rate 500K --progress-bar"


browser="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"

destination_folder_id=${@: -1}
if expr "$destination_folder_id" : '^[A-Za-z0-9]\{28\}$' > /dev/null
then
    # all but last word
    set -- "${@:0:$#}"
else
    # upload to root
    unset destination_folder_id
fi

if [ -e $HOME/.gdrive.conf ]
then
    . $HOME/.gdrive.conf
fi

old_umask=`umask`
umask 0077

if [ -z "$username" ]
then
    read -p "username: " username
    unset token
    echo "username=$username" >> $HOME/.gdrive.conf
fi

if [ -z "$account_type" ]
then
    if expr "$username" : '^[^@]*$' > /dev/null || expr "$username" : '.*@gmail.com$' > /dev/null
    then
        account_type=GOOGLE
    else
        account_type=HOSTED
    fi
fi

if [ -z "$password$token" ]
then
    read -s -p "password: " password
    unset token
    echo
fi

if [ -z "$token" ]
then
    token=`curl --silent --data-urlencode Email=$username --data-urlencode Passwd="$password" --data accountType=$account_type --data service=writely --data source=cURL "https://www.google.com/accounts/ClientLogin" | sed -ne s/Auth=//p`
    sed -ie '/^token=/d' $HOME/.gdrive.conf
    echo "token=$token" >> $HOME/.gdrive.conf
fi
umask $old_umask

for file in "$@"
do
    slug=`basename "$file"`
    mime_type=`file --brief --mime-type "$file"`
    upload_link=`curl --silent --show-error --insecure --request POST --header "Content-Length: 0" --header "Authorization: GoogleLogin auth=${token}" --header "GData-Version: 3.0" --header "Content-Type: $mime_type" --header "Slug: $slug" "https://docs.google.com/feeds/upload/create-session/default/private/full${destination_folder_id+/folder:$destination_folder_id/contents}?convert=false" --dump-header - | sed -ne s/"Location: "//p`
    echo "$file:"
    curl --request POST --output /dev/null --data-binary "@$file" --header "Authorization: GoogleLogin auth=${token}" --header "GData-Version: 3.0" --header "Content-Type: $mime_type" --header "Slug: $slug" "$upload_link" $curl_args
done
@axelfaltin

This comment has been minimized.

Copy link

@axelfaltin axelfaltin commented Jul 7, 2014

Great work idiomatic works like a charm!

Since I am trying to update the same file with a csv.file evertime I need to find a way to avoid a new file is being created. Any tips would be appreciated.

Axel

@andreapergola

This comment has been minimized.

Copy link

@andreapergola andreapergola commented Aug 4, 2014

I would like to thank the excellent work of all the people before me. Follows my little modifications, maybe someone could find them useful too:

  • parameter to set google documents file conversion (very useful to me for big XLS files). Set to "false" if not necessary.
  • small check to exclude the upload of the script itself (it happened to me when I use to set a destination folder, which is my common use case)

Unfortunately I am still trying to figure out how to avoid the file duplication, if someone discovers out to solve this small issue I will be very grateful :)

#!/bin/bash
# based on https://gist.github.com/deanet/3427090
#
# useful $HOME/.gdrive.conf options:
#    curl_args="--limit-rate 500K --progress-bar"


browser="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"
convert_to_googledocs="true"

destination_folder_id=${@: -1}
if expr "$destination_folder_id" : '^[A-Za-z0-9]\{28\}$' > /dev/null
then
    # all but last word
    set -- "${@:0:$#}"
else
    # upload to root
    unset destination_folder_id
fi

if [ -e $HOME/.gdrive.conf ]
then
    . $HOME/.gdrive.conf
fi

old_umask=`umask`
umask 0077

if [ -z "$username" ]
then
    read -p "username: " username
    unset token
    echo "username=$username" >> $HOME/.gdrive.conf
fi

if [ -z "$account_type" ]
then
    if expr "$username" : '^[^@]*$' > /dev/null || expr "$username" : '.*@gmail.com$' > /dev/null
    then
        account_type=GOOGLE
    else
        account_type=HOSTED
    fi
fi

if [ -z "$password$token" ]
then
    read -s -p "password: " password
    unset token
    echo
fi

if [ -z "$token" ]
then
    token=`curl --silent --data-urlencode Email=$username --data-urlencode Passwd="$password" --data accountType=$account_type --data service=writely --data source=cURL "https://www.google.com/accounts/ClientLogin" | sed -ne s/Auth=//p`
    sed -ie '/^token=/d' $HOME/.gdrive.conf
    echo "token=$token" >> $HOME/.gdrive.conf
fi
umask $old_umask

for file in "$@"
do
    if [ "$file" != "$0" ]
    then
        slug=`basename "$file"`
        mime_type=`file --brief --mime-type "$file"`
        upload_link=`curl --silent --show-error --insecure --request POST --header "Content-Length: 0" --header "Authorization: GoogleLogin auth=${token}" --header "GData-Version: 3.0" --header "Content-Type: $mime_type" --header "Slug: $slug" "https://docs.google.com/feeds/upload/create-session/default/private/full${destination_folder_id+/folder:$destination_folder_id/contents}?convert=$convert_to_googledocs" --dump-header - | sed -ne s/"Location: "//p`
        echo "$file:"
        curl --request POST --output /dev/null --data-binary "@$file" --header "Authorization: GoogleLogin auth=${token}" --header "GData-Version: 3.0" --header "Content-Type: $mime_type" --header "Slug: $slug" "$upload_link" $curl_args
    fi
done
@drocsid

This comment has been minimized.

Copy link

@drocsid drocsid commented Aug 13, 2014

curl: (3) malformed

@jonopowell

This comment has been minimized.

Copy link

@jonopowell jonopowell commented Aug 29, 2014

Drocsid: I had the same issue. When I looked at what was being returned, I was getting an authentication error because I have 2 factor authentication turned on. To get around this I have opted to create an application password for this script. Using that password and it all works fine again.

@Queuecumber

This comment has been minimized.

Copy link

@Queuecumber Queuecumber commented Sep 1, 2014

Updated the version by @andreapergola to use Zenity for username/passwords and upload progress making it cleaner to integrate via a nautilus action or similar. I had to use a trap to kill the curl command if the Zenity progress is cancelled, if anyone has a better solution please update

#!/bin/bash
# based on https://gist.github.com/deanet/3427090
#
# useful $HOME/.gdrive.conf options:
#    curl_args="--limit-rate 500K --progress-bar"

trap 'kill $(jobs -p)' EXIT

browser="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"
convert_to_googledocs="true"

destination_folder_id=${@: -1}
if expr "$destination_folder_id" : '^[A-Za-z0-9]\{28\}$' > /dev/null
then
    # all but last word
    set -- "${@:0:$#}"
else
    # upload to root
    unset destination_folder_id
fi

if [ -e $HOME/.gdrive.conf ]
then
    . $HOME/.gdrive.conf
fi

old_umask=`umask`
umask 0077

if [ -z "$username" ]
then
    ENTRY=`zenity --password --username --title="Drive Login"`

    case $? in
        1)
            exit
            ;;
        -1)
            exit
            ;;
    esac

    username=`echo $ENTRY | cut -d'|' -f1`
    password=`echo $ENTRY | cut -d'|' -f2`
    unset token
    echo "username=$username" >> $HOME/.gdrive.conf
fi

if [ -z "$account_type" ]
then
    if expr "$username" : '^[^@]*$' > /dev/null || expr "$username" : '.*@gmail.com$' > /dev/null
    then
        account_type=GOOGLE
    else
        account_type=HOSTED
    fi
fi

if [ -z "$password$token" ]
then
    ENTRY=`zenity --password --title="Password" --text="Enter your Google Drive password"`
    password=$ENTRY

    case $? in
        1)
            exit
            ;;
        -1)
            exit
            ;;
    esac

    unset token
fi

if [ -z "$token" ]
then
    token=`curl --silent --data-urlencode Email=$username --data-urlencode Passwd="$password" --data accountType=$account_type --data service=writely --data source=cURL "https://www.google.com/accounts/ClientLogin" | sed -ne s/Auth=//p`
    sed -ie '/^token=/d' $HOME/.gdrive.conf
    echo "token=$token" >> $HOME/.gdrive.conf
fi
umask $old_umask

for file in "$@"
do
    if [ "$file" != "$0" ]
    then
        slug=`basename "$file"`
        mime_type=`file --brief --mime-type "$file"`
        upload_link=`curl --silent --show-error --insecure --request POST --header "Content-Length: 0" --header "Authorization: GoogleLogin auth=${token}" --header "GData-Version: 3.0" --header "Content-Type: $mime_type" --header "Slug: $slug" "https://docs.google.com/feeds/upload/create-session/default/private/full${destination_folder_id+/folder:$destination_folder_id/contents}?convert=$convert_to_googledocs" --dump-header - | sed -ne s/"Location: "//p`
        echo "$file:"
        curl --request POST --output /dev/null --data-binary "@$file" --header "Authorization: GoogleLogin auth=${token}" --header "GData-Version: 3.0" --header "Content-Type: $mime_type" --header "Slug: $slug" "$upload_link" $curl_args -# 2>&1 | stdbuf -oL tr '\r' '\n' | grep -o --line-buffered '[0-9]*\.[0-9]' | zenity --progress --title="Uploading..." --text="${file##*/}" --auto-close --auto-kill

        case $? in
            1)
                exit
                ;;
            -1)
                exit
                ;;
        esac
    fi
done
@aoakley

This comment has been minimized.

Copy link

@aoakley aoakley commented Sep 12, 2014

I've adapted (improved? You judge!) this script still further by allowing the destination_folder_id to be stored in the ~/.gdrive.conf file. I have written a HOWTO which describes how to use this tool as part of backing up medium-resolution family photos to Google Drive:

http://aoakley.com/articles/2014-09-12-photo-backup.php

@Kryten0807

This comment has been minimized.

Copy link

@Kryten0807 Kryten0807 commented Oct 27, 2014

One more thing that might help get this working:

You may need to enable access to less secure apps at this page.

Also, there's a problem with the various enhanced scripts on this page: in order to determine if the type is HOSTED or GOOGLE, they check the username (email) to see if it's a Gmail address. This is not correct because you can now use a non-Gmail account to set up a Google account; that's what I'm doing. I have a non-Gmail account with email hosted somewhere else, but I'm using Google's other services (Drive).

@minsoehan

This comment has been minimized.

Copy link

@minsoehan minsoehan commented Nov 12, 2014

I think I am looking for this one. but I don't understand how to use these script. anyone explain?
Edit: OK, I got it now, great works.

@nzbaxterman

This comment has been minimized.

Copy link

@nzbaxterman nzbaxterman commented Jan 31, 2015

Great script - but having a problem getting it to run properly on a raspberry PI.

Weird problem. When I run it I'm getting "curl: (3) Illegal characters found in URL" in the final curl in the definition of $upload_link.
If I then edit the script and replace $upload_link variable with the actual $upload_link string it runs fine.

For example:
curl --request POST --output /dev/null --data-binary "@$file" --header "Authorization: GoogleLogin auth=${token}" --header "GData-Version: 3.0" --header "Content-Type: $mime_type" --header "Slug: $slug" "$upload_link" $curl_args

replaced with:

curl --request POST --output /dev/null --data-binary "@$file" --header "Authorization: GoogleLogin auth=${token}" --header "GData-Version: 3.0" --header "Content-Type: $mime_type" --header "Slug: $slug" "https://docs.google.com/feeds/upload/create-session/default/private/full?convert=true&upload_id=######" $curl_args

works fine.

Any ideas?

@kane-c

This comment has been minimized.

Copy link

@kane-c kane-c commented Feb 12, 2015

@nzbaxterman I ran into this problem too. The request to get the upload URL seems to have a line break in it now. Stripping that works for me:

upload_link = `curl ... | tr -d '\r\n'`
@sl45sms

This comment has been minimized.

Copy link

@sl45sms sl45sms commented Feb 20, 2015

@kane-c tnx works for me

@semeion

This comment has been minimized.

Copy link

@semeion semeion commented Apr 28, 2015

Nice work!

Anyone know how to avoid the file duplication?

@semeion

This comment has been minimized.

Copy link

@semeion semeion commented Apr 28, 2015

Here have some info about how manage folders, could be nice get the list of folder names and overwrite the files to avoid duplication:

https://developers.google.com/drive/web/manage-uploads

Here have info about how make an update case the file exist:
https://developers.google.com/drive/v2/reference/files/update

Here the author is using the new google drive api, where you can specify the 'uploadType':
http://codeseekah.com/tag/curl/
https://github.com/soulseekah/bash-utils/blob/master/google-drive-upload/upload.sh

I think we have elements to make a complete sync client in bash!

@nicolabeghin

This comment has been minimized.

Copy link

@nicolabeghin nicolabeghin commented Oct 7, 2015

does this still works? I always get

https://developers.google.com/accounts/docs/AuthForInstalledApps

when authenticating. Seems like Google deprecated this kind of authentication

@deanet

This comment has been minimized.

Copy link
Owner Author

@deanet deanet commented Oct 16, 2015

@nicolabeghin it doesn't work anymore.

@azizasm

This comment has been minimized.

Copy link

@azizasm azizasm commented Dec 4, 2015

This code doesn't work anymore because google has enforced OAUTH 2.0.

@bharadwaj-raju

This comment has been minimized.

Copy link

@bharadwaj-raju bharadwaj-raju commented Mar 12, 2016

Grive doesn't depend on Qt or Xorg.

@XavM

This comment has been minimized.

Copy link

@XavM XavM commented Jun 26, 2017

Google enforcing OAuth this script doesn't work any more;
You will get a 404 on "https://www.google.com/accounts/ClientLogin" when requesting the "${token}"

This one works fine with OAuth 2 : https://github.com/labbots/google-drive-upload

You will need an API client and secret : Go to https://console.developers.google.com/apis/ and create a "Google Drive" credential of type "OAuth client ID", sub type "other"

(Adding that here as this gist still popups first on google search)

@x011

This comment has been minimized.

Copy link

@x011 x011 commented Nov 11, 2019

evolution happens:

* automatically gleans MIME type from file

* uploads multiple files

* removes directory prefix from filename

* works with filenames with spaces

* uses dotfile for configuration and token

* interactively configuring

* uploads to target folder if last argument looks like a folder id

* quieter output

* uses longer command line flags for readability

* throttle by adding `curl_args="--limit-rate 500K"` to $HOME/.gdrive.conf
#!/bin/bash
# based on https://gist.github.com/deanet/3427090
#
# useful $HOME/.gdrive.conf options:
#    curl_args="--limit-rate 500K --progress-bar"


browser="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"

destination_folder_id=${@: -1}
if expr "$destination_folder_id" : '^[A-Za-z0-9]\{28\}$' > /dev/null
then
    # all but last word
    set -- "${@:0:$#}"
else
    # upload to root
    unset destination_folder_id
fi

if [ -e $HOME/.gdrive.conf ]
then
    . $HOME/.gdrive.conf
fi

old_umask=`umask`
umask 0077

if [ -z "$username" ]
then
    read -p "username: " username
    unset token
    echo "username=$username" >> $HOME/.gdrive.conf
fi

if [ -z "$account_type" ]
then
    if expr "$username" : '^[^@]*$' > /dev/null || expr "$username" : '.*@gmail.com$' > /dev/null
    then
        account_type=GOOGLE
    else
        account_type=HOSTED
    fi
fi

if [ -z "$password$token" ]
then
    read -s -p "password: " password
    unset token
    echo
fi

if [ -z "$token" ]
then
    token=`curl --silent --data-urlencode Email=$username --data-urlencode Passwd="$password" --data accountType=$account_type --data service=writely --data source=cURL "https://www.google.com/accounts/ClientLogin" | sed -ne s/Auth=//p`
    sed -ie '/^token=/d' $HOME/.gdrive.conf
    echo "token=$token" >> $HOME/.gdrive.conf
fi
umask $old_umask

for file in "$@"
do
    slug=`basename "$file"`
    mime_type=`file --brief --mime-type "$file"`
    upload_link=`curl --silent --show-error --insecure --request POST --header "Content-Length: 0" --header "Authorization: GoogleLogin auth=${token}" --header "GData-Version: 3.0" --header "Content-Type: $mime_type" --header "Slug: $slug" "https://docs.google.com/feeds/upload/create-session/default/private/full${destination_folder_id+/folder:$destination_folder_id/contents}?convert=false" --dump-header - | sed -ne s/"Location: "//p`
    echo "$file:"
    curl --request POST --output /dev/null --data-binary "@$file" --header "Authorization: GoogleLogin auth=${token}" --header "GData-Version: 3.0" --header "Content-Type: $mime_type" --header "Slug: $slug" "$upload_link" $curl_args
done

Still working, great !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.