2016-12-28 3 views
1

Я пытаюсь получить доступ к API v2 с сайта thetvdb.com (https://api.thetvdb.com). К сожалению, я всегда получаю ошибку 403.Запросы Python. Ошибка 403

Вот что у меня есть:

#!/usr/bin/python3 
import requests 

url = "https://api.thetvdb.com/login" 
headers = {'content-type': 'application/json'} 
payload = {"apikey":"123","username":"secretusername","userkey":"123"} 
post = requests.post(url, data = payload, headers = headers) 
print(post.status_code, post.reason) 

Согласно документации API я должен проверить подлинность того, чтобы получить маркер. Но я просто получаю 403 Forbidden.

Теперь я попытался его с помощью завитка:

curl -X POST --header 'Content-Type: application/json' --header 'Accept: 
application/json' -d 
{"apikey":"123","username":"secretusername","userkey":"123"}' 
'https://api.thetvdb.com/login' 

И это работало отлично. Может ли кто-нибудь объяснить мне, что мне не хватает? Это сводит меня с ума.

Я также пробовал с

post = requests.post(url, data = json.dumps(payload), headers = headers) 

ту же ошибку.

+0

попробуйте заменить URL-адрес 'http: // requestb.in' и выполнить как запрос python, так и curl. Затем в браузере вы можете увидеть, что было другим в моих запросах, вот как вы можете использовать этот 'https: // exotel.in/blog/engineering/debugging-your-exotel-webhooks-more-efficiently-using-requestbin /' –

ответ

0

Вы должны explicitly преобразовать payload в строку json и пройти как data. Похоже, что вы сделали, что также вы можете попробовать установить агент пользователя, как curl/7.47.1

headers = {'content-type': 'application/json', 'User-Agent': 'curl/7.47.1'} 
post = requests.post(url, data = json.dumps(payload), headers = headers) 

Программа будет выглядеть

#!/usr/bin/python3 
import requests 
import json  

url = "https://api.thetvdb.com/login" 
headers = {'content-type': 'application/json', 'User-Agent': 'curl/7.47.1'} 
payload = {"apikey":"123","username":"secretusername","userkey":"123"} 
post = requests.post(url, data = json.dumps(payload), headers = headers) 
print(post.status_code, post.reason) 
+0

OP упомянул, что он уже пробовал это – Andersson

+0

@ Andersson, если завиток работает, это должно работать. Только возможно проверить, что сервер может делать это, он может проверить «UserAgent» –

+1

Работал. Благодаря @Sarathsp и requestb.in я узнал, что единственной разницей между Python и Curl был User-Agent. Я сменил его на завиток, и это сработало. – zappendappen

0

Я думаю, что вам нужно передать Accept заголовки в запросах питона. Что-то вроде этого header = { 'Accept' : 'application/json', 'Content-Type' : 'application/json' "Accept-Encoding": "gzip, deflate, sdch, br", "Accept-Language": "en-US,en;q=0.8", "User-Agent": "some user-agent", }