前往
大廳
主題

繞了一點路但是還是完成的自動上傳聲音檔

奇幻 | 2021-05-25 15:46:38 | 巴幣 2 | 人氣 313

在今年年初,有隻圖奇下水道的嘎抓想做已仙界大濕為主角的RPG遊戲,在製作過程中需要大濕的語音讓遊戲更好玩,作為觀眾的我就去幫忙從大濕的實況中把大濕的聲音截下來上傳到myinstants.com上給嘎抓。

後來,嘎抓把遊戲做完後,因為每次大濕有開實況的時候,我會把大濕講的一些垃圾話或一些惡臭的叫聲截下來,所以我收集了一堆大濕的語音,而這些語音多到可以組成一句完整的話,因此我寫了大濕之音網站,讓大家可以隨意組合這些大濕語音。

然而,原本想說嘎抓把遊戲做完後,我就不要再截大濕的語音了,但是每次大濕開台時我還是會想去截,所以大濕關台後我都會截出一堆大溼的語音,接者麻煩的事就來了,要把大量的語音上傳到myinstants是件很麻煩的事,你必須將聲音一個一個的上傳,當上傳完一個聲音後,你還要等網站跳轉到你的個人頁面並載入完成後,你才能點擊連結回到上傳頁面,若你的個人頁面有大量的聲音按鈕的話,你的個人頁面載入時間就會比較久。

可能有人會說『那你就不要把聲音放在myinstants,把聲音跟你的網站放在一起,這樣不就沒有還要一個一個上傳的問題了不是嗎?』,是這樣子沒錯,但是我懶得管理伺服器,所以我是把大濕之音放在github page,而一個github page只有500MB的大小,所以我才不想把聲音更網頁放在一起。

因為上傳大量語音到myinstants實在太耗時間了,所以我就決定把上傳聲音的動作來給他自動化

一開始,我是以網頁爬蟲的方式去寫,說道網頁爬蟲就會令人想到Python,所以我就嘗試用Python來寫了,遇到這種需要登入使用者帳號的網頁,最先要解決的問題就是登入,不過對於myinstants這個網站解決的方法很簡單,因為他的使用者資訊是放在伺服器的Session,而伺服器要辨認使用者是用哪一個Session是靠瀏覽器Cookie中的sessionid,因此只要用隨便一個瀏覽器登入myinstants然後取得sessionid,接者在讓爬蟲帶上就完成登入了。

接者,完成登入後,就要來嘗試上傳聲音了,但是,這部分我失敗了...,因為myinstants有用Cloudflare來阻擋爬蟲以防止DDOS,所以只要你用POST去請求上傳並帶上檔案就會遇到Cloudflare version 2 Captcha challenge,雖然如果遇到Cloudflare Captcha challenge的話,是有人用Python寫了個套件cloudscraper來解決,但是遇到version 2 Captcha challenge就沒解了,到這裡用Python寫爬蟲的方法宣告失敗。

睡了一個覺後,我就想不然來用WebView把,之前寫Android的浮動視窗時有用過Android的WebView,所以我知道如果用戶點擊網頁上的<input type="file"/>觸發檔案選擇器,WebView就會去調用WebChromeClient.onShowFileChooser()來讓開發者自己決定要用什麼方法給用戶選擇檔案,而且微軟不久前才推出了新的基於edge chromium的WebView2,我就想WebView2因該也有類似的方法,所以我就嘗試用C#來寫個WPF應用程式,不過還是失敗了...。

首先WebView2幾乎已經把所有瀏覽器的基本功能都實現好了,在Android的WebView中是連最基本的Alert視窗都要自己實現,但是WebView2已經幫你做好了,所以也沒有類似WebChromeClient.onShowFileChooser()的方法,不過在用Google找方法的過程中發現了WebView2有個CallDevToolsProtocolMethodAsync方法,進而知道有Chrome DevTools Protocol這東西,我可以用Chrome DevTools Protocol的DOM.setFileInputFiles方法模擬使用者做檔案選擇,但是WebView2不知道是BUG還是怎樣,不管怎樣調用DOM.setFileInputFiles就只會扔出錯誤Value does not fall within the expected rang,就算照著Chrome DevTools Protocol的流程去調用DOM.setFileInputFiles也是一樣,我檢查了好幾遍,我參數也沒有給錯,但還是扔出錯誤,後來受不了我就去找看看有沒有可以已Ccommand line的方式手動操作Chrome DevTools Protocol,然後就找到Node.js的套件chrome-remote-interface,試了之後確定我的流程沒有問題,所以也就宣告了寫WPF應用程式的方法失敗了。

既然確定Node.js可以用,那就用Node.js來寫啦,不過全部都直接操作Chrome DevTools Protocol還真是有點硬,不過很快的我就找到了一個很好用的套件puppeteer,跟chromium是同一個團隊做的,puppeteer是用來寫網頁測試的,他可以模擬一系列使用者的操作,所以我最後是以寫測試的方式完成自動上傳大量語音的。

創作回應

是無語啊
https://media.tenor.com/images/236fd97aa26b093cb1dcb5ed35879ce5/tenor.gif
2021-05-25 16:20:02
奇幻
[e12]
2021-05-25 16:34:33

更多創作