Authorization (Login)

Information

Clients are authorized using OpenID in Authorization Code Flow with PKCE. Once a client has successfully authorized to Amazon, they receive an authorization code for device registration to Audible/Amazon.

Authorization

For an example on authorization, please take a look at Hello Library.

CAPTCHA

Added in version v0.5.2: Init cookies added to login function to prevent CAPTCHAs in most cases.

Authorization requires answering a CAPTCHA in some cases. By default Pillow is used to show captcha and a user prompt will be provided to enter your answer, which looks like:

Answer for CAPTCHA:

A custom callback can be provided (for example submitting the CAPTCHA to an external service), like so:

def custom_captcha_callback(captcha_url):

    # Do some things with the captcha_url ...
    # maybe you can call webbrowser.open(captcha_url)
    # or simply print out the captcha_url

    return "My answer for CAPTCHA"

auth = audible.Authenticator.from_login(
    ...
    captcha_callback=custom_captcha_callback
)

2FA (OTP Code)

If two-factor authentication (2FA) is activated, a user prompt will be provided using input to enter your one time password (OTP), which looks like:

"OTP Code: "

A custom callback can be provided, like so:

def custom_otp_callback():

    # Do some things to insert otp code

    return "My answer for otp code"

auth = audible.Authenticator.from_login(
    ...
    otp_callback=custom_otp_callback
)

If you have to enter an OTP often and don’t care about security, you can use the pyotp package with a custom callback like so:

from pyotp.totp import TOTP

def otp_callback():
    secret = "YOUR-AMAZON-OTP-SECRET"
    secret = secret.replace(" ", "")
    otp = TOTP(secret)
    return str(otp.now())

Another approach is to append the current OTP to the password.

CVF Code

If 2FA is deactivated and Amazon detects some security risks (too many logins in short times, etc.) you will be asked for a verify code (CVF). In that case, amazon sends you an email or SMS with a code, which you enter here:

"CVF Code: "

A custom callback can be provided, like so:

def custom_cvf_callback():

    # Do some things to insert cvf code

    return "My answer for cvf code"

auth = audible.Authenticator.from_login(
    ...
    cvf_callback=custom_cvf_callback
)

Approval Alert

Some users report that trying to authorize with audible gives them an approval alert and an email from amazon. Since audible v0.5 you will get a user prompt which looks like:

"Approval alert detected! Amazon sends you a mail."
"Please press enter when you approve the notification."

Please approve the email/SMS, and press any key to continue.

Added in version 0.5.1: Provide a custom callback with approval_callback

A custom callback can be provided, like so:

def custom_approval_callback():

    # You can let python check for the received Amazon mail and
    # open the approval link. The login function waits until
    # the callback function is executed. The returned value will be
    # ignored by the login function.


auth = audible.Authenticator.from_login(
    ...
    approval_callback=custom_approval_callback
    )

Authorization with external browser or program logic

Added in version v0.5.1: Login with external browser or program logic

To handle the login with a external browser or program logic you can do the following:

import audible

auth = audible.Authenticator.from_login_external(locale=COUNTRY_CODE)

By default, this code prints out the login url for the selected country code. Paste this url into a web browser or use it programatically to authorize yourself. You have to enter your credentials two times (because of missing init cookies). First time, the password can be a random one. Second time, you have to solve a captcha before you can submit the login form and you must use your correct password. After loggin in, you will end in an error page (not found). This is correct. Copy the url from the address bar from your browser and paste the url into the input field of the python code. It will look something like “https://www.amazon.{domain}/ap/maplanding?…&openid.oa2.authorization_code=…”

Note

If you have playwright installed and use the default login_url_callback, a new browser is opened, where you can authorize to your account.

Note

If you are using MacOS and have trouble insert the login result url, simply import the readline module in your script. See #34.

Custom callback

A custom callback can be provided (for example open the url in a webbrowser directly), like so:

def custom_login_url_callback(login_url):

    # Do some things with the login_url ...
    # maybe you can call webbrowser.open(login_url)
    # or simply print out the login_url

    return "The postlogin url"

auth = audible.Authenticator.from_login_external(
    ...
    login_url_callback=custom_login_url_callback
    )