Skip to content

Commit

Permalink
feature: 支持抖音,快手图集 (#33)
Browse files Browse the repository at this point in the history
  • Loading branch information
wujunwei928 committed Apr 11, 2024
1 parent 22d199b commit 95b9806
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 14 deletions.
38 changes: 31 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,43 @@
* [Docker](#docker)
* [依赖模块](#依赖模块)

Golang短视频去水印, 目前支持20个平台, 欢迎各位Star。
Golang短视频去水印, 视频目前支持20个平台, 图集目前支持2个平台, 欢迎各位Star。
> ps: 使用时, 请尽量使用app分享链接, 电脑网页版未做测试.
# 其他语言版本
- [Python版本](https://github.com/wujunwei928/parse-video-py)

# 支持平台
| 平台 | 状态| 平台 | 状态| 平台 | 状态| 平台 | 状态| 平台 | 状态|
| ---- | ---- | ---- | ---- |----|----|----|----|----|----|
| 皮皮虾 || 抖音短视频 || 火山短视频 || 皮皮搞笑 || 快手短视频 ||
| 微视短视频 || 西瓜视频 || 最右 || 梨视频 || 度小视(原全民) ||
| 逗拍 || 微博 || 绿洲 || 全民K歌 || 6间房 ||
| 美拍 || 新片场 || 好看视频 || 虎牙 || AcFun ||
## 视频
| 平台 | 状态 |
|----------|----|
| 皮皮虾 ||
| 抖音短视频 ||
| 火山短视频 ||
| 皮皮搞笑 ||
| 快手短视频 ||
| 微视短视频 ||
| 西瓜视频 ||
| 最右 ||
| 梨视频 ||
| 度小视(原全民) ||
| 逗拍 ||
| 微博 ||
| 绿洲 ||
| 全民K歌 ||
| 6间房 ||
| 美拍 ||
| 新片场 ||
| 好看视频 ||
| 虎牙 ||
| AcFun ||


## 图集
| 平台 | 状态 |
|----|----|
| 抖音 ||
| 快手 ||

# 安装
```go
Expand Down
25 changes: 23 additions & 2 deletions parser/douyin.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,20 +47,41 @@ func (d douYin) parseVideoID(videoId string) (*VideoParseInfo, error) {
)
}

// 获取图集图片地址
imagesObjArr := data.Get("images").Array()
images := make([]string, 0, len(imagesObjArr))
for _, imageItem := range data.Get("images").Array() {
imageUrl := imageItem.Get("url_list.0").String()
if len(imageUrl) > 0 {
images = append(images, imageUrl)
}
}

// 获取视频播放地址
videoUrl := data.Get("video.play_addr.url_list.0").String()
videoUrl = strings.ReplaceAll(videoUrl, "playwm", "play")

// 如果图集地址不为空时,因为没有视频,上面抖音返回的视频地址无法访问,置空处理
if len(images) > 0 {
videoUrl = ""
}

videoInfo := &VideoParseInfo{
Title: data.Get("desc").String(),
VideoUrl: videoUrl,
MusicUrl: "",
CoverUrl: data.Get("video.cover.url_list.0").String(),
Images: images,
}
videoInfo.Author.Uid = data.Get("author.unique_id").String()
videoInfo.Author.Name = data.Get("author.nickname").String()
videoInfo.Author.Avatar = data.Get("author.avatar_thumb.url_list.0").String()

// 获取302重定向之后的视频地址
d.getRedirectUrl(videoInfo)
// 视频地址非空时,获取302重定向之后的视频地址
// 图集时,视频地址为空,不处理
if len(videoInfo.VideoUrl) > 0 {
d.getRedirectUrl(videoInfo)
}

return videoInfo, nil
}
Expand Down
17 changes: 17 additions & 0 deletions parser/kuaishou.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package parser

import (
"errors"
"fmt"
"strings"

"github.com/tidwall/gjson"
Expand Down Expand Up @@ -60,17 +61,33 @@ func (k kuaiShou) parseShareUrl(shareUrl string) (*VideoParseInfo, error) {
SetBody(postData).
Post("https://m.gifshow.com/rest/wd/photo/info?kpn=KUAISHOU&captchaToken=")

if err != nil {
return nil, err
}

data := gjson.GetBytes(videoRes.Body(), "photo")
avatar := data.Get("headUrl").String()
author := data.Get("userName").String()
title := data.Get("caption").String()
videoUrl := data.Get("mainMvUrls.0.url").String()
cover := data.Get("coverUrls.0.url").String()

// 获取图集
imageCdnHost := data.Get("ext_params.atlas.cdn.0").String()
imagesObjArr := data.Get("ext_params.atlas.list").Array()
images := make([]string, 0, len(imagesObjArr))
if len(imageCdnHost) > 0 && len(imagesObjArr) > 0 {
for _, imageItem := range imagesObjArr {
imageUrl := fmt.Sprintf("https://%s/%s", imageCdnHost, imageItem.String())
images = append(images, imageUrl)
}
}

parseRes := &VideoParseInfo{
Title: title,
VideoUrl: videoUrl,
CoverUrl: cover,
Images: images,
}
parseRes.Author.Name = author
parseRes.Author.Avatar = avatar
Expand Down
9 changes: 5 additions & 4 deletions parser/vars.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,11 @@ type VideoParseInfo struct {
Name string `json:"name"` // 作者名称
Avatar string `json:"avatar"` // 作者头像
} `json:"author"`
Title string `json:"title"` // 描述
VideoUrl string `json:"video_url"` // 视频播放地址
MusicUrl string `json:"music_url"` // 音乐播放地址
CoverUrl string `json:"cover_url"` // 视频封面地址
Title string `json:"title"` // 描述
VideoUrl string `json:"video_url"` // 视频播放地址
MusicUrl string `json:"music_url"` // 音乐播放地址
CoverUrl string `json:"cover_url"` // 视频封面地址
Images []string `json:"images"` // 图集图片地址列表
}

// BatchParseItem 批量解析时, 单条解析格式
Expand Down
19 changes: 18 additions & 1 deletion templates/index.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,24 @@ function setValue(){
mdui.snackbar({
message: '解析成功'
});
$(".down").html('<h4>'+jsonObj.data.title+' </h4><a class="mdui-btn mdui-btn-raised" href="'+jsonObj.data.cover_url+'" target="_blank" download="video">下载封面</a><a class="mdui-btn mdui-btn-raised" href="'+jsonObj.data.video_url+'" target="_blank" download="video">下载视频</a>');

let successHtml = '<h4>'+jsonObj.data.title+' </h4>';
successHtml += '<a class="mdui-btn mdui-btn-raised" href="'+jsonObj.data.cover_url+'" target="_blank" download="video">下载封面</a>';

// 如果video_url不为空, 则显示下载视频按钮
if(jsonObj.data.video_url != ""){
successHtml += '<a class="mdui-btn mdui-btn-raised" href="'+jsonObj.data.video_url+'" target="_blank" download="video">下载视频</a>';
}

// 如果 jsonObj.data.images 是数组, 并且长度大于0, 则img展示图片
if(jsonObj.data.images && jsonObj.data.images.length > 0){
successHtml += '<h4>图集</h4>';
jsonObj.data.images.forEach(function(item){
successHtml += '<img src="'+item+'" style="width: 160px; margin: 1em;"/>';
});
}

$(".down").html(successHtml);
}else{
mdui.snackbar({
message: "解析失败,视频不存在或者链接不正确:<br/>" + jsonObj.msg
Expand Down

0 comments on commit 95b9806

Please sign in to comment.