Python: How do I resolve oauth2client.client.ApplicationDefaultCredentialsError: The Application Default Credentials are not available?

Deborah Swanson python at deborahswanson.net
Sun Feb 5 19:08:45 EST 2017


Hi David,
 
Well, I really don't know the first thing about Macs, but it looks like
you got the download and environment variable right, at least it's not
complaining about that.
 
Looks like the current problem is with the parameters you're passing to
the build() function. I don't have the apiclient module installed, so I
can't look at it for myself, but here is the critical error:
 
build() takes at most 2 positional arguments (3 given)
 
This means that you've given too many parameters to build(). I'm a bit
confused because your youtube_search()code is calling build() with:
 
youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
developerKey=DEVELOPER_KEY), 
 
which is passing 3 arguments, and you're using 
 
youtube = build(YOUTUBE_API_SERVICE_NAME,
GOOGLE_APPLICATION_CREDENTIALS, YOUTUBE_API_VERSION,
developerKey=DEVELOPER_KEY), 
 
which is passing 4 arguments. In either case the error you're getting is
complaining that build() only takes 2 arguments, so it's not matching up
with either youtube_search's code or your call to build().
 
It looks like you don't need the GOOGLE_APPLICATION_CREDENTIALS
argument, but more serious than that is the build() that youtube_search
is calling only takes 2 arguments and the script is calling with 3
arguments. So the script is fundamentally flawed to begin with.
 
If you want to proceed with this script, you need to get a look at the
build() function to see what arguments it wants.  You can try altering
the script to call build with only the arguments it will use, and try
that. But I suspect there are deeper problems, most likely that
apiclient.discovery version yo have insalled is either newer or older
than this youtube_search is expecting, in which case all bets are off on
making this combination work.
 
So you have 2 choices that I see, either getting a look at what the
build() you have installed uses and try youtube_search with that, or
looking for other versions of apiclient and getting a look at their
.discovery submodule build() functions. If you find a build() taking 3
arguments, you could try importing that version of apiclient.discovery
with this youtube_search. 
 
But all in all, if I had this problem I'd back up to what I really want
to accomplish and try another approach to the problem. It may not be
worth all the futzing around to make this youtube_search work.
 
Deborah
 
David Amadi wrote, on February 05, 2017 2:45 PM:

If I understand your previous email well, I've created the bits I
highlighted below and I'm still getting error messages - see below.


I'm running the python script on a Macbook Pro.

DEVELOPER_KEY = "AIza*****"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
GOOGLE_APPLICATION_CREDENTIALS = "/Users/*path*/Downloads/Youtube
API-67ty5.json"


def youtube_search(options):
    youtube = build(YOUTUBE_API_SERVICE_NAME,
GOOGLE_APPLICATION_CREDENTIALS, YOUTUBE_API_VERSION,
developerKey=DEVELOPER_KEY)


And here's the error message that was printed on my console:


build() takes at most 2 positional arguments (3 given)

Traceback (most recent call last):

  File "/Users/*path*/ML with Python/youtube_search.py", line 71, in
<module>

    youtube_search(args)

  File "/Users/*path*/ML with Python/youtube_search.py", line 19, in
youtube_search

    youtube = build(YOUTUBE_API_SERVICE_NAME,
GOOGLE_APPLICATION_CREDENTIALS, YOUTUBE_API_VERSION,
developerKey=DEVELOPER_KEY)

  File
"/Users/*path*/anaconda/lib/python3.5/site-packages/oauth2client/_helper
s.py", line 133, in positional_wrapper

    return wrapped(*args, **kwargs)

  File
"/Users/*path*/anaconda/lib/python3.5/site-packages/googleapiclient/disc
overy.py", line 223, in build

    requested_url, discovery_http, cache_discovery, cache)

  File
"/Users/*path*/anaconda/lib/python3.5/site-packages/googleapiclient/disc
overy.py", line 270, in _retrieve_discovery_doc

    resp, content = http.request(actual_url)

AttributeError: 'str' object has no attribute 'request'










On 5 February 2017 at 19:58, Deborah Swanson <python at deborahswanson.net>
wrote:


OK David,

I'm also a Linux newbie and my Linux PC has a dead power supply that
I've been too sick to fix. Since it is a choice (given my limited energy
resources), I've spent my time learning python on a very old Windows PC
instead of reviving the Linux PC, and I've never used Google Apps.

However, looking at the links provided, this is how I'd proceed:

1) At
https://developers.google.com/
<https://developers.google.com/identity/protocols/application-default-cr
e> identity/protocols/application-default-cre
dentials (Google Application Default Credentials  |  Google Identity
Platform), are the insructions you need to follow.

Now, I think you make up your own path and filename for the environment
variable, the more iffy question is what file it shoud be.

And the answer appears to be that it's a file you download. It then
tells you to follow several instructions, using the
https://console.developers.
<https://console.developers.google.com/projectselector/apis/credentials>
google.com/projectselector/apis/credentials
page, to get a file that automatically downloads to your computer.

2) It then says you have to make the environment variable
GOOGLE_APPLICATION_CREDENTIALS, specifying that it points to the file
you just downloaded.

I don't have a working Linux machine to test this on, at least it sounds
like you're using Linux (let me know if you're using Windows and I can
test it there), but to permanently set an environment variable in Linux:

Edit ~/.bashrc and add the line:

export GOOGLE_APPLICATION_CREDENTIALS=<path/filename>

(instructions are different for Windows, or Linux using something other
than bash for shell scripts)

That's what you need to do, and then your youtube_search.py should work
(haha, well you can try it and see).

Deborah

David Amadi wrote, on February 05, 2017 9:38 AM

>
> Hi Deborah,
>
>
> Thank you for stepping in, I appreciate it.
>
>
> Here's the python code I'm working with -
> http://codegists.com/snippet/
<http://codegists.com/snippet/python/youtube_searchpy_valeraradu_python>
python/youtube_searchpy_valeraradu_python
>
>
> To be honest, I don't know how to define the environment
> variable GOOGLE_APPLICATION_CREDENTIALS to point to a file
> defining the credentials. In the python script (link in the
> above line), you could only add the API Key, which I obtained
> and provided - but the script won't run.
>
>
> I look forward to hearing back from you.
>
>
> Regards,
> David
>
>
> On 5 February 2017 at 03:16, Deborah Swanson
> <python at deborahswanson.net> wrote:
>
> david.amadi at digital.beis.gov. <mailto:david.amadi at digital.beis.gov.uk>
uk wrote, on
> Saturday, February 04, 2017 3:39 PM
> >
> > Hello All,
> >
> > I'm a newbie to python programming - got into it
>
> > predominately for the purposes of machine learning and data
> mining and
> > even though I've committed several weeks to learning the scripting
> > language, I have struggled to fully grasp how it works.
> >
> > I'm looking to scrape title, video Id, view Count, like
> Count, dislike
> > Count, comment Count, favourite Count etc off YouTube using
> a python
> > script I found via an online tutorial.
> >
> > I have installed 'unidecode' and 'google-api-python-client'
> packages
> > via my terminal. I have also enabled YouTube Data Api V3 and I'm
> > getting the error below each time I run the script.
> >
> > Could anyone please point me in the right direction?
> >
> > Thanks a lot in advance for your help
> >
> > ****
> > Traceback (most recent call last):
> >   File "/Users/*Path*/ML with Python/youtube_search.py",
> line 73, in
> > <module>
> >     youtube_search(args)
> >   File "/Users/*Path*/ML with Python/youtube_search.py",
> line 21, in
> > youtube_search
> >     youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
> > developerKey=DEVELOPER_KEY)
> >   File
> "/Users/*Path*/anaconda/lib/python3.5/site-packages/oauth2clie
> > nt/_helpers.py", line 133, in positional_wrapper
> >     return wrapped(*args, **kwargs)
> >   File
> > "/Users/*Path*/anaconda/lib/python3.5/site-packages/googleapic
> > lient/discovery.py", line 226, in build
> >     credentials=credentials)
> >   File
> > "/Users/*Path*/anaconda/lib/python3.5/site-packages/oauth2clie
> > nt/_helpers.py", line 133, in positional_wrapper
> >     return wrapped(*args, **kwargs)
> >   File
> > "/Users/*Path*/anaconda/lib/python3.5/site-packages/googleapic
>
> > lient/discovery.py", line 358, in build_from_document
> >     credentials = _auth.default_credentials()
> >   File
> "/Users/*Path*/anaconda/lib/python3.5/site-packages/googleapic
> > lient/_auth.py", line 41, in default_credentials
> >     return
> > oauth2client.client.GoogleCredentials.get_application_default()
> >   File
> > "/Users/*Path*/anaconda/lib/python3.5/site-packages/oauth2clie
> > nt/client.py", line 1264, in get_application_default
> >     return GoogleCredentials._get_implicit_credentials()
> >   File
> > "/Users/*Path*/anaconda/lib/python3.5/site-packages/oauth2clie
> > nt/client.py", line 1254, in _get_implicit_credentials
> >     raise ApplicationDefaultCredentialsError(ADC_HELP_MSG)
> > oauth2client.client.ApplicationDefaultCredentialsError: The
> > Application Default Credentials are not available. They are
> > available if running in Google Compute Engine. Otherwise, the
> > environment variable GOOGLE_APPLICATION_CREDENTIALS must be
> > defined pointing to a file defining the credentials. See
> > https://developers.google.com/
<https://developers.google.com/accounts/docs/application-defaul>
accounts/docs/application-defaul
> t-credentials for more information.
>
> --
> Communications with the Department for Business, Innovation
> and Skills may be automatically logged, monitored and/or
> recorded for legal purposes.
> --
>
> I'm also a relatively new python coder (little over a year),
> but it seems plain to me that "The Application Default
> Credentials ... are available if running in Google Compute
> Engine. Otherwise, the environment variable
> GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a
> file defining the credentials. See
> https://developers.google.com/
<https://developers.google.com/accounts/docs/application-defaul>
accounts/docs/application-defaul
t-credenti
als for more information."

If you're not running in Google Compute Engine, you need to make a file
defining the credentials, and supposedly there are instructions or
requirements in the link above.

Looks like Anaconda tried to get the credentials by calling its
_auth.default_credentials() function:

credentials = _auth.default_credentials()

from "python3.5/site-packages/googleapiclient/discovery.py", but it
failed. I think you need to read that link and make the file it wants to
find.

Deborah







--

David Amadi

Digital Performance Analyst | Apprenticeships Service Department for
Business, Energy and Industrial Strategy


david.amadi at digital.beis.gov. <mailto:david.amadi at digital.beis.gov.uk>
uk


M. 07904776300

Communications with the Department for Business, Innovation and Skills
may be automatically logged, monitored and/or recorded for legal
purposes.


Communications with the Department for Business, Innovation and Skills
may be automatically logged, monitored and/or recorded for legal
purposes.






-- 


David Amadi


Digital Performance Analyst | Apprenticeships Service

Department for Business, Energy and Industrial Strategy




david.amadi at digital.beis.gov.uk




M. 07904776300


Communications with the Department for Business, Innovation and Skills
may be automatically logged, monitored and/or recorded for legal
purposes.


Communications with the Department for Business, Innovation and Skills
may be automatically logged, monitored and/or recorded for legal
purposes.




More information about the Python-list mailing list