запит python з аутентифікацією (access_token)


84

Я намагаюся отримати запит API у python. Командний рядок

curl --header "Authorization:access_token myToken" https://website.com/id

дає деякий вивід json. myToken - це шістнадцяткова змінна, яка залишається незмінною протягом усього часу. Я хотів би зробити цей виклик з python, щоб я міг перебирати різні ідентифікатори та аналізувати результати. Будь-які ідеї? До того, як була потрібна автентифікація, я зробив це за допомогою urllib2. Я також подивився модуль запитів, але не міг зрозуміти, як це зробити.

Дуже дякую.


Встановлення маркера авторизації для всієї сесії: stackoverflow.com/a/47043335/911945
Антон Тарасенко

Відповіді:


128

Пакет запитів має дуже приємний API для HTTP-запитів, додавання власного заголовка працює так ( джерело: офіційні документи ):

>>> import requests
>>> response = requests.get(
... 'https://website.com/id', headers={'Authorization': 'access_token myToken'})

Якщо ви не хочете використовувати зовнішню залежність, те саме, що використовує urllib2 стандартної бібліотеки, виглядає так ( джерело: відсутні інструкції ):

>>> import urllib2
>>> response = urllib2.urlopen(
... urllib2.Request('https://website.com/id', headers={'Authorization': 'access_token myToken'})

Дякую за Вашу відповідь. Я спробував обидві реалізації, і я отримую помилку HTTP 401: Несанкціоноване. Однак командний рядок працює чудово. Я ніколи не працював з маркерами доступу, тому, щоб було зрозуміло: токен, який я маю, - це 40 цифр форми 3f4264ff тощо
user1895406

1
Дивно. Що мене трохи чує, це двокрапка в заголовку ... ах! Можливо, я (або ми обоє;) просто прочитав це неправильно. Заголовок може мати назву "Авторизація", а його значенням буде "access_token long_hexadecimal_string". Хочете розкрутити?
wosc

це спрацювало! Дуже дякую. те, що я закінчив вводити, це url = ' website.com/id ' head = {'Авторизація': 'access_token hex_string'} res = request.get (url, headers = head)
user1895406

1
Це рішення застаріле або іншим чином не працює при встановленні Anaconda за замовчуванням.
bloodrootfc

1
Це маркер автентифікації, який сервер використовує, щоб підтвердити, що ви маєте доступ до API. Вам потрібно отримати облікові дані клієнта (ім’я користувача, пароль, ключ API) для API, до якого ви хочете отримати доступ, а потім надіслати їх (наприклад, через запит отримання) на сервер автентифікації. Сервер повертає вашому клієнту рядок, який може бути закодований у форматі JSON, а потім ви використовуєте його як маркер у своїх викликах API. Шукайте JWT або OAuth, щоб ще трохи прочитати та переглянути деякі приклади.
Філіп

28

У мене була та ж проблема при спробі використовувати маркер з Github.

Єдиний синтаксис, який працював у мене з Python 3:

import requests

myToken = '<token>'
myUrl = '<website>'
head = {'Authorization': 'token {}'.format(myToken)}
response = requests.get(myUrl, headers=head)

Яким би тут був знак? Або як отримати маркер автентифікації?
Deep Jadia

8
>>> import requests
>>> response = requests.get('https://website.com/id', headers={'Authorization': 'access_token myToken'})

Якщо вищезазначене не працює, спробуйте наступне:

>>> import requests
>>> response = requests.get('https://api.buildkite.com/v2/organizations/orgName/pipelines/pipelineName/builds/1230', headers={ 'Authorization': 'Bearer <your_token>' })
>>> print response.json()

1
Цього тижня у мене була та сама проблема, і що в підсумку працювало для мене, це опція «Носій авторизації». Не знаю, чому є різниця, але дякую, що надали мені цю можливість, щоб я спробував і успішно почав працювати!
Райан Гарріс

@SowmiyaRagu друга частина працює для мене, Bearer <my_token>а перша - ні, оскільки відповідь така, ніби запит не автентифікований.
гідрадон

2

Ви пробували uncurlпакет ( https://github.com/spulec/uncurl )? Ви можете встановити його через pip install uncurl. Ваш запит на завивання повертає:

>>> uncurl "curl --header \"Authorization:access_token myToken\" https://website.com/id"

requests.get("https://website.com/id",
    headers={
        "Authorization": "access_token myToken"
    },
    cookies={},
)

1

Додам трохи підказки: здається, що ви передаєте як ключове значення заголовка, залежить від вашого типу авторизації, в моєму випадку це було PRIVATE-TOKEN

header = {'PRIVATE-TOKEN': 'my_token'}
response = requests.get(myUrl, headers=header)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.