How do I get a file list for a Google Drive public hosted folder?
There's no way to do it unauthenticated. However, you can authenticate as ANY user and get the list with drive.children.list()
There is a simple way to list a public folder - just use YQL to get XML or JSON results.
One alternative solution --without using any API keys-- is to use google app-script to generate a text file for the directory, and put that script on a trigger every day or so to refresh it if the directory changes, then simply make that google doc file, that is modified by the google apps script, with the public URL plus /export?format=txt
at the end, or for a regular file, something like https://drive.google.com/uc?export=download&id=INSERT_ID_HERE
, and that is then publicly accessible on the web with no authorization
OK there is a way and it's pretty simple, it just needs a bit of setup. We need to get a Google Drive URL that can return JSONP, then run the request against it.
The setup
Generate the public URL. Go to: https://developers.google.com/apis-explorer/?hl=en_GB#p/drive/v3/drive.files.list
In the 'q' field enter the following:
'{your_public_folder_id}' in parents
Click the "Execute without OAuth" link underneath the button.
You should now see all your files listed underneath. It also show you the GET request. That is the URL you will need.
Copy the Request URL. Something like: https://www.googleapis.com/drive/v3/files?q='{your_public_folder_id}'+in+parents&key={YOUR_API_KEY}
Now, you will need to generate the API key. Go to Google Console: https://console.developers.google.com/ In left menu select 'Credentials'. Click 'Create credentials' and select API key. Click 'Browser key' Copy the generate key.
The execution
You can now do something like this:
var api_key = '{YOUR_API_KEY}';
var folderId = '{your_public_folder_id}';
var url = "https://www.googleapis.com/drive/v3/files?q='" + folderId + "'+in+parents&key=" + api_key;
var promise = $.getJSON( url, function( data, status){
// on success
});
promise.done(function( data ){
// do something with the data
}).fail(function(){
});