import mechanize import os import glob verbose = True def usage(): print ''' Upload file(s) to dropbox. dropbox.py file1.txt # upload to root folder dropbox.py dir:/Backups/2012 file1.txt # upload to custom folder dropbox.py dir:/Backups/2012 *.txt # upload by file mask dropbox.py dir:/Backups/2020 * # upload all files in current dir ''' def upload_files(local_files, remote_dir, email, password): """ Upload a local file to Dropbox """ # Fire up a browser using mechanize br = mechanize.Browser() br.set_handle_equiv(True) # br.set_handle_gzip(True) br.set_handle_redirect(True) br.set_handle_referer(True) br.set_handle_robots(False) # br.set_debug_http(True) # br.set_debug_responses(True) # br.set_debug_redirects(True) br.addheaders = [('User-agent', ' Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1018.0 Safari/535.19')] if verbose: print 'Opening login page...' # Browse to the login page r = br.open('https://www.dropbox.com/login') # just in case you need the html # html = r.read() # this shows a lot of info print r.info() if verbose: print br.title(), br.geturl() # Enter the username and password into the login form isLoginForm = lambda l: l.action == "https://www.dropbox.com/login" and l.method == "POST" try: if verbose: print 'selecting form...' br.select_form(predicate=isLoginForm) except: print("Unable to find login form."); exit(1); br['login_email'] = email br['login_password'] = password # Send the form if verbose: print 'submitting login form...' response = br.submit() # Add our file upload to the upload form once logged in isUploadForm = lambda u: u.action == "https://dl-web.dropbox.com/upload" and u.method == "POST" for local_file in local_files: try: br.select_form(predicate=isUploadForm) except: print("Unable to find upload form."); print("Make sure that your login information is correct."); exit(1); br.form.find_control("dest").readonly = False br.form.set_value(remote_dir, "dest") remote_file = os.path.basename(local_file) if (os.path.isfile(local_file)): br.form.add_file(open(local_file, "rb"), "", remote_file) # Submit the form with the file if verbose: print 'Uploading %s... to <>:/%s/%s' % (local_file, remote_dir, remote_file), br.submit() if verbose: print 'Ok' print 'All completed Ok!' if __name__ == "__main__": import sys from getpass import getpass email = raw_input("Enter Dropbox email address:") password = getpass("Enter Dropbox password:") # email = '' # password = '' # allow multiple local file names as input args # first arg with 'dir:' prefix is parsed as remote path if len(sys.argv) > 1: if sys.argv[1].lower().startswith('dir:'): remote_dir = sys.argv[1][4:] if not remote_dir.startswith('/'): remote_dir = '/' + remote_dir if verbose: print 'Using remote_dir=', remote_dir del sys.argv[1] local_files = sys.argv[1:] prepared_local_files = [] for local_file in local_files: # explode globs if '*' in local_file: prepared_local_files += glob.glob(local_file) else: prepared_local_files.append(local_file) if not len(prepared_local_files): usage() sys.exit(2) upload_files(prepared_local_files, remote_dir, email, password)