Files
go-bot-dongl/controller/douyin.go
2023-07-17 18:11:18 +08:00

178 lines
4.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package controller
import (
"encoding/json"
"fmt"
"go-bot/bot/global"
"go-bot/bot/structs"
"io/ioutil"
"net/http"
"os"
"strings"
"github.com/eatmoreapple/openwechat"
)
// DouYinResolution 抖音解析
// Author: NothAmor
func DouYinResolution(msg *openwechat.Message) {
split := strings.Split(msg.Content, " ")
if len(split) == 1 {
msg.ReplyText("请输入正确的抖音链接")
return
}
// 获取抖音链接
douyinUrl := split[1]
// 获取抖音视频信息
data, err := GetDouYinUrlInfo(douyinUrl)
if err != nil {
msg.ReplyText(fmt.Sprintf("获取抖音信息失败, 失败原因: %s", err.Error()))
return
}
// 图片解析
if data.Type == "image" {
msg.ReplyText(fmt.Sprintf("解析类型: %s\n解析时长: %f\n图片ID: %s\n图片描述: %s\n作者昵称: %s\n作者ID: %s\n", data.Type, data.TotalTime, data.AwemeID, data.Desc, data.Author.Nickname, data.Author.UID))
for _, imageUrl := range data.ImageData.NoWatermarkImageList {
image, err := DownloadPic(imageUrl)
if err != nil {
msg.ReplyText(fmt.Sprintf("下载图片失败, 失败原因: %s", err.Error()))
return
}
msg.ReplyImage(image)
}
return
}
// 视频解析
if data.Type == "video" {
msg.ReplyText(fmt.Sprintf("解析类型: %s\n解析时长: %f\n视频ID: %s\n视频描述: %s\n作者昵称: %s\n作者ID: %s\n", data.Type, data.TotalTime, data.AwemeID, data.Desc, data.Author.Nickname, data.Author.UID))
video, err := DownloadVideo(data.VideoData.NwmVideoURLHQ)
if err != nil {
msg.ReplyText(fmt.Sprintf("下载视频失败, 失败原因: %s", err.Error()))
return
}
msg.ReplyVideo(video)
return
}
}
// GetDouYinUrlInfo 获取抖音链接信息
// Author: NothAmor
func GetDouYinUrlInfo(url string) (resolutionResponse structs.ResolutionResponse, err error) {
// 拼接GET链接请求API服务
resolutionApiUrl := fmt.Sprintf("%s://%s:%s/%s?url=%s", global.Config.DouYin.Protocol, global.Config.DouYin.Address, global.Config.DouYin.Port, global.Config.DouYin.Router.Api, url)
client := &http.Client{}
req, err := http.NewRequest("GET", resolutionApiUrl, nil)
if err != nil {
err = fmt.Errorf("请求链接错误: %s", err)
return
}
resp, err := client.Do(req)
if err != nil {
err = fmt.Errorf("请求链接错误: %s", err)
return
}
defer resp.Body.Close()
err = json.NewDecoder(resp.Body).Decode(&resolutionResponse)
if err != nil {
err = fmt.Errorf("解析返回数据错误: %s", err)
return
}
if resolutionResponse.Status != "success" {
err = fmt.Errorf("解析返回数据错误: %s", resolutionResponse.Message)
return
}
return
}
// DownloadPic 下载图片
// Author: NothAmor
func DownloadPic(url string) (image *os.File, err error) {
resp, err := http.Get(url)
if err != nil {
err = fmt.Errorf("请求链接错误: %s", err)
return
}
defer resp.Body.Close()
imageBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
err = fmt.Errorf("读取返回数据错误: %s", err)
return
}
tmpFile, err := ioutil.TempFile("", "image*.jpg")
if err != nil {
err = fmt.Errorf("创建临时文件错误: %s", err)
return
}
defer tmpFile.Close()
_, err = tmpFile.Write(imageBytes)
if err != nil {
err = fmt.Errorf("写入临时文件错误: %s", err)
return
}
_, err = tmpFile.Seek(0, 0)
if err != nil {
err = fmt.Errorf("设置临时文件指针错误: %s", err)
return
}
return tmpFile, nil
}
// DownloadVideo 下载视频
// Author: NothAmor
func DownloadVideo(url string) (video *os.File, err error) {
resp, err := http.Get(url)
if err != nil {
err = fmt.Errorf("请求链接错误: %s", err)
return
}
defer resp.Body.Close()
videoBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
err = fmt.Errorf("读取返回数据错误: %s", err)
return
}
tmpFile, err := ioutil.TempFile("", "video*.mp4")
if err != nil {
err = fmt.Errorf("创建临时文件错误: %s", err)
return
}
defer tmpFile.Close()
_, err = tmpFile.Write(videoBytes)
if err != nil {
err = fmt.Errorf("写入临时文件错误: %s", err)
return
}
_, err = tmpFile.Seek(0, 0)
if err != nil {
err = fmt.Errorf("设置临时文件指针错误: %s", err)
return
}
return tmpFile, nil
}