Day11 - 搜寻文章标题

今天来加入搜寻文章标题的部分。

Layout的部份新增一个EditText以及ImageView,目前画面如下:
https://imgur.com/rld6gCS.jpg

首先点击按纽时先取得目前输入的内容并做前置的判断

val word = searchTitleInput.text.toString()
if (word.isEmpty()) return@setOnClickListener
searchTitleInput.setText("")

之所以会把EditText清空是因为Ptt有增加搜寻条件

接着是判断目前画面状态

Pattern如下

private val inBoardPattern = arrayOf(
    "【主功能表】",
    "请按任意键继续", // 进板画面
    "文章选读", // 看板内
)

判断内容

when (PttClient.getInstance().expect(inBoardPattern)) {
    0 -> {
        // first go into the board
        val board = searchBoardInput.text.toString().trim()
        if (board.isEmpty()) return@setOnClickListener
        PttClient.getInstance().send("s${board}\r\n")
        viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) {
            delay(200L)
            var ret = PttClient.getInstance().expect(inBoardPattern)
            while (ret == 1) {
                if (ret == 1) {
                    PttClient.getInstance().send("q")
                    delay(200L)
                    ret = PttClient.getInstance().expect(inBoardPattern)
                }
            }
            when (ret) {
                0 -> { // "【主功能表】" -> 在看板外,无法搜寻文章
                    Log.e(mTag, "Out of board.\n${PttClient.getInstance().getScreen()}")
                    return@launch
                }
                2 -> { // "文章选读" -> 在看板内
                    searchTitle(word)
                }
            }
        }
    }
    2 -> {
        viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) {
            searchTitle(word)
        }
    }
    else -> {
        Log.e(mTag, "Wrong screen: \n${PttClient.getInstance().getScreen()}")
        PttClient.getInstance().send("\r\nqqqqqqqqqqqq")
        //TODO show alert
    }
}

要是目前画面在主功能表的话,需要先进入看板再开始查询,进入看板相关的条件请见Day08Day10,最後结果要是还是在主功能表的话代表找不到看板,那就不继续了。反之则进入searchTitle方法:要是目前画面已经在看板内的话,直接进入searchTitle方法即可。

searchTitle

会用到的Pattern

private val searchTitlePattern = arrayOf(
    "抱歉,已达搜寻条件上限。",
    "文章选读"
)

private suspend fun searchTitle(word: String) {
    delay(200L)
    PttClient.getInstance().send("/$word\r\n")
    delay(200L)
    when (PttClient.getInstance().expect(searchTitlePattern)) {
        0 -> {
            //TODO show Alert
            Log.d(mTag, "Up to limit")
        }
        1 -> {
            parseBoardArticle(PttClient.getInstance().getScreen())
        }
        else -> {
            Log.e(
                mTag,
                "Wrong screen: \n${PttClient.getInstance().getScreen()}"
            )
            PttClient.getInstance().send("\r\nqqqqqqqqqqqq")
            //TODO show alert
        }
    }
}

搜寻文章标题需使用"/",接着输入搜寻内容以及Enter即可。结果会有里面的两种情况,

  • 抱歉,已达搜寻条件上限。
    这是Ptt的搜寻限制,超出3次的搜寻内容後就会出现此讯息。
  • 文章选读
    这有两种可能,一是搜寻完成、二是搜寻的内容无其他结果。

目前进度就先到这边,parseBoardArticle是在解析搜寻的画面结果,我打算放在搜寻作者之後再做说明。


<<:  Kotlin Android 第21天,从 0 到 ML - Retrofit and Repository

>>:  Day 26 - Rancher Fleet Kubernetes 应用程序部署

# Day35 Golang - Google Sheet 试算表应用 (Spreadsheet)

Day35 Golang - Google Sheet 试算表应用 (Spreadsheet) Go...

[Day30] Pentesting CheatSheet Meow Meow

终於到了最後一天了,感觉这阵子打了好多好多的靶机哦,希望过去的这些文章可以对大家有一些帮助。非常感谢...

Day 4 - 破解骇客的思考模式

出於书本 Chapter 2. Cracking the Hacker Mindset 如果我是恶意...

2021 资通讯高峰论坛 !

https://edm.bnext.com.tw/2021cpx/?utm_source=%E3%8...

[Day 16] 第一个和资料库互动的测试

知道什麽是自动测试之後,我们来看看怎麽进行和资料库互动的自动测试。 测试目标 假设我们现有的资料关联...