urequests 仅适用于特定网站
urequests only working on specific websites
我正在使用 nodemcu esp8266 并且计划发出一个 spotify api 请求来自动播放一些歌曲,我有一个功能齐全的 python 脚本可以做到这一点,但是当我试图将它转换为 upython 但失败了。我现在已经花了几个小时在这上面,并且发现问题是出于某种原因 urequest 只适用于特定的网站,例如,如果我尝试:
import urequests as requests
x = requests.get('https://www.spotify.com')
print(x.status_code)
我得到一个 302
但是当我尝试时:
import urequests as requests
x = requests.get('https://www.google.com')
print(x.status_code)
我得到了 200。这个问题在一些网站上仍然存在并且没有有效响应我的 urequests.put 命令没有 return 我需要的东西...有什么解决办法吗?
提前谢谢你。
这是我正在尝试的代码 运行:
import urequests as requests
import ujson as json
refresh_token = "xxxxx"
base_64 = "xxxxx"
class Refresh:
def __init__(self):
self.refresh_token = refresh_token
self.base_64 = base_64
def refresh(self):
query = "https://accounts.spotify.com/api/token"
payload={"grant_type": "refresh_token", "refresh_token": refresh_token}
headers={'Authorization': 'Basic %s' % base_64}
data = (json.dumps(payload)).encode()
response = requests.post(query,
data=data,
headers=headers)
print(response.status_code)
print(response.reason)
a = Refresh()
a.refresh()
这里发生的几件事会导致您的问题。
首先,您尝试将 JSON 数据发送到 /api/token
端点:
data = (json.dumps(payload)).encode()
response = requests.post(query,
data=data,
headers=headers)
...但是根据 the documentation,此端点不包括 application/x-www-form-urlencoded
数据。
其次,虽然文档建议您需要发送一个基本的Authorization
header,但在我今晚的实验中我无法让它工作...但是我是 如果我在请求中包含客户端 ID 和密码,则能够成功刷新令牌 body。
这个问题here.
你可以看看我的论坛post
考虑到这一点,以下代码似乎适用于我的 esp8266 运行 micropython 1.18:
import urequests as requests
refresh_token = "..."
client_id = "..."
client_secret = "..."
class Refresh:
def __init__(self, refresh_token, client_id, client_secret):
self.refresh_token = refresh_token
self.client_id = client_id
self.client_secret = client_secret
def refresh(self):
url = "https://accounts.spotify.com/api/token"
data = "&".join(
[
"grant_type=refresh_token",
f"refresh_token={self.refresh_token}",
f"client_id={self.client_id}",
f"client_secret={self.client_secret}",
]
)
headers = {
"content-type": "application/x-www-form-urlencoded",
}
response = requests.post(url, data=data, headers=headers)
print(data)
print(response.status_code)
print(response.reason)
print(response.text)
a = Refresh(refresh_token, client_id, client_secret)
a.refresh()
我正在使用 nodemcu esp8266 并且计划发出一个 spotify api 请求来自动播放一些歌曲,我有一个功能齐全的 python 脚本可以做到这一点,但是当我试图将它转换为 upython 但失败了。我现在已经花了几个小时在这上面,并且发现问题是出于某种原因 urequest 只适用于特定的网站,例如,如果我尝试:
import urequests as requests
x = requests.get('https://www.spotify.com')
print(x.status_code)
我得到一个 302
但是当我尝试时:
import urequests as requests
x = requests.get('https://www.google.com')
print(x.status_code)
我得到了 200。这个问题在一些网站上仍然存在并且没有有效响应我的 urequests.put 命令没有 return 我需要的东西...有什么解决办法吗? 提前谢谢你。
这是我正在尝试的代码 运行:
import urequests as requests
import ujson as json
refresh_token = "xxxxx"
base_64 = "xxxxx"
class Refresh:
def __init__(self):
self.refresh_token = refresh_token
self.base_64 = base_64
def refresh(self):
query = "https://accounts.spotify.com/api/token"
payload={"grant_type": "refresh_token", "refresh_token": refresh_token}
headers={'Authorization': 'Basic %s' % base_64}
data = (json.dumps(payload)).encode()
response = requests.post(query,
data=data,
headers=headers)
print(response.status_code)
print(response.reason)
a = Refresh()
a.refresh()
这里发生的几件事会导致您的问题。
首先,您尝试将 JSON 数据发送到 /api/token
端点:
data = (json.dumps(payload)).encode()
response = requests.post(query,
data=data,
headers=headers)
...但是根据 the documentation,此端点不包括 application/x-www-form-urlencoded
数据。
其次,虽然文档建议您需要发送一个基本的Authorization
header,但在我今晚的实验中我无法让它工作...但是我是 如果我在请求中包含客户端 ID 和密码,则能够成功刷新令牌 body。
这个问题here.
你可以看看我的论坛post考虑到这一点,以下代码似乎适用于我的 esp8266 运行 micropython 1.18:
import urequests as requests
refresh_token = "..."
client_id = "..."
client_secret = "..."
class Refresh:
def __init__(self, refresh_token, client_id, client_secret):
self.refresh_token = refresh_token
self.client_id = client_id
self.client_secret = client_secret
def refresh(self):
url = "https://accounts.spotify.com/api/token"
data = "&".join(
[
"grant_type=refresh_token",
f"refresh_token={self.refresh_token}",
f"client_id={self.client_id}",
f"client_secret={self.client_secret}",
]
)
headers = {
"content-type": "application/x-www-form-urlencoded",
}
response = requests.post(url, data=data, headers=headers)
print(data)
print(response.status_code)
print(response.reason)
print(response.text)
a = Refresh(refresh_token, client_id, client_secret)
a.refresh()