Power AutomateからVirus Total にアクセスするPythonを呼び出して入力したサイトの安全性を確認してみた

Pocket

最近、Power Automateをいろいろといじり始めていますが、今回は、Power Automateから Virus TotalにアクセスするPythonプログラムを呼び出してみましたので、そのときの設定を記録しておきます。

なお、処理の流れは以下の通りです。

1.入出力変数(NewInput)にVirus Totalで評価するURLを設定
2.NewInputの内容をinput.txtに書き込み
3.Virus TotalにアクセスするPythonプログラムを呼び出し
  (input: input.txt, output:output.txt, scan_result.json)
4.Virus Totalでの評価結果をoutput.txtファイル等から読み込み
5.Gmailをつかって評価結果をメール送信

Power Automate全体フロー

以下、フローを作成していて苦労した点を少し説明していきます。

2.NewInputの内容をinput.txtに書き込み

Power Automateの機能メニューから「テキストをファイルに書き込む」を選択した際に、エンコードがデフォルトでUTF-8になっていましたが、それだとなぜが Pythonで読み込んだときに半角が全角になってしましいました。

そこでエンコードの設定を「UTF-8」から「システムの規定値」に変えたところ、半角のままpythonで処理することができました。

Power automate – テキストをファイルに書き込む

3.Virus TotalにアクセスするPythonプログラムを呼び出し

正直このPythonプログラムは ChatGPTにお願いして大部分を作成してもらいました。

手直ししたのは、「json_response[‘positives’]」を「json_response[“positives”]」を書き換えたくらいです。

あとはそのまま動いてくれました。

import requests
import json

# VirusTotalのAPIキーを設定します。
api_key = 'virus totalのapiキーをここに設定'

# VirusTotalのURLスキャンAPIエンドポイントを設定します。
url_scan_endpoint = 'https://www.virustotal.com/vtapi/v2/url/scan'

# ファイルを読み込みモードで開きます。
with open('c:\\tmp\\input.txt', 'r') as file:

# ファイルから文字列を読み込み、調査したいURLを設定します。
url_to_check = file.read()
print(url_to_check)

# APIリクエストのパラメータを設定します。
params = {'apikey': api_key, 'url': url_to_check}

# URLスキャンAPIにリクエストを送信します。
response = requests.post(url_scan_endpoint, data=params)

# レスポンスをJSON形式で取得します。
json_response = response.json()

# スキャンIDを取得します。
scan_id = json_response["scan_id"]

# VirusTotalのURLレポートAPIエンドポイントを設定します。
url_report_endpoint = 'https://www.virustotal.com/vtapi/v2/url/report'

# APIリクエストのパラメータを設定します。
params = {'apikey': api_key, 'resource': scan_id}

# URLレポートAPIにリクエストを送信します。
response = requests.get(url_report_endpoint, params=params)

# レスポンスをJSON形式で取得します。
json_response = response.json()

# URLが安全かどうかを判断します。
if json_response["positives"] > 0:
    text_to_write = 'The URL is not safe.'
else:
    text_to_write = 'The URL is safe.'

# ファイルを書き込みモードで開きます。
with open('output.txt', 'w') as file:
    # 文字列をファイルに書き出します。
    file.write(text_to_write)

# レスポンスをファイルに保存します。
with open('scan_result.json', 'w') as outfile:
    json.dump(json_response, outfile)

5.Gmailをつかって評価結果をメール送信

ここでは、Gmailサーバにアクセスする為のポート番号の設定や、2段階認証していたのでアプリパスワードの設定に少してこずりました。


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA