Skip to content

Commit

Permalink
感谢 Issues 859提供的抖音思路 (#924)
Browse files Browse the repository at this point in the history
* 感谢 Issues 859提供的抖音思路

* 补上漏掉的文件,去掉打印输出

Co-authored-by: wyndem <wyndem@qq.com>
  • Loading branch information
wyndem and wyndem committed Aug 28, 2021
1 parent 8f71e42 commit 3b82c8d
Show file tree
Hide file tree
Showing 3 changed files with 144 additions and 43 deletions.
55 changes: 14 additions & 41 deletions extractors/douyin/douyin.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,12 @@ package douyin
import (
"encoding/json"
"errors"
"fmt"

"github.com/iawia002/annie/extractors/types"
"github.com/iawia002/annie/request"
"github.com/iawia002/annie/utils"
"strings"
)

type data struct {
ItemList []struct {
Desc string `json:"desc"`
} `json:"item_list"`
}

type extractor struct{}

// New returns a youtube extractor.
Expand All @@ -26,17 +19,22 @@ func New() types.Extractor {
// Extract is the main function to extract the data.
func (e *extractor) Extract(url string, option types.Options) ([]*types.Data, error) {
var err error
html, err := request.Get(url, url, nil)
if err != nil {
return nil, err
itemIds := utils.MatchOneOf(url, `/video/(\d+)`)
if len(itemIds) == 0 {
return nil, errors.New("unable to get video ID")
}

realURLs := utils.MatchOneOf(html, `playAddr: "(.+?)"`)
if realURLs == nil || len(realURLs) < 2 {
if itemIds == nil || len(itemIds) < 2 {
return nil, types.ErrURLParseFailed
}
realURL := realURLs[1]

itemId := itemIds[len(itemIds)-1]
jsonData, err := request.Get("https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids="+itemId, url, nil)
var douyin douyinData
err = json.Unmarshal([]byte(jsonData), &douyin)
if err != nil {
return nil, err
}
realURL := strings.Replace(douyin.ItemList[0].Video.PlayAddr.URLList[0], "playwm", "play", -1)
size, err := request.Size(realURL, url)
if err != nil {
return nil, err
Expand All @@ -53,35 +51,10 @@ func (e *extractor) Extract(url string, option types.Options) ([]*types.Data, er
},
}

videoIDs := utils.MatchOneOf(url, `/video/(\d+)`)
if len(videoIDs) == 0 {
return nil, errors.New("unable to get video ID")
}
videoID := videoIDs[1]

dytks := utils.MatchOneOf(html, `dytk: "(.+?)"`)
if len(dytks) == 0 {
return nil, errors.New("unable to get dytk info")
}
dytk := dytks[1]

apiDataString, err := request.Get(
fmt.Sprintf("https://www.douyin.com/web/api/v2/aweme/iteminfo/?item_ids=%s&dytk=%s", videoID, dytk),
url, nil,
)
if err != nil {
return nil, err
}

var apiData data
if err = json.Unmarshal([]byte(apiDataString), &apiData); err != nil {
return nil, err
}

return []*types.Data{
{
Site: "抖音 douyin.com",
Title: apiData.ItemList[0].Desc,
Title: douyin.ItemList[0].Desc,
Type: types.DataTypeVideo,
Streams: streams,
URL: url,
Expand Down
4 changes: 2 additions & 2 deletions extractors/douyin/douyin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ func TestDownload(t *testing.T) {
{
name: "normal test",
args: test.Args{
URL: "https://www.douyin.com/share/video/6557825773007277319/?mid=6557826301539912456",
Title: "跟特效师一起学跳舞,看变形金刚擎天柱怎么跳,你也来试试!@抖音小助手",
URL: "https://www.douyin.com/video/6967223681286278436?previous_page=main_page&tab_name=home",
Title: "是爱情,让父子相认#陈翔六点半 #关于爱情",
},
},
}
Expand Down
128 changes: 128 additions & 0 deletions extractors/douyin/types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
package douyin

type douyinData struct {
StatusCode int `json:"status_code"`
ItemList []struct {
CommentList interface{} `json:"comment_list"`
GroupID int64 `json:"group_id"`
TextExtra []interface{} `json:"text_extra"`
ImageInfos interface{} `json:"image_infos"`
AwemeID string `json:"aweme_id"`
ShareInfo struct {
ShareWeiboDesc string `json:"share_weibo_desc"`
ShareDesc string `json:"share_desc"`
ShareTitle string `json:"share_title"`
} `json:"share_info"`
IsPreview int `json:"is_preview"`
Images interface{} `json:"images"`
RiskInfos struct {
Type int `json:"type"`
Content string `json:"content"`
Warn bool `json:"warn"`
} `json:"risk_infos"`
VideoText interface{} `json:"video_text"`
LabelTopText interface{} `json:"label_top_text"`
Author struct {
Nickname string `json:"nickname"`
AvatarThumb struct {
URI string `json:"uri"`
URLList []string `json:"url_list"`
} `json:"avatar_thumb"`
AvatarMedium struct {
URI string `json:"uri"`
URLList []string `json:"url_list"`
} `json:"avatar_medium"`
PlatformSyncInfo interface{} `json:"platform_sync_info"`
PolicyVersion interface{} `json:"policy_version"`
UID string `json:"uid"`
ShortID string `json:"short_id"`
Signature string `json:"signature"`
AvatarLarger struct {
URI string `json:"uri"`
URLList []string `json:"url_list"`
} `json:"avatar_larger"`
UniqueID string `json:"unique_id"`
FollowersDetail interface{} `json:"followers_detail"`
Geofencing interface{} `json:"geofencing"`
TypeLabel interface{} `json:"type_label"`
} `json:"author"`
Music struct {
CoverMedium struct {
URI string `json:"uri"`
URLList []string `json:"url_list"`
} `json:"cover_medium"`
CoverThumb struct {
URI string `json:"uri"`
URLList []string `json:"url_list"`
} `json:"cover_thumb"`
Duration int `json:"duration"`
Status int `json:"status"`
Author string `json:"author"`
Mid string `json:"mid"`
Title string `json:"title"`
CoverHd struct {
URI string `json:"uri"`
URLList []string `json:"url_list"`
} `json:"cover_hd"`
CoverLarge struct {
URI string `json:"uri"`
URLList []string `json:"url_list"`
} `json:"cover_large"`
PlayURL struct {
URI string `json:"uri"`
URLList []string `json:"url_list"`
} `json:"play_url"`
Position interface{} `json:"position"`
ID int64 `json:"id"`
} `json:"music"`
ChaList interface{} `json:"cha_list"`
Video struct {
PlayAddr struct {
URI string `json:"uri"`
URLList []string `json:"url_list"`
} `json:"play_addr"`
Width int `json:"width"`
Ratio string `json:"ratio"`
HasWatermark bool `json:"has_watermark"`
Duration int `json:"duration"`
Vid string `json:"vid"`
Cover struct {
URI string `json:"uri"`
URLList []string `json:"url_list"`
} `json:"cover"`
Height int `json:"height"`
DynamicCover struct {
URI string `json:"uri"`
URLList []string `json:"url_list"`
} `json:"dynamic_cover"`
OriginCover struct {
URI string `json:"uri"`
URLList []string `json:"url_list"`
} `json:"origin_cover"`
BitRate interface{} `json:"bit_rate"`
} `json:"video"`
ShareURL string `json:"share_url"`
AuthorUserID int64 `json:"author_user_id"`
Geofencing interface{} `json:"geofencing"`
Promotions interface{} `json:"promotions"`
LongVideo interface{} `json:"long_video"`
ForwardID string `json:"forward_id"`
Desc string `json:"desc"`
CreateTime int `json:"create_time"`
Statistics struct {
CommentCount int `json:"comment_count"`
DiggCount int `json:"digg_count"`
PlayCount int `json:"play_count"`
ShareCount int `json:"share_count"`
AwemeID string `json:"aweme_id"`
} `json:"statistics"`
VideoLabels interface{} `json:"video_labels"`
Duration int `json:"duration"`
AwemeType int `json:"aweme_type"`
IsLiveReplay bool `json:"is_live_replay"`
} `json:"item_list"`
Extra struct {
Now int64 `json:"now"`
Logid string `json:"logid"`
} `json:"extra"`
}

0 comments on commit 3b82c8d

Please sign in to comment.