Мое приложение работало нормально До тех пор, пока сайт, на котором я импортировал информацию, не начал использовать защиту Cloudflare, я некоторое время пытался обойти защиту Cloudflare Но это стало очень неприятно, и я не мог понять, как с ним бороться
это мои коды: NetworkUtils.kt
object NetworkUtils {
private const val TAG = "NetworkUtils"
const val HTTP_GET = "GET"
const val HTTP_POST = "POST"
const val HTTP_PUT = "PUT"
const val HTTP_DELETE = "DELETE"
private val client by lazy {
OkHttpClient.Builder()
.apply {
if (BuildConfig.DEBUG) addInterceptor(OkHttpProfilerInterceptor())
}
.followSslRedirects(true)
.followRedirects(true)
.connectTimeout(15, TimeUnit.SECONDS)
.addInterceptor(UserAgentInterceptor())
.build()
}
@JvmStatic
@Throws(IOException::class)
fun httpGet(url: String, cookie: String? = null): Document {
val request = Request.Builder()
.url(url)
.get()
if (!cookie.isNullOrBlank()) {
request.header("Cookie", cookie)
}
return client.newCall(request.build()).execute().use { response ->
Jsoup.parse(response.body()?.string(), url)
}
}
@Deprecated("")
@JvmStatic
@Throws(IOException::class)
fun httpPost(url: String, cookie: String?, data: Array<String>) =
httpPost(url, cookie, data.toList().zipWithNext { a, b -> a to b }.toMap())
@JvmStatic
@Throws(IOException::class)
fun httpPost(url: String, cookie: String? = null, data: Map<String, String>? = null): Document {
val body = FormBody.Builder()
data?.entries?.forEach { x -> body.addEncoded(x.key, x.value) }
val request = Request.Builder()
.url(url)
.post(body.build())
if (!cookie.isNullOrBlank()) {
request.header("Cookie", cookie)
}
return client.newCall(request.build()).execute().use { response ->
Jsoup.parse(response.body()?.string(), url)
}
}}
webProvider. java
public abstract class webProvider {
protected boolean features[];
private final SharedPreferences mPrefs;
public static Document getPage(String url) throws IOException {
return NetworkUtils.httpGet(url, null);
}
public static Document getPage(String url, @NonNull String cookie) throws IOException {
return NetworkUtils.httpGet(url, null);
}
protected final Document postPage(String url, String... data) throws IOException {
return NetworkUtils.httpPost(url, getAuthCookie(), data);
}
public webProvider(Context context) {
mPrefs = context.getSharedPreferences("prov_" + this.getClass().getSimpleName(), Context.MODE_PRIVATE);
}
@NonNull
protected final String getStringPreference(@NonNull String key, @NonNull String defValue) {
return mPrefs.getString(key, defValue);
}
protected final boolean getBooleanPreference(@NonNull String key, boolean defValue) {
return mPrefs.getBoolean(key, defValue);
}
protected final int getIntPreference(@NonNull String key, int defValue) {
return mPrefs.getInt(key, defValue);
}
//content access methods
public abstract webList getList(int page, int sort, int genre) throws Exception;
@Deprecated
public webList getList(int page, int sort) throws Exception {
return webList(page, sort, 0);
}
@Deprecated
public webList getList(int page) throws Exception {
return webList(page, 0, 0);
}
public abstract webSummary getDetailedInfo(webInfo webInfo);
public abstract ArrayList<webPage> getPages(String readLink);
public abstract String getPageImage(webPage webPage);
@Nullable
protected String getAuthCookie() {
return null;
}
этот поставщик onma. java
public class onma extends webProvider {
public onma(Context context) {
super(context);
}
@Override
public webList getList(int page, int sort, int genre) throws Exception {
webList list = new webList();
Document document = getPage("https://www.onma.me/filterList?page=" + (page + 1));
webInfo manga;
for (Element o : document.select("div.page-item-detail")) {
manga = new webInfo();
manga.name = o.select("h3").first().text();
manga.subtitle = null;
try {
manga.genres = o.select("div.summary-content").last().previousElementSibling().text();
} catch (Exception e) {
manga.genres = "";
}
manga.path = o.select("a").first().attr("href");
try {
manga.preview = o.select("img").first().attr("src");
} catch (Exception e) {
manga.preview = "";
}
try {
String scr = o.select("script").first().html();
int p1 = scr.lastIndexOf('"');
int p0 = scr.lastIndexOf('"', p1 - 1);
manga.rating = (byte) (Float.parseFloat(scr.substring(p0 + 1, p1)) * 20);
} catch (Exception ignored) {
}
//manga.rating = (byte) (Byte.parseByte(o.select("span.rate").first().text().substring(0,3).replace(".","")) * 2);
manga.provider = onma.class;
manga.id = manga.path.hashCode();
list.add(manga);
}
return list;
}
Я хочу узнать, есть ли какие-либо возможные решения, чтобы обойти защиту от облачных вспышек И приступить к синтаксическому анализу html этого сайта Веб https://onma.me