基于浙江线上大学视频秒过分析
當代苦逼大學生,人在家中坐,課從天上來.沒辦法,想偷懶,于是就對目前在上的網課平臺進行了分析
嘿嘿 先來張效果圖:
好勒,廢話不多說,上主題
其實我們在看網課的時候,本地的網頁會通過ajax請求定時的發送當前所觀看的視頻秒數到服務器上,并記載,所以通過拉取本地的進度條是達不到秒過的效果的
額,因為已經刷好了,不知道為什么就沒發送了,不過這張圖也能表達意思,通過上面的參數可以發現,有courseId,chapterId,一個固定的server,正確的發送參數還應該有playtime,percent,最后一個是變化的time,
time后面的值看起來像一個時間
好了,既然知道發送ajax請求需要的是這些參數,那我們就來找找這些參數從哪里獲得的,service好說,固定的參數,我們不用管它,courseId和chapterId顧名思義,
像這種有代表性的參數,不是在查看該課程的首頁出現,就是在觀看具體某一章節出現,playtime是當前播放了多少時間,percent是根據當前播放的時間除以總時長的百分比,播放的單位是s,最后一個加密的time就顯得尤為重要了,我們要找到這個time是怎么實現的,很明顯
是通過js來生成的
因為提交的域名是https://www.zjooc.cn/ajax 后面加的就是上面說的4個參數,且是get的請求
通過對url的全局搜索
找到了對應time參數的js文件,可以看出time的關鍵點是一個叫做createAjaxTimestamp的函數調用,通過搜索,成功找到對應的加密函數
作者的js水平有限,就用python的來模擬js環境來執行對應的函數
通過這里,已經能實現單個視頻
那么如何實現批量化秒過呢,既然一個章節的視頻對應一個chapterId,那肯定可以通過對應的方法拿到所有的chapterId
通過在課程的首頁進行刷新,捕獲到一個ajax的數據包,對應的請求和響應數據如下
請求數據
響應數據
請求的參數也比較單一,courseId是根據不同的課程變化的,還有一個time的參數就是上文中寫到過的
這里的響應體就非常有價值了,里面對應了每個視頻的chapterId,名字,還有最重要的duration,在上面的介紹中肯定有小伙伴有疑問,我可以任意編造playtime,但是時長我不知道呀,怎么編寫對應的percent
嘿嘿,這時duration數據就非常重要啦,后文中我們可以通過duration來填寫playtime達到秒過的效果
因為里面的數據太多了,這里我就通過畫圖來描述一級菜單,二級菜單,三級菜單的結構圖
先給一張實物圖
額,手畫的草圖
響應體的數據大致就是這樣的菜單結構,再通過實現對應的邏輯,就可以拿到每一個視頻的chapterId和duration
這里就獻上本人low逼的代碼吧
# -*- coding: utf-8 -*-
# @Author : __will__
import time
import requests
import execjs
class Zjooc(object):
node = execjs.get()
url = 'https://www.zjooc.cn/ajax'
get_video_playing_server = '/learningmonitor/api/learning/monitor/videoPlaying'
get_pdf_finished_server = '/learningmonitor/api/learning/monitor/finishTextChapter'
get_student_course_server = '/jxxt/api/course/courseStudent/getStudentCourseChapters'
def __init__(self, course_id,cookie):
self.headers = {
'User-Agent': 'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14',
'Cookie': cookie
}
self.course_id = course_id
def get_student_course_info(self):
ctx = self.node.compile(open('zjooc.js').read())
ajax_time = ctx.eval('createTimesatamp(32)')
ts = ajax_time + str(int(time.time()) * 1000)
student_params = {
'time': ts,
'service': self.get_student_course_server,
'params[pageNo]': '1',
'params[courseId]': self.course_id,
'params[urlNeed]': '0'
}
course_info = requests.get(self.url,params=student_params,headers=self.headers).json()
return course_info
def parse_course_info(self):
data = self.get_student_course_info()
single_course_list = []
course_list = data['data']
# 獲取每個章節
for item in course_list:
# 獲取每個小章節的事件節點
chapter_node = item['children']
for i in chapter_node:
children_node = i['children']
for child in children_node:
course_dict = {}
course_dict['id'] = child['id']
course_dict['name'] = child['name']
course_dict['resourceType'] = child['resourceType']
if child['resourceType'] == 1:
course_dict['vedioTimeLength'] = child['vedioTimeLength']
single_course_list.append(course_dict)
return single_course_list
def run(self):
context = self.node.compile(open('zjooc.js').read())
single_course_list = self.parse_course_info()
for item in single_course_list:
ajax_time = context.eval('createTimesatamp(32)')
ts = ajax_time + str(int(time.time())+ 600) + '000'
if item['resourceType'] == 1:
video_params = {
'time': ts,
'service': self.get_video_playing_server,
'params[chapterId]': item['id'],
'params[courseId]': self.course_id,
'params[playTime]': item['vedioTimeLength'],
'params[percent]': '100'
}
result = requests.get(self.url,params=video_params,headers=self.headers).json()
if result['resultCode'] == 0:
print(item['name']+'的視頻''------秒過成功')
else:
print(item['name']+'的視頻''------秒過失敗')
else:
pdf_params = {
'time': ts,
'service': self.get_pdf_finished_server,
'params[chapterId]': item['id'],
'params[courseId]': self.course_id,
}
result = requests.get(self.url, params=pdf_params, headers=self.headers).json()
if result['resultCode'] == 0:
print(item['name'] +'的pdf' '------秒過成功')
else:
print(item['name'] +'的pdf' '------秒過失敗')
大功告成,最后,上述內容只供學習使用,
總結
以上是生活随笔為你收集整理的基于浙江线上大学视频秒过分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 青栀做网名什么意思145个
- 下一篇: 函数基础