こんにちは。
初歩的な質問になりすいません。
以下の投稿を参照して、PI Web APIを用いてデータを収集するプログラムを作成しようとしております。
PI Web APIの使い方(基礎)
PI Web APIのクエリ作成の演習
PythonにてPI Web APIからデータを収集の例 - GET
Postmanであれば、以下のURLを設定してJSON形式のデータが取得できているのですが、
上記のpythonのサンプルコードを用いると"Message": "Authorization has been denied for this request."が表示されデータが取得できません。
https://localhost/piwebapi/assetservers/
Postmanでは、Authorizationを「No Auth」でGETを実行すればデータを取得できますが、
「Basic Auth」でユーザー/パスワードを入力すると、"Message": "Authorization has been denied for this request."が表示されます。
恐らく、ユーザー認証がうまくいっていないためだと思うのですが、
どのユーザーIDとパスワードを設定すれば、認証がうまくいくのでしょうか?
また、PI SystemからユーザーIDとパスワードを確認するにはどのように確認すれば良いでしょうか?
piadminでも接続がうまくいくならいいのですが、パスワードが間違っているのかうまくいかず・・・。
ご回答よろしくお願い致します。
サンプルプログラムを下記に記載しました。
# Python Web API GET sample
import json
import getpass
import requests
# sys.path.append('C:\Python37-32\Lib\site-packages')
# PI Web APIのリクエストはHTTPSが必要ですが、
# テストの環境では、PI Web APIのサーバーに自己署名証明書しかないことが多いです。
# この場合、HTTPSのリクエストをするとrequestsのパッケージか警告またはエラーが発生します。
# 下記の行は警告を無視するためです。
requests.packages.urllib3.disable_warnings()
base_url = 'https://localhost/piwebapi/'
url = base_url
# PI Web APIにて認証は三種類ありますが、このポストではKerberosについては言及しません。
# Basic認識を使う場合はユーザー名とパスワードを送る必要があります。
# Anonymousを使う場合は下記のように空白でよいです。
user = 'piadmin'
_password = ''
def password():
global _password
if _password == '':
_password = getpass.getpass('please type in your password: ')
return _password
def pi_get_requests(action, parameters={}, debug=True):
# pi_get_requestsの関数は変数として:
# actionにelement、assetdatabasessetなどのController(Method)名か
# controler名/webidのリソース名
# parametersに"Url Parameters"を設定する
# verify=Falseのパラメーターは自己署名証明書しかない環境では
# エラーを発生させないためのパラメーターです。
response = requests.get(url=base_url + action,
params=parameters,
verify=False,
auth=(user, password()))
# エラーが発生すると、レスポンスのヘッダーなどを見て何かあったと分かるケースが多いので、
# pi_get_requests(action, parameters={}, debug=True)と実行するとレスポンスの情報を出力します。
if debug:
# レスポンスなどを出力する
print('デバッグのための情報です')
print('{0: <10} {1}'.format('url:', response.url))
print('{0: <10} {1}'.format('status:', response.status_code))
print('{0: <10} {1}'.format('reason: ', response.reason))
print('{0: <10} '.format('headers:'))
for key in response.headers:
print(' {0: <17} {1}'.format(key + ':', response.headers[key]))
#
# print('{0: <10} {1}'.format('text:'), response.text)
return json.loads(response.text)
def pprint(response):
# pi_get_requestsを綺麗に出力するため
print(json.dumps(response, indent=4, sort_keys=True))
allServers = pi_get_requests('assetservers/')
pprint(allServers)