--- tags: html, shadow-dom, javascript, VirusTotal --- # 透過javascript來操作VirusTotal網站 2022/04/24 ## 前言 因為VirusTotal網站大量使用Shadow, 進行操作的時候需要一點技巧, 另外該網站有RWD 輸入框輸入完畢後Enter即可, 手機版則有按鈕可以點選 ## 進行輸入資料 進入網址 https://www.virustotal.com/gui/home/search 找出輸入框的結構 ![](https://i.imgur.com/Qrvxix7.png) 找出搜尋框並輸入資料 ```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'));` 模擬使用者點選並輸入資料 該輸入框超多事件... ![](https://i.imgur.com/CgLT92N.png) 經過多次嘗試發現主要是`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'}) ); ``` ## 取出結果 接著看看我們要的結果在哪 ![](https://i.imgur.com/uPyHuie.png) `#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'); ```