parent
c84501c18e
commit
ceaed6a5dc
@ -0,0 +1,114 @@ |
||||
package xyz.fycz.myreader.webapi |
||||
|
||||
import io.reactivex.Observable |
||||
import okhttp3.MediaType.Companion.toMediaTypeOrNull |
||||
import okhttp3.RequestBody.Companion.toRequestBody |
||||
import org.jsoup.Jsoup |
||||
import xyz.fycz.myreader.common.URLCONST |
||||
import xyz.fycz.myreader.util.help.StringHelper |
||||
import xyz.fycz.myreader.util.utils.OkHttpUtils |
||||
import java.net.HttpURLConnection |
||||
import java.net.URL |
||||
import java.util.* |
||||
|
||||
/** |
||||
* @author fengyue |
||||
* @date 2022/1/22 18:50 |
||||
*/ |
||||
object LanZouApi { |
||||
/** |
||||
* 通过api获取蓝奏云可下载直链 |
||||
* |
||||
* @param url |
||||
* @param password |
||||
*/ |
||||
fun getUrl(url: String, password: String = ""): Observable<String> { |
||||
return Observable.create { |
||||
val html = OkHttpUtils.getHtml(url) |
||||
val url2 = if (password.isEmpty()) { |
||||
val url1 = getUrl1(html) |
||||
val key = getKey(OkHttpUtils.getHtml(url1)) |
||||
getUrl2(key, url1) |
||||
} else { |
||||
getUrl2(StringHelper.getSubString(html, "sign=", "&"), url, password) |
||||
} |
||||
it.onNext(getRedirectUrl(url2)) |
||||
it.onComplete() |
||||
} |
||||
} |
||||
|
||||
private fun getUrl1(html: String): String { |
||||
val doc = Jsoup.parse(html) |
||||
return URLCONST.LAN_ZOUS_URL + doc.getElementsByClass("ifr2").attr("src") |
||||
} |
||||
|
||||
private fun getKey(html: String): String { |
||||
var lanzousKeyStart = "var pposturl = '" |
||||
val keyName = StringHelper.getSubString(html, "'sign':", ",") |
||||
lanzousKeyStart = if (keyName.endsWith("'")) { |
||||
"'sign':'" |
||||
} else { |
||||
"var $keyName = '" |
||||
} |
||||
return StringHelper.getSubString(html, lanzousKeyStart, "'") |
||||
} |
||||
|
||||
|
||||
private fun getUrl2(key: String, referer: String, password: String = ""): String { |
||||
val mediaType = "application/x-www-form-urlencoded".toMediaTypeOrNull() |
||||
val body = if (password.isEmpty()) { |
||||
"action=downprocess&sign=$key&ves=1" |
||||
} else { |
||||
"action=downprocess&sign=$key&p=$password" |
||||
} |
||||
val requestBody = body.toRequestBody(mediaType) |
||||
|
||||
val headers = HashMap<String, String>() |
||||
headers["Referer"] = referer |
||||
|
||||
val html = OkHttpUtils.getHtml( |
||||
URLCONST.LAN_ZOUS_URL + "/ajaxm.php", requestBody, |
||||
"UTF-8", headers |
||||
) |
||||
return getUrl2(html) |
||||
} |
||||
|
||||
private fun getUrl2(o: String): String { |
||||
val info = o.split(",").toTypedArray() |
||||
val zt = info[0].substring(info[0].indexOf(":") + 1) |
||||
if (!"1".endsWith(zt)) { |
||||
return "" |
||||
} |
||||
var dom = info[1].substring(info[1].indexOf(":") + 2, info[1].lastIndexOf("\"")) |
||||
var url = info[2].substring(info[2].indexOf(":") + 2, info[2].lastIndexOf("\"")) |
||||
dom = dom.replace("\\", "") |
||||
url = url.replace("\\", "") |
||||
return "$dom/file/$url" |
||||
} |
||||
|
||||
/** |
||||
* 获取重定向地址 |
||||
* |
||||
* @param path |
||||
*/ |
||||
private fun getRedirectUrl(path: String): String { |
||||
val conn = URL(path) |
||||
.openConnection() as HttpURLConnection |
||||
conn.instanceFollowRedirects = false |
||||
conn.connectTimeout = 5000 |
||||
conn.setRequestProperty( |
||||
"User-Agent", |
||||
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" |
||||
) |
||||
conn.setRequestProperty("Accept-Language", "zh-cn") |
||||
conn.setRequestProperty("Connection", "Keep-Alive") |
||||
conn.setRequestProperty( |
||||
"Accept", |
||||
"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, */*" |
||||
) |
||||
conn.connect() |
||||
val redirectUrl = conn.getHeaderField("Location") |
||||
conn.disconnect() |
||||
return redirectUrl |
||||
} |
||||
} |
Loading…
Reference in new issue