Javascript Python 3脚本无法使用OAuth API打开和关闭浏览器窗口进行登录 导言
正如您将在下面看到的,我已经尝试了3种方法,主要是从stackoverflow上找到的。但我已经走到了死胡同 我正在尝试构建一个Python 3脚本,该脚本将向Spotify API发出请求。但首先,我需要通过OAuth进行身份验证,尤其是使用“授权代码”流,以获得“无止境”访问。看见基本上,该过程包括以下主要步骤: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(可在我的
GET
request tohttps://accounts.spotify.com/authorize
endpoint具有多个参数,包括:
- 我注册的应用程序的
(可在我的Spotify Dev Dashbord上找到)客户端id
重定向\u uri
重定向\u uri
:https://example.com/callback?code=XYZ
XYZ
授权代码,并将其传递回主脚本以进行下一步POST
request tohttps://accounts.spotify.com/api/token
endpoint获取access\u令牌
]->我们在这篇文章中不会涉及这一点,也不会涉及以下步骤网络浏览器处理。打开新选项卡(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)