我目前使用以下代码(供个人使用)使用Spotify Web API进行授权
import http.server
import urllib.parse
from subprocess import call
authQuery = {}
class queryStrHandler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
print("received a get request")
urlComponents = urllib.parse.urlparse(self.path)
if urlComponents[4] == "":
print("sending payload")
self.send_response(200)
self.send_header("Content-type", "text/html")
self.end_headers()
html = """<html><head><script type="text/javascript">
alert("payload has been activated");
var tokenSupplier = document.createElement("img");
if(window.location.hash){
var fragment = window.location.hash.substring(1);
alert(fragment);
tokenSupplier.src = "http://localhost:8888/?" + fragment;
alert(tokenSupplier.src);
}
else {
var queryStr = window.location.href.split('?')[1];
tokenSupplier.src = "http://localhost:8888/?" + queryStr;
}
</script></head><body></body></html>"""
self.wfile.write(bytes(html, "utf-8"))
else:
print("receiving token or error")
global authQuery
authQuery = urllib.parse.parse_qs(urlComponents[4])
tokenFetcher = http.server.HTTPServer(('127.0.0.1', 8888), queryStrHandler)
authUrl = "https://accounts.spotify.com/authorize?" + urllib.parse.urlencode(
{
"client_id": "<ID here>",
"redirect_uri": "http://localhost:8888/",
"scope": "playlist-read-private user-library-read",
"response_type": "token"
}
)
call(["open", authUrl])
tokenFetcher.handle_request()
print(authQuery)
因为Spotify帐户服务的URL中的哈希片段在用户允许访问后将用户重定向到服务器(此脚本),所以当Accounts服务重定向时,我发送HTML / JS有效负载用户到localhost:8888,通过跟踪像素样式图像元素的源URL中的查询字符串,将包含访问令牌的哈希片段置于家中。发生这种情况时,应执行do_GET函数中的else分支。但是,设置图像元素的src似乎永远不会生成GET请求,因为我的脚本从不报告第二个GET请求,因此应该包含访问令牌的authQuery字典保持为空。奇怪的是,当我没有添加打开浏览器的代码(利用OS X'打开命令,在默认应用程序中打开URL或文件)的调用行时,但是手动浏览到http://localhost:8888/?aParameter=someValueHere “跟踪像素”确实有效!
我已经读过,由于浏览器的缓存行为设置图像的src可能不会生成GET请求,建议的解决方案是在src URL中添加一个唯一的参数以避免缓存,但这不是必需的就我而言,因为src URL中的Spotify Web API访问令牌已经是唯一的!
答案 0 :(得分:0)
尝试设置src =“”,然后src =“http:// localhost:8888 /?aParameter = someValueHere”
编辑:
尝试从DOM中删除IMG元素,然后使用新的src重新添加它 在每次通话之间如此:
var img = document.createElement("img");
img.src = "http://localhost:8888/?aParameter=someValue_1";
ContainerElement.appendChild(img);
ContainerElement.removeChild(img);
img = null;
img = document.createElement("img");
img.src = "http://localhost:8888/?aParameter=someValue_2";
ContainerElement.appendChild(img);