urequests 仅适用于特定网站

强尼摩根

我正在使用 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 命令没有返回我需要的东西......有什么想法可以解决它吗?先感谢您。

这是我要运行的代码:

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)

...但根据文档,此端点不包括application/x-www-form-urlencoded数据。

其次,虽然文档建议您需要发送一个基本Authorization标头,但在我今晚的实验中,我无法让它工作......但如果我在其中包含客户端 ID 和密码,我能够成功刷新令牌请求正文。

你可以在这里看到我的论坛帖子,里面有这个问题

考虑到这一点,以下代码似乎适用于我运行 micropython 1.18 的 esp8266:

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()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章