mirror of
https://github.com/httprunner/httprunner.git
synced 2026-05-12 02:21:29 +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()
|
||||
}
|
||||
|
||||
func (vc *VideoCrawler) checkLiveVideo(video *Video) (enterPoint PointF, yes bool) {
|
||||
if video.Type != VideoType_PreviewLive {
|
||||
return PointF{}, false
|
||||
}
|
||||
|
||||
func (vc *VideoCrawler) getLiveEntryPoint(video *Video) (enterPoint PointF, err error) {
|
||||
// take screenshot and get OCR texts via image service
|
||||
texts, err := vc.driverExt.GetScreenTexts()
|
||||
if err != nil {
|
||||
return PointF{}, false
|
||||
return PointF{}, err
|
||||
}
|
||||
|
||||
// 预览流入口:DY/KS
|
||||
// 标签文案:点击进入直播间|进入直播间领金币
|
||||
points, err := texts.FindTexts([]string{".*进入直播间.*"}, WithScope(0, 0.3, 1, 0.8), WithRegex(true))
|
||||
if err == nil {
|
||||
return points[0].Center(), true
|
||||
return points[0].Center(), nil
|
||||
}
|
||||
// 标签文案:直播中|直播卖货|直播团购
|
||||
points, err = texts.FindTexts([]string{"直播中|直播卖货|直播团购"},
|
||||
WithScope(0, 0.7, 0.5, 1), WithRegex(true))
|
||||
if err == nil {
|
||||
return points[0].Center(), true
|
||||
return points[0].Center(), nil
|
||||
}
|
||||
|
||||
// 预览流入口:KS/KSLite
|
||||
@@ -144,12 +140,12 @@ func (vc *VideoCrawler) checkLiveVideo(video *Video) (enterPoint PointF, yes boo
|
||||
X: point.X,
|
||||
Y: point.Y - 300,
|
||||
}
|
||||
return enterPoint, true
|
||||
return enterPoint, nil
|
||||
}
|
||||
|
||||
// TODO: 头像入口
|
||||
|
||||
return PointF{}, false
|
||||
return PointF{}, errors.New("live entry not found")
|
||||
}
|
||||
|
||||
// run live video crawler
|
||||
@@ -187,7 +183,7 @@ func (vc *VideoCrawler) startLiveCrawler(enterPoint PointF) error {
|
||||
vc.failedCount++
|
||||
log.Warn().
|
||||
Int64("failedCount", vc.failedCount).
|
||||
Str("videoType", string(liveRoom.Type)).
|
||||
Interface("video", liveRoom).
|
||||
Msg("get current live room failed")
|
||||
continue
|
||||
}
|
||||
@@ -244,14 +240,8 @@ func (vc *VideoCrawler) startLiveCrawler(enterPoint PointF) error {
|
||||
}
|
||||
|
||||
func (vc *VideoCrawler) exitLiveRoom() error {
|
||||
log.Info().Msg("exit live room")
|
||||
// swipe right twice to exit live room
|
||||
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
|
||||
log.Info().Msg("press back to exit live room")
|
||||
return vc.driverExt.Driver.PressBack()
|
||||
}
|
||||
|
||||
func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
|
||||
@@ -305,7 +295,7 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
|
||||
swipeFinishTime := time.Now()
|
||||
|
||||
// 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()
|
||||
if err != nil || feedVideo.Type == "" {
|
||||
if crawler.failedCount >= 10 {
|
||||
@@ -332,26 +322,49 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
|
||||
|
||||
screenResult := &ScreenResult{
|
||||
Resolution: dExt.windowSize,
|
||||
Video: feedVideo,
|
||||
|
||||
// log swipe timelines
|
||||
SwipeStartTime: swipeStartTime.UnixMilli(),
|
||||
SwipeFinishTime: swipeFinishTime.UnixMilli(),
|
||||
}
|
||||
dExt.cacheStepData.screenResults[time.Now().String()] = screenResult
|
||||
|
||||
// check if live video && run live crawler
|
||||
if enterPoint, isLive := crawler.checkLiveVideo(feedVideo); isLive {
|
||||
switch feedVideo.Type {
|
||||
case VideoType_PreviewLive:
|
||||
// 直播预览流
|
||||
log.Info().Msg("live video found")
|
||||
if !crawler.isLiveTargetAchieved() {
|
||||
if err := crawler.startLiveCrawler(enterPoint); err != nil {
|
||||
log.Info().Msg("get preview live video")
|
||||
if crawler.isLiveTargetAchieved() {
|
||||
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) {
|
||||
return err
|
||||
}
|
||||
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
|
||||
screenResult.Video = feedVideo
|
||||
crawler.FeedCount++
|
||||
log.Info().
|
||||
Strs("tags", screenResult.Tags).
|
||||
@@ -368,7 +381,11 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
|
||||
|
||||
// simulation watch feed video
|
||||
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
|
||||
if crawler.isTargetAchieved() {
|
||||
@@ -376,11 +393,6 @@ func (dExt *DriverExt) VideoCrawler(configs *VideoCrawlerConfigs) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
// log swipe timelines
|
||||
screenResult.SwipeStartTime = swipeStartTime.UnixMilli()
|
||||
screenResult.SwipeFinishTime = swipeFinishTime.UnixMilli()
|
||||
screenResult.TotalElapsed = time.Since(swipeFinishTime).Milliseconds()
|
||||
|
||||
// reset failed count
|
||||
crawler.failedCount = 0
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user