package com.yeshi.buwan.util.tvlive;
|
|
import com.yeshi.buwan.domain.live.TVLiveChannel;
|
import com.yeshi.buwan.util.NumberUtil;
|
import com.yeshi.buwan.util.StringUtil;
|
import net.sf.json.JSONArray;
|
import org.apache.commons.io.IOUtils;
|
import org.jsoup.Jsoup;
|
import org.jsoup.nodes.Document;
|
import org.jsoup.nodes.Element;
|
import org.jsoup.select.Elements;
|
import org.yeshi.utils.HttpUtil;
|
|
import javax.script.Invocable;
|
import javax.script.ScriptEngine;
|
import javax.script.ScriptEngineManager;
|
import javax.script.ScriptException;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.net.URLEncoder;
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* 电视猫帮助类
|
*/
|
public class DianShiMaoUtil {
|
|
private static ScriptEngine jsEngine;
|
|
static {
|
ScriptEngineManager manager = new ScriptEngineManager();
|
jsEngine = manager.getEngineByName("javascript");
|
InputStream scriptStream = DianShiMaoUtil.class.getClassLoader().getResourceAsStream("script\\tvlive\\dianshimao_program.js");
|
try {
|
String script = IOUtils.toString(scriptStream);
|
jsEngine.eval(script);
|
} catch (ScriptException e) {
|
e.printStackTrace();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
|
|
/**
|
* 获取当日电视节目表单
|
*
|
* @param url 如:https://www.tvmao.com/program/CCTV-CCTV1-w4.html
|
* @return
|
*/
|
public static List<TVLiveChannel.TVLiveProgram> getProgramList(String url) throws Exception {
|
String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36";
|
Document doc = Jsoup.connect(url).userAgent(userAgent).referrer(url).timeout(60000).get();
|
List<TVLiveChannel.TVLiveProgram> list = new ArrayList<>();
|
Element pgrow = doc.getElementById("pgrow");
|
Elements items = pgrow.getElementsByClass("over_hide");
|
for (int i = 0; i < items.size(); i++) {
|
list.add(parseProgram(items.get(i)));
|
}
|
|
//下一页的数据
|
Element form = doc.getElementsByTag("form").get(0);
|
String q = form.attr("q");
|
String a = form.attr("a");
|
String id = form.getElementsByTag("button").get(0).attr("id");
|
//计算下一页请求链接中的p参数
|
Invocable in = (Invocable) jsEngine;
|
Object data = in.invokeFunction("f", q, a, id);
|
String p = data.toString();
|
String nextUrl = "https://www.tvmao.com/api/pg?p=" + URLEncoder.encode(p, "UTF-8");
|
Map<String, String> headers = new HashMap<>();
|
headers.put("User-Agent",userAgent);
|
headers.put("Referer", url);
|
String result = HttpUtil.get(nextUrl, headers);
|
//解析下一页的结果
|
JSONArray array = JSONArray.fromObject(result);
|
String script = array.optString(1);
|
doc = Jsoup.parse(script);
|
items = doc.getElementsByClass("over_hide");
|
if(items==null||items.size()<=0){
|
throw new Exception("获取下一页资源出错");
|
}
|
for (int i = 0; i < items.size(); i++) {
|
list.add(parseProgram(items.get(i)));
|
}
|
return list;
|
}
|
|
private static TVLiveChannel.TVLiveProgram parseProgram(Element item) throws Exception {
|
String name = item.getElementsByClass("p_show").get(0).text().trim();
|
String time = item.getElementsByTag("span").get(0).text().trim();
|
|
if (StringUtil.isNullOrEmpty(name)) {
|
throw new Exception("节目名称为空");
|
}
|
if (!time.contains(":") || !NumberUtil.isNumeric(time.replace(":", ""))) {
|
throw new Exception("时间格式错误");
|
}
|
return new TVLiveChannel.TVLiveProgram(time, name);
|
}
|
|
public static void main(String[] args) throws Exception {
|
|
getProgramList("https://www.tvmao.com/program/CCTV-CCTV2-w4.html");
|
|
|
}
|
|
|
}
|