mirror of
https://github.com/httprunner/httprunner.git
synced 2026-09-07 00:17:37 +08:00
refactor: handle video type
This commit is contained in:
@@ -111,28 +111,24 @@ func (vc *VideoCrawler) isTargetAchieved() bool {
|
|||||||
return vc.isFeedTargetAchieved() && vc.isLiveTargetAchieved()
|
return vc.isFeedTargetAchieved() && vc.isLiveTargetAchieved()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (vc *VideoCrawler) checkLiveVideo(video *Video) (enterPoint PointF, yes bool) {
|
func (vc *VideoCrawler) getLiveEntryPoint(video *Video) (enterPoint PointF, err error) {
|
||||||
if video.Type != VideoType_PreviewLive {
|
|
||||||
return PointF{}, false
|
|
||||||
}
|
|
||||||
|
|
||||||
// take screenshot and get OCR texts via image service
|
// take screenshot and get OCR texts via image service
|
||||||
texts, err := vc.driverExt.GetScreenTexts()
|
texts, err := vc.driverExt.GetScreenTexts()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return PointF{}, false
|
return PointF{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 预览流入口:DY/KS
|
// 预览流入口:DY/KS
|
||||||
// 标签文案:点击进入直播间|进入直播间领金币
|
// 标签文案:点击进入直播间|进入直播间领金币
|
||||||
points, err := texts.FindTexts([]string{".*进入直播间.*"}, WithScope(0, 0.3, 1, 0.8), WithRegex(true))
|
points, err := texts.FindTexts([]string{".*进入直播间.*"}, WithScope(0, 0.3, 1, 0.8), WithRegex(true))
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return points[0].Center(), true
|
return points[0].Center(), nil
|
||||||
}
|
}
|
||||||
// 标签文案:直播中|直播卖货|直播团购
|
// 标签文案:直播中|直播卖货|直播团购
|
||||||
points, err = texts.FindTexts([]string{"直播中|直播卖货|直播团购"},
|
points, err = texts.FindTexts([]string{"直播中|直播卖货|直播团购"},
|
||||||
WithScope(0, 0.7, 0.5, 1), WithRegex(true))
|
WithScope(0, 0.7, 0.5, 1), WithRegex(true))
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return points[0].Center(), true
|
return points[0].Center(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 预览流入口:KS/KSLite
|
// 预览流入口:KS/KSLite
|
||||||
@@ -144,12 +140,12 @@ func (vc *VideoCrawler) checkLiveVideo(video *Video) (enterPoint PointF, yes boo
|
|||||||
X: point.X,
|
X: point.X,
|
||||||
Y: point.Y - 300,
|
Y: point.Y - 300,
|
||||||
}
|
}
|
||||||
return enterPoint, true
|
return enterPoint, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: 头像入口
|
// TODO: 头像入口
|
||||||
|
|
||||||
return PointF{}, false
|
return PointF{}, errors.New("live entry not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
// run live video crawler
|
// run live video crawler
|
||||||
@@ -187,7 +183,7 @@ func (vc *VideoCrawler) startLiveCrawler(enterPoint PointF) error {
|
|||||||
vc.failedCount++
|
vc.failedCount++
|
||||||
log.Warn().
|
log.Warn().
|
||||||
Int64("failedCount", vc.failedCount).
|
Int64("failedCount", vc.failedCount).
|
||||||
Str("videoType", string(liveRoom.Type)).
|
Interface("video", liveRoom).
|
||||||
Msg("get current live room failed")
|
Msg("get current live room failed")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -244,14 +240,8 @@ func (vc *VideoCrawler) startLiveCrawler(enterPoint PointF) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (vc *VideoCrawler) exitLiveRoom() error {
|
func (vc *VideoCrawler) exitLiveRoom() error {
|
||||||
log.Info().Msg("exit live room")
|
log.Info().Msg("press back to exit live room")
|
||||||
// swipe right twice to exit live room
|
return vc.driverExt.Driver.PressBack()
|
||||||
for i := 0; i < 2; i++ {
|
|
||||||
vc.driverExt.SwipeRelative(0.1, 0.5, 0.9, 0.5)
|
|
||||||
time.Sleep(2 * time.Second)
|
|
||||||
}
|
|
||||||
// TODO: check exit live room success
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
|
func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
|
||||||
@@ -305,7 +295,7 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
|
|||||||
swipeFinishTime := time.Now()
|
swipeFinishTime := time.Now()
|
||||||
|
|
||||||
// get app event trackings
|
// get app event trackings
|
||||||
// retry 3 times if get feed failed, abort if fail 3 consecutive times
|
// retry 10 times if get feed failed, abort if fail 10 consecutive times
|
||||||
feedVideo, err := crawler.getCurrentVideo()
|
feedVideo, err := crawler.getCurrentVideo()
|
||||||
if err != nil || feedVideo.Type == "" {
|
if err != nil || feedVideo.Type == "" {
|
||||||
if crawler.failedCount >= 10 {
|
if crawler.failedCount >= 10 {
|
||||||
@@ -332,26 +322,49 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
|
|||||||
|
|
||||||
screenResult := &ScreenResult{
|
screenResult := &ScreenResult{
|
||||||
Resolution: dExt.windowSize,
|
Resolution: dExt.windowSize,
|
||||||
|
Video: feedVideo,
|
||||||
|
|
||||||
|
// log swipe timelines
|
||||||
|
SwipeStartTime: swipeStartTime.UnixMilli(),
|
||||||
|
SwipeFinishTime: swipeFinishTime.UnixMilli(),
|
||||||
}
|
}
|
||||||
dExt.cacheStepData.screenResults[time.Now().String()] = screenResult
|
dExt.cacheStepData.screenResults[time.Now().String()] = screenResult
|
||||||
|
|
||||||
// check if live video && run live crawler
|
switch feedVideo.Type {
|
||||||
if enterPoint, isLive := crawler.checkLiveVideo(feedVideo); isLive {
|
case VideoType_PreviewLive:
|
||||||
// 直播预览流
|
// 直播预览流
|
||||||
log.Info().Msg("live video found")
|
log.Info().Msg("get preview live video")
|
||||||
if !crawler.isLiveTargetAchieved() {
|
if crawler.isLiveTargetAchieved() {
|
||||||
if err := crawler.startLiveCrawler(enterPoint); err != nil {
|
log.Info().Msg("live count achieved, skip")
|
||||||
|
} else {
|
||||||
|
// live target not achieved, enter live
|
||||||
|
enterPoint, err := crawler.getLiveEntryPoint(feedVideo)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Msg("get live entry failed")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// start live crawler
|
||||||
|
err = crawler.startLiveCrawler(enterPoint)
|
||||||
|
if err != nil {
|
||||||
if errors.Is(err, code.TimeoutError) || errors.Is(err, code.InterruptError) {
|
if errors.Is(err, code.TimeoutError) || errors.Is(err, code.InterruptError) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
log.Error().Err(err).Msg("run live crawler failed, continue")
|
log.Error().Err(err).Msg("run live crawler failed, continue")
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
|
case VideoType_Live:
|
||||||
|
// 直播
|
||||||
|
log.Info().Msg("get live video")
|
||||||
|
|
||||||
|
case VideoType_Image:
|
||||||
|
// 图文
|
||||||
|
log.Info().Msg("get image video")
|
||||||
|
|
||||||
|
default:
|
||||||
// 点播
|
// 点播
|
||||||
// check feed type and incr feed count
|
// check feed type and incr feed count
|
||||||
screenResult.Video = feedVideo
|
|
||||||
crawler.FeedCount++
|
crawler.FeedCount++
|
||||||
log.Info().
|
log.Info().
|
||||||
Strs("tags", screenResult.Tags).
|
Strs("tags", screenResult.Tags).
|
||||||
@@ -368,7 +381,11 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
|
|||||||
|
|
||||||
// simulation watch feed video
|
// simulation watch feed video
|
||||||
sleepStrict(swipeFinishTime, screenResult.Video.PlayDuration)
|
sleepStrict(swipeFinishTime, screenResult.Video.PlayDuration)
|
||||||
|
|
||||||
|
log.Warn().Interface("video", feedVideo).
|
||||||
|
Msg("get unexpected video type")
|
||||||
}
|
}
|
||||||
|
screenResult.TotalElapsed = time.Since(swipeFinishTime).Milliseconds()
|
||||||
|
|
||||||
// check if target count achieved
|
// check if target count achieved
|
||||||
if crawler.isTargetAchieved() {
|
if crawler.isTargetAchieved() {
|
||||||
@@ -376,11 +393,6 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// log swipe timelines
|
|
||||||
screenResult.SwipeStartTime = swipeStartTime.UnixMilli()
|
|
||||||
screenResult.SwipeFinishTime = swipeFinishTime.UnixMilli()
|
|
||||||
screenResult.TotalElapsed = time.Since(swipeFinishTime).Milliseconds()
|
|
||||||
|
|
||||||
// reset failed count
|
// reset failed count
|
||||||
crawler.failedCount = 0
|
crawler.failedCount = 0
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user