2016-05-25 3 views
0

настоящее время у меня следующий код (для личного пользования) для авторизации с Spotify Web 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) 

Поскольку фрагмент хэш в URL, что Spotify счета услуг переадресовывает пользователь после того, как пользователь разрешил доступ, не отправляется на сервер (этот скрипт), я отправляю полезную нагрузку HTML/JS, когда служба Accounts перенаправляет пользователя на localhost: 8888, который поддерживает домашний хэш-фрагмент, содержащий токен доступа через строку запроса в исходном URL-адресе элемента изображения стиля пикселя отслеживания. Когда это происходит, должна выполняться ветка else в функции do_GET. Однако установка src элемента изображения никогда не генерирует запрос GET, так как мой сценарий никогда не сообщает второй запрос GET, в результате этого словарь authQuery, который должен содержать токен доступа среди других вещей, остается пустым. Странная вещь, когда я не добавил код, который открывает браузер (линия вызова, которая использует команду открытия OS X, которая открывает URL-адрес или файл в приложении по умолчанию), но вручную просмотрела до http://localhost:8888/?aParameter=someValueHere «пиксель отслеживания» «Сделал работу!

Я прочитал, что из-за поведения кеширования браузеров, когда настройка src изображения может не сгенерировать запрос GET, предлагаемое решение добавляло уникальный URL-адрес URL-адреса src, чтобы избежать кеширования, однако это не должно быть необходимо в моем случае, поскольку токен доступа Spotify Web API в URL-адресе src уже уникален!

+0

Что они имели в виду, чтобы сохранить изменения, что уникальный идентификатор для того, чтобы заставить GET reauest – Yerken

+0

Я не знаю, как то, что вы говорите, отличается от того, что я сказал:/Маркер доступа отличается каждый раз, когда скрипт t запускается. – Superpelican

ответ

0

Попробуйте установить SRC = "", а затем SRC = "HTTP: // локальный: 8888/aParameter = someValueHere"

EDIT:

Попробуйте удалить элемент IMG из DOM, а затем повторно добавив его с новым СРК как и между каждыми вызовов:

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, и хотя вкладка «Сеть» в Firefox Debugging Console четко показывает GET-запрос с токеном доступа в URL-адресе отправлен, мой сценарий по-прежнему не сообщает второй запрос GET, это говорит о том, что что-то не так с кодом сервера, а не с кодом JS! – Superpelican

Смежные вопросы