Yimmh: Trust all certificates (#10849)
This commit is contained in:
parent
ce3fe83068
commit
76eb331136
|
@ -5,7 +5,7 @@ ext {
|
||||||
extName = 'Yimmh'
|
extName = 'Yimmh'
|
||||||
pkgNameSuffix = 'zh.yimmh'
|
pkgNameSuffix = 'zh.yimmh'
|
||||||
extClass = '.Yimmh'
|
extClass = '.Yimmh'
|
||||||
extVersionCode = 3
|
extVersionCode = 4
|
||||||
}
|
}
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
apply from: "$rootDir/common.gradle"
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package eu.kanade.tachiyomi.extension.zh.yimmh
|
package eu.kanade.tachiyomi.extension.zh.yimmh
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.source.model.Filter
|
import eu.kanade.tachiyomi.source.model.Filter
|
||||||
|
@ -11,11 +12,16 @@ import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import okhttp3.Headers
|
import okhttp3.Headers
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
|
import java.security.cert.X509Certificate
|
||||||
|
import javax.net.ssl.SSLContext
|
||||||
|
import javax.net.ssl.TrustManager
|
||||||
|
import javax.net.ssl.X509TrustManager
|
||||||
|
|
||||||
class Yimmh : ParsedHttpSource() {
|
class Yimmh : ParsedHttpSource() {
|
||||||
override val name: String = "忆漫"
|
override val name: String = "忆漫"
|
||||||
|
@ -24,13 +30,34 @@ class Yimmh : ParsedHttpSource() {
|
||||||
override val baseUrl: String = "https://m.yimmh.com"
|
override val baseUrl: String = "https://m.yimmh.com"
|
||||||
override fun headersBuilder() = Headers.Builder()
|
override fun headersBuilder() = Headers.Builder()
|
||||||
.add("User-Agent", "Mozilla/5.0 (Android 11; Mobile; rv:83.0) Gecko/83.0 Firefox/83.0")
|
.add("User-Agent", "Mozilla/5.0 (Android 11; Mobile; rv:83.0) Gecko/83.0 Firefox/83.0")
|
||||||
|
override val client: OkHttpClient = getUnsafeOkHttpClient()
|
||||||
|
|
||||||
private fun toHttp(url: String): String {
|
// Trusted all certificates
|
||||||
// Images from https://*.yemancomic.com do not load
|
private fun getUnsafeOkHttpClient(): OkHttpClient {
|
||||||
// because of certificate issue, so switch to http.
|
// Create a trust manager that does not validate certificate chains
|
||||||
return if (url.startsWith("https")) {
|
val trustAllCerts = arrayOf<TrustManager>(
|
||||||
"http" + url.substring(5)
|
@SuppressLint("CustomX509TrustManager")
|
||||||
} else url
|
object : X509TrustManager {
|
||||||
|
@SuppressLint("TrustAllX509TrustManager")
|
||||||
|
override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) {
|
||||||
|
}
|
||||||
|
@SuppressLint("TrustAllX509TrustManager")
|
||||||
|
override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getAcceptedIssuers() = arrayOf<X509Certificate>()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// Install the all-trusting trust manager
|
||||||
|
val sslContext = SSLContext.getInstance("SSL")
|
||||||
|
sslContext.init(null, trustAllCerts, java.security.SecureRandom())
|
||||||
|
// Create an ssl socket factory with our all-trusting manager
|
||||||
|
val sslSocketFactory = sslContext.socketFactory
|
||||||
|
|
||||||
|
return OkHttpClient.Builder()
|
||||||
|
.sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
|
||||||
|
.hostnameVerifier { _, _ -> true }.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Popular
|
// Popular
|
||||||
|
@ -41,7 +68,7 @@ class Yimmh : ParsedHttpSource() {
|
||||||
override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply {
|
override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply {
|
||||||
title = element.select("p.rank-list-info-right-title").text()
|
title = element.select("p.rank-list-info-right-title").text()
|
||||||
setUrlWithoutDomain(element.attr("abs:href"))
|
setUrlWithoutDomain(element.attr("abs:href"))
|
||||||
thumbnail_url = toHttp(element.select("img").attr("abs:data-original"))
|
thumbnail_url = element.select("img").attr("abs:data-original")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Latest
|
// Latest
|
||||||
|
@ -60,7 +87,7 @@ class Yimmh : ParsedHttpSource() {
|
||||||
SManga.create().apply {
|
SManga.create().apply {
|
||||||
title = book.getString("book_name")
|
title = book.getString("book_name")
|
||||||
url = "/book/${book.getString("unique_id")}"
|
url = "/book/${book.getString("unique_id")}"
|
||||||
thumbnail_url = toHttp(book.getString("cover_url"))
|
thumbnail_url = book.getString("cover_url")
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -104,14 +131,14 @@ class Yimmh : ParsedHttpSource() {
|
||||||
override fun searchMangaFromElement(element: Element): SManga = SManga.create().apply {
|
override fun searchMangaFromElement(element: Element): SManga = SManga.create().apply {
|
||||||
title = element.select("p.book-list-info-title").text()
|
title = element.select("p.book-list-info-title").text()
|
||||||
setUrlWithoutDomain(element.select("a").attr("abs:href"))
|
setUrlWithoutDomain(element.select("a").attr("abs:href"))
|
||||||
thumbnail_url = toHttp(element.select("img").attr("abs:data-original"))
|
thumbnail_url = element.select("img").attr("abs:data-original")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Details
|
// Details
|
||||||
|
|
||||||
override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply {
|
override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply {
|
||||||
title = document.select("p.detail-main-info-title").text()
|
title = document.select("p.detail-main-info-title").text()
|
||||||
thumbnail_url = toHttp(document.select("div.detail-main-cover > img").attr("abs:data-original"))
|
thumbnail_url = document.select("div.detail-main-cover > img").attr("abs:data-original")
|
||||||
author = document.select("p.detail-main-info-author:contains(作者:) > a").text()
|
author = document.select("p.detail-main-info-author:contains(作者:) > a").text()
|
||||||
artist = author
|
artist = author
|
||||||
genre = document.select("p.detail-main-info-class > span").eachText().joinToString(", ")
|
genre = document.select("p.detail-main-info-class > span").eachText().joinToString(", ")
|
||||||
|
@ -141,7 +168,7 @@ class Yimmh : ParsedHttpSource() {
|
||||||
while (true) {
|
while (true) {
|
||||||
val images = page.select("div#cp_img > img.lazy")
|
val images = page.select("div#cp_img > img.lazy")
|
||||||
images.forEach {
|
images.forEach {
|
||||||
add(Page(size, "", toHttp(it.attr("abs:data-src"))))
|
add(Page(size, "", it.attr("abs:data-src")))
|
||||||
}
|
}
|
||||||
val nextPage = page.select("a.view-bottom-bar-item:contains(下一页)").attr("href")
|
val nextPage = page.select("a.view-bottom-bar-item:contains(下一页)").attr("href")
|
||||||
if (nextPage.isNullOrEmpty()) {
|
if (nextPage.isNullOrEmpty()) {
|
||||||
|
|
Loading…
Reference in New Issue