From c4d0140b42737100c3c8db6dd7103ae3a8aaf1d0 Mon Sep 17 00:00:00 2001 From: eson Date: Thu, 10 Sep 2020 17:33:52 +0800 Subject: [PATCH 1/8] for save --- extractor/nimo_extractor/nimo_extractor.go | 4 +- .../twitcasting_extractor.go | 8 +- .../twitch_extractor/tiwtch_extractor.go | 34 +++++++-- tasks/twitch/twitch_task1/task_twitch.go | 9 ++- utils.go | 73 ++++++++++++++++--- 5 files changed, 101 insertions(+), 27 deletions(-) diff --git a/extractor/nimo_extractor/nimo_extractor.go b/extractor/nimo_extractor/nimo_extractor.go index d823de5..79c9cfd 100644 --- a/extractor/nimo_extractor/nimo_extractor.go +++ b/extractor/nimo_extractor/nimo_extractor.go @@ -28,7 +28,7 @@ type LiveInfo struct { } func Execute() { - wd := intimate.GetChromeDriver(3030) + wd := intimate.GetChromeDriver() count := 0 countlimit := 200 @@ -120,7 +120,7 @@ func Execute() { count = 0 wd.Close() wd.Quit() - wd = intimate.GetChromeDriver(3030) + wd = intimate.GetChromeDriver() } } } diff --git a/extractor/twitcasting_extractor/twitcasting_extractor.go b/extractor/twitcasting_extractor/twitcasting_extractor.go index 0fe20a6..da8c17d 100644 --- a/extractor/twitcasting_extractor/twitcasting_extractor.go +++ b/extractor/twitcasting_extractor/twitcasting_extractor.go @@ -34,13 +34,17 @@ func main() { ps := intimate.NewPerfectShutdown() ses := requests.NewSession() streamerQueue := intimate.TStreamer.Queue(intimate.Streamer{}, intimate.ConditionDefault(intimate.Ptwitcasting)) - + var lasterr error for !ps.IsClose() { // streamer, err := estore.Pop(intimate.Ptwitcasting) isteamer, err := streamerQueue.Pop() if err != nil { - log.Println(err, isteamer) + if lasterr != err { + lasterr = err + log.Println(err) + } + time.Sleep(time.Minute) continue } diff --git a/extractor/twitch_extractor/tiwtch_extractor.go b/extractor/twitch_extractor/tiwtch_extractor.go index 8a00fcd..6aa0ab4 100644 --- a/extractor/twitch_extractor/tiwtch_extractor.go +++ b/extractor/twitch_extractor/tiwtch_extractor.go @@ -20,22 +20,36 @@ import ( // var estore *intimate.StoreExtractor = intimate.NewStoreExtractor() func main() { - wd := intimate.GetChromeDriver(3040) + + adriver := intimate.GetChromeDriver() + + defer func() { + adriver.Close() + }() + ps := intimate.NewPerfectShutdown() queue := intimate.TStreamerList.Queue(intimate.StreamerList{}, intimate.ConditionDefault(intimate.Ptwitch)) var count = 0 - var countlimt = 200 + var countlimt = 1 + var recreate = time.Now() - // var lasterr error = nil + var lasterr error = nil // var err error for !ps.IsClose() { + wd := adriver.Webdriver // sourceChannel, err := sstore.Pop(intimate.TTwitchChannel) isl, err := queue.Pop() if err != nil { - panic(err) + if lasterr != err { + lasterr = err + log.Println(err) + } + time.Sleep(time.Minute) + continue } + streamerlist := isl.(*intimate.StreamerList) weburl := streamerlist.Url + "?sort=VIEWER_COUNT" @@ -169,15 +183,19 @@ func main() { } count++ - if count >= countlimt { + if count >= countlimt || time.Now().Sub(recreate) >= time.Minute*120 { count = 0 - wd = intimate.GetChromeDriver(3031) + countlimt = 3 + adriver = intimate.GetChromeDriver() + recreate = time.Now() + } + + if count >= 2 { + break } } - wd.Close() - wd.Quit() } func Extractor(wd selenium.WebDriver, streamer *intimate.Streamer) { diff --git a/tasks/twitch/twitch_task1/task_twitch.go b/tasks/twitch/twitch_task1/task_twitch.go index 8a6fc0d..32c531b 100644 --- a/tasks/twitch/twitch_task1/task_twitch.go +++ b/tasks/twitch/twitch_task1/task_twitch.go @@ -22,8 +22,10 @@ func Execute() { ps := intimate.NewPerfectShutdown() for !ps.IsClose() { + var err error - wd := intimate.GetChromeDriver(3030) + adriver := intimate.GetChromeDriver() + wd := adriver.Webdriver weburl := "https://www.twitch.tv/directory?sort=VIEWER_COUNT" err = wd.Get(weburl) @@ -119,9 +121,8 @@ func Execute() { log.Println("hrefs len:", len(hrefs)) // sstore.Deduplicate(intimate.TTwitchChannel, "source") - - wd.Close() - wd.Quit() + // wd.Close() + // wd.Quit() time.Sleep(time.Minute * 30) } } diff --git a/utils.go b/utils.go index 1a699b7..5f3683f 100644 --- a/utils.go +++ b/utils.go @@ -5,9 +5,10 @@ import ( "database/sql" "fmt" "log" + "net" "os" + "os/exec" "os/signal" - "runtime" "strconv" "strings" "sync/atomic" @@ -93,7 +94,27 @@ func ParseDuration(dt string) (time.Duration, error) { return tdt.Sub(zeroTime), nil } -func GetChromeDriver(port int) selenium.WebDriver { +type AutoCloseDriver struct { + Webdriver selenium.WebDriver + Port int +} + +func (adriver *AutoCloseDriver) Close() { + killshell := fmt.Sprintf("pkill -P `pgrep -f 'port=%d '` && pkill -f 'port=%d '", adriver.Port, adriver.Port) + log.Println(killshell) + + // log.Printf(fmt.Sprintf("kill -9 $(lsof -t -i:%d)", port)) + cmd := exec.Command("sh", "-c", killshell) + err := cmd.Run() + if err != nil { + log.Println(err) + } +} + +func GetChromeDriver() *AutoCloseDriver { + + port := GetFreePort() + var err error caps := selenium.Capabilities{"browserName": "chrome"} @@ -131,28 +152,44 @@ func GetChromeDriver(port int) selenium.WebDriver { chromecaps.ExcludeSwitches = append(chromecaps.ExcludeSwitches, "enable-automation") caps.AddChrome(chromecaps) + _, err = selenium.NewChromeDriverService("/usr/bin/chromedriver", port) if err != nil { panic(err) } + wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port)) if err != nil { panic(err) } - runtime.SetFinalizer(wd, func(obj interface{}) { - if err := obj.(selenium.WebDriver).Close(); err != nil { - log.Println(err) - } - if err := obj.(selenium.WebDriver).Quit(); err != nil { - log.Println(err) - } - }) + + adriver := &AutoCloseDriver{} + adriver.Port = port + adriver.Webdriver = wd + + // runtime.SetFinalizer(adriver, func(obj interface{}) { + + // adriver := obj.(*AutoCloseDriver) + // adriver.Webdriver.Close() + // adriver.Webdriver.Quit() + + // killshell := fmt.Sprintf("pkill -P `pgrep -f 'port=%d '` && pkill -f 'port=%d '", port, port) + // log.Println(killshell) + + // // log.Printf(fmt.Sprintf("kill -9 $(lsof -t -i:%d)", port)) + // // cmd := exec.Command("sh", "-c", killshell) + // // err = cmd.Run() + // // if err != nil { + // // log.Println(err) + // // } + // }) + wd.ExecuteScript("windows.navigator.webdriver = undefined", nil) if err != nil { panic(err) } - return wd + return adriver } // PerfectShutdown 完美关闭程序 @@ -305,3 +342,17 @@ func (wf *WaitFor) WaitWithTimeout(xpath string, timeout time.Duration, do func( }, timeout) } + +func GetFreePort() int { + addr, err := net.ResolveTCPAddr("tcp", "localhost:0") + if err != nil { + panic(err) + } + + l, err := net.ListenTCP("tcp", addr) + if err != nil { + panic(err) + } + defer l.Close() + return l.Addr().(*net.TCPAddr).Port +} From ef7b59ce3dd8ccc2f3938ca02e4036597beb4af9 Mon Sep 17 00:00:00 2001 From: eson Date: Fri, 11 Sep 2020 18:52:04 +0800 Subject: [PATCH 2/8] TODO: streamerlist --- autostore.go | 4 +- extractor/nimo_extractor/nimo_extractor.go | 9 ++- .../twitch_extractor/tiwtch_extractor.go | 60 ++++++++++++------- tasks/twitch/twitch_task1/task_twitch.go | 24 ++++---- utils.go | 37 ++++++++++-- 5 files changed, 87 insertions(+), 47 deletions(-) diff --git a/autostore.go b/autostore.go index 28dcca1..a7c73c8 100644 --- a/autostore.go +++ b/autostore.go @@ -427,10 +427,10 @@ func (t *Table) UpdateError(obj interface{}, err error) { } } - _, dberr := t.store.db.Exec("update "+t.name+" set operator = ?, error_msg = ? where ? = ?", 10000, sql.NullString{String: err.Error(), Valid: true}, uidname, uidvalue) + _, dberr := t.store.db.Exec("update "+t.name+" set operator = ?, error_msg = ? where "+uidname+" = ?", 10000, sql.NullString{String: err.Error(), Valid: true}, uidvalue) if dberr != nil { // email tell owner to deal with - panic(err) + panic(dberr) } } diff --git a/extractor/nimo_extractor/nimo_extractor.go b/extractor/nimo_extractor/nimo_extractor.go index 79c9cfd..b94b6fb 100644 --- a/extractor/nimo_extractor/nimo_extractor.go +++ b/extractor/nimo_extractor/nimo_extractor.go @@ -28,10 +28,10 @@ type LiveInfo struct { } func Execute() { - wd := intimate.GetChromeDriver() + adriver := intimate.GetChromeDriver() count := 0 countlimit := 200 - + wd := adriver.Webdriver waitfor := intimate.NewWaitFor(wd) ps := intimate.NewPerfectShutdown() @@ -118,9 +118,8 @@ func Execute() { count++ if count >= countlimit { count = 0 - wd.Close() - wd.Quit() - wd = intimate.GetChromeDriver() + adriver.Close() + adriver = intimate.GetChromeDriver() } } } diff --git a/extractor/twitch_extractor/tiwtch_extractor.go b/extractor/twitch_extractor/tiwtch_extractor.go index 6aa0ab4..a1eedc9 100644 --- a/extractor/twitch_extractor/tiwtch_extractor.go +++ b/extractor/twitch_extractor/tiwtch_extractor.go @@ -7,7 +7,6 @@ import ( "intimate" "log" "regexp" - "strings" "time" "github.com/tebeka/selenium" @@ -23,15 +22,13 @@ func main() { adriver := intimate.GetChromeDriver() - defer func() { - adriver.Close() - }() - ps := intimate.NewPerfectShutdown() - queue := intimate.TStreamerList.Queue(intimate.StreamerList{}, intimate.ConditionDefault(intimate.Ptwitch)) + slqueue := intimate.TStreamerList.Queue(intimate.StreamerList{}, intimate.ConditionDefault(intimate.Ptwitch)) + squeue := intimate.TStreamer.Queue(intimate.Streamer{}, intimate.ConditionDefault(intimate.Ptwitch)) + var count = 0 - var countlimt = 1 + var countlimt = 200 var recreate = time.Now() var lasterr error = nil @@ -40,13 +37,36 @@ func main() { wd := adriver.Webdriver // sourceChannel, err := sstore.Pop(intimate.TTwitchChannel) - isl, err := queue.Pop() + isl, err := slqueue.Pop() if err != nil { if lasterr != err { lasterr = err log.Println(err) } - time.Sleep(time.Minute) + + istreamer, err := squeue.Pop() + if err != nil { + if lasterr != err { + lasterr = err + log.Println(err) + ps.Wait(time.Minute) + continue + } + } + + streamer := istreamer.(*intimate.Streamer) + Extractor(wd, streamer) + if err = intimate.TStreamer.Update(streamer); err != nil { + log.Println(err) + } + + count++ + if count >= countlimt || time.Now().Sub(recreate) >= time.Minute*120 { + count = 0 + adriver.Close() + adriver = intimate.GetChromeDriver() + recreate = time.Now() + } continue } @@ -185,17 +205,14 @@ func main() { count++ if count >= countlimt || time.Now().Sub(recreate) >= time.Minute*120 { count = 0 - countlimt = 3 + adriver.Close() adriver = intimate.GetChromeDriver() recreate = time.Now() } - if count >= 2 { - break - } - } + adriver.Close() } func Extractor(wd selenium.WebDriver, streamer *intimate.Streamer) { @@ -211,16 +228,16 @@ func Extractor(wd selenium.WebDriver, streamer *intimate.Streamer) { // var updateUrl map[string]string // json.Unmarshal(streamer.UpdateUrl.([]byte), &updateUrl) - liveUrl := streamer.LiveUrl.String - - liveUrl = strings.Replace(liveUrl, "/watchparty", "", -1) + liveUrl := "https://www.twitch.tv/" + (*streamer.UserId) + // liveUrl = strings.Replace(liveUrl, "/watchparty", "", -1) log.Println(liveUrl) // err = wd.Get("https://www.twitch.tv/zoe_0601" + "/about") err := wd.Get(liveUrl + "/about") if err != nil { - log.Println(err) - intimate.TStreamer.UpdateError(streamer, err) + errstr := fmt.Errorf("%s: %s", err.Error(), liveUrl+"/about") + log.Println(errstr) + intimate.TStreamer.UpdateError(streamer, errstr) time.Sleep(time.Second * 5) return } @@ -235,10 +252,10 @@ func Extractor(wd selenium.WebDriver, streamer *intimate.Streamer) { if err != nil { _, err = wd.FindElement(selenium.ByXPATH, "//a[@data-a-target='browse-channels-button']") if err == nil { - log.Println(streamer.UserId, "may be cancell") + log.Println(*streamer.UserId, "may be cancell") streamer.Operator = 5 streamer.UpdateTime = &sql.NullTime{Time: time.Now(), Valid: true} - intimate.TStreamer.UpdateError(streamer, fmt.Errorf("")) + intimate.TStreamer.UpdateError(streamer, fmt.Errorf(*streamer.UserId, "may be cancell")) } return } @@ -276,7 +293,6 @@ func Extractor(wd selenium.WebDriver, streamer *intimate.Streamer) { return } - streamer.Operator = 10 streamer.LatestLogUid = lastClogId if clog.Tags != nil { streamer.Tags = clog.Tags diff --git a/tasks/twitch/twitch_task1/task_twitch.go b/tasks/twitch/twitch_task1/task_twitch.go index 32c531b..57e8618 100644 --- a/tasks/twitch/twitch_task1/task_twitch.go +++ b/tasks/twitch/twitch_task1/task_twitch.go @@ -20,11 +20,12 @@ import ( func Execute() { ps := intimate.NewPerfectShutdown() + var adriver *intimate.AutoCloseDriver for !ps.IsClose() { var err error - adriver := intimate.GetChromeDriver() + adriver = intimate.GetChromeDriver() wd := adriver.Webdriver weburl := "https://www.twitch.tv/directory?sort=VIEWER_COUNT" @@ -109,20 +110,17 @@ func Execute() { if err != nil { log.Println(err) } - - // TODO: Save href - // source := &intimate.Source{} - // source.Source = sql.NullString{String: href, Valid: true} - // source.Operator = 0 - // source.Target = intimate.TTwitchChannel - // source.Url = weburl - // sstore.Insert(source) } log.Println("hrefs len:", len(hrefs)) - // sstore.Deduplicate(intimate.TTwitchChannel, "source") - // wd.Close() - // wd.Quit() - time.Sleep(time.Minute * 30) + adriver.Close() + ps.Wait(time.Minute * 5) + } + + func merge(nums1 []int, m int, nums2 []int, n int) { + for i := 0 ; i < n ; i++ { + nums1[m+i] = n[i] + } + sort } } diff --git a/utils.go b/utils.go index 5f3683f..aa14bbe 100644 --- a/utils.go +++ b/utils.go @@ -100,14 +100,29 @@ type AutoCloseDriver struct { } func (adriver *AutoCloseDriver) Close() { - killshell := fmt.Sprintf("pkill -P `pgrep -f 'port=%d '` && pkill -f 'port=%d '", adriver.Port, adriver.Port) - log.Println(killshell) - // log.Printf(fmt.Sprintf("kill -9 $(lsof -t -i:%d)", port)) - cmd := exec.Command("sh", "-c", killshell) - err := cmd.Run() + data, err := exec.Command("/bin/bash", "-c", fmt.Sprintf(`pgrep -f "port=%d"`, adriver.Port)).Output() if err != nil { log.Println(err) + log.Println(string(data)) + return + } + // log.Println(string(data)) + + killshell := fmt.Sprintf("pkill -P %s", data) + // log.Println(killshell) + // pkill -f \"port=%d\" + // log.Printf(fmt.Sprintf("kill -9 $(lsof -t -i:%d)", port)) + err = exec.Command("/bin/bash", "-c", killshell).Run() + if err != nil { + log.Println(err) + return + } + + err = exec.Command("/bin/bash", "-c", fmt.Sprintf("kill %s", data)).Run() + if err != nil { + log.Println(err) + return } } @@ -217,6 +232,18 @@ func (ps *PerfectShutdown) IsClose() bool { return atomic.LoadInt32(&ps.loop) == 0 } +// Wait 判断是否要关闭 +func (ps *PerfectShutdown) Wait(tm time.Duration) bool { + now := time.Now() + for time.Now().Sub(now) <= tm { + if ps.IsClose() { + return false + } + time.Sleep(time.Second) + } + return true +} + type Counter struct { dcount int count int From 072468005c2a053dcd5dfe3697865f8460070444 Mon Sep 17 00:00:00 2001 From: eson Date: Mon, 14 Sep 2020 15:15:41 +0800 Subject: [PATCH 3/8] =?UTF-8?q?pkill=20=E6=B7=BB=E5=8A=A0-9=20=E5=BC=BA?= =?UTF-8?q?=E5=88=B6kill?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tasks/twitch/twitch_task1/task_twitch.go | 6 ------ utils.go | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/tasks/twitch/twitch_task1/task_twitch.go b/tasks/twitch/twitch_task1/task_twitch.go index 57e8618..c0ab21a 100644 --- a/tasks/twitch/twitch_task1/task_twitch.go +++ b/tasks/twitch/twitch_task1/task_twitch.go @@ -117,10 +117,4 @@ func Execute() { ps.Wait(time.Minute * 5) } - func merge(nums1 []int, m int, nums2 []int, n int) { - for i := 0 ; i < n ; i++ { - nums1[m+i] = n[i] - } - sort - } } diff --git a/utils.go b/utils.go index aa14bbe..edbd926 100644 --- a/utils.go +++ b/utils.go @@ -109,7 +109,7 @@ func (adriver *AutoCloseDriver) Close() { } // log.Println(string(data)) - killshell := fmt.Sprintf("pkill -P %s", data) + killshell := fmt.Sprintf("pkill -9 -P %s", data) // log.Println(killshell) // pkill -f \"port=%d\" // log.Printf(fmt.Sprintf("kill -9 $(lsof -t -i:%d)", port)) From 36c277c3cedc80a1e147c6381ee85b01add93c20 Mon Sep 17 00:00:00 2001 From: eson Date: Tue, 15 Sep 2020 10:39:34 +0800 Subject: [PATCH 4/8] fix: update_interval = 0 if that is error --- extractor/twitch_extractor/tiwtch_extractor.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/extractor/twitch_extractor/tiwtch_extractor.go b/extractor/twitch_extractor/tiwtch_extractor.go index a1eedc9..f502479 100644 --- a/extractor/twitch_extractor/tiwtch_extractor.go +++ b/extractor/twitch_extractor/tiwtch_extractor.go @@ -189,9 +189,11 @@ func main() { for _, streamer := range streamers { Extractor(wd, streamer) + streamer.UpdateTime = &sql.NullTime{Time: time.Now(), Valid: true} if err = intimate.TStreamer.InsertOrUpdate(streamer, intimate.DUpdate{Field: "tags"}, intimate.DUpdate{Field: "update_time"}, + intimate.DUpdate{Field: "update_interval"}, ); err != nil { log.Println(err) } @@ -254,13 +256,15 @@ func Extractor(wd selenium.WebDriver, streamer *intimate.Streamer) { if err == nil { log.Println(*streamer.UserId, "may be cancell") streamer.Operator = 5 - streamer.UpdateTime = &sql.NullTime{Time: time.Now(), Valid: true} intimate.TStreamer.UpdateError(streamer, fmt.Errorf(*streamer.UserId, "may be cancell")) } return } err = extractFollowers(wd, clog) if err != nil { + // log.Println(err) + streamer.UpdateInterval += 30 + return } From 925b7d42c760a853d9001d0808c7999f0f287e73 Mon Sep 17 00:00:00 2001 From: eson Date: Tue, 15 Sep 2020 17:09:22 +0800 Subject: [PATCH 5/8] add: mirrativ init --- .../mirrativ_extractor/mirrativ_extractor.go | 1 + .../mirrativ_extractor_test.go | 7 + extractor_field.go | 2 + platform_list.go | 3 + .../mirrativ/mirrativ_task1/mirrativ_task1.go | 81 +++++++++ .../mirrativ_task1/mirrativ_task1_test.go | 9 + testfile/mirrativ.json | 159 ++++++++++++++++++ 7 files changed, 262 insertions(+) create mode 100644 extractor/mirrativ_extractor/mirrativ_extractor.go create mode 100644 extractor/mirrativ_extractor/mirrativ_extractor_test.go create mode 100644 tasks/mirrativ/mirrativ_task1/mirrativ_task1.go create mode 100644 tasks/mirrativ/mirrativ_task1/mirrativ_task1_test.go create mode 100644 testfile/mirrativ.json diff --git a/extractor/mirrativ_extractor/mirrativ_extractor.go b/extractor/mirrativ_extractor/mirrativ_extractor.go new file mode 100644 index 0000000..06ab7d0 --- /dev/null +++ b/extractor/mirrativ_extractor/mirrativ_extractor.go @@ -0,0 +1 @@ +package main diff --git a/extractor/mirrativ_extractor/mirrativ_extractor_test.go b/extractor/mirrativ_extractor/mirrativ_extractor_test.go new file mode 100644 index 0000000..02d22fb --- /dev/null +++ b/extractor/mirrativ_extractor/mirrativ_extractor_test.go @@ -0,0 +1,7 @@ +package main + +import "testing" + +func TestDo(t *testing.T) { + +} diff --git a/extractor_field.go b/extractor_field.go index 4e1b691..e7577bf 100644 --- a/extractor_field.go +++ b/extractor_field.go @@ -46,6 +46,7 @@ type Streamer struct { Channel *sql.NullString `field:"channel"` // Tags interface{} `field:"tags"` Ext interface{} `field:"ext"` // + Comments interface{} `field:"comments"` IsUpdateStreamer bool // 更新上面的内容 IsUpdateUrl bool @@ -89,6 +90,7 @@ type CollectLog struct { Tags interface{} `field:"tags"` Ext interface{} `field:"ext"` // ErrorMsg *sql.NullString `field:"error_msg"` // + Comments interface{} `field:"comments"` // } // Get Simple Value diff --git a/platform_list.go b/platform_list.go index 98ef433..2006a1d 100644 --- a/platform_list.go +++ b/platform_list.go @@ -15,4 +15,7 @@ const ( // PNimo PNimo 平台 PNimo Platform = "nimo" + + // PMirrativ PNimo 平台 + PMirrativ Platform = "mirrativ" ) diff --git a/tasks/mirrativ/mirrativ_task1/mirrativ_task1.go b/tasks/mirrativ/mirrativ_task1/mirrativ_task1.go new file mode 100644 index 0000000..3bcb2f5 --- /dev/null +++ b/tasks/mirrativ/mirrativ_task1/mirrativ_task1.go @@ -0,0 +1,81 @@ +package main + +import ( + "database/sql" + "intimate" + "log" + "time" + + "github.com/474420502/gcurl" + "github.com/tidwall/gjson" +) + +func main() { + bcurl := `curl 'https://www.mirrativ.com/api/live/catalog?id=2&cursor=%s' \ + -H 'authority: www.mirrativ.com' \ + -H 'accept: application/json' \ + -H 'x-timezone: Asia/Shanghai' \ + -H 'x-csrf-token: F3Ojd6RBtApP6YAZzVn-9jWN1of159VxAqOQL1Zn' \ + -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36' \ + -H 'content-type: application/json' \ + -H 'sec-fetch-site: same-origin' \ + -H 'sec-fetch-mode: cors' \ + -H 'sec-fetch-dest: empty' \ + -H 'referer: https://www.mirrativ.com/' \ + -H 'accept-language: zh-CN,zh;q=0.9,ja;q=0.8' \ + -H 'cookie: f=A2D75F0E-D218-11EA-A042-452BF6D21CE8; _ga=GA1.2.689947597.1596081392; mr_id=kxb65LddGMZf5C28jkR_tGCZD_ZFOAepD5gfXO7eNjfPMB8EKYvU1Vg_Y29V1lsa; _gid=GA1.2.2116692650.1600139685; lang=ja' \ + --compressed` + + curl := gcurl.Parse(bcurl) + tp := curl.CreateTemporary(nil) + cursor := tp.QueryParam(`cursor`) + cursor.StringSet("") + + for { + + log.Println(tp.ParsedURL.String()) + resp, err := tp.Execute() + if err != nil { + log.Println(err) + time.Sleep(time.Second * 2) + continue + } + + apijson := gjson.ParseBytes(resp.Content()) + next := apijson.Get("next_cursor").String() + + for _, liveinfo := range apijson.Get("list").Array() { + var prekey string + if liveinfo.Get("live_preview").Exists() { + prekey = "live_preview" + } else { + prekey = "live" + } + owner := liveinfo.Get(prekey + ".owner") + if guserid := owner.Get("user_id"); guserid.String() != "" { + streamer := &intimate.Streamer{} + streamer.Platform = intimate.PMirrativ + streamer.Operator = 0 + streamer.UserId = &guserid.Str + streamer.UserName = &sql.NullString{String: liveinfo.Get("name").String(), Valid: true} + streamer.UpdateInterval = 60 + streamer.UpdateTime = intimate.GetUpdateTimeNow() + + err = intimate.TStreamer.InsertOrUpdate( + streamer, + intimate.DUpdate{Field: "update_time"}, + ) + if err != nil { + log.Println(err) + panic(err) + } + } + } + if next == "" { + time.Sleep(time.Minute * 5) + } else { + time.Sleep(time.Second * 2) + } + cursor.StringSet(next) + } +} diff --git a/tasks/mirrativ/mirrativ_task1/mirrativ_task1_test.go b/tasks/mirrativ/mirrativ_task1/mirrativ_task1_test.go new file mode 100644 index 0000000..0ca53de --- /dev/null +++ b/tasks/mirrativ/mirrativ_task1/mirrativ_task1_test.go @@ -0,0 +1,9 @@ +package main + +import ( + "testing" +) + +func TestMain(t *testing.T) { + +} diff --git a/testfile/mirrativ.json b/testfile/mirrativ.json new file mode 100644 index 0000000..0fbad59 --- /dev/null +++ b/testfile/mirrativ.json @@ -0,0 +1,159 @@ +{ + "status": { + "msg": "", + "ok": 1, + "error": "", + "captcha_url": "", + "error_code": 0, + "message": "" + }, + "current_cursor": "MDoxMzplbjoyNjY2OTA2MS8w", + "next_cursor": "", + "latest_diamonds_given_at": null, + "announcement_urls": {}, + "list": [ + { + "live_preview": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "is_gift_supported": 0, + "collab_has_vacancy": 1, + "stamp_num": 0, + "live_id": "rAjAr5gwVtdkj1c-x8FNxA", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_share/6cae74e76b205f415051b28aaf06ef9bb5f08dd8e03f54678a449551698788bf_share.jpeg?1600143674", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 18, + "ended_at": 0, + "thumbnail_image_url": "", + "is_archive": 0, + "online_user_num": 4, + "preview": { + "streaming_url_hls": "http://hls-cdn30.mirrativ.com/liveedge/db5968b68a5a11e46c624b9835d1b5902a221981e397a9c495a3a12bf6d58ac3/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-152.mirrativ.com:1935/liveedge/db5968b68a5a11e46c624b9835d1b5902a221981e397a9c495a3a12bf6d58ac3" + }, + "title": "Iván say bullshit out loud. ", + "share_url": "https://www.mirrativ.com/live/rAjAr5gwVtdkj1c-x8FNxA", + "orientation": 2, + "app_icon_urls": [], + "max_online_viewer_num": 6, + "created_at": 1600055418, + "preview_blur_image_url": "", + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/6cae74e76b205f415051b28aaf06ef9bb5f08dd8e03f54678a449551698788bf_m.jpeg?crop=16:9,offset-x0,offset-y26&blur=80&1600143674", + "started_at": 1600141392, + "is_live": 1, + "image_url_without_letterbox": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/6cae74e76b205f415051b28aaf06ef9bb5f08dd8e03f54678a449551698788bf_m.jpeg?1600143674", + "thumbnail_blur_image_url": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 0, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/6cae74e76b205f415051b28aaf06ef9bb5f08dd8e03f54678a449551698788bf_m.jpeg?1600143674", + "owner": { + "share_url": "https://www.mirrativ.com/user/10083948", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/58345863caafaf6f8272de423ce0b5b09375691a0e23c88a8080ecbe765467be_m.jpeg?1600055396", + "name": "Iván_rabbyt", + "description": "Ivan says bullshit out loud ", + "properties": [], + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_normal_holiday_L.en.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_normal_holiday_S.en.png?v6" + } + ], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_normal_holiday_en@3x.png?v5", + "user_id": "10083948", + "onlive": null + }, + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/6cae74e76b205f415051b28aaf06ef9bb5f08dd8e03f54678a449551698788bf_m.jpeg?crop=16:9,offset-x0,offset-y26&1600143674", + "bcsvr_key": "1abb7337:53JOIIhx", + "orientation_v2": 6, + "heartbeated_at": 1600143639 + }, + "type": "live_preview" + }, + { + "live": { + "is_private": 0, + "collab_supported": 0, + "sticker_enabled": 0, + "is_gift_supported": 1, + "collab_has_vacancy": 0, + "stamp_num": 0, + "live_id": "FV-79JspHmjsDLn4rdCJ3g", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/80e27298548e6dc1df5691d3c1e120d04791f3de4e0cee8f3d01fadd11d13652_share.jpeg?1600143689", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 103, + "ended_at": 0, + "thumbnail_image_url": "", + "is_archive": 0, + "online_user_num": 3, + "preview": { + "streaming_url_hls": "http://hls-cdn45.mirrativ.com/liveedge/2cd62d82d807effdd573e58d074ed31c40ab7a85a71332e729bc1dc86bf85938/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-214.mirrativ.com:1935/liveedge/2cd62d82d807effdd573e58d074ed31c40ab7a85a71332e729bc1dc86bf85938" + }, + "title": "chilling and gaming", + "share_url": "https://www.mirrativ.com/live/FV-79JspHmjsDLn4rdCJ3g", + "app_id": "com.google.android.youtube", + "orientation": 0, + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/c434fd240dfe93243c64944fa8cbfad0f3f373b6e380903f5d93ccf1c070a2d6.png" + ], + "max_online_viewer_num": 9, + "created_at": 1600132181, + "preview_blur_image_url": "", + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/80e27298548e6dc1df5691d3c1e120d04791f3de4e0cee8f3d01fadd11d13652_m.jpeg?blur=80&1600143689", + "started_at": 1600132190, + "is_live": 1, + "image_url_without_letterbox": "", + "thumbnail_blur_image_url": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "comment_num": 11, + "max_collab_user_num": 1, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/80e27298548e6dc1df5691d3c1e120d04791f3de4e0cee8f3d01fadd11d13652_m.jpeg?1600143689", + "owner": { + "share_url": "https://www.mirrativ.com/user/3399944", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/3b3408709e40caf081e5f20d5a58dd3cb59b83e7d994b3f9119ca8f675a3bc9e_m.jpeg?1600121828", + "name": "Branndon", + "description": "Fuk fortnite", + "properties": [], + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_L.en.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_S.en.png?v6" + } + ], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_super_holiday_en@3x.png?v5", + "user_id": "3399944", + "onlive": null + }, + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 0, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/80e27298548e6dc1df5691d3c1e120d04791f3de4e0cee8f3d01fadd11d13652_m.jpeg?1600143689", + "bcsvr_key": "1abd0717:FX5ZAqVh", + "orientation_v2": 0, + "heartbeated_at": 1600143665 + }, + "type": "live" + } + ] +} \ No newline at end of file From ee28db4ad80a75fdd453150ea6d945d6c4905c50 Mon Sep 17 00:00:00 2001 From: eson Date: Tue, 15 Sep 2020 19:06:03 +0800 Subject: [PATCH 6/8] todo: profile live --- .../mirrativ_extractor_test.go | 48 +- testfile/mirrativ.json | 2351 ++++++++++++++++- 2 files changed, 2324 insertions(+), 75 deletions(-) diff --git a/extractor/mirrativ_extractor/mirrativ_extractor_test.go b/extractor/mirrativ_extractor/mirrativ_extractor_test.go index 02d22fb..49c9507 100644 --- a/extractor/mirrativ_extractor/mirrativ_extractor_test.go +++ b/extractor/mirrativ_extractor/mirrativ_extractor_test.go @@ -1,7 +1,51 @@ package main -import "testing" +import ( + "intimate" + "log" + "testing" + "time" -func TestDo(t *testing.T) { + "github.com/474420502/gcurl" +) + +func main() { + + ps := intimate.NewPerfectShutdown() + gprofile := gcurl.Parse(`https://www.mirrativ.com/api/user/profile?user_id=103383701`) + tpProfile := gprofile.CreateTemporary(nil) + tpProfileUserID := tpProfile.QueryParam("user_id") + + g := gcurl.Parse(`https://www.mirrativ.com/api/live/live?live_id=O5Ia4iX9c5CeZj7DFtg52Q`) + tpLive := g.CreateTemporary(nil) + tpLiveID := tpLive.QueryParam("live_id") + + queue := intimate.TStreamer.Queue(intimate.Streamer{}, intimate.ConditionDefault(intimate.PMirrativ)) + for !ps.IsClose() { + istreamer, err := queue.Pop() + if err != nil { + log.Println(err) + time.Sleep(time.Second * 2) + continue + } + + streamer := istreamer.(*intimate.Streamer) + userid := *streamer.UserId + + tpProfileUserID.StringSet(userid) + resp, err := tpProfile.Execute() + if err != nil { + log.Println(err) + time.Sleep(time.Second) + continue + } + + profilejson := gcurl.Parse(string(resp.Content())) + + } } + +func TestDo(t *testing.T) { + main() +} diff --git a/testfile/mirrativ.json b/testfile/mirrativ.json index 0fbad59..2106e78 100644 --- a/testfile/mirrativ.json +++ b/testfile/mirrativ.json @@ -7,8 +7,8 @@ "error_code": 0, "message": "" }, - "current_cursor": "MDoxMzplbjoyNjY2OTA2MS8w", - "next_cursor": "", + "current_cursor": "MDoxMzpqYToyNjY2OTMzMy8x", + "next_cursor": "MDoxMzpqYToyNjY2OTMzMy8y", "latest_diamonds_given_at": null, "announcement_urls": {}, "list": [ @@ -17,130 +17,1009 @@ "is_private": 0, "collab_supported": 1, "sticker_enabled": 0, - "is_gift_supported": 0, "collab_has_vacancy": 1, + "is_gift_supported": 1, "stamp_num": 0, - "live_id": "rAjAr5gwVtdkj1c-x8FNxA", + "live_id": "h-xCIY_1Nq_ht3YXY6yeiA", "collab_online_user_num": 0, - "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_share/6cae74e76b205f415051b28aaf06ef9bb5f08dd8e03f54678a449551698788bf_share.jpeg?1600143674", + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/973d6e8630989189cefc60e28c0c2736801cb84419a3c5d41dd1057a7184338f_share.jpeg?1600159890", "following_viewer_image_urls": [], "is_mirrorable": 0, "description": "", - "total_viewer_num": 18, - "ended_at": 0, + "total_viewer_num": 720, "thumbnail_image_url": "", + "ended_at": 0, "is_archive": 0, - "online_user_num": 4, "preview": { - "streaming_url_hls": "http://hls-cdn30.mirrativ.com/liveedge/db5968b68a5a11e46c624b9835d1b5902a221981e397a9c495a3a12bf6d58ac3/playlist.m3u8", - "streaming_url_edge": "rtmp://edge-210-140-191-152.mirrativ.com:1935/liveedge/db5968b68a5a11e46c624b9835d1b5902a221981e397a9c495a3a12bf6d58ac3" + "streaming_url_hls": "http://hls-cdn47.mirrativ.com/liveedge/v13d6497f7d6fa869e1bdb37093c32a61f234248bbd7c3de461bb67e0cfe41c3/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-140.mirrativ.com:1935/liveedge/v13d6497f7d6fa869e1bdb37093c32a61f234248bbd7c3de461bb67e0cfe41c3" }, - "title": "Iván say bullshit out loud. ", - "share_url": "https://www.mirrativ.com/live/rAjAr5gwVtdkj1c-x8FNxA", + "online_user_num": 89, + "title": "初心者による第5練習😇参加〇 サムネは相方とのほのぼ〜のとした会話です🥺", + "share_url": "https://www.mirrativ.com/live/h-xCIY_1Nq_ht3YXY6yeiA", "orientation": 2, - "app_icon_urls": [], - "max_online_viewer_num": 6, - "created_at": 1600055418, - "preview_blur_image_url": "", - "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/6cae74e76b205f415051b28aaf06ef9bb5f08dd8e03f54678a449551698788bf_m.jpeg?crop=16:9,offset-x0,offset-y26&blur=80&1600143674", - "started_at": 1600141392, + "app_id": "com.netease.dwrg", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/3538a29c1da0a2cc5ab623915a5ba2ae8dfeac7b1b1877eac749241f3d4352dd.png" + ], + "max_online_viewer_num": 96, + "created_at": 1600145796, "is_live": 1, - "image_url_without_letterbox": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/6cae74e76b205f415051b28aaf06ef9bb5f08dd8e03f54678a449551698788bf_m.jpeg?1600143674", + "started_at": 1600154438, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/973d6e8630989189cefc60e28c0c2736801cb84419a3c5d41dd1057a7184338f_m.jpeg?blur=80&1600159890", + "preview_blur_image_url": "", "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/973d6e8630989189cefc60e28c0c2736801cb84419a3c5d41dd1057a7184338f_m.jpeg?1600159890", "sticker_num": 0, "thumbnail_frame": {}, "max_collab_user_num": 3, - "comment_num": 0, - "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/6cae74e76b205f415051b28aaf06ef9bb5f08dd8e03f54678a449551698788bf_m.jpeg?1600143674", + "comment_num": 491, "owner": { - "share_url": "https://www.mirrativ.com/user/10083948", - "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/58345863caafaf6f8272de423ce0b5b09375691a0e23c88a8080ecbe765467be_m.jpeg?1600055396", - "name": "Iván_rabbyt", - "description": "Ivan says bullshit out loud ", + "share_url": "https://www.mirrativ.com/user/9520228", + "is_able_continuous_stream_holiday": 1, + "name": "Df_もち👩🦲🍼", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/efe87ea0c454ebad795bcf83b030fe6a1c552f486ba752ccc7f5c17659840be8_m.jpeg?1600145795", + "description": "さゆこのお世話係🍼 激推し➛🧸🐻推し➛🐉🐈ファンマ➛👩🦲🍼 Dfクラン所属", + "badges": [], "properties": [], - "badges": [ - { - "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_normal_holiday_L.en.png?v6", - "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_normal_holiday_S.en.png?v6" - } - ], - "is_continuous_streamer": 1, + "is_continuous_streamer": 0, "is_new": 0, - "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_normal_holiday_en@3x.png?v5", - "user_id": "10083948", + "user_id": "9520228", "onlive": null }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/973d6e8630989189cefc60e28c0c2736801cb84419a3c5d41dd1057a7184338f_m.jpeg?1600159890", "following_viewer_num": 0, "sticker_display_type": 0, "tags": [], "is_following": 0, "collab_enabled": 1, - "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/6cae74e76b205f415051b28aaf06ef9bb5f08dd8e03f54678a449551698788bf_m.jpeg?crop=16:9,offset-x0,offset-y26&1600143674", - "bcsvr_key": "1abb7337:53JOIIhx", - "orientation_v2": 6, - "heartbeated_at": 1600143639 + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/973d6e8630989189cefc60e28c0c2736801cb84419a3c5d41dd1057a7184338f_m.jpeg?1600159890", + "bcsvr_key": "1abd23c7:mxzc0LcQ", + "heartbeated_at": 1600160019, + "orientation_v2": 6 }, "type": "live_preview" }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "FSYtpH0ambA9puerk1IMSA", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/f4f6760d2eb4ebe6184125b1b0c3f3cdcb03f49affda50c638aabe25b1a26319_share.jpeg?1600159909", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 248, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn53.mirrativ.com/liveedge/v12bc8d7120c8c1b9c79da403a82a390d26aa542818e3914a1493b2d78e954f1/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-208.mirrativ.com:1935/liveedge/v12bc8d7120c8c1b9c79da403a82a390d26aa542818e3914a1493b2d78e954f1" + }, + "online_user_num": 42, + "title": "雑談しよ❤❤❤常連さん初見さんおいで(つ *´︶`*)っ❤❤デイリーOK❤", + "share_url": "https://www.mirrativ.com/live/FSYtpH0ambA9puerk1IMSA", + "orientation": 1, + "app_id": "com.dena.mirrativa", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/afdae74097b193443ea8cab36d1e79666aee9a8b510a253cb5694a5dd6e387af.png" + ], + "max_online_viewer_num": 54, + "created_at": 1600124188, + "is_live": 1, + "started_at": 1600157481, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/f4f6760d2eb4ebe6184125b1b0c3f3cdcb03f49affda50c638aabe25b1a26319_m.jpeg?blur=80&1600159909", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 2, + "comment_num": 316, + "owner": { + "share_url": "https://www.mirrativ.com/user/99157138", + "is_able_continuous_stream_holiday": 1, + "name": "かい様🥐🐧【L∞F】", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/f60142b9e070c12c0ccd47263ab2db78cc42cbd5386ede7c5e179afc1d2c7556_m.jpeg?1600124185", + "description": "〖🌺Lien fort🌺〗代表 愛方れい 🐧相方あんちゃ", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_S.ja.png?v6" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_super_holiday_ja@3x.png?v5", + "user_id": "99157138", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/f4f6760d2eb4ebe6184125b1b0c3f3cdcb03f49affda50c638aabe25b1a26319_m.jpeg?1600159909", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/f4f6760d2eb4ebe6184125b1b0c3f3cdcb03f49affda50c638aabe25b1a26319_m.jpeg?1600159909", + "bcsvr_key": "1abcfa1a:uOe9nTPL", + "heartbeated_at": 1600160012, + "orientation_v2": 1 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 0, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "76dnBfGCa4zRnRRhl4RF3w", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/98b258ebf8553b94bf1b1c488617bf25eadcdc11174790d4d102d1b76a0acf90_share.jpeg?1600159973", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 156, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn35.mirrativ.com/liveedge/d78c7875d5fe92f0d3e024476b339e0a7a5a7b6cc99910f37d3951b56d89e836/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-157.mirrativ.com:1935/liveedge/d78c7875d5fe92f0d3e024476b339e0a7a5a7b6cc99910f37d3951b56d89e836" + }, + "online_user_num": 32, + "title": "🍀🍀🍀ツムツム😊まったりコイン稼ぎ🍀🍀🍀電話落ち😱すみません😭", + "share_url": "https://www.mirrativ.com/live/76dnBfGCa4zRnRRhl4RF3w", + "orientation": 1, + "app_id": "com.linecorp.LGTMTM", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/af15d4cf71043719078324048c862d5d3e6a7f02526cb15ad70e7d9940000ba1.png" + ], + "max_online_viewer_num": 41, + "created_at": 1600157532, + "is_live": 1, + "started_at": 1600157548, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/98b258ebf8553b94bf1b1c488617bf25eadcdc11174790d4d102d1b76a0acf90_m.jpeg?blur=80&1600159973", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 221, + "owner": { + "share_url": "https://www.mirrativ.com/user/100912229", + "is_able_continuous_stream_holiday": 1, + "name": "💕💍💕みー💕", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/2649abf533710587b56a051fa7cacc9d068a0c068ee29d60ff82c35ebb2135b6_m.jpeg?1600157300", + "description": "ツムツム配信😊推しマ→💕💍💕推し→🍒🌸🌸🐷🐙🎤💼🐶🍄🧸", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_S.ja.png?v6" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_super_holiday_ja@3x.png?v5", + "user_id": "100912229", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/98b258ebf8553b94bf1b1c488617bf25eadcdc11174790d4d102d1b76a0acf90_m.jpeg?1600159973", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 0, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/98b258ebf8553b94bf1b1c488617bf25eadcdc11174790d4d102d1b76a0acf90_m.jpeg?1600159973", + "bcsvr_key": "1abd4fa6:p645GGXJ", + "heartbeated_at": 1600160009, + "orientation_v2": 1 + }, + "type": "live" + }, { "live": { "is_private": 0, "collab_supported": 0, "sticker_enabled": 0, + "collab_has_vacancy": 0, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "1K3rYPoIPxsx4MQsn-ypEA", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/26e76395e550b3db2154d07ca2530c1d8e73731f2f3bb7c573cb00e07eaaf8c6_share.jpeg?1600159913", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 1322, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn24.mirrativ.com/liveedge/475228dfb3f05a97aa5513620d0824c610050228f4c3ab93024b84e5e5f800b6/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-174.mirrativ.com:1935/liveedge/475228dfb3f05a97aa5513620d0824c610050228f4c3ab93024b84e5e5f800b6" + }, + "online_user_num": 80, + "title": "【参加型】aimで語りたいPC初心者とクリエで練習しませんか?(夕方の部)", + "share_url": "https://www.mirrativ.com/live/1K3rYPoIPxsx4MQsn-ypEA", + "orientation": 0, + "app_id": "com.epicgames.fortnite", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/724dcecc4abdda6c68040a796facd650f5017d50397fff296395c9e89b9cbcfa.png" + ], + "max_online_viewer_num": 139, + "created_at": 1600154655, + "is_live": 1, + "started_at": 1600154870, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/26e76395e550b3db2154d07ca2530c1d8e73731f2f3bb7c573cb00e07eaaf8c6_m.jpeg?blur=80&1600159913", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 1, + "comment_num": 673, + "owner": { + "share_url": "https://www.mirrativ.com/user/101883748", + "is_able_continuous_stream_holiday": 1, + "name": "SW_いかちゃん🥊🔫", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/9250f0ea16065ad51bf3809bed6ff9b19c475d9de5b21caf0a06296358709af4_m.png?1600073561", + "description": "【fortnite】 SW専属アマチュア配信者 推しマ→🥊🔫", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_S.ja.png?v6" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_super_holiday_ja@3x.png?v5", + "user_id": "101883748", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/26e76395e550b3db2154d07ca2530c1d8e73731f2f3bb7c573cb00e07eaaf8c6_m.jpeg?1600159913", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 0, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/26e76395e550b3db2154d07ca2530c1d8e73731f2f3bb7c573cb00e07eaaf8c6_m.jpeg?1600159913", + "bcsvr_key": "1abd3faf:UmHXmU5P", + "heartbeated_at": 1600159972, + "orientation_v2": 0 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 0, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "dGxA6c_5tAzPgU1CIgWmMQ", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/7497a164a2d85bc45a892ab12df9e7a676738fb405b88ee77f23d36ceefe6517_share.jpeg?1600159954", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 101, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn53.mirrativ.com/liveedge/v162c6b0d3d75a37715456d2288f734569797ea4e536fbcd566e430868d8d2b7/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-173.mirrativ.com:1935/liveedge/v162c6b0d3d75a37715456d2288f734569797ea4e536fbcd566e430868d8d2b7" + }, + "online_user_num": 41, + "title": "一緒にあそびましょ〜🩰 雑談 ゼペット Siri先輩 ", + "share_url": "https://www.mirrativ.com/live/dGxA6c_5tAzPgU1CIgWmMQ", + "orientation": 1, + "app_id": "me.zepeto.main", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/f1fa0f73a9575d768d50fbce93631a25185832ac66cf90c79f9a8a07c07b4dad.png" + ], + "max_online_viewer_num": 49, + "created_at": 1600159034, + "is_live": 1, + "started_at": 1600159189, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/7497a164a2d85bc45a892ab12df9e7a676738fb405b88ee77f23d36ceefe6517_m.jpeg?blur=80&1600159954", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 1, + "comment_num": 331, + "owner": { + "share_url": "https://www.mirrativ.com/user/105997289", + "name": "あゔぃ ちゃん ∞", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/42647fd02e8cabd342011906071d453caaab35b57ad4e03fa22991010524d301_m.jpeg?1599982102", + "description": "🤍 ゼペットコード FZKPHQ 🌈 ", + "badges": [], + "properties": [], + "is_continuous_streamer": 0, + "is_new": 0, + "user_id": "105997289", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/7497a164a2d85bc45a892ab12df9e7a676738fb405b88ee77f23d36ceefe6517_m.jpeg?1600159954", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 0, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/7497a164a2d85bc45a892ab12df9e7a676738fb405b88ee77f23d36ceefe6517_m.jpeg?1600159954", + "bcsvr_key": "1abd5904:JGxCvSyi", + "heartbeated_at": 1600159970, + "orientation_v2": 1 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "NBQQDu-sv4llbBVVF8ayHQ", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/23e6863e2d5cebf4207ae510157d1678759f29cdd0af2624f2de9784879c8391_share.jpeg?1600160003", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 25, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn49.mirrativ.com/liveedge/v102759d5d03b34915ff11744c18343d733c482a79c2c40f63b99f9d37214b3c/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-143.mirrativ.com:1935/liveedge/v102759d5d03b34915ff11744c18343d733c482a79c2c40f63b99f9d37214b3c" + }, + "online_user_num": 23, + "title": "マイクラ参加型 サバイバル2日目 (再配信)", + "share_url": "https://www.mirrativ.com/live/NBQQDu-sv4llbBVVF8ayHQ", + "orientation": 2, + "app_id": "com.mojang.minecraftpe", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/f59bc14f65c339202bd71c738ea7aaa877a60f6e834e86612ed1c3f51af2e068.png" + ], + "max_online_viewer_num": 23, + "created_at": 1600159664, + "is_live": 1, + "started_at": 1600159697, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/23e6863e2d5cebf4207ae510157d1678759f29cdd0af2624f2de9784879c8391_m.jpeg?blur=80&1600160003", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 11, + "owner": { + "share_url": "https://www.mirrativ.com/user/106610505", + "is_able_continuous_stream_holiday": 1, + "name": "つちはや(ゲーム垢)", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/1d8c0a145dcd4e285ec6f29c868cc2c55cbd424590368b7d25f66363e68af888_m.jpeg?1600159592", + "description": "また始めました。Twitterフォローよろしくお願いします", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_normal_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_normal_holiday_S.ja.png?v6" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_normal_holiday_ja@3x.png?v5", + "user_id": "106610505", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/23e6863e2d5cebf4207ae510157d1678759f29cdd0af2624f2de9784879c8391_m.jpeg?1600160003", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/23e6863e2d5cebf4207ae510157d1678759f29cdd0af2624f2de9784879c8391_m.jpeg?1600160003", + "bcsvr_key": "1abd5d02:H9Dhw09W", + "heartbeated_at": 1600159998, + "orientation_v2": 6 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "L72aGllQ8oUxCj38itbLEQ", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/ff3fd87500acedab9406d07a8ec5e27aeb27048594c23bcfb7db945fe7278845_share.jpeg?1600159879", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 931, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn43.mirrativ.com/liveedge/0d2b66c3ffa4ff5fbdd2c8d259bb6a0dcbe3980774231c81ecedc9a72abd25b2/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-215.mirrativ.com:1935/liveedge/0d2b66c3ffa4ff5fbdd2c8d259bb6a0dcbe3980774231c81ecedc9a72abd25b2" + }, + "online_user_num": 57, + "title": "33or55ランク 39勝するまで寝れません! 22勝16敗2ダッヂ", + "share_url": "https://www.mirrativ.com/live/L72aGllQ8oUxCj38itbLEQ", + "orientation": 2, + "app_id": "com.superevilmegacorp.kindred", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/e3a989973e8a9157e1599450e2e9978e9b72a9f1b8941b6c1ff2bb2ee5740882.png" + ], + "max_online_viewer_num": 57, + "created_at": 1600137816, + "is_live": 1, + "started_at": 1600137818, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/ff3fd87500acedab9406d07a8ec5e27aeb27048594c23bcfb7db945fe7278845_m.jpeg?blur=80&1600159879", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 392, + "owner": { + "share_url": "https://www.mirrativ.com/user/777175", + "is_able_continuous_stream_holiday": 1, + "name": "ちび猿", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/e9ab6fbd4826e666524af94139d3c96291f2c410caa7e12b8f363700f042c9fd_m.jpeg?1600137790", + "description": "敗北者の成り上がり", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_L.ja.png?v1", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_S.ja.png?v1" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_master_holiday_ja@3x.png?v5", + "user_id": "777175", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/ff3fd87500acedab9406d07a8ec5e27aeb27048594c23bcfb7db945fe7278845_m.jpeg?1600159879", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/ff3fd87500acedab9406d07a8ec5e27aeb27048594c23bcfb7db945fe7278845_m.jpeg?1600159879", + "bcsvr_key": "1abd1171:czq7wB3G", + "heartbeated_at": 1600160018, + "orientation_v2": 6 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "cQ7gWV-3kwjuRX78mQUxKQ", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/2a6e2b47413c6cf9d8dc521a95f1cd3162544c0c34f61a7a1a34d1a2cac84e94_share.jpeg?1600159884", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 111, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn26.mirrativ.com/liveedge/698e8a94fe8593d792285484824aa7e59264a59342dca33b91947ad227190ae5/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-194.mirrativ.com:1935/liveedge/698e8a94fe8593d792285484824aa7e59264a59342dca33b91947ad227190ae5" + }, + "online_user_num": 33, + "title": "会社着くまで雑談ー", + "share_url": "https://www.mirrativ.com/live/cQ7gWV-3kwjuRX78mQUxKQ", + "orientation": 1, + "app_id": "com.dena.mirrativa", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/afdae74097b193443ea8cab36d1e79666aee9a8b510a253cb5694a5dd6e387af.png" + ], + "max_online_viewer_num": 35, + "created_at": 1600073714, + "is_live": 1, + "started_at": 1600157605, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/2a6e2b47413c6cf9d8dc521a95f1cd3162544c0c34f61a7a1a34d1a2cac84e94_m.jpeg?blur=80&1600159884", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 331, + "owner": { + "share_url": "https://www.mirrativ.com/user/7493129", + "is_able_continuous_stream_holiday": 1, + "name": "つるぴー33", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/02d3839e08f757006d71c53c20a86436d2cc39c6a8b79065aa8fe36b523d394f_m.jpeg?1600073713", + "description": "美智子LOVE 変人エンターテイナーです 趣味でYouTubeもやってます", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_S.ja.png?v6" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_super_holiday_ja@3x.png?v5", + "user_id": "7493129", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/2a6e2b47413c6cf9d8dc521a95f1cd3162544c0c34f61a7a1a34d1a2cac84e94_m.jpeg?1600159884", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/2a6e2b47413c6cf9d8dc521a95f1cd3162544c0c34f61a7a1a34d1a2cac84e94_m.jpeg?1600159884", + "bcsvr_key": "1abbc0e9:YmNHDP85", + "heartbeated_at": 1600160006, + "orientation_v2": 1 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "QIc9A18KmJJOEe5n4pAqJQ", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/a0bb723b0ed993d830663aa578ae7c2f8933f16fc48a170af8e008a0dc9d191b_share.jpeg?1600160002", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 283, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn39.mirrativ.com/liveedge/v1d572fa1b9fd920a0c0e6774d3ce409f53d70789218e98941e1afa27311d187/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-136.mirrativ.com:1935/liveedge/v1d572fa1b9fd920a0c0e6774d3ce409f53d70789218e98941e1afa27311d187" + }, + "online_user_num": 77, + "title": "テニスラケットを手にする✋🎾(今大会はタワー頑張ります)", + "share_url": "https://www.mirrativ.com/live/QIc9A18KmJJOEe5n4pAqJQ", + "orientation": 1, + "app_id": "jp.colopl.tennis", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/cf22cf1f1f8e73da7160b7addad5e85756d76effe22e4e31f2260a292a7bda1c.png" + ], + "max_online_viewer_num": 77, + "created_at": 1600157708, + "is_live": 1, + "started_at": 1600157727, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/a0bb723b0ed993d830663aa578ae7c2f8933f16fc48a170af8e008a0dc9d191b_m.jpeg?blur=80&1600160002", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 78, + "owner": { + "share_url": "https://www.mirrativ.com/user/1339952", + "is_able_continuous_stream_holiday": 1, + "name": "やっさん❁", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/370c78079647da9a65c22b5d2babc40726fb54cf1acab9a3c3cb229292c4c03e_m.jpeg?1600116542", + "description": "🗼最高🥈位 Marigold❁マスター リアル大会エンターテイナー賞👨🎨", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_extreme_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_extreme_holiday_S.ja.png?v6" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_extreme_holiday_ja@3x.png?v5", + "user_id": "1339952", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/a0bb723b0ed993d830663aa578ae7c2f8933f16fc48a170af8e008a0dc9d191b_m.jpeg?1600160002", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/a0bb723b0ed993d830663aa578ae7c2f8933f16fc48a170af8e008a0dc9d191b_m.jpeg?1600160002", + "bcsvr_key": "1abd50a2:IUM2wbIA", + "heartbeated_at": 1600160008, + "orientation_v2": 1 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "Gu9Frk99kqabxs6cYaUjXA", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/84171c2028d4bf3336be4db9fde4b2e3281238d865e362c1b8885b00dfde1179_share.jpeg?1600159982", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 1951, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn27.mirrativ.com/liveedge/0356c25066359d5e722bd1d7e56e0a53e499b58bc63457eb3e92147ca205463f/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-218.mirrativ.com:1935/liveedge/0356c25066359d5e722bd1d7e56e0a53e499b58bc63457eb3e92147ca205463f" + }, + "online_user_num": 68, + "title": "絆&セレナーデノクターンのストック提供できる方お願いします🙄モンスト&雑談🌴🐥", + "share_url": "https://www.mirrativ.com/live/Gu9Frk99kqabxs6cYaUjXA", + "orientation": 1, + "app_id": "jp.co.mixi.monsterstrike", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/42f681f04061add226c14d99468380ac6f3fa659eecbe3d81ede88d5c8fd98a1.png" + ], + "max_online_viewer_num": 148, + "created_at": 1600078021, + "is_live": 1, + "started_at": 1600151508, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/84171c2028d4bf3336be4db9fde4b2e3281238d865e362c1b8885b00dfde1179_m.jpeg?blur=80&1600159982", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": { + "right_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/assets/avatar/img/thumbnail_frames/0004_right.png?v=1", + "icon_url": "https://cdn.mirrativ.com/mirrorman-prod/assets/avatar/img/thumbnail_frames/0004_icon.png?v=1", + "right_thumbnail_animation_url": "https://cdn.mirrativ.com/mirrorman-prod/assets/avatar/img/thumbnail_frames/0004_right.webp?v=1", + "left_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/assets/avatar/img/thumbnail_frames/0004_left.png?v=1", + "id": 4919 + }, + "max_collab_user_num": 1, + "comment_num": 456, + "owner": { + "share_url": "https://www.mirrativ.com/user/103023539", + "is_able_continuous_stream_holiday": 1, + "name": "🛍ゆにゃん👧🏼💋🛍", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/c714b12f61796f2e4e15f7006347ce7c2c31b72aafe678ad90d29ba983cc838d_m.jpeg?1600078020", + "description": "モンスト配信者ランキング22位🌴✨轟絶13種🎐🐥ゆるふわ勢ですが宜しくネ🧡", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_L.ja.png?v1", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_S.ja.png?v1" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_master_holiday_ja@3x.png?v5", + "user_id": "103023539", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/84171c2028d4bf3336be4db9fde4b2e3281238d865e362c1b8885b00dfde1179_m.jpeg?1600159982", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/84171c2028d4bf3336be4db9fde4b2e3281238d865e362c1b8885b00dfde1179_m.jpeg?1600159982", + "bcsvr_key": "1abbe1a5:O8aNeCFd", + "heartbeated_at": 1600160029, + "orientation_v2": 1 + }, + "type": "live" + }, + { + "live_preview": { + "is_private": 0, + "collab_supported": 0, + "sticker_enabled": 0, + "collab_has_vacancy": 0, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "qtswMR9LHNzZLWHpw-jDaA", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/574826858adc950fa3384a278effca1d527e41cc263478ea6d67b760c1b81de5_share.jpeg?1600160029", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 225, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn35.mirrativ.com/liveedge/28f0046696e9a4fcc413b9de8de3e43e6849aa94d2daf9f960bbff3f23da2008/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-225.mirrativ.com:1935/liveedge/28f0046696e9a4fcc413b9de8de3e43e6849aa94d2daf9f960bbff3f23da2008" + }, + "online_user_num": 42, + "title": "全機種参加型 小4女子のフォトナみんなでビクロイ取りに行くぞ!", + "share_url": "https://www.mirrativ.com/live/qtswMR9LHNzZLWHpw-jDaA", + "orientation": 0, + "app_id": "com.epicgames.fortnite", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/724dcecc4abdda6c68040a796facd650f5017d50397fff296395c9e89b9cbcfa.png" + ], + "max_online_viewer_num": 82, + "created_at": 1600158411, + "is_live": 1, + "started_at": 1600158457, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/574826858adc950fa3384a278effca1d527e41cc263478ea6d67b760c1b81de5_m.jpeg?blur=80&1600160029", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/574826858adc950fa3384a278effca1d527e41cc263478ea6d67b760c1b81de5_m.jpeg?1600160029", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 1, + "comment_num": 68, + "owner": { + "share_url": "https://www.mirrativ.com/user/99229026", + "is_able_continuous_stream_holiday": 1, + "name": "シュバルツ", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/c2dfb1489a9e00a52fde0f159fca504271fcd6af7de6bdea9106efc221dcf9cf_m.jpeg?1600088981", + "description": "小四女子のミラティブ界の姫やってます 疑うやつはgmです", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_S.ja.png?v6" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_super_holiday_ja@3x.png?v5", + "user_id": "99229026", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/574826858adc950fa3384a278effca1d527e41cc263478ea6d67b760c1b81de5_m.jpeg?1600160029", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 0, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/574826858adc950fa3384a278effca1d527e41cc263478ea6d67b760c1b81de5_m.jpeg?1600160029", + "bcsvr_key": "1abd54f4:29dLx4pY", + "heartbeated_at": 1600160018, + "orientation_v2": 0 + }, + "type": "live_preview" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "F8X3kIjjf4VdVBJ6CmR_1A", + "collab_online_user_num": 2, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/1504898b4e93f540918409c13d64ff7ada92e39bcc407184e5c7223417800803_share.jpeg?1600159903", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 123, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn52.mirrativ.com/liveedge/v1cfe3eb59fcf89e839ae47acaf4a0e8f046e779eaf64a42c7d69ecc16709a95/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-169.mirrativ.com:1935/liveedge/v1cfe3eb59fcf89e839ae47acaf4a0e8f046e779eaf64a42c7d69ecc16709a95" + }, + "online_user_num": 29, + "title": "リーグ頑張るコニちゃんの配信", + "share_url": "https://www.mirrativ.com/live/F8X3kIjjf4VdVBJ6CmR_1A", + "orientation": 2, + "app_id": "com.bandainamcoent.opbrjp", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/e5b6930947132cbd283f9cc855c54743eb71356d89859c2a81eb7f512295d21d.png" + ], + "max_online_viewer_num": 41, + "created_at": 1600158177, + "is_live": 1, + "started_at": 1600158398, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/1504898b4e93f540918409c13d64ff7ada92e39bcc407184e5c7223417800803_m.jpeg?blur=80&1600159903", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 188, + "owner": { + "share_url": "https://www.mirrativ.com/user/5306626", + "is_able_continuous_stream_holiday": 1, + "name": "コニ🐭-AW-", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/61b068fecf88fd6e6721244b7f125de54db0b6d802af470eed705db6f5fa02fe_m.jpeg?1600157926", + "description": "所属Amazingworld 基本うるさい人で", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_L.ja.png?v1", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_S.ja.png?v1" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_master_holiday_ja@3x.png?v5", + "user_id": "5306626", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/1504898b4e93f540918409c13d64ff7ada92e39bcc407184e5c7223417800803_m.jpeg?1600159903", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/1504898b4e93f540918409c13d64ff7ada92e39bcc407184e5c7223417800803_m.jpeg?1600159903", + "bcsvr_key": "1abd537f:4nMpgkCl", + "heartbeated_at": 1600160020, + "orientation_v2": 6 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 0, + "sticker_enabled": 0, + "collab_has_vacancy": 0, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "Invv2rXo2Q7794eWsR_7-w", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/da4e049f3db9e98b7cd74c21bc693ac3699a53f5e549214283b366a2f3afacc3_share.jpeg?1600159939", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 64, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn28.mirrativ.com/liveedge/c37da4e8d6229125af131944a8f5249bf28e171b355102ce701cd08a661e0714/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-222.mirrativ.com:1935/liveedge/c37da4e8d6229125af131944a8f5249bf28e171b355102ce701cd08a661e0714" + }, + "online_user_num": 58, + "title": "【フォトナ参加型】誰でも⭕全機種🆗✨初めての人に優しい配信✨皆遊ぼ!", + "share_url": "https://www.mirrativ.com/live/Invv2rXo2Q7794eWsR_7-w", + "orientation": 0, + "app_id": "com.epicgames.fortnite", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/724dcecc4abdda6c68040a796facd650f5017d50397fff296395c9e89b9cbcfa.png" + ], + "max_online_viewer_num": 58, + "created_at": 1600159440, + "is_live": 1, + "started_at": 1600159878, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/da4e049f3db9e98b7cd74c21bc693ac3699a53f5e549214283b366a2f3afacc3_m.jpeg?blur=80&1600159939", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 1, + "comment_num": 23, + "owner": { + "share_url": "https://www.mirrativ.com/user/98972685", + "is_able_continuous_stream_holiday": 1, + "name": "なつめ🍊", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/6a04ba07d0661e6ae795e1fc01e0664c69f842c33c5d76743a193de2c5c47ba5_m.jpeg?1600057055", + "description": "普段17時40分から配信してます!フォロワー2万6千人突破✨推しマークは🍊です", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_S.ja.png?v6" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_super_holiday_ja@3x.png?v5", + "user_id": "98972685", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/da4e049f3db9e98b7cd74c21bc693ac3699a53f5e549214283b366a2f3afacc3_m.jpeg?1600159939", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 0, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/da4e049f3db9e98b7cd74c21bc693ac3699a53f5e549214283b366a2f3afacc3_m.jpeg?1600159939", + "bcsvr_key": "1abd5bac:O3FXUFNj", + "heartbeated_at": 1600160000, + "orientation_v2": 0 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, "is_gift_supported": 1, "collab_has_vacancy": 0, "stamp_num": 0, - "live_id": "FV-79JspHmjsDLn4rdCJ3g", + "live_id": "VdXsEt6tfzDGp7a088F2Cw", "collab_online_user_num": 0, - "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/80e27298548e6dc1df5691d3c1e120d04791f3de4e0cee8f3d01fadd11d13652_share.jpeg?1600143689", + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/e507e94b9c7dabb7df526cd21d11ef8d2d8a1423062f70650e49452dd51e54e2_share.jpeg?1600159900", "following_viewer_image_urls": [], "is_mirrorable": 0, "description": "", - "total_viewer_num": 103, + "total_viewer_num": 70, "ended_at": 0, "thumbnail_image_url": "", "is_archive": 0, - "online_user_num": 3, + "online_user_num": 20, "preview": { - "streaming_url_hls": "http://hls-cdn45.mirrativ.com/liveedge/2cd62d82d807effdd573e58d074ed31c40ab7a85a71332e729bc1dc86bf85938/playlist.m3u8", - "streaming_url_edge": "rtmp://edge-210-140-191-214.mirrativ.com:1935/liveedge/2cd62d82d807effdd573e58d074ed31c40ab7a85a71332e729bc1dc86bf85938" + "streaming_url_hls": "http://hls-cdn47.mirrativ.com/liveedge/v165769b1459c4c2fde660e6df91fbe977d631699e98711d5eff7525499cb601/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-140.mirrativ.com:1935/liveedge/v165769b1459c4c2fde660e6df91fbe977d631699e98711d5eff7525499cb601" }, - "title": "chilling and gaming", - "share_url": "https://www.mirrativ.com/live/FV-79JspHmjsDLn4rdCJ3g", - "app_id": "com.google.android.youtube", - "orientation": 0, + "title": "ガチャ少々と禁忌、共闘もやります。お気軽にお越しください(゚∀゚)", + "share_url": "https://www.mirrativ.com/live/VdXsEt6tfzDGp7a088F2Cw", + "app_id": "jp.grenge.pocolondungeons", + "orientation": 1, "app_icon_urls": [ - "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/c434fd240dfe93243c64944fa8cbfad0f3f373b6e380903f5d93ccf1c070a2d6.png" + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/f82a45ca153a04ab39d71b1222758e448ef4adbbfe7049608cab14d9c0635a5f.png" ], - "max_online_viewer_num": 9, - "created_at": 1600132181, + "max_online_viewer_num": 26, + "created_at": 1599823972, "preview_blur_image_url": "", - "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/80e27298548e6dc1df5691d3c1e120d04791f3de4e0cee8f3d01fadd11d13652_m.jpeg?blur=80&1600143689", - "started_at": 1600132190, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/e507e94b9c7dabb7df526cd21d11ef8d2d8a1423062f70650e49452dd51e54e2_m.jpeg?blur=80&1600159900", + "started_at": 1600158080, "is_live": 1, "image_url_without_letterbox": "", "thumbnail_blur_image_url": "", "sticker_num": 0, "thumbnail_frame": {}, - "comment_num": 11, - "max_collab_user_num": 1, - "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/80e27298548e6dc1df5691d3c1e120d04791f3de4e0cee8f3d01fadd11d13652_m.jpeg?1600143689", + "comment_num": 88, + "max_collab_user_num": 3, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/e507e94b9c7dabb7df526cd21d11ef8d2d8a1423062f70650e49452dd51e54e2_m.jpeg?1600159900", "owner": { - "share_url": "https://www.mirrativ.com/user/3399944", - "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/3b3408709e40caf081e5f20d5a58dd3cb59b83e7d994b3f9119ca8f675a3bc9e_m.jpeg?1600121828", - "name": "Branndon", - "description": "Fuk fortnite", + "share_url": "https://www.mirrativ.com/user/3410697", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/a486621c1bc15063823c904b5e84d87c30499e86b351e17968e7a7f0f87c763b_m.jpeg?1599823971", + "name": "なべこ", + "description": "♂です。ポコダン大好き。アークナイツは初心者です。", "properties": [], - "badges": [ - { - "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_L.en.png?v6", - "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_S.en.png?v6" - } - ], - "is_continuous_streamer": 1, + "badges": [], + "is_continuous_streamer": 0, "is_new": 0, - "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_super_holiday_en@3x.png?v5", - "user_id": "3399944", + "user_id": "3410697", "onlive": null }, "following_viewer_num": 0, @@ -148,12 +1027,1338 @@ "tags": [], "is_following": 0, "collab_enabled": 0, - "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/80e27298548e6dc1df5691d3c1e120d04791f3de4e0cee8f3d01fadd11d13652_m.jpeg?1600143689", - "bcsvr_key": "1abd0717:FX5ZAqVh", - "orientation_v2": 0, - "heartbeated_at": 1600143665 + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/e507e94b9c7dabb7df526cd21d11ef8d2d8a1423062f70650e49452dd51e54e2_m.jpeg?1600159900", + "bcsvr_key": "1ab62d33:poNnyujF", + "orientation_v2": 1, + "heartbeated_at": 1600160001 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "CfL752g7rR3lhJ_Owhu-7A", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/aaa4187f2c7a1789cf4c645d2f26b4183c1cea077e34e280e0b68fc2c95b3c34_share.jpeg?1600159881", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 1018, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn28.mirrativ.com/liveedge/c52d36f78b341aefec0847ce4dba1bbeb51ca1296b46713fc7f134bbcbed8f74/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-222.mirrativ.com:1935/liveedge/c52d36f78b341aefec0847ce4dba1bbeb51ca1296b46713fc7f134bbcbed8f74" + }, + "online_user_num": 46, + "title": "★せとっこ★配信【86】 モンストお勉強中…φ(..)メモメモ", + "share_url": "https://www.mirrativ.com/live/CfL752g7rR3lhJ_Owhu-7A", + "orientation": 1, + "app_id": "jp.co.mixi.monsterstrike", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/42f681f04061add226c14d99468380ac6f3fa659eecbe3d81ede88d5c8fd98a1.png" + ], + "max_online_viewer_num": 103, + "created_at": 1600079644, + "is_live": 1, + "started_at": 1600152604, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/aaa4187f2c7a1789cf4c645d2f26b4183c1cea077e34e280e0b68fc2c95b3c34_m.jpeg?blur=80&1600159881", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 377, + "owner": { + "share_url": "https://www.mirrativ.com/user/105014400", + "is_able_continuous_stream_holiday": 1, + "name": "★せとっこ★🐉", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/1fce49c63001129f416149085fffe9d2fd0a055ab46e4f2194278efd5e712ba8_m.jpeg?1600079636", + "description": "平日はモンスト(初心者なので解説を🙇)土日祝は歌の配信です😊 推し🐉", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_L.ja.png?v1", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_S.ja.png?v1" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_master_holiday_ja@3x.png?v5", + "user_id": "105014400", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/aaa4187f2c7a1789cf4c645d2f26b4183c1cea077e34e280e0b68fc2c95b3c34_m.jpeg?1600159881", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/aaa4187f2c7a1789cf4c645d2f26b4183c1cea077e34e280e0b68fc2c95b3c34_m.jpeg?1600159881", + "bcsvr_key": "1abbee2f:Rci44zLS", + "heartbeated_at": 1600160017, + "orientation_v2": 1 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 0, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "HOmOX23aqLf_XqR2xQP96g", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/de882fdfcd20afab2549df88dd3f0e6e084c7c57203ef70a339611504e395565_share.jpeg?1600159898", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 155, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn54.mirrativ.com/liveedge/v146542b78673c68201951d0626b34667f151ca2a1ee7358497d0d2237d234d8/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-205.mirrativ.com:1935/liveedge/v146542b78673c68201951d0626b34667f151ca2a1ee7358497d0d2237d234d8" + }, + "online_user_num": 24, + "title": "機動都市 極み配信者3日目", + "share_url": "https://www.mirrativ.com/live/HOmOX23aqLf_XqR2xQP96g", + "orientation": 2, + "app_id": "com.netease.g93na", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/a7e370cdbdfe74e04ecb10454c754150abc0b606489afdd6a3950d39ec523448.png" + ], + "max_online_viewer_num": 32, + "created_at": 1600092962, + "is_live": 1, + "started_at": 1600156255, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/de882fdfcd20afab2549df88dd3f0e6e084c7c57203ef70a339611504e395565_m.jpeg?blur=80&1600159898", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 1, + "comment_num": 263, + "owner": { + "share_url": "https://www.mirrativ.com/user/6971189", + "is_able_continuous_stream_holiday": 1, + "name": "cardy", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/e64ca78b363a1f70a08ed2ced59f66736717ac64a018c15842cf301aea72ca1f_m.jpeg?1600092960", + "description": "", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_extreme_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_extreme_holiday_S.ja.png?v6" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_extreme_holiday_ja@3x.png?v5", + "user_id": "6971189", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/de882fdfcd20afab2549df88dd3f0e6e084c7c57203ef70a339611504e395565_m.jpeg?1600159898", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 0, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/de882fdfcd20afab2549df88dd3f0e6e084c7c57203ef70a339611504e395565_m.jpeg?1600159898", + "bcsvr_key": "1abc7f75:CceLp0ws", + "heartbeated_at": 1600160036, + "orientation_v2": 3 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "THyJyUC-dp3GuOIzIsukAA", + "collab_online_user_num": 1, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_share/c3d6712136caabaff938340960083b6cd148833c5543944f5228c17b511d0562_share.jpeg?1600159907", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 166, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn42.mirrativ.com/liveedge/b633c9c71eb64a7aa71025b27a93e058563a263d8a6107a5ce251c8095454efc/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-168.mirrativ.com:1935/liveedge/b633c9c71eb64a7aa71025b27a93e058563a263d8a6107a5ce251c8095454efc" + }, + "online_user_num": 61, + "title": "CODやります参加していいよ(主はCODが下手くそだけど気にしないで)", + "share_url": "https://www.mirrativ.com/live/THyJyUC-dp3GuOIzIsukAA", + "orientation": 2, + "app_id": "com.activision.callofduty.shooter", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/a9036366e8f2fa8754adbc70380a5dba99f2eb9ea1e522a4197c622fae91236e.png" + ], + "max_online_viewer_num": 63, + "created_at": 1600085239, + "is_live": 1, + "started_at": 1600158086, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/c3d6712136caabaff938340960083b6cd148833c5543944f5228c17b511d0562_m.jpeg?crop=16:9,offset-x0,offset-y26&blur=80&1600159907", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 92, + "owner": { + "share_url": "https://www.mirrativ.com/user/104262495", + "is_able_continuous_stream_holiday": 1, + "name": "闇", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/f79c8789125e96e6d667d92bbebbc26367859cc45e6d183650026f793db246b3_m.jpeg?1600085197", + "description": "イケボ配信に俺はなる(だけどできるとは一言もいってない)", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_L.ja.png?v1", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_S.ja.png?v1" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_master_holiday_ja@3x.png?v5", + "user_id": "104262495", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/c3d6712136caabaff938340960083b6cd148833c5543944f5228c17b511d0562_m.jpeg?1600159907", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/c3d6712136caabaff938340960083b6cd148833c5543944f5228c17b511d0562_m.jpeg?crop=16:9,offset-x0,offset-y26&1600159907", + "bcsvr_key": "1abc247b:Q0b2lOjS", + "heartbeated_at": 1600159978, + "orientation_v2": 6 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 0, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "3S8-j2NQSQBKGYWa-zJ9Dg", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/74c8632a0c2f9f7464bb27729509bb5247a15eb4f5ef8cf333e03ab9f0752850_share.jpeg?1600159901", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 396, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn33.mirrativ.com/liveedge/v180b4bf817015247b127fbdb203e0fb2a93eb50b9673acb43e80ac4e1c333e1/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-211.mirrativ.com:1935/liveedge/v180b4bf817015247b127fbdb203e0fb2a93eb50b9673acb43e80ac4e1c333e1" + }, + "online_user_num": 43, + "title": "シーザー引かないけど15分🧔🏻💮", + "share_url": "https://www.mirrativ.com/live/3S8-j2NQSQBKGYWa-zJ9Dg", + "orientation": 2, + "app_id": "com.bandainamcoent.opbrjp", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/e5b6930947132cbd283f9cc855c54743eb71356d89859c2a81eb7f512295d21d.png" + ], + "max_online_viewer_num": 64, + "created_at": 1600076932, + "is_live": 1, + "started_at": 1600154292, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/74c8632a0c2f9f7464bb27729509bb5247a15eb4f5ef8cf333e03ab9f0752850_m.jpeg?blur=80&1600159901", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 444, + "owner": { + "share_url": "https://www.mirrativ.com/user/9138788", + "is_able_continuous_stream_holiday": 1, + "name": "おまつ🐉🔮", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/cc9252c0d0a1f1291a4ad03eb92d88738c441ca4ff7dae85102d943b84bf800e_m.jpeg?1600076930", + "description": "", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_S.ja.png?v6" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_super_holiday_ja@3x.png?v5", + "user_id": "9138788", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/74c8632a0c2f9f7464bb27729509bb5247a15eb4f5ef8cf333e03ab9f0752850_m.jpeg?1600159901", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 0, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/74c8632a0c2f9f7464bb27729509bb5247a15eb4f5ef8cf333e03ab9f0752850_m.jpeg?1600159901", + "bcsvr_key": "1abbd8e8:nsRmsyR0", + "heartbeated_at": 1600159994, + "orientation_v2": 8 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 0, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "kkO9qfvERv7yy5Pe4x1PmA", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/ea101c23bc348566e9e87cfe86381653f225af8e18049f4e6f3cad45dfa1f10b_share.jpeg?1600159997", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 128, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn26.mirrativ.com/liveedge/27a46c1c1849971eaaa6631cd457238ec846efbaf3d0d96683ea4247f279739a/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-194.mirrativ.com:1935/liveedge/27a46c1c1849971eaaa6631cd457238ec846efbaf3d0d96683ea4247f279739a" + }, + "online_user_num": 28, + "title": "6ヶ月突破🎉 ギフガチャ下さい🥺 ☽・:* 185回目 .。◦♡", + "share_url": "https://www.mirrativ.com/live/kkO9qfvERv7yy5Pe4x1PmA", + "orientation": 1, + "app_id": "com.dena.mirrativa", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/afdae74097b193443ea8cab36d1e79666aee9a8b510a253cb5694a5dd6e387af.png" + ], + "max_online_viewer_num": 31, + "created_at": 1600066251, + "is_live": 1, + "started_at": 1600157742, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/ea101c23bc348566e9e87cfe86381653f225af8e18049f4e6f3cad45dfa1f10b_m.jpeg?blur=80&1600159997", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 322, + "owner": { + "share_url": "https://www.mirrativ.com/user/101065932", + "is_able_continuous_stream_holiday": 1, + "name": "くれあ🧸⋆͛♥︎⋆͛🍓", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/f1c5cc992b82fd947d49b4a952ef28b5ec771c4a8792d30ed5c7f051f868ed75_m.jpeg?1600066250", + "description": "嫁♡⃛まめこ (相方:☽・:*) 推しマ:🧸🍓 / 家族:🧸⋆͛♥︎⋆͛🍓", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_S.ja.png?v6" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_super_holiday_ja@3x.png?v5", + "user_id": "101065932", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/ea101c23bc348566e9e87cfe86381653f225af8e18049f4e6f3cad45dfa1f10b_m.jpeg?1600159997", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 0, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/ea101c23bc348566e9e87cfe86381653f225af8e18049f4e6f3cad45dfa1f10b_m.jpeg?1600159997", + "bcsvr_key": "1abb9368:ucMaIFYH", + "heartbeated_at": 1600160023, + "orientation_v2": 1 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "oMO412bXfSQ8iA8xUHujew", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/a4c06732bb1db24cd91bb86d926481218401f40fe145970551085bb7709b5753_share.jpeg?1600160026", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 76, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn35.mirrativ.com/liveedge/a0597f9ef9c25e85ee670f1bad2ffaf6f8d4c2af9c87a4643526df9b44f83a94/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-157.mirrativ.com:1935/liveedge/a0597f9ef9c25e85ee670f1bad2ffaf6f8d4c2af9c87a4643526df9b44f83a94" + }, + "online_user_num": 45, + "title": "しばこラジオ!!!!【雑談】", + "share_url": "https://www.mirrativ.com/live/oMO412bXfSQ8iA8xUHujew", + "orientation": 1, + "app_id": "com.netease.hyxd", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/b7ac7943cfb36510dcb71caddb3515348d2ef865a9891d1547948e4bc71bbd79.png" + ], + "max_online_viewer_num": 46, + "created_at": 1600159403, + "is_live": 1, + "started_at": 1600159416, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/a4c06732bb1db24cd91bb86d926481218401f40fe145970551085bb7709b5753_m.jpeg?blur=80&1600160026", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 44, + "owner": { + "share_url": "https://www.mirrativ.com/user/99932023", + "is_able_continuous_stream_holiday": 1, + "name": "しばこ🗽", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/4238fd00d073c6c1430630d9d25e64e51a1f7c8c1b4ce2fce0cabb9eec711780_m.jpeg?1600080364", + "description": "界隈最強のオネエだわ。仏様に声似ているようです。推し 💫みんなに感謝。愛してる。", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_L.ja.png?v1", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_S.ja.png?v1" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_master_holiday_ja@3x.png?v5", + "user_id": "99932023", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/a4c06732bb1db24cd91bb86d926481218401f40fe145970551085bb7709b5753_m.jpeg?1600160026", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/a4c06732bb1db24cd91bb86d926481218401f40fe145970551085bb7709b5753_m.jpeg?1600160026", + "bcsvr_key": "1abd5b69:PikoAmw1", + "heartbeated_at": 1600160017, + "orientation_v2": 1 + }, + "type": "live" + }, + { + "live_preview": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 0, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "mLCnN__XiL0lI6qdc9lrQA", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/9352468f1225916e25cf66b70662b14a579d7a88bdf5143d8bf97ed645d34131_share.jpeg?1600159955", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 770, + "thumbnail_image_url": "", + "ended_at": 0, + "live_tags": [ + { + "tag_text": "ガチャ!!!", + "tag_icon_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_tags/87.png?1592990713" + }, + { + "tag_text": "マルチ!!!", + "tag_icon_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_tags/10001.png?1573623261" + } + ], + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn38.mirrativ.com/liveedge/v1abb07b15b5dfca56a7378dfbbcb975c2df98e9944641f0ebac110a8fc555b2/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-181.mirrativ.com:1935/liveedge/v1abb07b15b5dfca56a7378dfbbcb975c2df98e9944641f0ebac110a8fc555b2" + }, + "online_user_num": 32, + "title": "18時〜得玉ガチャ【参加型】金確定ベル神殿🦑みんなで厳選しよー!【初見さん歓迎】", + "share_url": "https://www.mirrativ.com/live/mLCnN__XiL0lI6qdc9lrQA", + "orientation": 1, + "app_id": "jp.co.mixi.monsterstrike", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/42f681f04061add226c14d99468380ac6f3fa659eecbe3d81ede88d5c8fd98a1.png" + ], + "max_online_viewer_num": 95, + "created_at": 1599827859, + "is_live": 1, + "started_at": 1600152995, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/9352468f1225916e25cf66b70662b14a579d7a88bdf5143d8bf97ed645d34131_m.jpeg?blur=80&1600159955", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/9352468f1225916e25cf66b70662b14a579d7a88bdf5143d8bf97ed645d34131_m.jpeg?1600159955", + "sticker_num": 0, + "thumbnail_frame": {}, + "comment_num": 245, + "max_collab_user_num": 3, + "owner": { + "share_url": "https://www.mirrativ.com/user/99288956", + "is_able_continuous_stream_holiday": 1, + "name": "いかまし", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/11597c70510c126e54eb80ab1e44baec0323524304b9e1e73703f559bd457b62_m.jpeg?1599988952", + "description": "『みんなで決める!ク◯ゲー・バ◯ゲーランキング!』", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_S.ja.png?v6" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_super_holiday_ja@3x.png?v5", + "user_id": "99288956", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/9352468f1225916e25cf66b70662b14a579d7a88bdf5143d8bf97ed645d34131_m.jpeg?1600159955", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 0, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/9352468f1225916e25cf66b70662b14a579d7a88bdf5143d8bf97ed645d34131_m.jpeg?1600159955", + "bcsvr_key": "1ab656ce:4oQOvShz", + "heartbeated_at": 1600160016, + "orientation_v2": 1 + }, + "type": "live_preview" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "KmamW5ZAoaRavlIWSdBshg", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_share/a49d95e5df4ae2c56e95876ad7138a392770f1fc9102be527ee4de724081dc43_share.jpeg?1600159923", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 93, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn53.mirrativ.com/liveedge/v1ac179d171d4eeb83b94ed379768c5a1ef63aa572b179a0a51d9ec270170e08/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-208.mirrativ.com:1935/liveedge/v1ac179d171d4eeb83b94ed379768c5a1ef63aa572b179a0a51d9ec270170e08" + }, + "online_user_num": 17, + "title": "帰宅とばとるりーぐと雑談と", + "share_url": "https://www.mirrativ.com/live/KmamW5ZAoaRavlIWSdBshg", + "orientation": 1, + "app_id": "com.nianticlabs.pokemongo", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/04a1d86c613a360b56ee833f57ac86ffdb88f769df754464dfbe3be1893a00d3.png" + ], + "max_online_viewer_num": 19, + "created_at": 1600067061, + "is_live": 1, + "started_at": 1600156586, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/a49d95e5df4ae2c56e95876ad7138a392770f1fc9102be527ee4de724081dc43_m.jpeg?crop=16:9,offset-x0,offset-y26&blur=80&1600159923", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 252, + "owner": { + "share_url": "https://www.mirrativ.com/user/99447215", + "is_able_continuous_stream_holiday": 1, + "name": "思考中からあげさぁん。", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/33a0d86c75426f8d93e1ed6a3c86dd505c7e753aff63f0ecba415384a0196db4_m.jpeg?1600067060", + "description": "くずのけしん。", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_S.ja.png?v6" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_super_holiday_ja@3x.png?v5", + "user_id": "99447215", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/a49d95e5df4ae2c56e95876ad7138a392770f1fc9102be527ee4de724081dc43_m.jpeg?1600159923", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/a49d95e5df4ae2c56e95876ad7138a392770f1fc9102be527ee4de724081dc43_m.jpeg?crop=16:9,offset-x0,offset-y26&1600159923", + "bcsvr_key": "1abb9724:QgPUFR3X", + "heartbeated_at": 1600160007, + "orientation_v2": 1 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "kTCpHLwcinJz79k8wz32sg", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/34a2af200222e1b40bc73584aae5455f1dd857529ce6f9edcae5634eb810bd39_share.jpeg?1600159909", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 335, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn32.mirrativ.com/liveedge/v1d8eb5d0b86f07b50ed09a6648c871d4dd0051bf974c2752c59ec5a32652163/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-195.mirrativ.com:1935/liveedge/v1d8eb5d0b86f07b50ed09a6648c871d4dd0051bf974c2752c59ec5a32652163" + }, + "online_user_num": 39, + "title": "【ハンドメイド】さくっとレジン💪🏻( ¨̮ 💪🏻)", + "share_url": "https://www.mirrativ.com/live/kTCpHLwcinJz79k8wz32sg", + "orientation": 1, + "app_id": "com.dena.mirrativa", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/afdae74097b193443ea8cab36d1e79666aee9a8b510a253cb5694a5dd6e387af.png" + ], + "max_online_viewer_num": 45, + "created_at": 1600084899, + "is_live": 1, + "started_at": 1600151287, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/34a2af200222e1b40bc73584aae5455f1dd857529ce6f9edcae5634eb810bd39_m.jpeg?blur=80&1600159909", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 420, + "owner": { + "share_url": "https://www.mirrativ.com/user/5437975", + "is_able_continuous_stream_holiday": 1, + "name": "うたたねむる。💤", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/9866024c594105b053f29f482e39739f9bc14dba1342595d9db233ef6b10dc00_m.jpeg?1600099312", + "description": "んぱっ⸜(* ॑꒳ ॑* )⸝You Are Hope / マイクラ / OHOL", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_extreme_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_extreme_holiday_S.ja.png?v6" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_extreme_holiday_ja@3x.png?v5", + "user_id": "5437975", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/34a2af200222e1b40bc73584aae5455f1dd857529ce6f9edcae5634eb810bd39_m.jpeg?1600159909", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/34a2af200222e1b40bc73584aae5455f1dd857529ce6f9edcae5634eb810bd39_m.jpeg?1600159909", + "bcsvr_key": "1abc204d:GnTX6fTc", + "heartbeated_at": 1600159988, + "orientation_v2": 1 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "ooRZdsI3sa-90VbE0QT2Ww", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/35cb8614db888d4900af6a56d92f24e5e08464230386a2193cfef1f0da49d2cd_share.jpeg?1600159940", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 132, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn33.mirrativ.com/liveedge/v1c4c0995101abc65d42d9e8f6d313599f794e02bc981244144e4d06c81b79cb/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-164.mirrativ.com:1935/liveedge/v1c4c0995101abc65d42d9e8f6d313599f794e02bc981244144e4d06c81b79cb" + }, + "online_user_num": 65, + "title": "雑談配信", + "share_url": "https://www.mirrativ.com/live/ooRZdsI3sa-90VbE0QT2Ww", + "orientation": 1, + "app_id": "com.activision.callofduty.shooter", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/a9036366e8f2fa8754adbc70380a5dba99f2eb9ea1e522a4197c622fae91236e.png" + ], + "max_online_viewer_num": 69, + "created_at": 1600098839, + "is_live": 1, + "started_at": 1600159024, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/35cb8614db888d4900af6a56d92f24e5e08464230386a2193cfef1f0da49d2cd_m.jpeg?blur=80&1600159940", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 71, + "owner": { + "share_url": "https://www.mirrativ.com/user/9762716", + "is_able_continuous_stream_holiday": 1, + "name": "べびたん", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/3a71466ca808b6f0cd10687d9c6d69e9f40eda52ad251113da9ad7a302732d38_m.jpeg?1600149241", + "description": "codm T2P XieL HE", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_L.ja.png?v1", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_S.ja.png?v1" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_master_holiday_ja@3x.png?v5", + "user_id": "9762716", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/35cb8614db888d4900af6a56d92f24e5e08464230386a2193cfef1f0da49d2cd_m.jpeg?1600159940", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/35cb8614db888d4900af6a56d92f24e5e08464230386a2193cfef1f0da49d2cd_m.jpeg?1600159940", + "bcsvr_key": "1abcb58a:zUsM3HcV", + "heartbeated_at": 1600159985, + "orientation_v2": 1 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "CIoGJH0BNI4KOGSXQkMRDw", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/efc4ee2cd85057352d0a8e656cc1ddb4c475f080a6cc1a58bc922a724bbb6027_share.jpeg?1600159958", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 51, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn33.mirrativ.com/liveedge/v10fc6a8a241e59c02af981e6387c8d61e856ff327ee86eabd5b80737db49581/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-164.mirrativ.com:1935/liveedge/v10fc6a8a241e59c02af981e6387c8d61e856ff327ee86eabd5b80737db49581" + }, + "online_user_num": 44, + "title": "オネェよ!縛りに負けずおしりを狙え!", + "share_url": "https://www.mirrativ.com/live/CIoGJH0BNI4KOGSXQkMRDw", + "orientation": 2, + "app_id": "com.pubg.krmobile", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/7bce595e79a0ea8c63dc7e7b80fcf10eff6c73a979eed2e23dbc4c6103283dee.png" + ], + "max_online_viewer_num": 44, + "created_at": 1600094774, + "is_live": 1, + "started_at": 1600159783, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/efc4ee2cd85057352d0a8e656cc1ddb4c475f080a6cc1a58bc922a724bbb6027_m.jpeg?blur=80&1600159958", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 43, + "owner": { + "share_url": "https://www.mirrativ.com/user/4284971", + "is_able_continuous_stream_holiday": 1, + "name": "変💋態ミーシャ", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/6c3da54c68937343fdf2a64c340e7d5533558d27e588a99bec26d6e82f239a60_m.jpeg?1600094760", + "description": "来るもの拒まず、去るもの逃がさず。ここに来たのが運の尽きよ?変💋態ミーシャより", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_S.ja.png?v6" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_super_holiday_ja@3x.png?v5", + "user_id": "4284971", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/efc4ee2cd85057352d0a8e656cc1ddb4c475f080a6cc1a58bc922a724bbb6027_m.jpeg?1600159958", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/efc4ee2cd85057352d0a8e656cc1ddb4c475f080a6cc1a58bc922a724bbb6027_m.jpeg?1600159958", + "bcsvr_key": "1abc9254:JUAG2ORS", + "heartbeated_at": 1600160026, + "orientation_v2": 6 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 0, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "2Nf6q2y9XaNGAOoRAADwcQ", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/5f77858cddc6c881f66e1dd7ece29767530e46247d3dd0a1ca84fb8c5cec1b34_share.jpeg?1600159896", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 51, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn20.mirrativ.com/liveedge/8698faed58d45294ed773436b6662c3dd1881e1f69d8718f7c6335802406e78c/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-154.mirrativ.com:1935/liveedge/8698faed58d45294ed773436b6662c3dd1881e1f69d8718f7c6335802406e78c" + }, + "online_user_num": 46, + "title": "🌻💗", + "share_url": "https://www.mirrativ.com/live/2Nf6q2y9XaNGAOoRAADwcQ", + "orientation": 2, + "app_id": "com.netease.dwrg", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/3538a29c1da0a2cc5ab623915a5ba2ae8dfeac7b1b1877eac749241f3d4352dd.png" + ], + "max_online_viewer_num": 46, + "created_at": 1600159725, + "is_live": 1, + "started_at": 1600159740, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/5f77858cddc6c881f66e1dd7ece29767530e46247d3dd0a1ca84fb8c5cec1b34_m.jpeg?blur=80&1600159896", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 6, + "owner": { + "share_url": "https://www.mirrativ.com/user/8413597", + "is_able_continuous_stream_holiday": 1, + "name": "arfu", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/4ee968fdbd07cec5a8a8e99711fc0cea772041a8ad441a7bb3cde7cb9a6b6551_m.jpeg?1600159686", + "description": "TikTok動画投稿者", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_L.ja.png?v1", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_S.ja.png?v1" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_master_holiday_ja@3x.png?v5", + "user_id": "8413597", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/5f77858cddc6c881f66e1dd7ece29767530e46247d3dd0a1ca84fb8c5cec1b34_m.jpeg?1600159896", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 0, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/5f77858cddc6c881f66e1dd7ece29767530e46247d3dd0a1ca84fb8c5cec1b34_m.jpeg?1600159896", + "bcsvr_key": "1abd5d70:HO3SW53l", + "heartbeated_at": 1600159981, + "orientation_v2": 6 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "9ojLs4t39evFmpnhQj_w0g", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/4e4acbfb99b6ab8fbdf74f1b18f393faac27173ab583909b7ad19f29db2728aa_share.jpeg?1600159950", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 398, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn23.mirrativ.com/liveedge/403f431f034ff439f9c1023fc8fe060d98998cd824efba8428d136e6036bf5fb/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-202.mirrativ.com:1935/liveedge/403f431f034ff439f9c1023fc8fe060d98998cd824efba8428d136e6036bf5fb" + }, + "online_user_num": 65, + "title": "ランクマがんばるぞぉ???", + "share_url": "https://www.mirrativ.com/live/9ojLs4t39evFmpnhQj_w0g", + "orientation": 2, + "app_id": "com.activision.callofduty.shooter", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/a9036366e8f2fa8754adbc70380a5dba99f2eb9ea1e522a4197c622fae91236e.png" + ], + "max_online_viewer_num": 68, + "created_at": 1600147049, + "is_live": 1, + "started_at": 1600155743, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/4e4acbfb99b6ab8fbdf74f1b18f393faac27173ab583909b7ad19f29db2728aa_m.jpeg?blur=80&1600159950", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 363, + "owner": { + "share_url": "https://www.mirrativ.com/user/106292408", + "is_able_continuous_stream_holiday": 1, + "name": "ちぃポム⥃", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/660700b2b2a2c6fca901bb1d3407e4b7425af350adeae956f1a1ec55a11049f5_m.jpeg?1600147047", + "description": "参加型始めました", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_L.ja.png?v1", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_S.ja.png?v1" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_master_holiday_ja@3x.png?v5", + "user_id": "106292408", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/4e4acbfb99b6ab8fbdf74f1b18f393faac27173ab583909b7ad19f29db2728aa_m.jpeg?1600159950", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/4e4acbfb99b6ab8fbdf74f1b18f393faac27173ab583909b7ad19f29db2728aa_m.jpeg?1600159950", + "bcsvr_key": "1abd26ed:8P3MvHDv", + "heartbeated_at": 1600160004, + "orientation_v2": 8 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "mVOkeJYCJIQIZLztTsGjAw", + "collab_online_user_num": 2, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/3ab0d72ebd79efe470720a727af32bc604a97af3f8db0bb1c50e1855e7f6eff9_share.jpeg?1600159923", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 287, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn41.mirrativ.com/liveedge/08b4a11b8d6b1174cd3cbf95fbce015ae02938308199aaa9108af065aa3e152b/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-213.mirrativ.com:1935/liveedge/08b4a11b8d6b1174cd3cbf95fbce015ae02938308199aaa9108af065aa3e152b" + }, + "online_user_num": 89, + "title": "第五人格する!参加型なんで良かったら参加してってください!!", + "share_url": "https://www.mirrativ.com/live/mVOkeJYCJIQIZLztTsGjAw", + "orientation": 2, + "app_id": "com.netease.dwrg", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/3538a29c1da0a2cc5ab623915a5ba2ae8dfeac7b1b1877eac749241f3d4352dd.png" + ], + "max_online_viewer_num": 94, + "created_at": 1600076537, + "is_live": 1, + "started_at": 1600158106, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/3ab0d72ebd79efe470720a727af32bc604a97af3f8db0bb1c50e1855e7f6eff9_m.jpeg?blur=80&1600159923", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 72, + "owner": { + "share_url": "https://www.mirrativ.com/user/7681440", + "is_able_continuous_stream_holiday": 1, + "name": "ちゃんちい🐱", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/bed8ade781debf375197750b2c34bd9dd348e638cb6cc9eadaa2822e5d84e4a7_m.jpeg?1600076535", + "description": "イケメンの呼吸、くんかくんかしたい!ぽんタさん推し⭐️ ", + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_S.ja.png?v6" + } + ], + "properties": [], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_super_holiday_ja@3x.png?v5", + "user_id": "7681440", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/3ab0d72ebd79efe470720a727af32bc604a97af3f8db0bb1c50e1855e7f6eff9_m.jpeg?1600159923", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/3ab0d72ebd79efe470720a727af32bc604a97af3f8db0bb1c50e1855e7f6eff9_m.jpeg?1600159923", + "bcsvr_key": "1abbd60a:AHcwa1Tf", + "heartbeated_at": 1600160027, + "orientation_v2": 6 + }, + "type": "live" + }, + { + "live": { + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 0, + "is_gift_supported": 1, + "stamp_num": 0, + "live_id": "7ppTTFvZBK-mJjuSqYtC1g", + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/95b1a913c9d538095da779695a03f8e0c34456832e06f7272ecfe6069e61bbb4_share.jpeg?1600159941", + "following_viewer_image_urls": [], + "is_mirrorable": 0, + "description": "", + "total_viewer_num": 164, + "thumbnail_image_url": "", + "ended_at": 0, + "is_archive": 0, + "preview": { + "streaming_url_hls": "http://hls-cdn47.mirrativ.com/liveedge/v1e1ac4ae79b60e355b2536aec7c146d05d6c7da149b3b405676f5cad0913e46/playlist.m3u8", + "streaming_url_edge": "rtmp://edge-210-140-191-140.mirrativ.com:1935/liveedge/v1e1ac4ae79b60e355b2536aec7c146d05d6c7da149b3b405676f5cad0913e46" + }, + "online_user_num": 35, + "title": "参加型!バンドリプレイ配信!参加したい方はチャットにてお知らせ下さい!", + "share_url": "https://www.mirrativ.com/live/7ppTTFvZBK-mJjuSqYtC1g", + "orientation": 2, + "app_id": "jp.co.craftegg.band", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/00ff6813dce18cf1ee9503f6ae70185cb45dab1a5be0f011783ad56f73c7ccc9.png" + ], + "max_online_viewer_num": 35, + "created_at": 1600074548, + "is_live": 1, + "started_at": 1600156906, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/95b1a913c9d538095da779695a03f8e0c34456832e06f7272ecfe6069e61bbb4_m.jpeg?blur=80&1600159941", + "preview_blur_image_url": "", + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "sticker_num": 0, + "thumbnail_frame": {}, + "max_collab_user_num": 3, + "comment_num": 63, + "owner": { + "share_url": "https://www.mirrativ.com/user/106988651", + "is_able_continuous_stream_holiday": 1, + "name": "泡丸°です 🎤💘", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/4c51becacebfde00a8075aa71808c4b9000a2ba64eca65bf12dc63aca30ea79e_m.jpeg?1600074508", + "description": "泡丸°と申します!以後お見知りおきを!配信は多分不定期なので暇な時に見てください", + "badges": [], + "properties": [], + "is_continuous_streamer": 0, + "is_new": 0, + "user_id": "106988651", + "onlive": null + }, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/95b1a913c9d538095da779695a03f8e0c34456832e06f7272ecfe6069e61bbb4_m.jpeg?1600159941", + "following_viewer_num": 0, + "sticker_display_type": 0, + "tags": [], + "is_following": 0, + "collab_enabled": 0, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/95b1a913c9d538095da779695a03f8e0c34456832e06f7272ecfe6069e61bbb4_m.jpeg?1600159941", + "bcsvr_key": "1abbc731:zdY6Gk66", + "heartbeated_at": 1600159984, + "orientation_v2": 6 }, "type": "live" } ] +} +// https://www.mirrativ.com/api/user/profile?user_id=106952114 +{ + "ambassador_image_url": "", + "avatar_body_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/user_closet_body_image_1/0884e12e44cebc26438be07e45555e0eded3eeb63a287e9059519622402f9b2e_origin.png?1599939966", + "current_continuous_record": "7", + "custom_thanks_message": "今日は本当にありがとう😊\nごめん、充電落ちw\nてか今日釣りしかしてなくない?\n今度マイクラ人狼したいなー\nwwwww\n良かったら次回の配信も見に来てください✨\nあと僕のフォロー等もよろしくね🙇🙏\n\nじゃ、ばい〜ヾ(・ω・`)\n\n〜discord鯖〜\n現在建設中です", + "registered_at": "1599589636", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/0884e12e44cebc26438be07e45555e0eded3eeb63a287e9059519622402f9b2e_m.jpeg?1600154133", + "continuous_type": 0, + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_normal_holiday_L.en.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_normal_holiday_S.en.png?v6" + } + ], + "follower_num": "74", + "next_continuous_streamer_badge_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_XS.png", + "anniversary": {}, + "my_app_num": 0, + "mutual_followees": { + "text": "", + "image_urls": [] + }, + "links": [], + "grade_id": 2, + "twitter_screen_name": "Cocoa_mirazu", + "birthday_to": 0, + "name": "【混沌の悪魔】✞しぁ✞", + "is_birthday": 0, + "birthday_editable_date": "", + "description": "昼の部🏙:12:00〜15:00 / 夜の部🌃:22:00〜0:00", + "properties": [], + "total_viewer_num": 8034, + "live_announcement": null, + "is_blocked": 0, + "is_blocking": 0, + "next_continuous_streamer_text": "名まいにち配信者", + "paypal_username": "", + "user_id": "106952114", + "onlive": { + "live_id": "ALxPoSj0oc6ifyEOStQDhA" + }, + "share_url": "https://www.mirrativ.com/user/106952114", + "status": { + "msg": "", + "ok": 1, + "error": "", + "captcha_url": "", + "error_code": 0, + "message": "" + }, + "birthday_from": 0, + "ribbons": [ + { + "is_continuous_ribbon": 1, + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_belt_normal_holiday_en.png?v4" + } + ], + "is_birthday_editable": 1, + "avatar_background_image_url": "https://cdn.mirrativ.com/mirrorman-prod/assets/avatar/img/backgrounds/0007.png?v=1", + "is_new": 0, + "following_num": "3", + "is_follower": 0, + "kakao_name": "", + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_normal_holiday_en@3x.png?v5", + "has_started_first_live": 1, + "birthday": "", + "max_continuous_record": "7", + "remaining_days_for_continuous_streamer": 0, + "continuous_achieved_text": "", + "chat_enabled": 0, + "is_continuous_streamer": 0, + "is_following": 0, + "live_request_num": "25" +} +// 'https://www.mirrativ.com/api/live/live?live_id=O5Ia4iX9c5CeZj7DFtg52Q' +{ + "streaming_url_hls": "http://hls-cdn37.mirrativ.com/liveedge/v1eaff44237026d1129ecdd3e3d84fe2f6c7f24a68a8c9827b07c3ecef8df7db/playlist.m3u8", + "is_gift_supported": 1, + "live_id": "O5Ia4iX9c5CeZj7DFtg52Q", + "is_mirrorable": 0, + "description": "おちん ぽビンビンカーニバル\n参加フォロー寄生は知り合いのみ\n\n\nhttps://r.agar.io/?party=A5B3DC", + "total_viewer_num": 95, + "thumbnail_image_url": "", + "is_archive": 0, + "is_singing_karaoke": 0, + "title": "15分〇〇にー配信ひときたら鯖とり", + "max_online_viewer_num": 27, + "created_at": 1600162961, + "is_live": 1, + "started_at": 1600162970, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/9bfba1b91a486106882577717aab4ccb4113b200d07dfb7127b087e4e52d8869_m.jpeg?blur=80&1600164645", + "preview_blur_image_url": "", + "live_mos": null, + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "diamonds": 0, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/9bfba1b91a486106882577717aab4ccb4113b200d07dfb7127b087e4e52d8869_m.jpeg?1600164645", + "template_comments": [], + "tags": [], + "broadcast_host": "online.mirrativ.com", + "live_user_key": "", + "bcsvr_key": "1abd73b7:UXjP42qc", + "heartbeated_at": 1600164712, + "shares": { + "twitter": { + "maxlength": 77, + "card": { + "site": "mirrativ.com", + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/9bfba1b91a486106882577717aab4ccb4113b200d07dfb7127b087e4e52d8869_share.jpeg?1600164645", + "title": "15分〇〇にー配信ひときたら鯖とり", + "description": "めっちゃ西崎" + }, + "text": "", + "placeholder": "Post something about this stream!" + }, + "others": { + "text": "15分〇〇にー配信ひときたら鯖とり #Agario #ミラティブ #配信 | https://www.mirrativ.com/live/O5Ia4iX9c5CeZj7DFtg52Q" + }, + "title": "Share this lit stream by めっちゃ西崎 to your friends!", + "description": "We'll tell them that your friends joined!" + }, + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 1, + "streaming_key": "v1eaff44237026d1129ecdd3e3d84fe2f6c7f24a68a8c9827b07c3ecef8df7db", + "stamp_num": 0, + "linked_live": null, + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/9bfba1b91a486106882577717aab4ccb4113b200d07dfb7127b087e4e52d8869_share.jpeg?1600164645", + "broadcast_key": "1abd73b7:UXjP42qc", + "gift_ranking_url": "https://www.mirrativ.com/gift/ranking?live_id=O5Ia4iX9c5CeZj7DFtg52Q&obfuscated_user_id=PgIBEgc6jVc", + "collab_mos": null, + "archive_url_hls": "", + "remaining_coins": 0, + "ended_at": 0, + "sticker_category_ids": [], + "online_user_num": 15, + "announcement_url": "", + "anniversary_bot_comment": "", + "is_emomo_wipe_enabled": 0, + "share_url": "https://www.mirrativ.com/live/O5Ia4iX9c5CeZj7DFtg52Q", + "status": { + "msg": "", + "ok": 1, + "error": "", + "captcha_url": "", + "error_code": 0, + "message": "" + }, + "orientation": 2, + "app_id": "com.miniclip.agar.io", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/a6fa408d94272e99c28d989bd04bd5bc55ce09c1910e64c3c4ff23226d29186e.png" + ], + "timeline": [ + { + "app": { + "is_my_app": 0, + "icon_url": "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/a6fa408d94272e99c28d989bd04bd5bc55ce09c1910e64c3c4ff23226d29186e.png", + "store_url": "https://itunes.apple.com/app/id995999703", + "app_id": "com.miniclip.agar.io", + "short_title": "Agar.io", + "is_category": 0, + "title": "Agar.io", + "id": 14 + }, + "timestamp": 1600162970, + "title": "15分〇〇にー配信ひときたら鯖とり" + } + ], + "enable_clap": 0, + "is_paid_sticker_supported": 0, + "announcement_urls": {}, + "sticker_num": 0, + "max_collab_user_num": 3, + "comment_num": 59, + "owner": { + "share_url": "https://www.mirrativ.com/user/103383701", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/7d63d331c759687ac8500b09bfea39a9ed56c91fea7236d7a639fa39c0fad7c1_m.jpeg?1600024199", + "birthday_from": 0, + "is_birthday_editable": 1, + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_L.en.png?v1", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_S.en.png?v1" + } + ], + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_master_holiday_en@3x.png?v5", + "birthday": "", + "birthday_to": 0, + "name": "めっちゃ西崎", + "description": "月に代わってお仕置きよっ💕", + "birthday_editable_date": "", + "is_birthday": 0, + "properties": [], + "is_continuous_streamer": 1, + "user_id": "103383701", + "live_request_num": "0", + "onlive": null + }, + "broadcast_port": 1883, + "recommend_sticker_ids": [], + "sticker_display_type": 0, + "archive_comment_enabled": 0, + "streaming_url_edge": "rtmp://edge-210-140-191-204.mirrativ.com:1935/liveedge/v1eaff44237026d1129ecdd3e3d84fe2f6c7f24a68a8c9827b07c3ecef8df7db", + "collab_enabled": 1, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/9bfba1b91a486106882577717aab4ccb4113b200d07dfb7127b087e4e52d8869_m.jpeg?1600164645", + "orientation_v2": "6" } \ No newline at end of file From fb3b09fc387551b5ba6017bdb06b2fb3109cadae Mon Sep 17 00:00:00 2001 From: eson Date: Wed, 16 Sep 2020 18:53:26 +0800 Subject: [PATCH 7/8] mirrativ finish 90% --- autostore.go | 2 +- .../mirrativ_extractor_test.go | 118 +++++++++- extractor_field.go | 2 +- .../mirrativ/mirrativ_task1/mirrativ_task1.go | 7 +- .../mirrativ_task1/mirrativ_task1_test.go | 2 +- testfile/mirrativ.json | 203 +++++++++++++++++- 6 files changed, 320 insertions(+), 14 deletions(-) diff --git a/autostore.go b/autostore.go index a7c73c8..6812888 100644 --- a/autostore.go +++ b/autostore.go @@ -145,7 +145,7 @@ func (queue *Queue) Pop() (result interface{}, err error) { rows, err := tx.Query(selectsql, queue.cond.CondArgs...) if err != nil { - return nil, fmt.Errorf("table: %s queue is empty", queue.table.name) + return nil, fmt.Errorf("table: %s queue is empty. %s", queue.table.name, err.Error()) } var fields = make([]interface{}, len(queue.fieldIndex)) diff --git a/extractor/mirrativ_extractor/mirrativ_extractor_test.go b/extractor/mirrativ_extractor/mirrativ_extractor_test.go index 49c9507..acc2abd 100644 --- a/extractor/mirrativ_extractor/mirrativ_extractor_test.go +++ b/extractor/mirrativ_extractor/mirrativ_extractor_test.go @@ -1,22 +1,39 @@ package main import ( + "database/sql" + "encoding/json" "intimate" "log" "testing" "time" "github.com/474420502/gcurl" + "github.com/tidwall/gjson" ) func main() { + sessionstr := ` + -H 'authority: www.mirrativ.com' + -H 'accept: application/json' + -H 'x-timezone: Asia/Shanghai' + -H 'x-csrf-token: F3Ojd6RBtApP6YAZzVn-9jWN1of159VxAqOQL1Zn' + -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36' + -H 'content-type: application/json' + -H 'sec-fetch-site: same-origin' + -H 'sec-fetch-mode: cors' + -H 'sec-fetch-dest: empty' + -H 'referer: https://www.mirrativ.com/live/O5Ia4iX9c5CeZj7DFtg52Q' + -H 'accept-language: zh-CN,zh;q=0.9,ja;q=0.8' + -H 'cookie: f=A2D75F0E-D218-11EA-A042-452BF6D21CE8; _ga=GA1.2.689947597.1596081392; mr_id=kxb65LddGMZf5C28jkR_tGCZD_ZFOAepD5gfXO7eNjfPMB8EKYvU1Vg_Y29V1lsa; _gid=GA1.2.2116692650.1600139685; lang=ja'` + ps := intimate.NewPerfectShutdown() - gprofile := gcurl.Parse(`https://www.mirrativ.com/api/user/profile?user_id=103383701`) + gprofile := gcurl.Parse(`curl 'https://www.mirrativ.com/api/user/profile?user_id=103383701'` + sessionstr) tpProfile := gprofile.CreateTemporary(nil) tpProfileUserID := tpProfile.QueryParam("user_id") - g := gcurl.Parse(`https://www.mirrativ.com/api/live/live?live_id=O5Ia4iX9c5CeZj7DFtg52Q`) + g := gcurl.Parse(`culr 'https://www.mirrativ.com/api/live/live?live_id=O5Ia4iX9c5CeZj7DFtg52Q'` + sessionstr) tpLive := g.CreateTemporary(nil) tpLiveID := tpLive.QueryParam("live_id") @@ -28,9 +45,11 @@ func main() { time.Sleep(time.Second * 2) continue } - + now := &sql.NullTime{Time: time.Now(), Valid: true} streamer := istreamer.(*intimate.Streamer) + streamer.UpdateTime = now userid := *streamer.UserId + log.Println(userid) tpProfileUserID.StringSet(userid) resp, err := tpProfile.Execute() @@ -40,10 +59,99 @@ func main() { continue } - profilejson := gcurl.Parse(string(resp.Content())) + clog := &intimate.CollectLog{} + clog.Platform = intimate.PMirrativ + clog.UpdateTime = now + clog.UserId = userid + clog.StreamerUid = streamer.Uid + profilejson := gjson.ParseBytes(resp.Content()) + if result := profilejson.Get("follower_num"); result.Exists() { + clog.Followers = &sql.NullInt64{Int64: result.Int(), Valid: true} + } + + if result := profilejson.Get("onlive.live_id"); result.Exists() { + liveID := result.String() + tpLiveID.StringSet(liveID) + resp, err = tpLive.Execute() + if err != nil { + log.Println(err) + continue + } + + livejson := gjson.ParseBytes(resp.Content()) + if result := livejson.Get("total_viewer_num"); result.Exists() { + clog.Views = &sql.NullInt64{Int64: result.Int(), Valid: true} + } + + if result := livejson.Get("title"); result.Exists() { + clog.LiveTitle = &sql.NullString{String: result.String(), Valid: true} + } + + if result := livejson.Get("started_at"); result.Exists() { + clog.LiveStartTime = &sql.NullTime{Time: time.Unix(result.Int(), 0), Valid: true} + } + + if result := livejson.Get("heartbeated_at"); result.Exists() { + clog.LiveEndTime = &sql.NullTime{Time: time.Unix(result.Int(), 0), Valid: true} + } + + if result := livejson.Get("app_id"); result.Exists() { + streamer.Channel = &sql.NullString{String: result.String(), Valid: true} + } + + if result := livejson.Get("timeline.#.app.short_title"); result.Exists() { + for _, tl := range result.Array() { + var tags []string = []string{tl.String()} + jtags, _ := json.Marshal(tags) + streamer.Tags = jtags + clog.Tags = jtags + break + } + } else { + log.Println(string(resp.Content())) + return + } + + if result := livejson.Get("gift_ranking_url"); result.Exists() { + // streamer.Channel = &sql.NullString{String: result.String(), Valid: true} + gifturl := "curl '" + result.String() + "&type=monthly&cursor='" + sessionstr + ggift := gcurl.Parse(gifturl) + tp := ggift.CreateTemporary(nil) + tp.SetURLRawPath("/api/gift/ranking") + pcursor := tp.QueryParam("cursor") + var gratuity int64 = 0 + + for { + giftdata, err := tp.Execute() + giftjson := gjson.ParseBytes(giftdata.Content()) + if err != nil { + log.Println(err) + } else { + for _, rpoint := range giftjson.Get("ranking.#.point").Array() { + gratuity += rpoint.Int() + } + } + ncursor := giftjson.Get("next_cursor").String() + if ncursor == "" { + break + } + pcursor.StringSet(ncursor) + } + // https://www.mirrativ.com/gift/ranking?live_id=O5Ia4iX9c5CeZj7DFtg52Q&obfuscated_user_id=PgIBEgc6jVc + clog.Gratuity = &sql.NullInt64{Int64: gratuity, Valid: true} + } + + cid, err := intimate.TClog.InsertRetAutoID(clog) + if err != nil { + log.Println(err) + } + streamer.LatestLogUid = cid + } + intimate.TStreamer.Update(streamer) + + time.Sleep(time.Second * 2) } - } func TestDo(t *testing.T) { diff --git a/extractor_field.go b/extractor_field.go index e7577bf..c38962d 100644 --- a/extractor_field.go +++ b/extractor_field.go @@ -46,7 +46,7 @@ type Streamer struct { Channel *sql.NullString `field:"channel"` // Tags interface{} `field:"tags"` Ext interface{} `field:"ext"` // - Comments interface{} `field:"comments"` + // Comments interface{} `field:"comments"` IsUpdateStreamer bool // 更新上面的内容 IsUpdateUrl bool diff --git a/tasks/mirrativ/mirrativ_task1/mirrativ_task1.go b/tasks/mirrativ/mirrativ_task1/mirrativ_task1.go index 3bcb2f5..5fd7146 100644 --- a/tasks/mirrativ/mirrativ_task1/mirrativ_task1.go +++ b/tasks/mirrativ/mirrativ_task1/mirrativ_task1.go @@ -57,14 +57,11 @@ func main() { streamer.Platform = intimate.PMirrativ streamer.Operator = 0 streamer.UserId = &guserid.Str - streamer.UserName = &sql.NullString{String: liveinfo.Get("name").String(), Valid: true} + streamer.UserName = &sql.NullString{String: owner.Get("name").String(), Valid: true} streamer.UpdateInterval = 60 streamer.UpdateTime = intimate.GetUpdateTimeNow() - err = intimate.TStreamer.InsertOrUpdate( - streamer, - intimate.DUpdate{Field: "update_time"}, - ) + err = intimate.TStreamer.Insert(streamer) if err != nil { log.Println(err) panic(err) diff --git a/tasks/mirrativ/mirrativ_task1/mirrativ_task1_test.go b/tasks/mirrativ/mirrativ_task1/mirrativ_task1_test.go index 0ca53de..80820ef 100644 --- a/tasks/mirrativ/mirrativ_task1/mirrativ_task1_test.go +++ b/tasks/mirrativ/mirrativ_task1/mirrativ_task1_test.go @@ -5,5 +5,5 @@ import ( ) func TestMain(t *testing.T) { - + main() } diff --git a/testfile/mirrativ.json b/testfile/mirrativ.json index 2106e78..87da6fc 100644 --- a/testfile/mirrativ.json +++ b/testfile/mirrativ.json @@ -2361,4 +2361,205 @@ "collab_enabled": 1, "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/9bfba1b91a486106882577717aab4ccb4113b200d07dfb7127b087e4e52d8869_m.jpeg?1600164645", "orientation_v2": "6" -} \ No newline at end of file +} + + +{ + "obfuscated_user_id": "PgIBEgc6jVc", + "current_user_rank": null, + "ranking": [ + { + "point": 10, + "user": { + "share_url": "https://www.mirrativ.com/user/105481237", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/2d16160a4158c99daf92f287313a7b4df7797b9f1e07ae0f8983df42fbecec97_m.jpeg?1600205857", + "name": "wwwww", + "description": "", + "properties": [], + "badges": [], + "is_continuous_streamer": 0, + "is_new": 0, + "user_id": "105481237", + "onlive": null + } + }, + { + "point": 1, + "user": { + "share_url": "https://www.mirrativ.com/user/103544585", + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/40cbd7501613cf08f45c56704b1a80796413d7ac0f9e06851d7a4ebe6f1fe7de_m.jpeg?1600217414", + "name": "ꗼ𝒓𝑦𝒖ꗼ", + "description": "俺のファンか仲良い人にしかギフトとかはあげません!まぁ俺にファンなんて居ないけど", + "properties": [], + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_L.en.png?v1", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_master_holiday_S.en.png?v1" + } + ], + "is_continuous_streamer": 1, + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_master_holiday_en@3x.png?v5", + "user_id": "103544585", + "onlive": null + } + } + ], + "status": { + "msg": "", + "ok": 1, + "error": "", + "captcha_url": "", + "error_code": 0, + "message": "" + }, + "next_cursor": "", + "current_cursor": "bW9udGhseToxMDYwNjk5MTY6MjY2NzA0NzMvMA" +} + +{ + "streaming_url_hls": "http://hls-cdn22.mirrativ.com/liveedge/c4d32ce6edec9a37e7b20cff4b656a95714b5b9ee872964d9e435debe74a9518/playlist.m3u8", + "is_gift_supported": 1, + "live_id": "9LtbLw58uSrzig_NTxutIw", + "is_mirrorable": 0, + "description": "いつも拝聴ありがとうございます!\nクラッカーは配信が落ちてしまうので、禁止でお願い致しますm(_ _)m\n", + "total_viewer_num": 1127, + "thumbnail_image_url": "", + "is_archive": 0, + "is_singing_karaoke": 0, + "title": "雑談しながらゲームする!", + "max_online_viewer_num": 212, + "created_at": 1600194426, + "is_live": 1, + "started_at": 1600242640, + "blur_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/64c45462a6dc1113cf984a2bebac27d99cbb9b12c736ee3d104dd4c0c4e086db_m.jpeg?blur=80&1600244617", + "preview_blur_image_url": "", + "live_mos": null, + "thumbnail_blur_image_url": "", + "image_url_without_letterbox": "", + "diamonds": 0, + "joined_live_thumbnail_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/live_capture/64c45462a6dc1113cf984a2bebac27d99cbb9b12c736ee3d104dd4c0c4e086db_m.jpeg?1600244617", + "template_comments": [], + "tags": [], + "broadcast_host": "online.mirrativ.com", + "live_user_key": "", + "bcsvr_key": "1abe77db:Cp3UZxJW", + "heartbeated_at": 1600244742, + "shares": { + "twitter": { + "maxlength": 84, + "card": { + "site": "mirrativ.com", + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/64c45462a6dc1113cf984a2bebac27d99cbb9b12c736ee3d104dd4c0c4e086db_share.jpeg?1600244617", + "title": "雑談しながらゲームする!", + "description": "🐉そあこ💖爽鱗🐉" + }, + "text": "", + "placeholder": "この配信についてひとこと!" + }, + "others": { + "text": "雑談しながらゲームする! #プラエデ #ミラティブ #配信 | https://www.mirrativ.com/live/9LtbLw58uSrzig_NTxutIw" + }, + "title": "🐉そあこ💖爽鱗🐉さんの配信を友達にシェアしよう!", + "description": "友達が見に来てくれると配信者さんに伝わるよ!" + }, + "is_private": 0, + "collab_supported": 1, + "sticker_enabled": 0, + "collab_has_vacancy": 0, + "streaming_key": "c4d32ce6edec9a37e7b20cff4b656a95714b5b9ee872964d9e435debe74a9518", + "stamp_num": 0, + "linked_live": { + "owner_badge_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_S.ja.png?v6", + "live_id": "-L6kxuJm_HgJN7aBY5JjYg", + "owner_id": "100895240", + "owner_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/2a6dab73acec21af7d4d08f53f854e4c3a429d0ba73cd3c8f7618f90ff3c4f9b_m.jpeg?1600184061", + "owner_name": "🦔NICO*🦥🥈感謝" + }, + "collab_online_user_num": 0, + "share_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/custom_thumbnail/64c45462a6dc1113cf984a2bebac27d99cbb9b12c736ee3d104dd4c0c4e086db_share.jpeg?1600244617", + "broadcast_key": "1abe77db:Cp3UZxJW", + "gift_ranking_url": "https://www.mirrativ.com/gift/ranking?live_id=9LtbLw58uSrzig_NTxutIw&obfuscated_user_id=PgIBEgc6jVc", + "collab_mos": null, + "archive_url_hls": "", + "remaining_coins": 0, + "ended_at": 0, + "sticker_category_ids": [], + "online_user_num": 174, + "announcement_url": "", + "anniversary_bot_comment": "", + "is_emomo_wipe_enabled": 0, + "share_url": "https://www.mirrativ.com/live/9LtbLw58uSrzig_NTxutIw", + "status": { + "msg": "", + "ok": 1, + "error": "", + "captcha_url": "", + "error_code": 0, + "message": "" + }, + "orientation": 2, + "app_id": "jp.co.yoozoo.projectyellow", + "app_icon_urls": [ + "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/999ce961e79bfe6d7fff3db363375a17a112810791a692b8858970efa599ca99.png" + ], + "timeline": [ + { + "app": { + "is_my_app": 0, + "icon_url": "https://cdn.mirrativ.com/mirrorman-prod/image/app_icon/999ce961e79bfe6d7fff3db363375a17a112810791a692b8858970efa599ca99.png", + "store_url": "https://go.onelink.me/app/c8e9133", + "app_id": "jp.co.yoozoo.projectyellow", + "short_title": "プラエデ", + "is_category": 0, + "title": "レッド:プライドオブエデン", + "id": 3139 + }, + "timestamp": 1600242607, + "title": "雑談しながらゲームする!" + } + ], + "enable_clap": 0, + "is_paid_sticker_supported": 0, + "announcement_urls": {}, + "sticker_num": 0, + "max_collab_user_num": 3, + "comment_num": 145, + "owner": { + "share_url": "https://www.mirrativ.com/user/104326294", + "is_able_continuous_stream_holiday": 1, + "profile_image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/profile_image/1046538382ddfccff9b118699ec605cb33cc3c61feb94122f79d5812221e99b5_m.jpeg?1600194531", + "birthday_from": 1615561200, + "is_birthday_editable": 1, + "badges": [ + { + "image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_L.ja.png?v6", + "small_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_badge_super_holiday_S.ja.png?v6" + } + ], + "is_new": 0, + "catalog_label_image_url": "https://cdn.mirrativ.com/assets/img/continuous_streamer/ic_status_super_holiday_ja@3x.png?v5", + "birthday": "0314", + "birthday_to": 1615820399, + "name": "🐉そあこ💖爽鱗🐉", + "is_birthday": 0, + "description": "色んなゲームを17:30に定期配信してます♡ギフト当たった人は欲しい時にDM求む", + "birthday_editable_date": "", + "properties": [], + "is_continuous_streamer": 1, + "user_id": "104326294", + "live_request_num": "70", + "onlive": null + }, + "broadcast_port": 1883, + "recommend_sticker_ids": [], + "sticker_display_type": 0, + "archive_comment_enabled": 0, + "streaming_url_edge": "rtmp://edge-210-140-191-149.mirrativ.com:1935/liveedge/c4d32ce6edec9a37e7b20cff4b656a95714b5b9ee872964d9e435debe74a9518", + "collab_enabled": 0, + "image_url": "https://cdn.mirrativ.com/mirrorman-prod/image/thumbnail_image_url/64c45462a6dc1113cf984a2bebac27d99cbb9b12c736ee3d104dd4c0c4e086db_m.jpeg?1600244617", + "orientation_v2": "6" +} + +// curl 'https://www.mirrativ.com/api/gift/ranking?obfuscated_user_id=PgIBEgc6jVc&live_id=O5Ia4iX9c5CeZj7DFtg52Q&type=monthly&cursor=' \ + \ No newline at end of file From 0e19b598130e444e8db362713baf9b5b2d661456 Mon Sep 17 00:00:00 2001 From: eson Date: Thu, 17 Sep 2020 14:58:50 +0800 Subject: [PATCH 8/8] add mirrativ finish --- .../mirrativ_extractor/mirrativ_extractor.go | 158 ++++++++++++++++++ .../mirrativ_extractor_test.go | 150 ----------------- supervisor_conf/clear_log.sh | 2 +- supervisor_conf/mirrativ_extractor.conf | 10 ++ supervisor_conf/mirrativ_task1.conf | 13 ++ .../mirrativ/mirrativ_task1/mirrativ_task1.go | 15 +- utils.go | 24 +-- 7 files changed, 193 insertions(+), 179 deletions(-) create mode 100644 supervisor_conf/mirrativ_extractor.conf create mode 100644 supervisor_conf/mirrativ_task1.conf diff --git a/extractor/mirrativ_extractor/mirrativ_extractor.go b/extractor/mirrativ_extractor/mirrativ_extractor.go index 06ab7d0..33015b3 100644 --- a/extractor/mirrativ_extractor/mirrativ_extractor.go +++ b/extractor/mirrativ_extractor/mirrativ_extractor.go @@ -1 +1,159 @@ package main + +import ( + "database/sql" + "encoding/json" + "intimate" + "log" + "time" + + "github.com/474420502/gcurl" + "github.com/tidwall/gjson" +) + +func main() { + + sessionstr := ` + -H 'authority: www.mirrativ.com' + -H 'accept: application/json' + -H 'x-timezone: Asia/Shanghai' + -H 'x-csrf-token: F3Ojd6RBtApP6YAZzVn-9jWN1of159VxAqOQL1Zn' + -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36' + -H 'content-type: application/json' + -H 'sec-fetch-site: same-origin' + -H 'sec-fetch-mode: cors' + -H 'sec-fetch-dest: empty' + -H 'referer: https://www.mirrativ.com/live/O5Ia4iX9c5CeZj7DFtg52Q' + -H 'accept-language: zh-CN,zh;q=0.9,ja;q=0.8' + -H 'cookie: f=A2D75F0E-D218-11EA-A042-452BF6D21CE8; _ga=GA1.2.689947597.1596081392; mr_id=kxb65LddGMZf5C28jkR_tGCZD_ZFOAepD5gfXO7eNjfPMB8EKYvU1Vg_Y29V1lsa; _gid=GA1.2.2116692650.1600139685; lang=ja'` + + ps := intimate.NewPerfectShutdown() + gprofile := gcurl.Parse(`curl 'https://www.mirrativ.com/api/user/profile?user_id=103383701'` + sessionstr) + tpProfile := gprofile.CreateTemporary(nil) + tpProfileUserID := tpProfile.QueryParam("user_id") + + g := gcurl.Parse(`culr 'https://www.mirrativ.com/api/live/live?live_id=O5Ia4iX9c5CeZj7DFtg52Q'` + sessionstr) + tpLive := g.CreateTemporary(nil) + tpLiveID := tpLive.QueryParam("live_id") + + var lasterr error + queue := intimate.TStreamer.Queue(intimate.Streamer{}, intimate.ConditionDefault(intimate.PMirrativ)) + for !ps.IsClose() { + istreamer, err := queue.Pop() + if err != nil { + if lasterr != err { + lasterr = err + log.Println(err) + } + ps.Wait(time.Second * 5) + continue + } + + now := &sql.NullTime{Time: time.Now(), Valid: true} + streamer := istreamer.(*intimate.Streamer) + streamer.UpdateTime = now + userid := *streamer.UserId + log.Println(userid) + + tpProfileUserID.StringSet(userid) + resp, err := tpProfile.Execute() + if err != nil { + log.Println(err) + time.Sleep(time.Second) + continue + } + + clog := &intimate.CollectLog{} + clog.Platform = intimate.PMirrativ + clog.UpdateTime = now + clog.UserId = userid + clog.StreamerUid = streamer.Uid + + profilejson := gjson.ParseBytes(resp.Content()) + if result := profilejson.Get("follower_num"); result.Exists() { + clog.Followers = &sql.NullInt64{Int64: result.Int(), Valid: true} + } + + if result := profilejson.Get("onlive.live_id"); result.Exists() { + liveID := result.String() + tpLiveID.StringSet(liveID) + resp, err = tpLive.Execute() + if err != nil { + log.Println(err) + continue + } + + livejson := gjson.ParseBytes(resp.Content()) + if result := livejson.Get("total_viewer_num"); result.Exists() { + clog.Views = &sql.NullInt64{Int64: result.Int(), Valid: true} + } + + if result := livejson.Get("title"); result.Exists() { + clog.LiveTitle = &sql.NullString{String: result.String(), Valid: true} + } + + if result := livejson.Get("started_at"); result.Exists() { + clog.LiveStartTime = &sql.NullTime{Time: time.Unix(result.Int(), 0), Valid: true} + } + + if result := livejson.Get("heartbeated_at"); result.Exists() { + clog.LiveEndTime = &sql.NullTime{Time: time.Unix(result.Int(), 0), Valid: true} + } + + if result := livejson.Get("app_id"); result.Exists() { + streamer.Channel = &sql.NullString{String: result.String(), Valid: true} + } + + if result := livejson.Get("timeline.#.app.short_title"); result.Exists() { + for _, tl := range result.Array() { + var tags []string = []string{tl.String()} + jtags, _ := json.Marshal(tags) + streamer.Tags = jtags + clog.Tags = jtags + break + } + } else { + log.Println(string(resp.Content())) + return + } + + if result := livejson.Get("gift_ranking_url"); result.Exists() { + // streamer.Channel = &sql.NullString{String: result.String(), Valid: true} + gifturl := "curl '" + result.String() + "&type=monthly&cursor='" + sessionstr + ggift := gcurl.Parse(gifturl) + tp := ggift.CreateTemporary(nil) + tp.SetURLRawPath("/api/gift/ranking") + pcursor := tp.QueryParam("cursor") + var gratuity int64 = 0 + + for { + giftdata, err := tp.Execute() + giftjson := gjson.ParseBytes(giftdata.Content()) + if err != nil { + log.Println(err) + } else { + for _, rpoint := range giftjson.Get("ranking.#.point").Array() { + gratuity += rpoint.Int() + } + } + ncursor := giftjson.Get("next_cursor").String() + if ncursor == "" { + break + } + pcursor.StringSet(ncursor) + } + // https://www.mirrativ.com/gift/ranking?live_id=O5Ia4iX9c5CeZj7DFtg52Q&obfuscated_user_id=PgIBEgc6jVc + clog.Gratuity = &sql.NullInt64{Int64: gratuity, Valid: true} + } + + cid, err := intimate.TClog.InsertRetAutoID(clog) + if err != nil { + log.Println(err) + } + streamer.LatestLogUid = cid + } + + intimate.TStreamer.Update(streamer) + time.Sleep(time.Second * 2) + } +} diff --git a/extractor/mirrativ_extractor/mirrativ_extractor_test.go b/extractor/mirrativ_extractor/mirrativ_extractor_test.go index acc2abd..b443cf2 100644 --- a/extractor/mirrativ_extractor/mirrativ_extractor_test.go +++ b/extractor/mirrativ_extractor/mirrativ_extractor_test.go @@ -1,159 +1,9 @@ package main import ( - "database/sql" - "encoding/json" - "intimate" - "log" "testing" - "time" - - "github.com/474420502/gcurl" - "github.com/tidwall/gjson" ) -func main() { - - sessionstr := ` - -H 'authority: www.mirrativ.com' - -H 'accept: application/json' - -H 'x-timezone: Asia/Shanghai' - -H 'x-csrf-token: F3Ojd6RBtApP6YAZzVn-9jWN1of159VxAqOQL1Zn' - -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36' - -H 'content-type: application/json' - -H 'sec-fetch-site: same-origin' - -H 'sec-fetch-mode: cors' - -H 'sec-fetch-dest: empty' - -H 'referer: https://www.mirrativ.com/live/O5Ia4iX9c5CeZj7DFtg52Q' - -H 'accept-language: zh-CN,zh;q=0.9,ja;q=0.8' - -H 'cookie: f=A2D75F0E-D218-11EA-A042-452BF6D21CE8; _ga=GA1.2.689947597.1596081392; mr_id=kxb65LddGMZf5C28jkR_tGCZD_ZFOAepD5gfXO7eNjfPMB8EKYvU1Vg_Y29V1lsa; _gid=GA1.2.2116692650.1600139685; lang=ja'` - - ps := intimate.NewPerfectShutdown() - gprofile := gcurl.Parse(`curl 'https://www.mirrativ.com/api/user/profile?user_id=103383701'` + sessionstr) - tpProfile := gprofile.CreateTemporary(nil) - tpProfileUserID := tpProfile.QueryParam("user_id") - - g := gcurl.Parse(`culr 'https://www.mirrativ.com/api/live/live?live_id=O5Ia4iX9c5CeZj7DFtg52Q'` + sessionstr) - tpLive := g.CreateTemporary(nil) - tpLiveID := tpLive.QueryParam("live_id") - - queue := intimate.TStreamer.Queue(intimate.Streamer{}, intimate.ConditionDefault(intimate.PMirrativ)) - for !ps.IsClose() { - istreamer, err := queue.Pop() - if err != nil { - log.Println(err) - time.Sleep(time.Second * 2) - continue - } - now := &sql.NullTime{Time: time.Now(), Valid: true} - streamer := istreamer.(*intimate.Streamer) - streamer.UpdateTime = now - userid := *streamer.UserId - log.Println(userid) - - tpProfileUserID.StringSet(userid) - resp, err := tpProfile.Execute() - if err != nil { - log.Println(err) - time.Sleep(time.Second) - continue - } - - clog := &intimate.CollectLog{} - clog.Platform = intimate.PMirrativ - clog.UpdateTime = now - clog.UserId = userid - clog.StreamerUid = streamer.Uid - - profilejson := gjson.ParseBytes(resp.Content()) - if result := profilejson.Get("follower_num"); result.Exists() { - clog.Followers = &sql.NullInt64{Int64: result.Int(), Valid: true} - } - - if result := profilejson.Get("onlive.live_id"); result.Exists() { - liveID := result.String() - tpLiveID.StringSet(liveID) - resp, err = tpLive.Execute() - if err != nil { - log.Println(err) - continue - } - - livejson := gjson.ParseBytes(resp.Content()) - if result := livejson.Get("total_viewer_num"); result.Exists() { - clog.Views = &sql.NullInt64{Int64: result.Int(), Valid: true} - } - - if result := livejson.Get("title"); result.Exists() { - clog.LiveTitle = &sql.NullString{String: result.String(), Valid: true} - } - - if result := livejson.Get("started_at"); result.Exists() { - clog.LiveStartTime = &sql.NullTime{Time: time.Unix(result.Int(), 0), Valid: true} - } - - if result := livejson.Get("heartbeated_at"); result.Exists() { - clog.LiveEndTime = &sql.NullTime{Time: time.Unix(result.Int(), 0), Valid: true} - } - - if result := livejson.Get("app_id"); result.Exists() { - streamer.Channel = &sql.NullString{String: result.String(), Valid: true} - } - - if result := livejson.Get("timeline.#.app.short_title"); result.Exists() { - for _, tl := range result.Array() { - var tags []string = []string{tl.String()} - jtags, _ := json.Marshal(tags) - streamer.Tags = jtags - clog.Tags = jtags - break - } - } else { - log.Println(string(resp.Content())) - return - } - - if result := livejson.Get("gift_ranking_url"); result.Exists() { - // streamer.Channel = &sql.NullString{String: result.String(), Valid: true} - gifturl := "curl '" + result.String() + "&type=monthly&cursor='" + sessionstr - ggift := gcurl.Parse(gifturl) - tp := ggift.CreateTemporary(nil) - tp.SetURLRawPath("/api/gift/ranking") - pcursor := tp.QueryParam("cursor") - var gratuity int64 = 0 - - for { - giftdata, err := tp.Execute() - giftjson := gjson.ParseBytes(giftdata.Content()) - if err != nil { - log.Println(err) - } else { - for _, rpoint := range giftjson.Get("ranking.#.point").Array() { - gratuity += rpoint.Int() - } - } - ncursor := giftjson.Get("next_cursor").String() - if ncursor == "" { - break - } - pcursor.StringSet(ncursor) - } - // https://www.mirrativ.com/gift/ranking?live_id=O5Ia4iX9c5CeZj7DFtg52Q&obfuscated_user_id=PgIBEgc6jVc - clog.Gratuity = &sql.NullInt64{Int64: gratuity, Valid: true} - } - - cid, err := intimate.TClog.InsertRetAutoID(clog) - if err != nil { - log.Println(err) - } - streamer.LatestLogUid = cid - } - intimate.TStreamer.Update(streamer) - - time.Sleep(time.Second * 2) - } -} - func TestDo(t *testing.T) { main() } diff --git a/supervisor_conf/clear_log.sh b/supervisor_conf/clear_log.sh index 1cce37f..61892e8 100644 --- a/supervisor_conf/clear_log.sh +++ b/supervisor_conf/clear_log.sh @@ -1,6 +1,6 @@ CURPATH=`pwd` BINPATH=$(dirname "$CURPATH")/bin -find $BINPATH -type f -name 'log' -exec rm {} + +find $BINPATH -type f -name 'log' -exec truncate -s 0 {} + diff --git a/supervisor_conf/mirrativ_extractor.conf b/supervisor_conf/mirrativ_extractor.conf new file mode 100644 index 0000000..4036857 --- /dev/null +++ b/supervisor_conf/mirrativ_extractor.conf @@ -0,0 +1,10 @@ +[supervisord] +nodaemon=true + +[program:mirrativ_extractor] +directory = MYPATH/bin/mirrativ_extractor/ +command= MYPATH/bin/mirrativ_extractor/mirrativ_extractor +autorestart=true +stderr_logfile=MYPATH/bin/mirrativ_extractor/log +stderr_logfile_maxbytes=0 +stopsignal=QUIT diff --git a/supervisor_conf/mirrativ_task1.conf b/supervisor_conf/mirrativ_task1.conf new file mode 100644 index 0000000..f945ee6 --- /dev/null +++ b/supervisor_conf/mirrativ_task1.conf @@ -0,0 +1,13 @@ +[supervisord] +nodaemon=false + +[program:mirrativ_task1] +environment=DISPLAY=":99" +directory = MYPATH/bin/mirrativ_task1/ +command= MYPATH/bin/mirrativ_task1/mirrativ_task1 +# process_name=%(program_name)s_%(process_num)02d ;多进程名称 +# numprocs=1 ;启动多个进程 +autorestart=true +stderr_logfile=MYPATH/bin/mirrativ_task1/log +stderr_logfile_maxbytes=0 +stopsignal=QUIT diff --git a/tasks/mirrativ/mirrativ_task1/mirrativ_task1.go b/tasks/mirrativ/mirrativ_task1/mirrativ_task1.go index 5fd7146..84a756d 100644 --- a/tasks/mirrativ/mirrativ_task1/mirrativ_task1.go +++ b/tasks/mirrativ/mirrativ_task1/mirrativ_task1.go @@ -31,7 +31,8 @@ func main() { cursor := tp.QueryParam(`cursor`) cursor.StringSet("") - for { + ps := intimate.NewPerfectShutdown() + for !ps.IsClose() { log.Println(tp.ParsedURL.String()) resp, err := tp.Execute() @@ -58,10 +59,14 @@ func main() { streamer.Operator = 0 streamer.UserId = &guserid.Str streamer.UserName = &sql.NullString{String: owner.Get("name").String(), Valid: true} - streamer.UpdateInterval = 60 + streamer.UpdateInterval = 600 streamer.UpdateTime = intimate.GetUpdateTimeNow() - err = intimate.TStreamer.Insert(streamer) + err = intimate.TStreamer.InsertOrUpdate( + streamer, + intimate.DUpdate{Field: "update_time"}, + ) + if err != nil { log.Println(err) panic(err) @@ -69,9 +74,9 @@ func main() { } } if next == "" { - time.Sleep(time.Minute * 5) + ps.Wait(time.Minute * 10) } else { - time.Sleep(time.Second * 2) + ps.Wait(time.Second * 2) } cursor.StringSet(next) } diff --git a/utils.go b/utils.go index edbd926..8079c0f 100644 --- a/utils.go +++ b/utils.go @@ -110,16 +110,13 @@ func (adriver *AutoCloseDriver) Close() { // log.Println(string(data)) killshell := fmt.Sprintf("pkill -9 -P %s", data) - // log.Println(killshell) - // pkill -f \"port=%d\" - // log.Printf(fmt.Sprintf("kill -9 $(lsof -t -i:%d)", port)) err = exec.Command("/bin/bash", "-c", killshell).Run() if err != nil { log.Println(err) return } - err = exec.Command("/bin/bash", "-c", fmt.Sprintf("kill %s", data)).Run() + err = exec.Command("/bin/bash", "-c", fmt.Sprintf("kill -9 %s", data)).Run() if err != nil { log.Println(err) return @@ -134,8 +131,6 @@ func GetChromeDriver() *AutoCloseDriver { caps := selenium.Capabilities{"browserName": "chrome"} chromecaps := chrome.Capabilities{} - - // chromecaps.AddExtension("/home/eson/test/myblock.crx") for _, epath := range []string{"../../../crx/myblock.crx", "../../crx/myblock.crx"} { _, err := os.Stat(epath) if err == nil { @@ -182,23 +177,6 @@ func GetChromeDriver() *AutoCloseDriver { adriver.Port = port adriver.Webdriver = wd - // runtime.SetFinalizer(adriver, func(obj interface{}) { - - // adriver := obj.(*AutoCloseDriver) - // adriver.Webdriver.Close() - // adriver.Webdriver.Quit() - - // killshell := fmt.Sprintf("pkill -P `pgrep -f 'port=%d '` && pkill -f 'port=%d '", port, port) - // log.Println(killshell) - - // // log.Printf(fmt.Sprintf("kill -9 $(lsof -t -i:%d)", port)) - // // cmd := exec.Command("sh", "-c", killshell) - // // err = cmd.Run() - // // if err != nil { - // // log.Println(err) - // // } - // }) - wd.ExecuteScript("windows.navigator.webdriver = undefined", nil) if err != nil { panic(err)