---
tags: html, shadow-dom, javascript, VirusTotal
---
# 透過javascript來操作VirusTotal網站
2022/04/24
## 前言
因為VirusTotal網站大量使用Shadow,
進行操作的時候需要一點技巧,
另外該網站有RWD
輸入框輸入完畢後Enter即可,
手機版則有按鈕可以點選
## 進行輸入資料
進入網址
https://www.virustotal.com/gui/home/search
找出輸入框的結構

找出搜尋框並輸入資料
```javascript
// 取得輸入框
let searchTxt = document
.querySelector("#view-container home-view")
.shadowRoot.querySelector("#searchbar")
.shadowRoot.querySelector("#searchInput");
// 輸入資料
searchTxt.value='1.1.1.1';
```
當按下按鈕後發現沒動作@@
看來有什麼事件沒觸發導致
這裡就要複習如何觸發元件身上的事件
`searchTxt.dispatchEvent(new Event('XXX'));`
模擬使用者點選並輸入資料
該輸入框超多事件...

經過多次嘗試發現主要是`input`這個事件,觸發後按鈕就可以點選了
```javascript=
searchTxt.dispatchEvent(new Event('input'));
```
## 進行搜尋
### 方法一: 按下搜尋按鈕
手機版有搜尋按鈕,
可透過按下手機版的按鈕來進行查詢
```javscript
// 找出按鈕
let btn = document
.querySelector("#view-container home-view")
.shadowRoot
.querySelector("#section div[data-route=search] .search-button vt-ui-button");
// 進行點選
btn.click();
```
### 方法二: 模擬鍵盤Enter(比較快)
後來發現輸入框有鍵盤事件,
當偵測到示Enter的時候就會進行查詢
```javascript
searchTxt.dispatchEvent(
new KeyboardEvent('keydown', {'key': 'Enter'})
);
```
## 取出結果
接著看看我們要的結果在哪

`#view-container`下的第一個元素
依照不同資料類型會有不同的View
IP => ip-address-view
FILE => file-view
DN => domain-view
沒找到 => search-view
管他是什麼,
反正都是`#view-container`下的第一個元素
取第一個元素可以這麼做`*:first-child`,
結合起來就是
`querySelector("#view-container > *:first-child")`
正常有找到的話程式如下:
```javascript=
let detections = document
.querySelector("#view-container > *:first-child")
.shadowRoot.querySelector('#report')
.shadowRoot
.querySelector('.wrapper>header>div.veredict-widget>vt-ui-detections-widget')
.shadowRoot.querySelector('div.circle');
// 在黑名單中的數量
let positives = detections
.querySelector('div.positives')
.innerText.trim();
// 黑名單總數
let total = detections
.querySelector('div.total')
.innerText.split(' ')[1].trim();
```
如果沒找到的話,
以下這個就會找不到了
```javascript
// 如果沒找到資料report就會找不到
let detections = document
.querySelector("#view-container > *:first-child")
.shadowRoot.querySelector('#report')
```
所以程式進行調整
```javascript=
let positives = 0; // 在黑名單中的數量
let total = 0; // 黑名單總數量
// 嘗試取得report
let detections = document
.querySelector("#view-container > *:first-child")
.shadowRoot.querySelector('#report');
if (detections) {
detections = detections.shadowRoot
.querySelector('.wrapper>header>div.veredict-widget>vt-ui-detections-widget')
.shadowRoot.querySelector('div.circle');
// 在黑名單中的數量
positives = detections
.querySelector('div.positives')
.innerText.trim();
// 黑名單總數
total = detections
.querySelector('div.total')
.innerText.split(' ')[1].trim();
}
// 輸出結果
console.log(total != 0 ? positives + '/' + total : 'N/A');
```