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