}
}
+//constKv
+var (
+ Proxy string//全局代理
+)
+func init() {
+ Proxy,_ = K_v.LoadV("http代理地址").(string)
+}
+
//日志
var Log = log.New(log.Config{
File:`danmu.log`,
req := reqf.Req()
if err := req.Reqf(reqf.Rval{
Url:`https://api.bilibili.com/x/space/acc/info?mid=`+strconv.Itoa(UpUid)+`&jsonp=jsonp`,
+ Proxy:c.Proxy,
Timeout:10,
Retry:2,
});err != nil {
{
r := g.Get(reqf.Rval{
Url:"https://live.bilibili.com/" + Roomid,
+ Proxy:c.Proxy,
})
if tmp := r.S(`<script>window.__NEPTUNE_IS_MY_WAIFU__=`, `</script>`, 0, 0);tmp.Err != nil {
Header:map[string]string{
`Referer`:"https://live.bilibili.com/" + Roomid,
},
+ Proxy:c.Proxy,
Timeout:10,
Retry:2,
});err != nil {
`Referer`:"https://live.bilibili.com/" + Roomid,
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
+ Proxy:c.Proxy,
Timeout:10,
Retry:2,
});err != nil {
`Referer`:"https://live.bilibili.com/" + Roomid,
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
+ Proxy:c.Proxy,
Timeout:10,
Retry:2,
});err != nil {
`Referer`:"https://live.bilibili.com/" + Roomid,
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
+ Proxy:c.Proxy,
Timeout:10,
});err != nil {
apilog.L(`E: `,err)
`Referer`:"https://live.bilibili.com/" + strconv.Itoa(c.Roomid),
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
+ Proxy:c.Proxy,
Timeout:10,
Retry:2,
});err != nil {
`Referer`:"https://live.bilibili.com/" + Roomid,
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
+ Proxy:c.Proxy,
Timeout:3,
Retry:2,
});err != nil {
`Referer`:"https://live.bilibili.com/" + Roomid,
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
+ Proxy:c.Proxy,
Timeout:3,
Retry:2,
});err != nil {
r := reqf.Req()
if e := r.Reqf(reqf.Rval{
Url:`https://passport.bilibili.com/qrcode/getLoginUrl`,
+ Proxy:c.Proxy,
Timeout:10,
Retry:2,
});e != nil {
`Referer`: `https://passport.bilibili.com/login`,
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
+ Proxy:c.Proxy,
Timeout:10,
Retry:2,
});e != nil {
Header:map[string]string{
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
+ Proxy:c.Proxy,
Timeout:10,
Retry:2,
});e != nil {
Header:map[string]string{
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
+ Proxy:c.Proxy,
Timeout:10,
Retry:2,
});e != nil {
`Content-Type`:`application/x-www-form-urlencoded; charset=UTF-8`,
`Referer`: `https://passport.bilibili.com/login`,
},
+ Proxy:c.Proxy,
Timeout:10,
Retry:2,
});e != nil {
`Referer`:"https://live.bilibili.com/all",
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
+ Proxy:c.Proxy,
Timeout:3,
Retry:2,
});err != nil {
`Referer`:"https://live.bilibili.com/all",
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
+ Proxy:c.Proxy,
Timeout:3,
Retry:2,
});err != nil {
`DNT`: `1`,
`Upgrade-Insecure-Requests`: `1`,
},
+ Proxy:c.Proxy,
Timeout:3,
Retry:2,
});err != nil {
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
PostStr:url.PathEscape(PostStr),
+ Proxy:c.Proxy,
Timeout:5,
Retry:2,
});err != nil {
PostStr += `csrf_token=`+csrf+`&csrf=`+csrf+`&`
PostStr += `visit_id=`
- if wasm := Wasm(3, 0, rt_obj);wasm == `` {//0全局
+ if wasm := Wasm(0, rt_obj);wasm == `` {//0全局
apilog.L(`E: `,`发生错误`)
return
} else {
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
PostStr:url.PathEscape(PostStr),
+ Proxy:c.Proxy,
Timeout:5,
Retry:2,
});err != nil {
`Referer`:"https://live.bilibili.com/"+strconv.Itoa(c.Roomid),
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
+ Proxy:c.Proxy,
Timeout:3,
Retry:2,
});err != nil {
`Referer`:`https://link.bilibili.com/p/center/index`,
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
+ Proxy:c.Proxy,
Timeout:3,
Retry:2,
});err != nil {
`Referer`:`https://link.bilibili.com/p/center/index`,
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
+ Proxy:c.Proxy,
Timeout:3,
Retry:2,
});err != nil {
`Referer`:`https://link.bilibili.com/p/center/index`,
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
+ Proxy:c.Proxy,
Timeout:3,
Retry:2,
});err != nil {
`Referer`:`https://t.bilibili.com/pages/nav/index_new`,
`Cookie`:reqf.Map_2_Cookies_String(Cookie),
},
+ Proxy:c.Proxy,
Timeout:3,
Retry:2,
});err != nil {
Header:map[string]string{
`Referer`:"https://live.bilibili.com/" + Roomid,
},
+ Proxy:c.Proxy,
Timeout:10,
Retry:2,
});err != nil {
req := reqf.Req()
if err := req.Reqf(reqf.Rval{
Url:"https://www.bilibili.com",
+ Proxy:c.Proxy,
Timeout:10,
JustResponseCode:true,
});err != nil {
wslog.L(`I: `,`使用WebJs`,webpath,`进行加密`)
}
-func Wasm(maxloop int, uid uintptr,s RT) (o string) {//maxloop 超时重试
- if maxloop <= 0 {return}
-
+func Wasm(uid uintptr,s RT) (o string) {//maxloop 超时重试
{//nodejs
if nodeJsUrl != "" {
req := reqf.Req()
},
Url:nodeJsUrl,
PostStr:toNodeJsString(s),
+ Proxy:c.Proxy,
Timeout:3,
});err != nil {
wslog.L(`E: `,err)
- o = Wasm(maxloop-1, uid, s)
+ o = Wasm(uid, s)
return
}
time.Sleep(time.Second*time.Duration(3))
}
+ if ws.Len() == 0 {
+ wslog.L(`W: `,`浏览器打开`,webpath,`失败,请手动打开`)
+ return
+ }
+
//获取websocket操作对象 发送
ws.Interface().Push_tag(`send`,websocket.Uinterface{
Id:uid,
return r.S
case <- time.After(time.Second*time.Duration(1)):
wslog.L(`E: `,`超时!响应>1s,确认保持`,webpath,`开启`)
- o = Wasm(maxloop-1, uid, s)
return
}
}
func test(uid uintptr) bool {
time.Sleep(time.Second*time.Duration(3))
- if s := Wasm(3, uid, RT{
+ if s := Wasm(uid, RT{
R:R{
Id: "[9,371,1,22613059]",
Device: "[\"AUTO8216117272375373\",\"77bee604-b591-4664-845b-b69603f8c71c\"]",
Url:m3u8_url,
Retry:4,
SleepTime:1,
+ Proxy:c.Proxy,
Timeout:3,
Header:map[string]string{
`Host`: url_struct.Host,
Url:c.Live[0],
Retry:10,
SleepTime:5,
+ Proxy:c.Proxy,
Header:map[string]string{
`Cookie`:reqf.Map_2_Cookies_String(CookieM),
},
byteC := make(chan []byte,1024*1024*30)//传来的关键帧间隔buf为3s,避免超出buf,设为30M
go func(){
- for !p.Checkfile().IsExist(savestream.path + ".flv.dtmp") {time.Sleep(time.Second)}
+ for !p.Checkfile().IsExist(savestream.path + ".flv.dtmp") {
+ select {
+ case <-exit_chan:return;
+ case <-time.After(time.Second):;
+ }
+ }
for {
if err := Stream(savestream.path + ".flv.dtmp",&savestream.flv_front,byteC,exit_chan);err != nil {
flog.L(`T: `,err);
if e := rr.Reqf(reqf.Rval{
Url:link,
Retry:3,
+ Proxy:c.Proxy,
SleepTime:3,
Header:map[string]string{
`Cookie`:reqf.Map_2_Cookies_String(CookieM),
SleepTime:1,
SaveToPath:path+(*link).Base,
Timeout:3,
+ Proxy:c.Proxy,
}); e != nil{
l.L(`I: `,e,`将重试!`)
//避免影响后续猜测
if flushSupport {flusher.Flush()}
//写入flv头,首tag
- if n,err := w.Write(savestream.flv_front);err != nil {
+ if _,err := w.Write(savestream.flv_front);err != nil {
return
} else if flushSupport {
flusher.Flush()
- } else {
- fmt.Println("pass",n)
}
cancel := make(chan struct{})
Buf *[]byte
}
- var seachtag = func(f *os.File)(offset int64){
- cur_offset,_ := f.Seek(0,1)
- defer f.Seek(cur_offset,0)
+ var seachtag = func(f *os.File, begin_offset int64)(available_offset int64){
+ available_offset += begin_offset
+ f.Seek(begin_offset, 0)//seek to begin
- f.Seek(tag_header_size,1)
- buf := make([]byte, 1024*1024)
- for {
- if size,_ := f.Read(buf);size == 0 {
- return
- } else {
- for offset=0;offset<int64(size); {
- streamid_loc := bytes.Index(buf[offset:], []byte{0x00,0x00,0x00})
- if streamid_loc == -1 {break}
- offset += int64(streamid_loc)
-
- if tag_type := buf[offset-6];tag_type != video_tag && tag_type != audio_tag && tag_type != script_tag {
- continue
- }
- offset += int64(tag_header_size-6)
+ buf := make([]byte, 1024*1024*10)
+ if size,_ := f.Read(buf);size == 0 {
+ return
+ } else {
+ for buf_offset:=0;buf_offset<size; {
+ if tag_offset := bytes.IndexAny(buf[buf_offset:], string([]byte{video_tag,audio_tag,script_tag}));tag_offset == -1 {
+ return
+ } else if streamid_offset := bytes.Index(buf[tag_offset:], []byte{0x00,0x00,0x00});streamid_offset == -1 {
+ return
+ } else if streamid_offset == 8 {
+ available_offset += int64(tag_offset + buf_offset)
return
+ } else {
+ buf_offset += tag_offset + 1
}
- f.Seek(-5,1)
}
}
+ return
}
//get tag func
time.Sleep(time.Second)
continue
} else if t.PreSize == 0 {
- f.Seek(last_available_offset,0)
- f.Seek(seachtag(f),1)
+ f.Seek(seachtag(f, last_available_offset),0)
continue
} else if t.Tag == video_tag {
if t.FirstByte & 0xf0 == 0x10 {
Url:src,
SaveToPath:Gtk_img_path + `/` + uid,
Timeout:3,
+ Proxy:c.Proxy,
}); e != nil{log.Println(e);}
}()
default:
Timeout:3,
Retry:1,
SleepTime:500,
+ Proxy:c.Proxy,
});err != nil {
tts_log.L(`E: `,err)
return
PostStr:url.PathEscape(PostStr),
Retry:2,
Timeout:5,
+ Proxy:c.Proxy,
Header:map[string]string{
`Host`: `api.live.bilibili.com`,
`User-Agent`: `Mozilla/5.0 (X11; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0`,
Url:`https://api.live.bilibili.com/gift/v2/live/bag_send`,
PostStr:url.PathEscape(sendStr),
Timeout:10,
+ Proxy:c.Proxy,
Header:map[string]string{
`Host`: `api.vc.bilibili.com`,
`User-Agent`: `Mozilla/5.0 (X11; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0`,
Url:`https://api.vc.bilibili.com/web_im/v1/web_im/send_msg`,
PostStr:url.PathEscape(send_str),
Timeout:10,
+ Proxy:c.Proxy,
Header:map[string]string{
`Host`: `api.vc.bilibili.com`,
`User-Agent`: `Mozilla/5.0 (X11; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0`,
ws_c := ws.New_client(ws.Client{
Url:v,
TO:35 * 1000,
+ Proxy:c.Proxy,
Func_abort_close:func(){danmulog.L(`I: `,`服务器连接中断`)},
Func_normal_close:func(){danmulog.L(`I: `,`服务器连接关闭`)},
Header: map[string]string{
"扫码登录-help": "当扫码登陆设置为true时,每次启动会检查,若失败则会要求登录",
"扫码登录": true,
"扫码登录自动打开标签页": false,
- "网络中断不退出": true
+ "网络中断不退出": true,
+ "http代理地址-help":"例http://127.0.0.1:38223 为空时不使用",
+ "http代理地址":""
}
\ No newline at end of file
github.com/miekg/dns v1.1.41 // indirect
github.com/mitchellh/mapstructure v1.4.1 // indirect
github.com/qydysky/bili_danmu v0.5.7
- github.com/qydysky/part v0.5.9 // indirect
+ github.com/qydysky/part v0.5.10 // indirect
github.com/shirou/gopsutil v3.21.3+incompatible // indirect
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect
github.com/qydysky/part v0.5.8/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg=
github.com/qydysky/part v0.5.9 h1:XZxBs6bBVQCKH48791X8ebrReY50aGw9IFCdaM1QhGA=
github.com/qydysky/part v0.5.9/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg=
+github.com/qydysky/part v0.5.10 h1:SYdPGV1DlHFDKjDGBU3dXbuR9WA8NNwTbQ2nDjdyeiA=
+github.com/qydysky/part v0.5.10/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg=
github.com/qydysky/part/msgq v0.0.0-20201213031129-ca3253dc72ad h1:Jtzf509lQrkUMGTV0Sc6IDCAiR1VrBcHrIban7hpye4=
github.com/qydysky/part/msgq v0.0.0-20201213031129-ca3253dc72ad/go.mod h1:w32TkJNVtTJd4LOS09cq+4uYG6itcN2vsqw+slp44Rg=
github.com/qydysky/part/msgq v0.0.0-20201213120821-f36e49c32bba h1:1ew9dRpc0Rux0WkWeT/4AE15ynYWmL2D7onJEJIFOB8=