liuyuqi-dellpc 1 year ago
parent
commit
1b0648ff47
8 changed files with 165 additions and 15 deletions
  1. 17 0
      README.md
  2. 1 1
      config/config.json
  3. 1 1
      crawl_ouchn/api.py
  4. 7 9
      crawl_ouchn/crawl_ouchn.py
  5. 9 0
      docs/Develop.md
  6. 107 3
      le.ouchn.cn.http
  7. 5 1
      requirements.txt
  8. 18 0
      test/jwt_login.py

+ 17 - 0
README.md

@@ -2,5 +2,22 @@
 
 ["国家开放大学终身教育平台"](http://le.ouchn.cn/)课程视频批量下载
 
+## Usage
 
+1. Configure `config/config.json` file add some url which you want to download video.
 
+```
+  "courseUrl": [
+    "http://le.ouchn.cn/#/courseDetails/CAAA010000023530"
+  ]
+```
+
+2. run it xx.exe
+
+3. downloading some lesson video need to login, So please configure `config/config.json` file `username` and `messageCode`  
+
+
+
+## Development
+
+please read [Develop](./docs/Develop.md)

+ 1 - 1
config/config.json

@@ -1,6 +1,6 @@
 {
   "username": "15016215661",
-  "password": "123456",
+  "messageCode": "123456",
   "courseUrl": [
     "http://le.ouchn.cn/#/courseDetails/CAAA010000023530"
   ]

+ 1 - 1
crawl_ouchn/api.py

@@ -4,7 +4,7 @@
 @Contact :   liuyuqi.gov@msn.cn
 @Time    :   2022/05/23 14:49:22
 @License :   Copyright © 2017-2022 liuyuqi. All Rights Reserved.
-@Desc    :   
+@Desc    :   API interface for ouchn.
 '''
 
 _host = r"http://le.ouchn.cn"

+ 7 - 9
crawl_ouchn/crawl_ouchn.py

@@ -4,7 +4,7 @@
 @Contact :   liuyuqi.gov@msn.cn
 @Time    :   2022/05/23 13:15:38
 @License :   Copyright © 2017-2022 liuyuqi. All Rights Reserved.
-@Desc    :   批量下载
+@Desc    :   Muti-threads crawler for ouchn.
 '''
 from multiprocessing import pool
 import requests
@@ -17,7 +17,6 @@ from contextlib import closing
 from crawl_ouchn import DownloadProgress, api, user_agent
 from concurrent.futures import ThreadPoolExecutor
 
-
 class CrawlOuchn():
 
     def __init__(self, configPath=r'config/config.json'):
@@ -31,7 +30,7 @@ class CrawlOuchn():
 
     def getCode(self, phone):
         '''
-        获取验证码
+        get verify code
         '''
         data={}
         res=self.sess.get("url", data=data, headers=user_agent.getheaders())
@@ -52,22 +51,20 @@ class CrawlOuchn():
     def getCommonVideoLinks(self, url):
         jsonData = self.sess.get(
             url=api.getCommonVideoList % (str.split(url, r'/')[-1]), headers=user_agent.getheaders())
-        print(jsonData.text)
         res = json.loads(jsonData.text)
         if(res["State"] == False):
             logging.debug(res["Message"])
-
         else:
-            logging.debug(res["Data"]["Modules"][0]["Title"])
+            logging.info(res["Data"]["Modules"][0]["Title"])
             logging.debug(res["Data"]["Url"])
         link = []
         return link
 
     def downloadVideo(self, url, fileName):
         '''
-        下载视频
-        :param url: 下载url路径
-        :return: 文件
+        download video
+        :param url: download url
+        :return: fileName
         '''
         with closing(requests.get(url=url, stream=True)) as response:
             chunk_size = 1024
@@ -86,6 +83,7 @@ class CrawlOuchn():
 
     def crawl(self):
         """
+        crawl ouchn website
         param :
         return:
         """

+ 9 - 0
docs/Develop.md

@@ -0,0 +1,9 @@
+## Development
+
+```
+venv .venv
+activate
+
+pip install -r requirements.txt
+python main.py
+```

+ 107 - 3
le.ouchn.cn.http

@@ -7,12 +7,116 @@
 @createdAt = {{$datetime iso8601}}
 @useragent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
 @accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
-@uid=10022
-@token=d627520092e04f958fa2f4a72ecb6170
 @course=CAAA010000023530
 
-### 获取配置
+### 00
 GET {{api}}/Course/{{course}}/MicroCourse/Details
 # GET {{api}}/checkApiParams.php?service=Home.getConfig
 User-Agent: {{useragent}}
 Accept-Language: en-GB,en-US;q=0.8,en;q=0.6,zh-CN;q=0.4
+
+### 登录准备
+GET http://passport.le.ouchn.cn/.well-known/openid-configuration
+Host: passport.le.ouchn.cn
+Connection: keep-alive
+User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53
+DNT: 1
+Accept: */*
+Origin: http://le.ouchn.cn
+Referer: http://le.ouchn.cn/
+Accept-Encoding: gzip, deflate
+Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
+
+###   http://passport.le.ouchn.cn/.well-known/openid-configuration/jwks
+
+###
+GET http://passport.le.ouchn.cn/.well-known/openid-configuration/jwks
+
+
+### 跳转
+GET http://passport.le.ouchn.cn/connect/authorize
+?client_id=le
+&redirect_uri=http%3A%2F%2Fle.ouchn.cn%2F%23%2Fsignin-oidc%23
+&response_type=id_token%20token
+&scope=openid%20leuser%20leportalapi%20profile%20PortalAPI
+&state=9fbd1ab353bb41a3bfd38e9d3095c1ae
+&nonce=0a04e33e16984f8cafcf3d770fa60322
+Host: passport.le.ouchn.cn
+Connection: keep-alive
+Upgrade-Insecure-Requests: 1
+DNT: 1
+User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53
+Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
+Referer: http://le.ouchn.cn/
+Accept-Encoding: gzip, deflate
+Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
+Cookie: .AspNetCore.Antiforgery.t2iuyDX03tY=CfDJ8J7esJS678tGnNfyJIKBVxMkvDmS3AYLNPii4f9a3S-bPR0NmO3z50ovLZbpkyUQEmiv8yRwtSOeHM2FwseSo4OjpBOTZ0TzOk7_YFXjodyH76DCdfvdpeoWLZBO-KbOihql2t7XisS1sTwsJKpsRYE; idsrv=CfDJ8J7esJS678tGnNfyJIKBVxMVgPDfrwwW1Ta0i96b3K7aH-SbCj39yvYi7SPn1oJy59y7_TlbUyhKQSUfz7AcvK7i05_0ML-7BmaS1ouEdPs_o2XA57DeKxtFKsTonKDIbD0RpUMK3V8LyZldi8pjL95scISRYdsRkGh7mEf_bOCX-Bh59JctRSc-0jdCQLHGnSoP7srFHnCSXaYENbCQ9uoMBUm_wTFF-i7HA7bV8oE7hGxokoKA6XGB7UIQJyhTLGTSalrDtdioa4bH8SEYd8Hfd1oauqY964I0IhEuEmLs7WDlg_ONq_OKaFx21GF8vjoAgJDnT9dRIguNs5WAl6XikoZFAzQRm6kiGhJtdyZFYFyKhHtfglm5bSXMvUs5VhnUVGZSX8vEOjS3tGJVKVduDRpAjKTDliHjTi2aJYE4KXF6KIx5Zf5atIVaoY0TWkMEiIvA5zcXPItzRihCBfMyKh4blsAa2vzWgos2o1_kCgZdvrDXR-bhfGVCsrWJ3bxswNn_D8oGVsmWtwJc-3CHLezn5sn74gbga06UQZ6Z3mYJ9TbpSJGDcviaS2MLunG3QBN66ZhyKcmQZaXZu43pYfMkHj8Udv5h9G3Ju5cjwwAG2vFPE2F3tqBdltWps5yj9R6qqTIyEMUySd2SuN_TGXJvQczkUmYjjShxnzJfgCHvh3cp_arGqK42uJDxsjPfKRljmRR1lx9I9QHUvPIMYkd5gWAWsJlLJEZiFxNOA_Df779jme2EkC3L8Gor7u8ASKgHqW32YOdZArNnYZ6YIFMC4R8KW4MVqTsI_PsEsWM782OT0nv_7Sw2m-o637RKO7cM524fKmD6KCCXM-0TGmfAj-uuoWBZ8hcytVkI-MdcBk2lGqM1whbn1TbzsRFSbvH_n0L9Y_rsdwHs8hB7UumbfyqSODTi_mDaLon8; Hm_lvt_ee7c8541e52cf185ce86916f1db0bcdf=1653288666; Hm_lpvt_ee7c8541e52cf185ce86916f1db0bcdf=1653355353
+
+### 登录页面
+GET http://passport.le.ouchn.cn/Account/Login
+?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3Dle%26redirect_uri%3Dhttp%253A%252F%252Fle.ouchn.cn%252F%2523%252Fsignin-oidc%2523%26response_type%3Did_token%2520token%26scope%3Dopenid%2520leuser%2520leportalapi%2520profile%2520PortalAPI%26state%3D9fbd1ab353bb41a3bfd38e9d3095c1ae%26nonce%3D0a04e33e16984f8cafcf3d770fa60322
+Host: passport.le.ouchn.cn
+Connection: keep-alive
+Upgrade-Insecure-Requests: 1
+DNT: 1
+User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53
+Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
+Referer: http://le.ouchn.cn/
+Accept-Encoding: gzip, deflate
+Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
+Cookie: .AspNetCore.Antiforgery.t2iuyDX03tY=CfDJ8J7esJS678tGnNfyJIKBVxMkvDmS3AYLNPii4f9a3S-bPR0NmO3z50ovLZbpkyUQEmiv8yRwtSOeHM2FwseSo4OjpBOTZ0TzOk7_YFXjodyH76DCdfvdpeoWLZBO-KbOihql2t7XisS1sTwsJKpsRYE; idsrv=CfDJ8J7esJS678tGnNfyJIKBVxMVgPDfrwwW1Ta0i96b3K7aH-SbCj39yvYi7SPn1oJy59y7_TlbUyhKQSUfz7AcvK7i05_0ML-7BmaS1ouEdPs_o2XA57DeKxtFKsTonKDIbD0RpUMK3V8LyZldi8pjL95scISRYdsRkGh7mEf_bOCX-Bh59JctRSc-0jdCQLHGnSoP7srFHnCSXaYENbCQ9uoMBUm_wTFF-i7HA7bV8oE7hGxokoKA6XGB7UIQJyhTLGTSalrDtdioa4bH8SEYd8Hfd1oauqY964I0IhEuEmLs7WDlg_ONq_OKaFx21GF8vjoAgJDnT9dRIguNs5WAl6XikoZFAzQRm6kiGhJtdyZFYFyKhHtfglm5bSXMvUs5VhnUVGZSX8vEOjS3tGJVKVduDRpAjKTDliHjTi2aJYE4KXF6KIx5Zf5atIVaoY0TWkMEiIvA5zcXPItzRihCBfMyKh4blsAa2vzWgos2o1_kCgZdvrDXR-bhfGVCsrWJ3bxswNn_D8oGVsmWtwJc-3CHLezn5sn74gbga06UQZ6Z3mYJ9TbpSJGDcviaS2MLunG3QBN66ZhyKcmQZaXZu43pYfMkHj8Udv5h9G3Ju5cjwwAG2vFPE2F3tqBdltWps5yj9R6qqTIyEMUySd2SuN_TGXJvQczkUmYjjShxnzJfgCHvh3cp_arGqK42uJDxsjPfKRljmRR1lx9I9QHUvPIMYkd5gWAWsJlLJEZiFxNOA_Df779jme2EkC3L8Gor7u8ASKgHqW32YOdZArNnYZ6YIFMC4R8KW4MVqTsI_PsEsWM782OT0nv_7Sw2m-o637RKO7cM524fKmD6KCCXM-0TGmfAj-uuoWBZ8hcytVkI-MdcBk2lGqM1whbn1TbzsRFSbvH_n0L9Y_rsdwHs8hB7UumbfyqSODTi_mDaLon8; Hm_lvt_ee7c8541e52cf185ce86916f1db0bcdf=1653288666; Hm_lpvt_ee7c8541e52cf185ce86916f1db0bcdf=1653355353
+
+### 发送验证码
+POST http://passport.le.ouchn.cn/Account/SendLoginCode HTTP/1.1
+Host: passport.le.ouchn.cn
+Connection: keep-alive
+Content-Length: 23
+Accept: */*
+DNT: 1
+X-Requested-With: XMLHttpRequest
+User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53
+Content-Type: application/x-www-form-urlencoded; charset=UTF-8
+Origin: http://passport.le.ouchn.cn
+Accept-Encoding: gzip, deflate
+Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
+Cookie: .AspNetCore.Antiforgery.t2iuyDX03tY=CfDJ8J7esJS678tGnNfyJIKBVxMkvDmS3AYLNPii4f9a3S-bPR0NmO3z50ovLZbpkyUQEmiv8yRwtSOeHM2FwseSo4OjpBOTZ0TzOk7_YFXjodyH76DCdfvdpeoWLZBO-KbOihql2t7XisS1sTwsJKpsRYE; idsrv=CfDJ8J7esJS678tGnNfyJIKBVxMVgPDfrwwW1Ta0i96b3K7aH-SbCj39yvYi7SPn1oJy59y7_TlbUyhKQSUfz7AcvK7i05_0ML-7BmaS1ouEdPs_o2XA57DeKxtFKsTonKDIbD0RpUMK3V8LyZldi8pjL95scISRYdsRkGh7mEf_bOCX-Bh59JctRSc-0jdCQLHGnSoP7srFHnCSXaYENbCQ9uoMBUm_wTFF-i7HA7bV8oE7hGxokoKA6XGB7UIQJyhTLGTSalrDtdioa4bH8SEYd8Hfd1oauqY964I0IhEuEmLs7WDlg_ONq_OKaFx21GF8vjoAgJDnT9dRIguNs5WAl6XikoZFAzQRm6kiGhJtdyZFYFyKhHtfglm5bSXMvUs5VhnUVGZSX8vEOjS3tGJVKVduDRpAjKTDliHjTi2aJYE4KXF6KIx5Zf5atIVaoY0TWkMEiIvA5zcXPItzRihCBfMyKh4blsAa2vzWgos2o1_kCgZdvrDXR-bhfGVCsrWJ3bxswNn_D8oGVsmWtwJc-3CHLezn5sn74gbga06UQZ6Z3mYJ9TbpSJGDcviaS2MLunG3QBN66ZhyKcmQZaXZu43pYfMkHj8Udv5h9G3Ju5cjwwAG2vFPE2F3tqBdltWps5yj9R6qqTIyEMUySd2SuN_TGXJvQczkUmYjjShxnzJfgCHvh3cp_arGqK42uJDxsjPfKRljmRR1lx9I9QHUvPIMYkd5gWAWsJlLJEZiFxNOA_Df779jme2EkC3L8Gor7u8ASKgHqW32YOdZArNnYZ6YIFMC4R8KW4MVqTsI_PsEsWM782OT0nv_7Sw2m-o637RKO7cM524fKmD6KCCXM-0TGmfAj-uuoWBZ8hcytVkI-MdcBk2lGqM1whbn1TbzsRFSbvH_n0L9Y_rsdwHs8hB7UumbfyqSODTi_mDaLon8; Hm_lvt_ee7c8541e52cf185ce86916f1db0bcdf=1653288666; Hm_lpvt_ee7c8541e52cf185ce86916f1db0bcdf=1653355353
+
+PhoneNumber=18516527440
+
+
+### 登录请求
+POST http://passport.le.ouchn.cn/Account/Login
+?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3Dle%26redirect_uri%3Dhttp%253A%252F%252Fle.ouchn.cn%252F%2523%252Fsignin-oidc%2523%26response_type%3Did_token%2520token%26scope%3Dopenid%2520leuser%2520leportalapi%2520profile%2520PortalAPI%26state%3D9fbd1ab353bb41a3bfd38e9d3095c1ae%26nonce%3D0a04e33e16984f8cafcf3d770fa60322
+Host: passport.le.ouchn.cn
+Connection: keep-alive
+Content-Length: 585
+Cache-Control: max-age=0
+Origin: null
+Upgrade-Insecure-Requests: 1
+DNT: 1
+Content-Type: application/x-www-form-urlencoded
+User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53
+Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
+Accept-Encoding: gzip, deflate
+Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
+Cookie: .AspNetCore.Antiforgery.t2iuyDX03tY=CfDJ8J7esJS678tGnNfyJIKBVxMkvDmS3AYLNPii4f9a3S-bPR0NmO3z50ovLZbpkyUQEmiv8yRwtSOeHM2FwseSo4OjpBOTZ0TzOk7_YFXjodyH76DCdfvdpeoWLZBO-KbOihql2t7XisS1sTwsJKpsRYE; idsrv=CfDJ8J7esJS678tGnNfyJIKBVxMVgPDfrwwW1Ta0i96b3K7aH-SbCj39yvYi7SPn1oJy59y7_TlbUyhKQSUfz7AcvK7i05_0ML-7BmaS1ouEdPs_o2XA57DeKxtFKsTonKDIbD0RpUMK3V8LyZldi8pjL95scISRYdsRkGh7mEf_bOCX-Bh59JctRSc-0jdCQLHGnSoP7srFHnCSXaYENbCQ9uoMBUm_wTFF-i7HA7bV8oE7hGxokoKA6XGB7UIQJyhTLGTSalrDtdioa4bH8SEYd8Hfd1oauqY964I0IhEuEmLs7WDlg_ONq_OKaFx21GF8vjoAgJDnT9dRIguNs5WAl6XikoZFAzQRm6kiGhJtdyZFYFyKhHtfglm5bSXMvUs5VhnUVGZSX8vEOjS3tGJVKVduDRpAjKTDliHjTi2aJYE4KXF6KIx5Zf5atIVaoY0TWkMEiIvA5zcXPItzRihCBfMyKh4blsAa2vzWgos2o1_kCgZdvrDXR-bhfGVCsrWJ3bxswNn_D8oGVsmWtwJc-3CHLezn5sn74gbga06UQZ6Z3mYJ9TbpSJGDcviaS2MLunG3QBN66ZhyKcmQZaXZu43pYfMkHj8Udv5h9G3Ju5cjwwAG2vFPE2F3tqBdltWps5yj9R6qqTIyEMUySd2SuN_TGXJvQczkUmYjjShxnzJfgCHvh3cp_arGqK42uJDxsjPfKRljmRR1lx9I9QHUvPIMYkd5gWAWsJlLJEZiFxNOA_Df779jme2EkC3L8Gor7u8ASKgHqW32YOdZArNnYZ6YIFMC4R8KW4MVqTsI_PsEsWM782OT0nv_7Sw2m-o637RKO7cM524fKmD6KCCXM-0TGmfAj-uuoWBZ8hcytVkI-MdcBk2lGqM1whbn1TbzsRFSbvH_n0L9Y_rsdwHs8hB7UumbfyqSODTi_mDaLon8; Hm_lvt_ee7c8541e52cf185ce86916f1db0bcdf=1653288666; Hm_lpvt_ee7c8541e52cf185ce86916f1db0bcdf=1653355353
+
+ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3Dle%26redirect_uri%3Dhttp%253A%252F%252Fle.ouchn.cn%252F%2523%252Fsignin-oidc%2523%26response_type%3Did_token%2520token%26scope%3Dopenid%2520leuser%2520leportalapi%2520profile%2520PortalAPI%26state%3D9fbd1ab353bb41a3bfd38e9d3095c1ae%26nonce%3D0a04e33e16984f8cafcf3d770fa60322
+&Mobile=18516527440
+&Code=911330
+&button=MobileLogin
+&__RequestVerificationToken=CfDJ8J7esJS678tGnNfyJIKBVxOU_c5jw2MqtHCXLRA3BbZ7Bf7IebRjQ2vdc7TWkYhn0nlOlN7FSfBC9SiCTagZwVjdjIKcD1cYCYB7QutZ9yTF3uRoX-OpOCnU6vxfz7dOX6PNGTVIeh-sz4WSgKB55hY
+&RememberLogin=false
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 5 - 1
requirements.txt

@@ -1 +1,5 @@
-requests
+requests
+pyjwt
+cryptography
+hug_middleware_cors
+

+ 18 - 0
test/jwt_login.py

@@ -0,0 +1,18 @@
+from cgi import test
+from email import header
+
+
+#!/usr/bin/env python
+# -*- encoding: utf-8 -*-
+'''
+@Contact :   liuyuqi.gov@msn.cn
+@Time    :   2022/05/24 11:50:01
+@License :   Copyright © 2017-2022 liuyuqi. All Rights Reserved.
+@Desc    :   identity server with jwt test
+'''
+
+import jwt
+from jwt.algorithms import get_default_algorithms
+
+if __name__=='__main__':
+    pass