経緯
底辺SEである私がZabbix6.0のAPIを利用してグラフ画像を取得しようとした際に、
google検索等で見つかるコードだけでは取得できなかった。
私の探し方が悪かった可能性も大きく、もっと簡単な方法もあるかもしれません・・・
また、WEBページの仕組みに疎いため、識者が見れば当たり前の情報の可能性もありますが誰かの助けになればと思い情報共有します。
経緯
巷で見つかるコードですが、おおむね下記の手順でグラフ画像をローカルに保存していると思います。
① APIログインしてトークン取得。
② graph.getメソッドを使いgraphidを特定。
③ graphidを利用してrequests.get用のクエリを作成。
④ request.get実行した結果を変数に格納。
⑤ open関数を使ってローカルにPNG出力。
私の場合は、④ request.getで躓いてました。
保存されたのは画像として開けない謎ファイルでした。
変数に格納されたデータをprint(変数名.text)で確認した結果、中身はログイン画面のhtmlファイルであることが判明。
結論
API側へのログインの他にWEB側(index.php)へのログイン処理が必要でした。
解決法
通常のAPI側の処理にWEB側へのログイン処理を加えて下さい。
以下に、WEB側(index.php)へのログイン処理を記載します。
# Zabbix WEBへのログイン
url = 'http://exzample.co.jp/zabbix/index.php' #末尾に「/index.php」を忘れないよう注意して下さい。
payload = {
'name': 'Admin_ID',
'password': 'Admin_PASS',
'autologin': '1',
'enter': 'Sign in'
}
session = requests.Session()
response = session.post(url, data=payload)
これでWEB側(index.php)へのログイン処理が完了しました。
後は、request.getで画像を取得するだけですが、ログインしたセッション情報をreqeustsに渡す必要があります。
具体的には、request.getではなくrequests.Session().getを使います。
以下に、request部分を含めた全体のコードを記載します。
# Zabbix WEBへのログイン
url = 'http://hostname/zabbix/index.php' #末尾に「/index.php」を忘れないよう注意して下さい。
payload = {
'name': 'ID',
'password': 'PASS',
'autologin': '1',
'enter': 'Sign in'
}
session = requests.Session()
response = session.post(url, data=payload)
# グラフ取得用クエリ #取得内容によってパラメータは変更して下さい。
payload2 = {
'graphid': '2231',
'from': 'now-7d',
'to': 'now',
'profileIdx': 'web.graphs.filter'
}
chart_url = 'http://hostname/zabbix/chart2.php' #今度はchart2.phpを使用します。
cookie = dict(zbx_session=session.cookies.get_dict().get('zbx_session'))
# cookieを渡してグラフ画像を取得
response2 = session.get(chart_url, params=payload2, cookies=cookie)
# 画像を保存
with open('graph.png', 'wb') as f:
f.write(response2.content)
おわりに
以上が、私が躓いた問題と解決方法になります。
参考になれば幸いです。