今天事情比較多,沒啥進度,就先對先前的內容補點漏洞。
進站畫面除了Day07的幾個Pattern以外還有其他的可能,詳細設定可以到Ptt的個人設定區>選擇進站畫面內查看,可以勾選的內容有以下這些:
頁面很多,可是後來發現好像根本沒必要考慮那麼多的Pattern,只要送出足夠多的q就能確保正確回到主功能表了。
private val loginResultPattern = arrayOf(
"按任意鍵繼續",
"您想刪除其他重複登入的連線嗎?",
"密碼不對或無此帳號。請檢查大小寫及有無輸入錯誤。",
"您要刪除以上錯誤嘗試的記錄嗎?",
"【主功能表】",
)
Pattern與Day07唯一的差別只有第一點的"請按任意鍵繼續"改成了"按任意鍵繼續",這是因為若使用者的信件超出上限,在登入時Ptt會跳出以下訊息:
並且若有錯誤嘗試的紀錄,"您要刪除以上錯誤嘗試的記錄嗎?"的頁面會介在這訊息與一開始的"請按任意鍵繼續"之間。因此我們需要把這兩個任意鍵繼續的訊息都判斷出來才行。
接著正如上面所提到的,只要送出足夠多的q,我們就能確保正確回到主功能表,因此下方程式需要修改的只有
// ...
0 -> { // "請按任意鍵繼續"
if (hasPressedAnyKey) continue
hasPressedAnyKey = true
PttClient.getInstance().send("\r\n".toByteArray(BIG5))
delay(500L)
}
// ...
修改為
// ...
0 -> { // "按任意鍵繼續"
PttClient.getInstance().send("qqqqqqqqqqqqqqq")
delay(500L)
}
// ...
其實照估算應該12~13個q就足夠了,但是保險起見我打了15個,反正在主功能表按再多次q也毫無反應,就只是個主功能表。
在Day08的流程中我疏忽了一種情況,那就是當搜尋的字串只有一個看板符合時,並不會跳出相關資訊一覽表的訊息,而是在搜尋的內容中自動補完:
因此使用的Pattern我多加了一項:
private val searchBoardPattern = arrayOf(
"按空白鍵可列出更多項目",
"相關資訊一覽表",
"請輸入看板名稱" // <- new
)
這項必須要放在array的最後,否則在前面兩項的條件中也能被判斷出來,若回傳的判斷結果為此則將後面自動補完的看板名稱給解析出來,以下條件新增在Day08的do/while內:
// ...
else if (ret == 2) {
val searchResult = PttClient.getInstance().getScreen().split("\n")
boardList.add(searchResult[1].substring(19).trim())
}
// ...
因為回傳的ret為2,走完後就離開do/while了。
目前需要補充的大概就這些,明天預計會做看板內搜尋文章及作者的部分了。