Javascript Python 3脚本无法使用OAuth API打开和关闭浏览器窗口进行登录 导言

Javascript Python 3脚本无法使用OAuth API打开和关闭浏览器窗口进行登录 导言,javascript,python,python-3.x,google-chrome,selenium-webdriver,Javascript,Python,Python 3.x,Google Chrome,Selenium Webdriver,正如您将在下面看到的,我已经尝试了3种方法,主要是从stackoverflow上找到的。但我已经走到了死胡同 我正在尝试构建一个Python 3脚本,该脚本将向Spotify API发出请求。但首先,我需要通过OAuth进行身份验证,尤其是使用“授权代码”流,以获得“无止境”访问。看见基本上,该过程包括以下主要步骤: GETrequest tohttps://accounts.spotify.com/authorizeendpoint具有多个参数,包括: 我注册的应用程序的客户端id(可在我的

正如您将在下面看到的,我已经尝试了3种方法,主要是从stackoverflow上找到的。但我已经走到了死胡同

我正在尝试构建一个Python 3脚本,该脚本将向Spotify API发出请求。但首先,我需要通过OAuth进行身份验证,尤其是使用“授权代码”流,以获得“无止境”访问。看见基本上,该过程包括以下主要步骤:

  • GET
    request to
    https://accounts.spotify.com/authorize
    endpoint具有多个参数,包括:
    • 我注册的应用程序的
      客户端id
      (可在我的Spotify Dev Dashbord上找到)
    • 重定向\u uri
  • (如果尚未登录,则为用户登录)
  • (用户对我的应用程序的授权(如果尚未授权)
  • 重定向到
    重定向\u uri
    https://example.com/callback?code=XYZ
  • 获取
    XYZ
    授权代码,并将其传递回主脚本以进行下一步
  • [
    POST
    request to
    https://accounts.spotify.com/api/token
    endpoint获取
    access\u令牌
    ]->我们在这篇文章中不会涉及这一点,也不会涉及以下步骤
  • 由于需要用户的凭据,最重要的是需要用户的授权,我必须打开一个浏览器窗口。问题是,我无法从我的Python3脚本中以我希望的方式管理该窗口

    尝试#1 首先,我从给出的示例中得到了很大的启发,尤其是JavaScript中的示例

    介绍步骤1。由
    网络浏览器处理。打开新选项卡(url)
    。一旦我的应用程序获得授权,Chrome(我的默认浏览器)将重定向到
    localhost
    。实际上,我的Python3脚本运行一个“一次性”服务器,它等待请求。收到后,它从窗口.path获取授权代码,然后通过窗口.close()将一些HTML代码发送回浏览器。这最后一段代码在应用程序已经授权时有效,但在Spotify登录页面或授权页面之间出现时无效。这种情况下窗户关不上。我开始明白,只有通过
    window.open()
    打开的窗口才能通过
    window.close()
    以编程方式关闭。在这一点上,我尝试了许多其他的变体,比如
    window.open('''u self').close()。如果应用尚未授权且用户尚未登录,则All无法关闭窗口

    问题1:为什么不起作用?为什么它在已经登录+授权的情况下还能工作

    问题2:我认为登录窗口会以某种方式改变窗口。。。但我怎样才能证实这一点呢?Chrome控制台不会有帮助,我甚至没有收到
    窗口的错误。关闭

    问题3:是否有办法保留打开窗口的句柄并将其传递回回调javascript

    尝试#2 结合
    selenium
    chromedriver
    I可以成功打开和关闭该窗口:

  • browserdriver.execute_脚本(“window.open('%s','self');%url)
  • window.close()
  • 但问题是,selenium似乎更适合用于单元测试。因此,我无法让它在另一个打开的Chrome会话/实例中使用Chrome默认配置文件打开Chrome窗口。只有在创建临时用户数据文件夹时,它才能正常工作,但这样做时,登录凭据无法从默认配置文件中检索(或保存),这对我不合适

    问题4:我看到了一种解决方法,将整个用户数据文件夹复制到某个位置,并使用它打开Chrome,这样它就可以对默认配置文件进行写访问。这不适合我。。。你看到另一个解决方案了吗

    尝试#3 回到使用
    webbrowser
    。主脚本现在打开一个浏览器,该浏览器不会直接发出
    GET
    引入步骤1的请求。(前面提到的
    url
    在第2步第1步中)。它向
    localhost
    发出请求,该请求通过
    窗口向浏览器发送一些HTML代码。打开(url,'.'u self')
    。但是稍后,在回调javascript中,“window.close()”将不再工作。即使用户已登录且应用已授权!(在这个特殊案例中,它在尝试1中起了作用)

    问题5:为什么?在本例中,
    window.open()
    甚至是显式的,但它没有尝试1,因为它隐藏在
    webbrowser
    类中

    如果我使用
    window.open(url)
    ,我可以稍后使用
    window.close()
    关闭新窗口。但是第一个窗口仍然打开,这里又出现了一个新问题:新窗口是一个被阻止的弹出窗口,因为它是通过脚本打开的,因此无法跟踪到用户操作(与引言中使用“登录”按钮的示例不同)

    问题6:如何打开单个浏览器窗口,而不是阻止的弹出窗口,并在检索授权代码时将其关闭

    还有什么想法吗?

    注意:我对浏览器重定向到的URI的简单副本不感兴趣,然后粘贴到Python解释器中以检索Spotify帐户服务提供的授权代码(例如Spotipy)