CSRのHTMLをAndroidとiOSで取得する方法

kyamada,AndroidiOShtmlCSRjavascript

SSR(サーバサイドレンダリング)の場合はサーバで HTML が構築されるので、ktor-client (opens in a new tab)というマルチプラットフォーム対応のライブラリを使って、HTML を取得することができます。

CSR(クライアントサイドレンダリング)の場合は javascript で HTML が構築されるため、ktor-client では javascript が構築する部分の HTML を取得することができません。

そのため、各言語毎の CSR 対応ライブラリを使って、HTML を取得する必要があります。

今回は、Android と iOS で CSR の HTML を取得する方法を紹介します。

Android

Android ではhtmlunit-android (opens in a new tab)という「GUI レスブラウザ」ライブラリを使い CSR の HTML を取得します。

実装例

androidApp/build.gradle.kts
dependencies {
    ...
    implementation("net.sourceforge.htmlunit:htmlunit-android:2.67.0")
}
Sample.kt
suspend fun getCsrHtml(
    urlString: String,
    userAgent: String,
): String? {
    val webClient = WebClient(BrowserVersion.CHROME)
    return try {
        // Scriptでエラーが起きてもExceptionを投げないようにする
        webClient.options.isThrowExceptionOnScriptError = false
        webClient.options.isThrowExceptionOnFailingStatusCode = false
        // javaScriptTimeoutを設定しないと、いつまでたってもページが取得できない可能性がある
        webClient.javaScriptTimeout = 3000
        // 必要に応じてユーザーエージェントをセットする
        webClient.addRequestHeader("User-Agent", userAgent)
        // 通信はバックグラウンドスレッドで行う
        val page: HtmlPage = withContext(Dispatchers.Default) {
            webClient.getPage(urlString)
        }
        return page.asXml()
    } catch (e: IOException) {
        Log.d(TAG, "Failed to get CSR HTML")
        null
    }
}

iOS

iOS の場合は、標準ライブラリのURLSession (opens in a new tab)クラスを使えば、CSR の HTML を取得できます。

実装例

func getCsrHtml(urlString: String, userAgent: String) async -> String? {
    guard let url = URL(string: urlString) else { return nil }
    var request = URLRequest(url: url)
    // 必要に応じてユーザーエージェントをセットする
    request.setValue(userAgent, forHTTPHeaderField: "User-Agent")
    do {
        let (data, _) = try await URLSession.shared.data(for: request, delegate: nil)
        return String(data: data, encoding: .utf8)
    } catch {
        print("Failed to get CSR HTML: \(error)")
        return nil
    }
}

参考

© 品川アプリ.RSS