找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 1564|回复: 13

[iptv信源 资源分享或寻求] 江苏电信IPTV点播节目在tvbox上进行播放 (技术分析)

[复制链接]
本帖最后由 op351 于 2023-12-20 12:50 编辑

经过前三篇的思考实践
江苏电信IPTV回看地址探究 (技术分析)
江苏电信IPTV回看源在tvbox上进行播放 (技术分析)
江苏电信IPTV直播源(RTSP认证源)在tvbox上播放(技术分析)
我们已经基本摸透了江苏电信IPTV直播和回看部分的所有技术
那么在本篇中我们将对江苏电信IPTV的另一个模块 电影 电视剧 点播 进行研究

首先照例
我们先看看最后成果图
电影界面

电影筛选

电影详情页面

电视剧页面

电视剧筛选

电视剧详情


下面我们开始写代码
打开之前的爬虫项目
重写init方法 导入筛选配置
  1. <font size="3">/**
  2.      * 筛选配置
  3.      */
  4.     private JSONObject filterConfig;
  5.     @Override
  6.     public void init(Context context) {
  7.         super.init(context);
  8.         try {
  9.             filterConfig = new JSONObject("{"movie":[{"key":0,"name":"清晰度","value":[{"n":"全部","v":"new"},{"n":"免费","v":"free"},{"n":"付费","v":"fufei"},{"n":"高清","v":"HD"},{"n":"4K","v":"4K"}]},{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"zhongguodalu"},{"n":"中国深圳旁边","v":"xianggang"},{"n":"中国福建旁边","v":"taiwan"},{"n":"美国","v":"meiguo"},{"n":"法国","v":"faguo"},{"n":"印度","v":"yindu"},{"n":"其他","v":"qita"}]},{"key":2,"name":"类型","value":[{"n":"全部","v":""},{"n":"喜剧","v":"xiju"},{"n":"爱情","v":"aiqing"},{"n":"动作","v":"dongzuo"},{"n":"动画","v":"donghua"},{"n":"悬疑","v":"xuanyi"},{"n":"奇幻","v":"qihuan"},{"n":"惊悚","v":"jingsong"},{"n":"科幻","v":"kehuan"},{"n":"情感","v":"qinggan"},{"n":"战争","v":"zhanzheng"},{"n":"武侠","v":"wuxia"},{"n":"罪案","v":"zuian"}]},{"key":3,"name":"年代","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2010~2015","v":"2010~2015"},{"n":"更早","v":"gengzao"}]},{"key":4,"name":"排序","value":[{"n":"最新","v":"new"},{"n":"最热","v":"hot"},{"n":"最多播放","v":"pv"},{"n":"最好评","v":"score"}]}],"drama":[{"key":0,"name":"清晰度","value":[{"n":"全部","v":"new"},{"n":"免费","v":"free"},{"n":"付费","v":"fufei"},{"n":"高清","v":"HD"},{"n":"4K","v":"4K"}]},{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"neidi"},{"n":"中国深圳旁边","v":"xianggang"},{"n":"中国福建旁边","v":"taiwan"},{"n":"其他","v":"qita"}]},{"key":2,"name":"类型","value":[{"n":"全部","v":""},{"n":"爱情","v":"aiqing"},{"n":"战争","v":"zhanzheng"},{"n":"古装","v":"guzhuang"},{"n":"情感","v":"qinggan"},{"n":"谍战","v":"diezhan"},{"n":"仙侠","v":"xianxia"},{"n":"历史","v":"lishi"},{"n":"军旅","v":"junlv"},{"n":"悬疑","v":"xuanyi"},{"n":"偶像","v":"ouxiang"},{"n":"喜剧","v":"xiju"},{"n":"武侠","v":"wuxia"},{"n":"警匪","v":"jingfei"},{"n":"律政","v":"lvzheng"},{"n":"年代","v":"niandai"}]},{"key":3,"name":"年代","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2011~2015","v":"2011~2015"},{"n":"更早","v":"gengzao"}]},{"key":4,"name":"排序","value":[{"n":"最新","v":"new"},{"n":"最热","v":"hot"},{"n":"最多播放","v":"pv"}]}]}");
  10.         } catch (JSONException e) {
  11.             SpiderDebug.log(e);
  12.         }
  13.     }</font>
复制代码
在homecontent方法中增加两个分类
  1. <font size="3">JSONObject result = new JSONObject();
  2.             JSONObject jsonObject1 = new JSONObject();
  3.             jsonObject1.put("type_id", "movie");
  4.             jsonObject1.put("type_name", "电影");
  5.             JSONObject jsonObject2 = new JSONObject();
  6.             jsonObject2.put("type_id", "drama");
  7.             jsonObject2.put("type_name", "电视剧");
  8.             JSONArray videos = new JSONArray();
  9.             videos.put(jsonObject1);
  10.             videos.put(jsonObject2);
  11.             result.put("class", videos);</font>
复制代码
开启筛选配置
  1. <font size="3">if (filter) {
  2.                 result.put("filters", filterConfig);
  3.             }</font>
复制代码
重写categoryContent方法(用于tab页显示,比如电影和电视剧的首页)
1.读取筛选值,未筛选时默认为new
  1. <font size="3">String tags = "";
  2.             if (extend != null && extend.size() > 0) {
  3.                 for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
  4.                     String key = it.next();
  5.                     String value = extend.get(key);
  6.                     tags = tags + value + ",";
  7.                 }
  8.             }
  9.             if (StringUtils.isEmpty(tags)) {
  10.               tags = "new";
  11.             } else {
  12.                tags = tags.substring(0, tags.length()-1);
  13.             }</font>
复制代码
2.根据传入值tid分类对电影和电视剧的url进行拼接
  1. <font size="3">Long timestamp = System.currentTimeMillis();
  2.             String getFilterDataurl = "";
  3.             String getFilterDataRefer = "";
  4.             if (tid.equals("movie")) {
  5.                 getFilterDataRefer = "http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/html/list.html?listPos=7_0_1_0_4_1_1_2_0_0&hwRreturnUrl=null";
  6.                 getFilterDataurl = "http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/jsp/getFilterData.jsp?apikey="+apikey+"&secretkey="+secretkey+"&sp=dx&type=1&userId="+userId+"&tags="+tags+"&page="+pg+"&pageSize=45&date="+timestamp;
  7.             } else {
  8.                 getFilterDataRefer = "http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/html/list.html?listPos=7_0_1_2_0_0_0_0_0_0";
  9.                 getFilterDataurl = "http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/jsp/getFilterData.jsp?apikey="+apikey+"&secretkey="+secretkey+"&sp=dx&type=2&userId="+userId+"&tags="+tags+"&page="+pg+"&pageSize=45&date="+timestamp;
  10.             }</font>
复制代码
此处的apikey和secretkey请在setepg方法中进行获取,并全局设值,不再赘述。
3.获取列表数据
  1. <font size="3">OkHttpClient client = new OkHttpClient().newBuilder()
  2.                     .build();
  3.             Request request = new Request.Builder()
  4.                     .url(getFilterDataurl)
  5.                     .get()
  6.                     .addHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; SkyworthBrowser) AppleWebKit/534.24 (KHTML, like Gecko) Safari/534.24 SkWebKit-JS-CTC")
  7.                     .addHeader("Accept", "*/*")
  8.                     .addHeader("Referer", getFilterDataRefer)
  9.                     .addHeader("Cookie", "JSESSIONID="+JSESSIONID)
  10.                     .build();
  11.             Response response = client.newCall(request).execute();
  12.             String pgString = response.body().string();</font>
复制代码
4.数据重组,返回
  1. <font size="3">JSONArray videos = new JSONArray();
  2.             JSONObject datas = new JSONObject(pgString);
  3.             JSONArray pgJson = datas.getJSONArray("datas");
  4.             String TotalPage = datas.get("total").toString();
  5.             Integer pageCount = Integer.parseInt(TotalPage) / 45;
  6.             for(int i = 0;i < pgJson.length(); i++) {
  7.                 String vodId = pgJson.getJSONObject(i).get("contentId").toString();
  8.                 String vodName = pgJson.getJSONObject(i).get("name").toString();
  9.                 String picUrl = this.getPicUrl(vodId);
  10.                 JSONObject jsonObject = new JSONObject();
  11.                 if (tid.equals("movie")) {
  12.                     jsonObject.put("vod_id", vodId + "|movie");
  13.                 } else if (tid.equals("drama")) {
  14.                     jsonObject.put("vod_id", vodId + "|drama");
  15.                 }
  16.                 jsonObject.put("vod_name", vodName);
  17.                 jsonObject.put("vod_pic", picUrl);
  18.                 jsonObject.put("vod_remarks", "");
  19.                 videos.put(jsonObject);
  20.             }
  21.             JSONObject result = new JSONObject();
  22.             result.put("page", pg);
  23.             result.put("pagecount", pageCount);
  24.             result.put("limit", 45);
  25.             result.put("total", pageCount <= 1 ? videos.length() : 1 * 45);

  26.             result.put("list", videos);
  27.             return result.toString();</font>
复制代码
getPicUrl方法通过请求url /iptvepg/frame805/epg30/iptv/jsp/externalCode_Content.jsp获取,自行实现,不再赘述。


至此我们完成了电影和视频的首页列表数据获取,即以下画面



下面我们开始详情页面的编码
在之前的帖子中,我们已经写过回放节目的详情,所以此次对之前的方法detailContent稍加改造即可
增加movie分支
  1. <font size="3">else if (currentTab.equals("movie")) {
  2.                 String code = idsa[0];
  3.                 OkHttpClient client = new OkHttpClient().newBuilder()
  4.                         .build();
  5.                 Request request = new Request.Builder()
  6.                         .url("http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/jsp/externalCode_Content.jsp?code=" + code)
  7.                         .get()
  8.                         .addHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; SkyworthBrowser) AppleWebKit/534.24 (KHTML, like Gecko) Safari/534.24 SkWebKit-JS-CTC")
  9.                         .addHeader("Accept", "*/*")
  10.                         .addHeader("Referer", "http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/html/list.html?listPos=7_0_1_2_0_0_0_0_0_0")
  11.                         .addHeader("Cookie", "JSESSIONID=" + JSESSIONID)
  12.                         .build();
  13.                 Response response = client.newCall(request).execute();
  14.                 String exresult = response.body().string();
  15.                 JSONArray detail = new JSONArray(exresult);
  16.                 JSONObject detailobj = detail.getJSONObject(0);
  17.                 vodList.put("vod_id", detailobj.get("programcode").toString());
  18.                 vodList.put("vod_name", detailobj.get("programname").toString());
  19.                 vodList.put("vod_pic", detailobj.get("poster3").toString().replace("..","http://imagecache.itv.jsinfo.net:8080"));
  20.                 vodList.put("type_name", "");
  21.                 vodList.put("vod_year", detailobj.get("releasedate").toString());
  22.                 vodList.put("vod_area", detailobj.get("countryname").toString());
  23.                 vodList.put("vod_remarks", "");
  24.                 vodList.put("vod_actor", detailobj.get("actor").toString().replace(";",","));
  25.                 vodList.put("vod_director", "");
  26.                 vodList.put("vod_content", detailobj.get("description").toString());
  27.                 List<String> vodItems = new ArrayList<>();
  28.                 String playList = "";
  29.                 vodItems.add("正片" + "$" + "movie"+ "|" + detailobj.get("programcode").toString() + "|" +
  30.                         detailobj.get("contentcode").toString());
  31.                 playList = String.join("#", vodItems);
  32.                 vod_play.put("江苏电信", playList);</font>
复制代码
电视剧的drama分支和movie分支大致相同,但需要多请求一个接口来获取所有剧集,接口为/iptvepg/frame805/epg30/iptv/jsp/vod_detail.jsp
请自行实现,不再赘述


以上改造完成后,可以实现以下画面



下面我们进入最后一步,播放链接的获取,还是如之前的帖子,我们改造playerContent方法
  1. else if (idas[0].equals("movie")) {
  2.                 String programcode = idas[1];
  3.                 String programcoderefer = idas[2];
  4.                 OkHttpClient client = new OkHttpClient().newBuilder()
  5.                         .build();
  6.                 Request request = new Request.Builder()
  7.                         .url("http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/jsp/getPlayURL.jsp?programcode="+programcode+"&breakpoint=9&standardflag=1&playmediaservice=1")
  8.                         .get()
  9.                         .addHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; SkyworthBrowser) AppleWebKit/534.24 (KHTML, like Gecko) Safari/534.24 SkWebKit-JS-CTC")
  10.                         .addHeader("Accept", "*/*")
  11.                         .addHeader("Referer", "http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/html/movieDetail.html?programcode="+programcoderefer)
  12.                         .addHeader("Cookie", "JSESSIONID="+JSESSIONID)
  13.                         .build();
  14.                 Response response = client.newCall(request).execute();
  15.                 String data = response.body().string();
  16.                 JSONObject dataj = new JSONObject(data);
  17.                 String rtspurl = dataj.get("playurl").toString().trim();
  18.                 result.put("parse", "");
  19.                 result.put("playUrl", "");
  20.                 result.put("url",rtspurl);
  21.                 result.put("header", "");
  22.                 return result.toString();
  23.             }
复制代码
增加movie分支,获取rtsp播放链接。
电视剧的drama分支类似,请自行实现,不再赘述。

在完成本步后,即可实现电影和电视剧的播放。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 1恩山币 +1 收起 理由
wj2*** + 1 强大的恩山!(以下重复1万次)

查看全部评分

支持一下...
这个不能破 解付费节目吧?
回复

使用道具 举报

 楼主| | 显示全部楼层
superzjg 发表于 2023-12-20 13:01
支持一下...
这个不能破 解付费节目吧?

能,就是因为能看付费节目我才写的。
回复

使用道具 举报

牛逼啊  兄嘚  我也要研究一下杭州电信
回复

使用道具 举报

这才是技术。。。。
回复

使用道具 举报

op351 发表于 2023-12-20 13:16
能,就是因为能看付费节目我才写的。

那挺好
这一系列技术贴真的是不错..。虽然不是那么容易看懂
回复

使用道具 举报

艹 这厉害了 收藏了话说这些代码都是运行在什么上面的
回复

使用道具 举报

可有偿代搭建吗
回复

使用道具 举报

牛逼的技术贴,必须顶一下
回复

使用道具 举报

,老了,跟不上了
回复

使用道具 举报

支持一下,最近正好也在研究,顶!
回复

使用道具 举报

老早就在v2ex看到你的帖子了,没想到这么快研究出来了
回复

使用道具 举报

来自手机 | 显示全部楼层
mooncake5874 发表于 2023-12-20 21:06
艹 这厉害了 收藏了话说这些代码都是运行在什么上面的

一眼java,代码里有okhttp
回复

使用道具 举报

谢谢大佬分享.....................
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-5-10 21:21

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表