2016-05-25 8 views
0

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は、サービスのリダイレクトを占めるU​​RL内のハッシュフラグメントユーザーがアクセスを許可した後にサーバー(このスクリプト)に送信されない場合、アカウントサービスがユーザーを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:

+0

彼らは何を意味する – Yerken

+0

reauest GET強制するために、私は何を言っていることはどう違うのかわからないんだけど、その一意のIDを変更しておくことです:ので、各呼び出しの間のような新しいSRC でそれを追加します私が言ったことから:/アクセストークンはscrip毎に異なっているtが実行されます。 – Superpelican

答えて

0

はSRC = ""、その後、SRC =" HTTP設定してみてください

はDOMからIMG要素を削除してください、その後を再

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); 
+0

ちょうど試してみましたが、うまくいきませんでした:( – Superpelican

+0

@Superpelican IMG要素を完全に削除して新しいsrcを追加して回答を編集しました – user3163495

+0

答えを改善する時間をとってくれてありがとうございます。 img srcはスクリプトが実行されるたびに一度だけ設定されるので、私はあなたの提案は必要ではないと考えています。さらに、トラッキングピクセル技術をXMLHttpRequestに置き換えました。 URL内のアクセストークンでGETリクエストが送信され、スクリプトはまだ2番目のGETリクエストを報告しません。これは、JSコードではなくサーバーコードに何か問題があることを示しています! – Superpelican

関連する問題