├── src ├── requirements.txt ├── plus │ ├── tool.py │ └── usage1.py ├── main.py └── common │ ├── util │ ├── ky_requests.py │ └── ky_jsons.py │ ├── download │ └── ky_download.py │ └── lib │ └── ky_cctalk.py ├── .gitignore ├── images ├── image-20221020150603578.png └── image-20221020152719338.png └── readme.md /src/requirements.txt: -------------------------------------------------------------------------------- 1 | jsonpath==0.82 2 | requests==2.28.1 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # pycharm 2 | /**/.idea/* 3 | /**/data/* 4 | 5 | # python_temp_files 6 | /**/__pycache__/* -------------------------------------------------------------------------------- /images/image-20221020150603578.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/here200/CCTalk-Video-Download-Extension/HEAD/images/image-20221020150603578.png -------------------------------------------------------------------------------- /images/image-20221020152719338.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/here200/CCTalk-Video-Download-Extension/HEAD/images/image-20221020152719338.png -------------------------------------------------------------------------------- /src/plus/tool.py: -------------------------------------------------------------------------------- 1 | # 打印容器里面的数据 2 | def print_container_elements(container): 3 | for el in container: 4 | print(el) 5 | print() 6 | -------------------------------------------------------------------------------- /src/main.py: -------------------------------------------------------------------------------- 1 | from plus import usage1 2 | 3 | if __name__ == '__main__': 4 | # 第一种使用方法 5 | movie_list1 = usage1.get_by_course_id('1612582780690810') 6 | # usage1.download(movie_list1, 26) 7 | 8 | # 第二种使用方法 9 | # movie_list2 = usage1.get_by_movie_id('16433005891810') 10 | # usage1.download(movie_list2, seq=False) 11 | -------------------------------------------------------------------------------- /src/common/util/ky_requests.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | _headers = { 4 | "User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)", 5 | # 有些视频需要购买才能观看,登录CCTalk后,把cookies复制到这里 6 | # 解除权限的限制 7 | "cookie": "" 8 | } 9 | 10 | 11 | def get(url, params=None): 12 | return requests.get(headers=_headers, url=url, params=params) 13 | 14 | 15 | def decode_response(response): 16 | return response.content.decode() 17 | -------------------------------------------------------------------------------- /src/common/util/ky_jsons.py: -------------------------------------------------------------------------------- 1 | import json 2 | import jsonpath 3 | 4 | cache = None 5 | 6 | 7 | def json_string2python_object(json_string): 8 | return json.loads(json_string) 9 | 10 | 11 | def python_object2json_string(python_object): 12 | return json.dumps(python_object, ensure_ascii=False) 13 | 14 | 15 | def get_data(expression, obj=None): 16 | if obj is None: 17 | obj = cache 18 | return jsonpath.jsonpath(obj, expression) 19 | 20 | 21 | def get_one_data(expression, obj=None): 22 | return get_data(expression, obj)[0] 23 | 24 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # CCTalk-Video-Download-Extension 2 | 3 | 原项目:[here200/CCTalk-Video-Download: Cctalk视频下载工具 (github.com)](https://github.com/here200/CCTalk-Video-Download) 4 | 5 | 6 | 7 | 新项目的特点 8 | 9 | - 采用模块化的方式进行管理 10 | - 更加易于使用。 11 | - 大部分功能都已经写好了,只需要简单的修改一下参数。 12 | 13 | 相较于原来的项目,新添加的功能 14 | 15 | 1. 默认会给每个下载的视频添加序号【可选,也可以不添加】 16 | 2. 已经下载过的视频,不会重新下载【会直接跳过,避免重复下载视频】 17 | 3. 不再需要手动添加 `./data/` 文件夹。 18 | 19 | 20 | 21 | ### 图片(仅供参考,以实际情况为准) 22 | 23 | ![image-20221020150603578](images/image-20221020150603578.png) 24 | 25 | ![image-20221020152719338](images/image-20221020152719338.png) -------------------------------------------------------------------------------- /src/common/download/ky_download.py: -------------------------------------------------------------------------------- 1 | from common.util import ky_requests 2 | import os 3 | 4 | 5 | def download_movie(movie_list, index=0): 6 | movie = movie_list[index] 7 | # 判断url是否存在 8 | download_url = movie['url'] 9 | if download_url is None or len(download_url) == 0: 10 | return 11 | # 创建文件夹(./data/) 12 | if not os.path.exists('./data/'): 13 | os.mkdir('./data/') 14 | # 拼接文件路径 15 | file_path = './data/' + movie['title'] 16 | # 判断文件是否存在,存在就不下载 17 | if os.path.exists(file_path): 18 | print('>--- 该文件已经存在,不进行下载操作 ---<') 19 | return 20 | 21 | # 一切就绪,开始下载 22 | response = ky_requests.get(url=download_url) 23 | with open(file_path, 'wb') as f: 24 | f.write(response.content) 25 | # 下载完成提示 26 | print(movie['title'] + ' 已经下载完成 --------') 27 | -------------------------------------------------------------------------------- /src/plus/usage1.py: -------------------------------------------------------------------------------- 1 | from common.lib import ky_cctalk 2 | from common.download import ky_download 3 | from plus import tool 4 | 5 | 6 | def download(movie_list, index=0, seq=True): 7 | # 添加序号 8 | if seq: 9 | movie = movie_list[index] 10 | movie['title'] = str(index + 1) + '_' + movie['title'] 11 | # 下载视频 12 | ky_download.download_movie(movie_list, index) 13 | 14 | 15 | # 根据课程系列号,获取所有的视频信息 16 | def get_by_course_id(series_id): 17 | movie_list = [] 18 | # 获取课程的所有视频id 19 | movie_ids = ky_cctalk.get_movie_ids(series_id) 20 | # 获取所有视频id下的标题和链接 21 | for movie_id in movie_ids: 22 | ky_cctalk.get_title_href(movie_id, movie_list) 23 | tool.print_container_elements(movie_list) 24 | return movie_list 25 | 26 | 27 | # 根据单个视频id,获取单个视频信息 28 | def get_by_movie_id(movie_id): 29 | movie_list = [] 30 | ky_cctalk.get_title_href(movie_id, movie_list) 31 | tool.print_container_elements(movie_list) 32 | return movie_list 33 | -------------------------------------------------------------------------------- /src/common/lib/ky_cctalk.py: -------------------------------------------------------------------------------- 1 | from common.util import ky_requests, ky_jsons 2 | 3 | 4 | # 根据课程id, 获取课程里边所有的视频id 5 | def get_movie_ids(series_id): 6 | url = 'https://www.cctalk.com/webapi/content/v1.2/series/all_lesson_list' 7 | params = { 8 | 'seriesId': series_id 9 | } 10 | tmp = ky_requests.decode_response(ky_requests.get(url=url, params=params)) 11 | ky_jsons.cache = ky_jsons.json_string2python_object(tmp) 12 | # 解析数据,获取每个视频的id号 13 | return ky_jsons.get_data('$..items..contentId') 14 | 15 | 16 | # 根据单个movie_id,获取里边的标题和链接,将其存放在movie_list里 17 | def get_title_href(movie_id, movie_list): 18 | url = 'https://www.cctalk.com/webapi/content/v1.1/video/detail' 19 | params = { 20 | 'videoId': movie_id 21 | } 22 | tmp = ky_requests.decode_response(ky_requests.get(url=url, params=params)) 23 | ky_jsons.cache = ky_jsons.json_string2python_object(tmp) 24 | movie_title = ky_jsons.get_one_data('$..videoName') + '.mp4' 25 | movie_href = ky_jsons.get_one_data('$..videoUrl') 26 | # 保存视频信息 27 | movie_list.append({"index": len(movie_list), "title": movie_title, "url": movie_href}) 28 | --------------------------------------------------------------------------------