我正在玩,尝试编写一些代码来使用tr.im API来缩短URL.
在阅读http://docs.python.org/library/urllib2.html后,我尝试了:
TRIM_API_URL = 'http://api.tr.im/api'
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(realm='tr.im',
uri=TRIM_API_URL,
user=USERNAME,
passwd=PASSWORD)
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
response = urllib2.urlopen('%s/trim_simple?url=%s'
% (TRIM_API_URL, url_to_trim))
url = response.read().strip()
Run Code Online (Sandbox Code Playgroud)
response.code是200(我认为它应该是202).url有效,但基本的HTTP身份验证似乎没有用,因为缩短的URL不在我的URL列表中(在http://tr.im/?page=1).
在阅读http://www.voidspace.org.uk/python/articles/authentication.shtml#doing-it-properly后, 我也尝试过:
TRIM_API_URL = 'api.tr.im/api'
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_mgr.add_password(None, TRIM_API_URL, USERNAME, PASSWORD)
auth_handler = urllib2.HTTPBasicAuthHandler(password_mgr)
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
response = urllib2.urlopen('http://%s/trim_simple?url=%s'
% (TRIM_API_URL, url_to_trim))
url = response.read().strip()
Run Code Online (Sandbox Code Playgroud)
但我得到了相同的结果.(response.code为200且url有效,但未在我的帐户http://tr.im/中记录.)
如果我使用查询字符串参数而不是基本HTTP身份验证,如下所示:
TRIM_API_URL = 'http://api.tr.im/api'
response = urllib2.urlopen('%s/trim_simple?url=%s&username=%s&password=%s'
% (TRIM_API_URL,
url_to_trim,
USERNAME,
PASSWORD))
url = response.read().strip()
Run Code Online (Sandbox Code Playgroud)
...然后不仅url有效,而且它记录在我的tr.im帐户中.(虽然response.code仍然是200.) …
这是我在Flask-RESTful中进行单元测试的一部分.
self.app = application.app.test_client()
rv = self.app.get('api/v1.0/{0}'.format(ios_sync_timestamp))
eq_(rv.status_code,200)
Run Code Online (Sandbox Code Playgroud)
在命令行中,我可以使用curl将用户名:密码发送到服务:
curl -d username:password http://localhost:5000/api/v1.0/1234567
Run Code Online (Sandbox Code Playgroud)
如何在单元测试的get()中实现相同的功能?
由于我的get/put/post需要身份验证,否则测试将失败.
python unit-testing basic-authentication flask flask-restful
我已经浏览了许多与使用基本身份验证触发 GET 请求相关的类似帖子(例如:Python、带有基本身份验证的 HTTPS GET),但仍然无法找出问题。我不断收到错误requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url
使用相同的凭据,标头在邮递员中尝试了相同的操作,它按预期工作。已验证 api_key、password 的 base64encoded 值与 postman 中使用的值完全相同,因此我不认为其编码或资源访问权限问题。
python -V
Python 3.6.4 :: Anaconda, Inc.
Run Code Online (Sandbox Code Playgroud)
方法一
api_key = 'some_api_key'
password = 'some_password'
headers = {'accept': 'application/json'}
url = 'https://test.access.com/this/url'
api_key_password = "%s:%s" % (api_key, password)
b64_encoded = b64encode(bytes(api_key_password, 'utf-8')).decode("ascii")
headers['authorization'] = 'Basic %s' % b64_encoded
response = requests.get(url,
headers=headers)
if (response.ok):
json_data = json.loads(response.content)
print (json_data)
else:
print (response)
response.raise_for_status()
Run Code Online (Sandbox Code Playgroud)
方法2
api_key = 'some_api_key'
password = 'some_password' …Run Code Online (Sandbox Code Playgroud) 基本上我需要一个给出URL的程序,它会下载一个文件并保存它.我知道这应该很简单,但这里有一些缺点......
首先,它是我在工作中构建的工具的一部分,除此之外我还有其他所有内容,URL是HTTPS,URL是您要在浏览器中粘贴的URL,如果您需要,您会弹出一个提示打开或保存文件(.txt).
其次,我是初学者,所以如果有我不提供的信息,请问我.:)
我顺便使用Python 3.3.
我试过这个:
import urllib.request
response = urllib.request.urlopen('https://websitewithfile.com')
txt = response.read()
print(txt)
Run Code Online (Sandbox Code Playgroud)
我得到:
urllib.error.HTTPError: HTTP Error 401: Authorization Required
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?谢谢!!
这是我的 MSAL 身份验证:
@app.route('/get-microsoft-data', methods=('GET', 'POST'))
def get_microsoft_token():
public_app = ConfidentialClientApplication(
client_id="<client_id>", authority="https://login.microsoftonline.com/<tenant_id>",
client_credential="<client_secret>"
)
result = None
result = public_app.acquire_token_silent(["https://api.businesscentral.dynamics.com/.default"], account=None)
if not result:
print("No suitable token exists in cache. Let's get a new one from AAD.")
result = public_app.acquire_token_for_client(scopes=["https://api.businesscentral.dynamics.com/.default"])
if "access_token" in result:
global microsoft_token
microsoft_token = result["access_token"]
return redirect('/')
Run Code Online (Sandbox Code Playgroud)
这是我对业务中心 api 的调用:
@app.route('/send-data-to-microsoft', methods=('GET', 'POST'))
def send_data_to_microsoft():
print(microsoft_token)
headers = {
"Authorization": "Bearer " + microsoft_token
}
r = requests.get("https://api.businesscentral.dynamics.com/v1.0/<tenant_domain>/sandbox/api/v1.0/companies", headers=headers)
print(r.json())
return redirect('/')
Run Code Online (Sandbox Code Playgroud)
这是我调用 /send-data-to-microsoft 时遇到的错误: …