I現在、SpotifyはウェブAPI設定のimg srcがGETリクエストを生成しない
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内のハッシュフラグメントユーザーがアクセスを許可した後にサーバー(このスクリプト)に送信されない場合、アカウントサービスがユーザーをlocalhost:8888にリダイレクトするときにHTML/JSペイロードを送信して、トラッキングピクセルスタイルの画像要素のソースURL内のクエリ文字列を介して。これが起こると、do_GET関数のelseブランチが実行されます。しかし、イメージ要素のsrcを設定することは決して私のスクリプトが第2のGET要求を報告することはないので、他のものの中でアクセストークンを含むべきauthQuery辞書は空のままです。奇妙なことは、ブラウザを開くコード(デフォルトのアプリケーションでURLまたはファイルを開くOS Xのオープンコマンドを使用するコールライン)をまだ追加していないときに、手動で「トラッキングピクセル」をhttp://localhost:8888/?aParameter=someValueHereにブラウズすると、 '仕事をした!
画像のsrcを設定するブラウザのキャッシュ動作がGET要求を生成しない可能性があるため、キャッシュされないようにsrc URLに一意のパラメータを追加することをお勧めします。私の場合は、src URLのSpotify Web APIアクセストークンがすでにユニークなので、必要です。 // localhostを:?8888/aParameter = someValueHere "
EDIT:
彼らは何を意味する – Yerken
reauest GET強制するために、私は何を言っていることはどう違うのかわからないんだけど、その一意のIDを変更しておくことです:ので、各呼び出しの間のような新しいSRC でそれを追加します私が言ったことから:/アクセストークンはscrip毎に異なっているtが実行されます。 – Superpelican