有没有一种方法可以解析python-flask oauth2



我有如下代码-

app = Flask(__name__)

# access token
access_token = None

@app.route('/getcode')
def get_authorization_url():
oauth = OAuth2Session(client_id, redirect_uri=redirect_uri, scope=scope)
authorization_url, _state = oauth.authorization_url(authorization_base_url, access_type="authorization_code")
print('authorization_url')
print(authorization_url)
return redirect(authorization_url)

@app.route('/')
def callback():
global access_token
oauth = OAuth2Session(client_id, redirect_uri=redirect_uri, scope=scope)
token = oauth.fetch_token(token_url, authorization_response=request.url, client_secret=client_secret)
access_token = token['access_token']
print('access token is:', access_token)
## we will be shutting down the server after getting access_token
## the thread created here is copied in if __name__ == '__main__' block
## and will run after closing the server
# th = threading.Thread(target=data_from_resource_server, args=(access_token,))
# th.start()
func = request.environ.get('werkzeug.server.shutdown')
if func:
print('stoping server')
func()

return 'see terminal for logs'

if __name__ == '__main__':
app.secret_key = 'example'
app.env = 'development'
print()
print('Open this url in browser:', 'http://127.0.0.1/getcode', end='nn')
app.run(host='127.0.0.1', port='80')
print('server stopped')
## got access_token, closed the server, now running ray integration code
if access_token:
th = threading.Thread(target=data_from_resource_server, args=(access_token,))
th.start()

当app.run(host='27.0.0.1',port='80'(运行时,这里会给我URL-http://127.0.0.1/getcode.我需要手动打开输入用户名和密码,然后再打开一个窗口输入YOB,然后它会给我一些类似的东西

127.0.0.1 - - [04/May/2021 21:20:23] "GET /**getcode?code=G7h_QL0Cpo3kEqyyNBZ68DTX3JhQ_6E6sl_Sk1x5iBc.oG4JFQiKyZGupTuJ-bV6qE9lA**&scope=orders&state=M6hdb7EJxgNKkuBqbihg1SKaUGAJ7W HTTP/1.1" 302  

我的问题是,有一种方法可以避免手动打开浏览器并输入凭据和获取代码。我们能用python解析整个东西吗

听起来像是硒的工作!它可以打开web浏览器并为您解析所需的详细信息。

启动服务器后运行以下代码

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
url = 'http://127.0.0.1/getcode'
driver = webdriver.Firefox()  # (Or Chrome())
driver.get(url)
username = driver.find_element_by_id("username")
password = driver.find_element_by_id("password")
# uncomment this code if your text boxes have pre-populated text
#username.clear()
#password.clear()
username.send_keys("YourUsername") # change this to your username
password.send_keys("PassworD")     # change this to your password
driver.find_element_by_name("submit").click()
# we can implicitly wait before the page loads
driver.implicitly_wait(2)

现在,这将处理您问题的第一部分,即自动化登录过程。现在我不确定你的下一个目标是什么,但我认为你想要URL中的代码变量,我认为它是由OAuth2函数返回的。

我们可以通过简单地获取URL并解析代码变量来实现这一点

获取URL

current_url = driver.current_url;

现在,您可以简单地使用urlparse解析URL。

import urllib.parse as urlparse
from urllib.parse import parse_qs
parsed = urlparse.urlparse(current_url)
OAuth_code = parse_qs(parsed.query)['code']

您可以参考的一些来源:

  1. https://medium.com/swlh/automate-data-collection-with-selenium-in-python-246a051206e2
  2. 在python中使用selenium填充用户名和密码
  3. 单击链接后查找URL
  4. https://stackoverflow.com/a/5075477/11029298
  5. https://selenium-python.readthedocs.io/getting-started.html

最新更新