Javascript python如何从URL提取哈希片段?

Javascript python如何从URL提取哈希片段?,javascript,python,api,flask,spotify,Javascript,Python,Api,Flask,Spotify,我正在使用Spotify的API构建一个python flask应用程序。Spotify API的用户身份验证部分将应用程序id(客户端id)、作用域等连接到Spotify的最终基本url:?(下面是client_id=94857&scope=read)。该URL将用户重定向到身份验证页面,用户可以在该页面上批准我的应用程序以访问他们的Spotify数据(这意味着现在API应该能够发送请求)。在他们批准后,他们被带到重定向URL(Spotify API用户(me)的所有者将其输入到应用程序的设置

我正在使用Spotify的API构建一个python flask应用程序。Spotify API的用户身份验证部分将应用程序id(客户端id)、作用域等连接到Spotify的最终基本url:?(下面是client_id=94857&scope=read)。该URL将用户重定向到身份验证页面,用户可以在该页面上批准我的应用程序以访问他们的Spotify数据(这意味着现在API应该能够发送请求)。在他们批准后,他们被带到重定向URL(Spotify API用户(me)的所有者将其输入到应用程序的设置中),重定向URL后面是一个名为“access_token”的变量,它是一个“散列片段”。我需要这个访问令牌才能调用API,因为它是用户自定义的必需参数,但我无法访问它,因为它前面有一个“#”。url看起来像这样:

我可以从python函数中访问此url的所有部分,但不包括“#”字符后面的信息,这是我需要的信息,因为它没有访问权限。我在另一篇Stackoverflow文章中读到后端无法访问散列片段

我可以让用户手动复制整个URL,或者只复制访问令牌,然后将其输入到我的应用程序中,这样它就有了数据,但我想避免这种情况,让应用程序提取它,而不是让它成为一个两步输入过程,从而为用户自动化该过程

我获取这些信息的想法是在用户访问URL时从python运行javascript函数,因为javascript可能能够访问完整的URL。我不知道如何做到这一点,还想知道是否有其他的想法来获取URL的访问令牌部分?请让我知道是否有任何其他信息可以帮助

以下是Spotify API验证文档:

编辑: 感谢您提出使用“授权代码流”而不是“隐式授权”流的想法!这似乎是应该走的路。在我看来,不同之处在于使用了请求方法,并将响应类型指定为“code”,这样它就不会作为散列返回。但是,它仍然不起作用(我得到“无法解析”,因为URL中仍然有一个“#”)。我怀疑我确实按照它想要的方式指定了参数,但我已经仔细检查了一遍,没有看到任何东西。有什么突出的吗

from flask import Flask, request, jsonify, render_template, redirect, url_for
import requests
import json
app = Flask(__name__)

CLIENT_ID = "myclientid"
REDIRECR_URI="http://127.0.0.1:5000/callback" #this is the uri specified in my Spotify app

SCOPE='user-read-private%20user-read-playback-state%20user-top-read'
API_ENDPOINT = "https://accounts.spotify.com/authorize"

PARAMS = {  "client_id": CLIENT_ID, 
            "response_type": 'code', 
            "redirect_uri": REDIRECR_URI,
            "state": '123',
            "scope": SCOPE,
            "show_dialog": False
}
def userAuthURLBuilder(client_id, redirect_uri, scope):
    return "https://accounts.spotify.com/authorize?client_id={}&redirect_uri={}&scope={}&response_type=token&state=123".format(client_id, redirect_uri, scope)

builtUrl = userAuthURLBuilder(CLIENT_ID, REDIRECR_URI, SCOPE)

@app.route('/', methods=["GET"])
def getTester():
    r = requests.get(url = API_ENDPOINT, params=PARAMS)
    data = r.json()
    return data

@app.route('/<path:text>', methods=['GET', 'POST'])
def all_routes(text):
    if text.startswith('callback'):
        try:
            params = text.split('&code=')[1]
            return params
        except:
            return "couldn't parse" #this is what I'm currently getting 
    else:
        return "it errored"
从flask导入flask、请求、jsonify、呈现模板、重定向、url
导入请求
导入json
app=烧瓶(名称)
客户\u ID=“myclientid”
REDIRECR_URI=”http://127.0.0.1:5000/callback“#这是我的Spotify应用程序中指定的uri
SCOPE='user-read-private%20用户读取播放状态%20用户顶部读取'
API_端点=”https://accounts.spotify.com/authorize"
PARAMS={“client_id”:client_id,
“响应类型”:“代码”,
“重定向uri”:重定向uri,
“州”:“123”,
“范围”:范围,
“显示对话”:False
}
def userAuthURLBuilder(客户端id、重定向uri、作用域):
返回“https://accounts.spotify.com/authorize?client_id={}&redirect\u uri={}&scope={}&response\u type=token&state=123“。格式(客户端id,重定向\u uri,作用域)
builtUrl=userAuthURLBuilder(客户端ID、Redirer\u URI、作用域)
@app.route('/',methods=[“GET”])
def getter():
r=requests.get(url=API_端点,params=params)
data=r.json()
返回数据
@app.route('/',方法=['GET','POST'])
定义所有_路线(文本):
如果text.startswith('callback'):
尝试:
params=text.split('&code=')[1]
返回参数
除:
return“无法解析”#这是我目前得到的结果
其他:
返回“它出错了”

您正在尝试使用Spotify,但这可能不是您想要的。正如文件中所说:

隐式授权流适用于完全使用JavaScript实现并在资源所有者的浏览器中运行的客户端

URL哈希值在服务器端不可访问-它们不包含在标题中。获取URL哈希值的唯一方法是从客户机获取—使用现代JavaScript可以获得此值

然而,您真正应该做的是使用Spotify的。这将把代码作为查询参数发送,而不是在散列之后,您可以使用

更新

为了回答更新后的问题,您应该使用
request.args
获取URL查询args,而不是试图解析出实际的字符串。像这样的方法应该会奏效:

@app.route('/callback',methods=['GET',POST'])
定义所有_路线(文本):
如果request.method==“GET”:
尝试:
params=request.args
如果参数和参数['code']:
返回参数['code']
其他:
返回参数['error']
除:
return“无法解析”
其他:
#不知道你为什么会在这里使用POST
返回

欢迎光临。您可以应用一些吗?您似乎启动了错误的OAuth流类型。向我们展示生成URL的代码,该URL引导用户使用Spotify。@非常感谢您指出这一点。我现在使用“授权代码流”,我发布了我正在使用的代码。您是否有一些可能导致错误的想法?非常感谢Hugh!我尝试了您的建议,并用代码编辑了我的问题,但仍然不足以让我尝试尝试请求。args['Code']方法,因为URL/作为get响应返回的内容无法对其进行解析。我可能做得不正确?我更新了答案,因为无法在注释中有效显示代码示例。