- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试在 current_track() 函数中检查无 200 响应。可能是什么问题?它抛出 JSONDecodeError 错误。但是,如果我正确理解 raise_for_ status 它应该阻止该函数尝试从错误的网页加载 JSON?如果我在没有此检查的情况下运行脚本并使用取消注释行 check_playback() 它成功捕获 JSONDecodeError。
脚本正在从 Spotify 获取数据并将其置于 vk.com 上的状态。
import config
import webbrowser
import requests
import furl
import secrets
import string
import time
import os
import simplejson as json
URL_CODE_BASE_VK = 'https://oauth.vk.com/authorize'
URL_CODE_BASE_SP = 'https://accounts.spotify.com/authorize'
URL_TOKEN_VK = 'https://oauth.vk.com/access_token'
URL_TOKEN_SP = 'https://accounts.spotify.com/api/token'
URL_TRACK = 'https://api.spotify.com/v1/me/player/currently-playing'
URL_STATUS = 'https://api.vk.com/method/status.set'
EXP_IN_TOKEN_SP = 3400
EXP_IN_TOKEN_VK = 86400
FILE_TOKEN_VK = 'vk_token.json'
FILE_TOKEN_SP = 'sp_token.json'
def get_auth_code_vk():
url_code_params = {
'client_id': config.CLIENT_ID_VK,
'response_type': 'code',
'redirect_uri': 'https://oauth.vk.com/blank.html',
'v': 5.92,
'scope': 'status',
'state': gen_state(),
'display': 'page'
}
code = url_open(URL_CODE_BASE_VK, url_code_params)
return parse_code(code)
def get_auth_code_sp():
url_code_params = {
'client_id': config.CLIENT_ID_SP,
'response_type': 'code',
'redirect_uri': 'https://www.spotify.com/',
'scope': 'user-read-currently-playing',
'state': gen_state()
}
code = url_open(URL_CODE_BASE_SP, url_code_params)
return parse_code(code)
def gen_state():
symbols = string.ascii_lowercase + string.digits
return ''.join(secrets.choice(symbols) for _ in range(12))
def url_open(url_base, url_params):
url_code_full = furl.furl(url_base).add(url_params).url
webbrowser.open_new_tab(url_code_full)
input_url = input('Enter the whole URL, that you have been redirected on: ')
return input_url
def parse_code(url):
return (url.split("code=")[1]).split("&state=")[0]
def get_token_vk():
data = {
'grant_type': 'authorization_code',
'code': get_auth_code_vk(),
'redirect_uri': 'https://oauth.vk.com/blank.html',
'client_id': 6782333,
'client_secret': config.CLIENT_SECRET_VK
}
response = requests.post(url=URL_TOKEN_VK, data=data).json()
write_file(FILE_TOKEN_VK, response)
def get_token_sp():
data = {
'grant_type': 'authorization_code',
'code': get_auth_code_sp(),
'redirect_uri': 'https://www.spotify.com/',
'client_id': config.CLIENT_ID_SP,
'client_secret': config.CLIENT_SECRET_SP
}
response = requests.post(url=URL_TOKEN_SP, data=data).json()
write_file(FILE_TOKEN_SP, response)
def write_file(tkn_file, response):
dict = {}
dict['token'] = response["access_token"]
dict['time'] = time.time()
with open(tkn_file, 'w') as file:
file.write(json.dumps(dict))
def load_file(tkn_file):
with open(tkn_file) as file:
data = json.load(file)
return data
def set_status():
params = {
'v': 5.92,
'access_token': load_file(FILE_TOKEN_VK)['token'],
'text': current_track()
}
set_status = requests.get(url=URL_STATUS, params=params)
def track_data():
tkn_file = load_file(FILE_TOKEN_SP)['token']
headers = {
'Accept': 'application/json',
'Authorization': f'Bearer {tkn_file}'
}
return requests.get(url=URL_TRACK, headers=headers)
def current_track():
response = track_data()
print(response)
try:
response.raise_for_status()
except requests.exceptions.HTTPError as e:
return "Error: " + str(e)
# data = track_data().json()
data = response.json()
artist = data['item']['artists'][0]['name']
track = data['item']['name']
return(f'{artist} - {track}')
def check_playback():
set_status()
print(current_track())
# try:
# set_status()
# print(current_track())
# except json.decoder.JSONDecodeError:
# print('Not playing')
def token_missing(file):
return not os.path.isfile(file)
def token_expired(file, exp_in):
return time.time() - load_file(file)['time'] > exp_in
def token_not_valid(file, exp_in):
return token_missing(file) or token_expired(file, exp_in)
def run_script():
if token_not_valid(FILE_TOKEN_VK, EXP_IN_TOKEN_VK):
get_token_vk()
if token_not_valid(FILE_TOKEN_SP, EXP_IN_TOKEN_SP):
get_token_sp()
check_playback()
if __name__ == "__main__":
run_script()
最佳答案
raise_for_status()
仅当 服务器 向您报告错误时才会引发异常(即便如此,只有当它实际上遵循 HTTP 规范并返回 HTTP 错误代码时)。
库无法知道响应不正确。即使它是正确格式的 JSON,它也不知道您希望它遵循什么模式(应该存在哪些字段,以及这些字段应该具有什么类型)。即使它知道架构并对其进行了验证,它也无法知道数据实际上是正确的并且不是当场编造的。
关于python - 为什么 raise_for_status() 没有发现错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53784877/
尝试在 current_track() 函数中检查无 200 响应。可能是什么问题?它抛出 JSONDecodeError 错误。但是,如果我正确理解 raise_for_ status 它应该阻止该
我想删除重复的 x.raise_for_status() 行: x = requests.get(url1) x.raise_for_status() y = requests.delete(url2
我最近开始使用 pytest,甚至最近开始使用 mock 来模拟 requests图书馆。我已经创建了一个 requests.Response 对象,对于 200 状态代码它工作正常。我在这里尝试做的
我一直使用: r = requests.get(url) if r.status_code == 200: # my passing code else: # anything els
我将 FastAPI 与 aiohttp 一起使用,我为持久 session 构建了一个单例,我用它在启动时打开 session 并在关闭时关闭它. 需求:response 正文在失败的情况下很重要,
我有一个 API,可以在发生 4xx 错误时返回 json 消息。一个例子是 {'message': 'Could not decode JWT token'} .当我处理异常时,该消息丢失了。 cl
我是一名优秀的程序员,十分优秀!