找回密码
 立即注册
img_loading
智能检测中

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888广告投放联系QQ68610888
查看: 7743|回复: 27

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

  [复制链接]
发表于 2023-12-3 17:16 | 显示全部楼层 |阅读模式
本帖最后由 op351 于 2023-12-3 17:16 编辑

上一个帖子中 我们分析并复现了江苏电信iptv的用户认证,回看源的获取
https://www.right.com.cn/forum/thread-8314231-1-1.html
那么在我们获取到认证的回看源地址之后 应该如何便捷的在电视上进行播放呢?
这里就要用到本坛认证播放器之一tvbox
tvbox的功能之一便是通过抓取数据源来播放视频网站的视频 简单的说 tvbox内部可以实现一个爬虫

而江苏电信iptv这套认证并获取回看源的过程就可以用爬虫来完全模拟并重现

在开始分析之前让我们先看一下最终的效果
首页

七天回放详情页


回放视频播放页


以下内容需具备一定的编程基础

步骤1
下载猫影视TV客户端爬虫自定义接口工程,也就是现在的tvbox壳配置对应的爬虫生成工程

网址为https://github.com/CatVodTVOfficial/CatVodTVSpider
此工程生成的jar文件即为各位所熟知的tvbox的配置源里的第一个地址中的json文件中所引用的jar包
在json文件中,此jar包对应的配置为
"spider": "./xxxx.jar;md5;xxxx",

步骤2
下载AndroidStudio或intellij
这里我们以AndroidStudio为例进行分析
将CatVodTVSpider-master导入到AndroidStudio中
由于此工程没有导入junit测试框架 不利于我们编写代码之后的单元测试
所以首先需要导入junit4(不要导入junit5 不支持)
导入方法如下
1.切换导航目录到project模式

2.打开文件java/com/github/catvod/spider/Aidi.java
在文件中右键-Go to-Test

这里我们选择junit4 若工程中未安装 as会进行提示 按照提示进行安装即可

接下来我们点击ok,as会自动生成一个单元测试class


步骤3
在spider包下新建class 这里以JiangSutv为例


步骤4
在上一篇帖子中 江苏电信iptv认证的第一关便是CTCGetAuthInfo
在这一步中我们需要获取CTCGetAuthInfo的入参
新建方法 cTCGetAuthInfo
直接复制postman生成的java代码
  1. OkHttpClient client = new OkHttpClient().newBuilder()
  2.   .build();
  3. MediaType mediaType = MediaType.parse("text/plain");
  4. RequestBody body = RequestBody.create(mediaType, "");
  5. Request request = new Request.Builder()
  6.   .url("http://itv.jsinfo.net:8298/auth?UserID=xxxxx&Action=Login&Mode=MENU")
  7.   .method("GET", body)
  8.   .addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
  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-Encoding", "gzip,deflate")
  11.   .addHeader("Accept-Language", "zh-cn,en-us,en")
  12.   .build();
  13. Response response = client.newCall(request).execute();
复制代码
在获取到报文返回值之后,利用正则表达式提取CTCGetAuthInfo
  1. String body = response.body().string();
  2.         Pattern authinfoPattern = Pattern.compile("CTCGetAuthInfo\\('(\\d*)'\\)");
  3.         Matcher authinfoMatch = authinfoPattern.matcher(body);
  4.         authinfoMatch.find();
  5.         String authinfo = authinfoMatch.group(1);
  6.         if (StringUtils.isNotEmpty(authinfo)) {
  7.             return authinfo;
  8.         }
复制代码
在获取到值authinfo之后进行返回

步骤5
在获取到authinfo之后,便开始对“任意8位$CTCGetAuthInfo入参$iptv账号$序列号$ip地址$mac地址$$CTC”进行加密
这里出现了另一个问题,程序无法实时获取openwrt iptv口的ip
解决方法如下
利用openwrt的cgi接口获取
1.通过xshell连接openwrt
2.切换到/www/cgi-bin
3.新建文件iptvip

4.chmod+x
5.在文件中写入如下内容(ucode为openwrt22.03之后导入的新工具,22.03之前版本的openwrt请使用lua或其他工具实现)
  1. #!/usr/bin/env ucode

  2. 'use strict';
  3. import * as fs from 'fs';
  4. let fp = fs.popen('ubus call network.interface.iptv status | grep \'"address"\: "\' | grep -oE \'([0-9]{1,3}.){3}.[0-9]{1,3}\'');
  5. let iptvip = fp.read("all");
  6. print("Content-type: text/html\n\n");
  7. print(iptvip);
复制代码
6.保存,访问http://路由器地址/cgi-bin/iptvip 返回值即为iptv口的ip
下面我们回到加密
新建方法setAuthenticator
插入如下代码
  1. String ip = getIp();
  2. String authInfo = cTCGetAuthInfo();
  3. String str = "随机6位数$" + authInfo + "$" + userId + "$" + stbId + "$" + ip + "$" + mac + "$$CTC";
  4. byte[] result = encrypt(str.getBytes(), password);
  5. System.out.println("加密后:----" );
  6. System.out.println("加密后:----" + new String(byteToHex(result).toUpperCase()));
  7. Authenticator = new String(byteToHex(result).toUpperCase());
复制代码
getIp方法为http://路由器地址/cgi-bin/iptvip返回的ip值采集方法 这里不再详细展开 请自行利用postman生成的java代码实现
我们对encrypt方法进行展开描述
  1. static byte[] encrypt(byte[] datasource, String password) {
  2.         try {
  3.             DESKeySpec desKey = new DESKeySpec(password.getBytes());
  4.             // 创建一个密匙工厂,然后用它把DESKeySpec转换成
  5.             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
  6.             SecretKey securekey = keyFactory.generateSecret(desKey);
  7.             // Cipher对象实际完成加密操作
  8.             Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
  9.             // 用密匙初始化Cipher对象
  10.             cipher.init(Cipher.ENCRYPT_MODE, securekey);
  11.             // 现在,获取数据并加密
  12.             // 正式执行加密操作
  13.             return cipher.doFinal(datasource);
  14.         } catch (Throwable e) {
  15.             e.printStackTrace();
  16.         }
  17.         return null;
  18.     }
复制代码
password为机顶盒密码 参考上一个帖子
最后的Authenticator赋值之前请将加密的byte数组转换为hex之后再转换为大写,实现方法请自行谷歌或百度搜索
在获取到Authenticator之后,即可请求uploadAuthInfo以获取usertoken
实现方法如cTCGetAuthInfo方法,先获取报文后,直接提取报文header中的Set-Cookie字段即可,不再赘述。


步骤6
JSESSIONID获取(setJSESSIONID方法)
1.请求getServiceList,利用正则提取返回报文body中的UserGroupNMB url值。
2.请求UserGroupNMB url,利用正则提取返回报文body中的loadbalance url值。
3.请求loadbalance url,直接提取返回报文head中的X-Frame-Sessionid值。
实现方法如cTCGetAuthInfo,不再赘述。

步骤七
新建iptvAuth方法
1.调用setAuthenticator设置usertoken
2.调用setJSESSIONID设置JSESSIONID
3.访问3个直播认证url完成认证
/iptvepg/function/funcportalauth.jsp
/iptvepg/function/frameset_judger.jsp
/iptvepg/function/frameset_builder.jsp

实现方法如cTCGetAuthInfo,不再赘述。


步骤八
新建huikan方法
1.访问huikan_detail
2.

访问get_channel_tvod_data
存储返回报文的body


步骤9
继承java/com/github/catvod/crawler/Spider.java
重写首页数据内容生成方法homeContent
1.调用huikan方法获取频道数据并转换成jsonarray对象 channelJson
2.遍历channelJson
  1. for(int i = 0;i < channelJson.length(); i++) {
  2.                String channelName = channelJson.getJSONObject(i).get("name").toString();
  3.                String channelId = channelJson.getJSONObject(i).get("chanid").toString();
  4.                JSONObject jsonObject = new JSONObject();
  5.                jsonObject.put("vod_id", channelId);
  6.                jsonObject.put("vod_name", channelName);
  7.                jsonObject.put("vod_pic", "");
  8.                jsonObject.put("vod_remarks", "");
  9.                classes.put(jsonObject);
  10.            }
  11.            JSONObject result = new JSONObject();
  12.             JSONObject jsonObject1 = new JSONObject();
  13.             jsonObject1.put("type_id", "efef");
  14.             jsonObject1.put("type_name", "test");
  15.             JSONArray videos = new JSONArray();
  16.             videos.put(jsonObject1);
  17.             result.put("class", videos);
  18.             if (filter) {
  19. //                result.put("filters", filterConfig);
  20.             }
  21.             result.put("list", classes);
  22.             return result.toString();
复制代码
这里我们设置vod_id和vod_name即可,分别代表channelJson中的chanid和name
特别注意的是 我们要在class标签下设置一个空的对象以避免首页数据不显示
在这个方法写完之后
我们即可进行第一次打包
打包完成后注意将md5也复制到spider值中
sites值如以下示例所示
  1. "sites": [
  2.         {
  3.             "key": "csp_JiangSutv",
  4.             "name": "江苏IPTV",
  5.             "type": 3,
  6.             "api": "csp_JiangSutv",
  7.             "searchable": 0,
  8.             "quickSearch": 0,
  9.             "filterable": 0
  10.         }
  11.     ],
复制代码
将json文件和jar包放置到网盘或个人网站或其他机顶盒可访问地址中
打开tvbox 设置源地址为你自己生成的json
示例使用了https://github.com/takagen99/Box 版tvbox
需要先进入设置界面 将推荐设置为站点推荐,关闭窗口预览
在以上设置完成后,你将解锁第一个成就 一个展示了所有可回看频道的首页 如下所示


下面我们进入详情页面的代码编写
我们需要重写spider的detailContent方法
  1. String currentChannel = ids.get(0);
  2.             String currentChannelName = "";
  3.             for (int i = 0; i < channelInfo.length(); i++) {
  4.                 if (channelInfo.getJSONObject(i).get("chanid").toString().equals(currentChannel)) {
  5.                     currentChannelName = channelInfo.getJSONObject(i).get("name").toString();
  6.                 }
  7.             }
  8.             vodList.put("vod_id", currentChannel);
  9.             vodList.put("vod_name", currentChannelName);
  10.             vodList.put("vod_pic", "");
  11.             vodList.put("type_name", "");
  12.             vodList.put("vod_year", "");
  13.             vodList.put("vod_area", "");
  14.             vodList.put("vod_remarks", "");
  15.             vodList.put("vod_actor", "");
  16.             vodList.put("vod_director", "");
  17.             vodList.put("vod_content", "");
复制代码
1.从入参ids中获取当前用户所选择的频道id
2.遍历channelInfo,搜索获取id所对应的频道名currentChannelName

3.在vodlist中设置vod_id和vod_name,其他项置空
  1. Map<String, String> vod_play = new TreeMap<>();
  2.             for (int index = 0; index > -7; index--){
  3.                 OkHttpClient client = new OkHttpClient().newBuilder()
  4.                         .build();
  5.                 Request request = new Request.Builder()
  6.                         .url("http://180.100.93.38:33200/iptvepg/frame224/datas/get_tvod_programe_data.jsp?channelid="+currentChannel+"&index="+Integer.toString(index)+"&channelName="+ URLEncoder.encode(currentChannelName,"GB2312"))
  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/frame224/huikan_detail.jsp?mixno=001")
  11.                         .addHeader("Accept-Encoding", "gzip,deflate")
  12.                         .addHeader("Accept-Language", "zh-cn,en-us,en")
  13.                         .addHeader("Cookie", "JSESSIONID=" + JSESSIONID)
  14.                         .build();
  15.                 Response response = client.newCall(request).execute();
  16.                 String pgString = response.body().string();
  17.                 JSONArray pgJson = new JSONArray(pgString);
  18.                 String playList = "";
  19.                 List<String> vodItems = new ArrayList<>();
  20.                 for(int i = 0;i < pgJson.length() - 1; i++) {
  21.                     if (pgJson.getJSONObject(i).get("Playable").toString().equals("false")) {
  22.                         continue;
  23.                     }
  24.                     String vodId = pgJson.getJSONObject(i).get("ContentId").toString() +
  25.                             "|" +
  26.                             currentChannel +
  27.                             "|" +
  28.                             currentChannelName +
  29.                             "|" +
  30.                             pgJson.getJSONObject(i).get("StartTime").toString() +
  31.                             "|" +
  32.                             pgJson.getJSONObject(i).get("EndTime").toString();
  33.                     String vodName = pgJson.getJSONObject(i).get("ProgramName").toString();
  34.                     vodItems.add(vodName + "$" + vodId);
  35.                 }

  36.                 if (vodItems.size() > 0)
  37.                     playList = String.join("#", vodItems);

  38.                 Calendar calendar = Calendar.getInstance();
  39.                 calendar.add(Calendar.DATE, index);
  40.                 vod_play.put((calendar.get(Calendar.MONTH) + 1) + "-" + calendar.get(Calendar.DAY_OF_MONTH), playList);
  41.             }
  42.             if (vod_play.size() > 0) {
  43.                 String vod_play_from = String.join("$$$", vod_play.keySet());
  44.                 String vod_play_url = String.join("$$$", vod_play.values());
  45.                 vodList.put("vod_play_from", vod_play_from);
  46.                 vodList.put("vod_play_url", vod_play_url);
  47.             }
复制代码
4.遍历0到-6 对应七天回放
5.此处注意对currentChannelName进行GB2312格式的url编码以转换中文频道名,如江苏卫视HD
6.在设置vodId时,需要将频道名currentChannelName ,开始时间StartTime,结束时间endtime也一并拼接赋值,方便后面播放视频接口调用。
7.vod_play的键值设置为当前日历值减去index,以显示几月几号的节目。
这一步完成之后进行打包,上传jar,改md5
完成之后,你将解锁第2个成就 一个展示了用户所选频道7天内所有节目的页面,切换日期来查看当天节目表 如下所示


下面我们进入视频播放的编写
重写spider的playcontent方法
  1. JSONObject result = new JSONObject();
  2.             String[] idas = id.split("\\|");
  3.             String channelID = idas[1];
  4.             String contentId = idas[0];
  5.             String channelName = idas[2];
  6.             String stime = idas[3];
  7.             String etime = idas[4];
  8.             OkHttpClient client = new OkHttpClient().newBuilder()
  9.                     .build();
  10.             Request request = new Request.Builder()
  11.                     .url("http://180.100.93.38:33200/iptvepg/frame224/get_tvod_url.jsp?contentId="+contentId+"&channelId="+channelID+"&stime=undefined&adPositionId=undefined")
  12.                     .get()
  13.                     .addHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; SkyworthBrowser) AppleWebKit/534.24 (KHTML, like Gecko) Safari/534.24 SkWebKit-JS-CTC")
  14.                     .addHeader("Accept", "*/*")
  15.                     .addHeader("Referer", "180.100.93.38:33200/iptvepg/frame224/channel_tvod_play.jsp?columnid=01&channelid="+channelID+"&index=-1&contentid="+contentId+"&stime="+stime+"&playtype=tvodplay&etime="+etime+"&channelname="+URLEncoder.encode(channelName,"GB2312"))
  16.                     .addHeader("Accept-Encoding", "gzip,deflate")
  17.                     .addHeader("Accept-Language", "zh-cn,en-us,en")
  18.                     .addHeader("Cookie", "JSESSIONID="+JSESSIONID)
  19.                     .build();
  20.             Response response = client.newCall(request).execute();
  21.             String body = response.body().string();
  22.             Pattern tvodUrlPattern = Pattern.compile(""tvodUrl":"(.*)","orderParam");
  23.             Matcher tvodUrlMatch = tvodUrlPattern.matcher(body);
  24.             tvodUrlMatch.find();
  25.             String tvodUrl = tvodUrlMatch.group(1);
  26.             result.put("parse", "");
  27.             result.put("playUrl", tvodUrl);
  28.             result.put("url","");
  29.             result.put("header", "");
  30.             return result.toString();
复制代码
1.剥离入参id,以获得频道名,开始时间,结束时间
2.这里同样注意将频道名进行GB2312编码
3.利用正则表达式剥离播放rtsp链接
这一步即为最后一步,打包完成部署后。
你将解锁终极成就,在自建平台上观看江苏电信iptv 7天内的任意频道的任意节目 即点即看 自动完成认证 获取认证后的回看url













本帖子中包含更多资源

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

×

评分

参与人数 4恩山币 +5 收起 理由
onlyangli + 1 面对这种帖子,我内心复杂,真不知道说什么 ...
slayers510 + 1 技术贴,支持
aska_cn + 1 难得纯技术贴,拜读推荐!
lucktu + 2 不错,纯纯的技术贴啊!!

查看全部评分

只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
发表于 2023-12-3 17:28 | 显示全部楼层
本帖最后由 Maike1024 于 2023-12-3 17:32 编辑

你这样看太累了,江苏移动源放在DIYP播放器直接时移回看
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-12-3 17:31 | 显示全部楼层

你这样看太累了,江苏移动源放在DIYP播放器直接时移回看

本帖最后由 Maike1024 于 2023-12-3 17:32 编辑


只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-12-3 19:42 来自手机 | 显示全部楼层
猫直播里不是直接可以回看吗?干嘛要这样另外写爬虫?还有可不可以去https://github.com/FongMi/CatVodSpider提交下代码。
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-12-3 20:39 | 显示全部楼层
半年前我也求过江苏电信IPTV回看和时移,今日见识到了整个项目的复杂性,不过已经用别的方案代替了,恩山有这样精彩帖子实在难得!

点评

能讲讲啥啥种别的方案?  发表于 2023-12-25 15:16
!!! 还有其他办法么?  详情 回复 发表于 2023-12-25 14:35
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-12-4 08:09 | 显示全部楼层
思考一下
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-12-4 12:31 | 显示全部楼层
楼主厉害,这是自己做了一个iptv软终端啊。

江苏电信的iptv软终端
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-12-4 13:56 | 显示全部楼层
干货,可惜看不懂。
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-12-4 14:06 | 显示全部楼层
教程很好思考思考
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-12-5 14:34 | 显示全部楼层
技术贴啊,支持下楼主
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-12-7 00:37 来自手机 | 显示全部楼层
论坛就是有一点不好,像这种贴,应该上热门,设精,哪怕是限时精品帖,人家搞技术的不喜欢藏着掖着,若是加隐藏回复,回复基本是无效回复,根本不是来讨论问题的,也不利于坛友思考讨论。应该加个推荐或顶的按钮,让坛友给推荐上热门
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-12-20 13:49 | 显示全部楼层
大神很牛
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-12-21 07:32 | 显示全部楼层
奔驰的小野马 发表于 2023-12-3 20:39
半年前我也求过江苏电信IPTV回看和时移,今日见识到了整个项目的复杂性,不过已经用别的方案代替了,恩山有 ...

什么方案
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-12-24 20:09 来自手机 | 显示全部楼层
折腾了两天折腾完了,其实不需要去获取ip,随便用一个ip都能验证过去

点评

家里是江苏电信宽带,没开iptv,能看电信直播吗?主路由新3潘多拉系统,电视通过无线中继或者wifi直接接主路由  详情 回复 发表于 2024-1-19 13:49
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

发表于 2023-12-25 14:35 | 显示全部楼层
奔驰的小野马 发表于 2023-12-3 20:39
半年前我也求过江苏电信IPTV回看和时移,今日见识到了整个项目的复杂性,不过已经用别的方案代替了,恩山有 ...

!!! 还有其他办法么?
只谈技术、莫论政事!(点击见详情) | 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

欢迎大家光临恩山无线论坛

只谈技术、莫论政事!切勿转播谣言!为了你也为了他人。
只谈技术、莫论政事!(点击见详情) 切记不要随意传播谣言,把自己的日子过安稳了就行,为了自己好也为了大家好。 恩山无线论坛欢迎您的来访,请互相尊重、友善交流,建议保持一颗平常心看待网友的评论,切勿过度反应。

查看 »

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

GMT+8, 2025-6-3 00:43

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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

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