]> 127.0.0.1 Git - bili_danmu/.git/commitdiff
全局map保护
authorqydysky <qydysky@foxmail.com>
Thu, 18 Feb 2021 06:34:38 +0000 (14:34 +0800)
committerqydysky <qydysky@foxmail.com>
Thu, 18 Feb 2021 06:34:38 +0000 (14:34 +0800)
部分日志级别调整
没粉丝牌不获取小心心,可自定义是否发进房弹幕

CV/Var.go
F/api.go
Reply/F.go
Reply/Reply.go
Reply/tts.go
Send/Send.go
Send/Send_pm.go
bili_danmu.go
demo/config/config_K_v.json
demo/go.mod
demo/go.sum

index 80b9d0a6ad16077bf9843f1e2108a6c4bb87ea5d..92411d7a79c4363efadf5bef08bac4b67ade5b3f 100644 (file)
--- a/CV/Var.go
+++ b/CV/Var.go
@@ -16,7 +16,7 @@ var (
        Live []string//直播链接
        Live_qn string
        Roomid int
-       Cookie = make(map[string]string)
+       Cookie syncmap.Map
        Title string//直播标题
        Uname string//主播名
        Rev float64//营收
@@ -25,6 +25,7 @@ var (
        Note string//分区排行
        Live_Start_Time time.Time//直播开始时间
        Liveing bool//是否在直播
+       Wearing_FansMedal int//当前佩戴的粉丝牌
 )
 
 //消息队列
index 9001d53ed51cfbd9db01f8a5209daaf02e0bb3cd..8d90dac487245f308bd6db3f286b0507c3c48a51 100644 (file)
--- a/F/api.go
+++ b/F/api.go
@@ -31,7 +31,6 @@ type api struct {
        Token string
        Parent_area_id int
        Area_id int
-       wearing_FansMedal bool
 }
 
 var apilog = c.Log.Base(`api`)
@@ -107,12 +106,18 @@ func (i *api) Get_info() (o *api) {
                c.Title != ``{return}
 
        {//使用其他api
+               Cookie := make(map[string]string)
+               c.Cookie.Range(func(k,v interface{})(bool){
+                       Cookie[k.(string)] = v.(string)
+                       return true
+               })
+
                req := p.Req()
                if err := req.Reqf(p.Rval{
                        Url:"https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom?room_id=" + Roomid,
                        Header:map[string]string{
                                `Referer`:"https://live.bilibili.com/" + Roomid,
-                               `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                               `Cookie`:p.Map_2_Cookies_String(Cookie),
                        },
                        Timeout:10,
                        Retry:2,
@@ -212,8 +217,14 @@ func (i *api) Get_live(qn ...string) (o *api) {
                return
        }
        if api_limit.TO() {return}//超额请求阻塞,超时将取消
+       
+       CookieM := make(map[string]string)
+       c.Cookie.Range(func(k,v interface{})(bool){
+               CookieM[k.(string)] = v.(string)
+               return true
+       })
 
-       Cookie := p.Map_2_Cookies_String(c.Cookie)
+       Cookie := p.Map_2_Cookies_String(CookieM)
        if i := strings.Index(Cookie, "PVID="); i != -1 {
                if d := strings.Index(Cookie[i:], ";"); d == -1 {
                        Cookie = Cookie[:i]
@@ -233,7 +244,7 @@ func (i *api) Get_live(qn ...string) (o *api) {
                })
                if e := r.S(`"durl":[`, `]`, 0, 0).Err;e == nil {
                        if urls := p.Json().GetArrayFrom("[" + r.RS[0] + "]", "url");urls != nil {
-                               apilog.L(`W: `,"直播中")
+                               apilog.L(`I: `,"直播中")
                                c.Liveing = true
                                o.Live_status = 1
                                for _,v := range urls {
@@ -283,15 +294,15 @@ func (i *api) Get_live(qn ...string) (o *api) {
                        switch live_status.(float64) {
                        case 2:
                                c.Liveing = false
-                               apilog.L(`W: `,"轮播中")
+                               apilog.L(`I: `,"轮播中")
                                return
                        case 0: //未直播
                                c.Liveing = false
-                               apilog.L(`W: `,"未在直播")
+                               apilog.L(`I: `,"未在直播")
                                return
                        case 1:
                                c.Liveing = true
-                               apilog.L(`W: `,"直播中")
+                               apilog.L(`I: `,"直播中")
                        default:
                                apilog.L(`W: `,"live_status:", live_status)
                        }
@@ -371,7 +382,7 @@ func (i *api) Get_live(qn ...string) (o *api) {
        }
 
        if v,ok := c.Default_qn[cu_qn];ok {
-               apilog.L(`W: `,"当前清晰度:", v)
+               apilog.L(`I: `,"当前清晰度:", v)
        }
        return
 }
@@ -386,14 +397,19 @@ func (i *api) Get_host_Token() (o *api) {
        }
        Roomid := strconv.Itoa(o.Roomid)
        if api_limit.TO() {return}//超额请求阻塞,超时将取消
-
+       
+       Cookie := make(map[string]string)
+       c.Cookie.Range(func(k,v interface{})(bool){
+               Cookie[k.(string)] = v.(string)
+               return true
+       })
 
        req := p.Req()
        if err := req.Reqf(p.Rval{
                Url:"https://api.live.bilibili.com/xlive/web-room/v1/index/getDanmuInfo?type=0&id=" + Roomid,
                Header:map[string]string{
                        `Referer`:"https://live.bilibili.com/" + Roomid,
-                       `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                       `Cookie`:p.Map_2_Cookies_String(Cookie),
                },
                Timeout:10,
                Retry:2,
@@ -436,13 +452,19 @@ func Get_face_src(uid string) (string) {
        if uid == "" {return ""}
        if api_limit.TO() {return ""}//超额请求阻塞,超时将取消
        apilog := apilog.Base_add(`获取头像`)
+       
+       Cookie := make(map[string]string)
+       c.Cookie.Range(func(k,v interface{})(bool){
+               Cookie[k.(string)] = v.(string)
+               return true
+       })
 
        req := p.Req()
        if err := req.Reqf(p.Rval{
                Url:"https://api.live.bilibili.com/xlive/web-room/v1/index/getDanmuMedalAnchorInfo?ruid=" + uid,
                Header:map[string]string{
                        `Referer`:"https://live.bilibili.com/" + strconv.Itoa(c.Roomid),
-                       `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                       `Cookie`:p.Map_2_Cookies_String(Cookie),
                },
                Timeout:10,
                Retry:2,
@@ -476,6 +498,12 @@ func (i *api) Get_OnlineGoldRank() {
        var self_loop func(page int)
        self_loop = func(page int){
                if page <= 0 || session_roomid != c.Roomid{return}
+               
+               Cookie := make(map[string]string)
+               c.Cookie.Range(func(k,v interface{})(bool){
+                       Cookie[k.(string)] = v.(string)
+                       return true
+               })
 
                req := p.Req()
                if err := req.Reqf(p.Rval{
@@ -491,7 +519,7 @@ func (i *api) Get_OnlineGoldRank() {
                                `Pragma`: `no-cache`,
                                `Cache-Control`: `no-cache`,
                                `Referer`:"https://live.bilibili.com/" + strconv.Itoa(c.Roomid),
-                               `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                               `Cookie`:p.Map_2_Cookies_String(Cookie),
                        },
                        Timeout:3,
                        Retry:2,
@@ -554,6 +582,12 @@ func (i *api) Get_HotRank() {
        if api_limit.TO() {return}//超额请求阻塞,超时将取消
        apilog := apilog.Base_add(`获取热门榜`)
 
+       Cookie := make(map[string]string)
+       c.Cookie.Range(func(k,v interface{})(bool){
+               Cookie[k.(string)] = v.(string)
+               return true
+       })
+
        req := p.Req()
        if err := req.Reqf(p.Rval{
                Url:`https://api.live.bilibili.com/xlive/general-interface/v1/rank/getHotRank?ruid=`+strconv.Itoa(i.Uid)+`&room_id=`+strconv.Itoa(c.Roomid)+`&is_pre=0&page_size=50&source=2&area_id=`+strconv.Itoa(i.Parent_area_id),
@@ -568,7 +602,7 @@ func (i *api) Get_HotRank() {
                        `Pragma`: `no-cache`,
                        `Cache-Control`: `no-cache`,
                        `Referer`:"https://live.bilibili.com/" + strconv.Itoa(c.Roomid),
-                       `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                       `Cookie`:p.Map_2_Cookies_String(Cookie),
                },
                Timeout:3,
                Retry:2,
@@ -611,6 +645,12 @@ func (i *api) Get_guardNum() {
        if api_limit.TO() {return}//超额请求阻塞,超时将取消
        apilog := apilog.Base_add(`获取舰长数`)
 
+       Cookie := make(map[string]string)
+       c.Cookie.Range(func(k,v interface{})(bool){
+               Cookie[k.(string)] = v.(string)
+               return true
+       })
+
        req := p.Req()
        if err := req.Reqf(p.Rval{
                Url:`https://api.live.bilibili.com/xlive/app-room/v2/guardTab/topList?roomid=`+strconv.Itoa(c.Roomid)+`&page=1&ruid=`+strconv.Itoa(i.Uid)+`&page_size=29`,
@@ -625,7 +665,7 @@ func (i *api) Get_guardNum() {
                        `Pragma`: `no-cache`,
                        `Cache-Control`: `no-cache`,
                        `Referer`:"https://live.bilibili.com/" + strconv.Itoa(c.Roomid),
-                       `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                       `Cookie`:p.Map_2_Cookies_String(Cookie),
                },
                Timeout:3,
                Retry:2,
@@ -643,7 +683,7 @@ func (i *api) Get_guardNum() {
                return
        } else {
                c.GuardNum = int(num.(float64))
-               apilog.L(`W: `,"舰长数获取成功", c.GuardNum)
+               apilog.L(`I: `,"舰长数获取成功", c.GuardNum)
        }
        return
 }
@@ -701,7 +741,7 @@ func (i *api) Get_Version() {
                        return
                }
                c.VERSION = r.RS[0]
-               apilog.L(`W: `,"api version", c.VERSION)
+               apilog.L(`I: `,"api version", c.VERSION)
        }
 }
 
@@ -790,6 +830,12 @@ func Get_cookie() {
                        },
                })
 
+               Cookie := make(map[string]string)
+               c.Cookie.Range(func(k,v interface{})(bool){
+                       Cookie[k.(string)] = v.(string)
+                       return true
+               })
+
                for max_try > 0 && !change_room_sign {
                        max_try -= 1
                        p.Sys().Timeoutf(3)
@@ -800,7 +846,7 @@ func Get_cookie() {
                                Header:map[string]string{
                                        `Content-Type`:`application/x-www-form-urlencoded; charset=UTF-8`,
                                        `Referer`: `https://passport.bilibili.com/login`,
-                                       `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                                       `Cookie`:p.Map_2_Cookies_String(Cookie),
                                },
                                Timeout:10,
                                Retry:2,        
@@ -838,7 +884,7 @@ func Get_cookie() {
        }
        {//写入cookie.txt
                for k,v := range p.Cookies_String_2_Map(cookie){
-                       c.Cookie[k] = v
+                       c.Cookie.Store(k, v)
                }
                f := p.File()
                f.FileWR(p.Filel{
@@ -859,17 +905,21 @@ func Get_cookie() {
        }
 }
 
-func (i *api) Switch_FansMedal() {
-       if len(c.Cookie) == 0 {return}
+func (i *api) CheckSwitch_FansMedal() {
+       if c.Cookie.Len() == 0 {return}
        if api_limit.TO() {return}//超额请求阻塞,超时将取消
        apilog := apilog.Base_add(`切换粉丝牌`)
-       Cookie := p.Map_2_Cookies_String(c.Cookie)
-       {//验证是否本直播间牌子
+       Cookie := make(map[string]string)
+       c.Cookie.Range(func(k,v interface{})(bool){
+               Cookie[k.(string)] = v.(string)
+               return true
+       })
+       {//获取当前牌子,验证是否本直播间牌子
                r := p.Req()
                if e := r.Reqf(p.Rval{
                        Url:`https://api.live.bilibili.com/live_user/v1/UserInfo/get_weared_medal`,
                        Header:map[string]string{
-                               `Cookie`:Cookie,
+                               `Cookie`:p.Map_2_Cookies_String(Cookie),
                        },
                        Timeout:10,
                        Retry:2,
@@ -877,8 +927,23 @@ func (i *api) Switch_FansMedal() {
                        apilog.L(`E: `,e)
                        return
                }
-               res := string(r.Respon)
-               if v,ok := p.Json().GetValFromS(res, "data.roominfo.room_id").(float64);ok && int(v) == c.Roomid {
+               var res struct{
+                       Code int `json:"code"`
+                       Msg     string `json:"msg"`
+                       Message string `json:"message"`
+                       Data struct{
+                               Roominfo struct{
+                                       Room_id int `json:"room_id"`
+                               } `json:"roominfo"`
+                       } `json:"data"`
+               }
+               if e := json.Unmarshal(r.Respon, &res);e != nil && res.Msg == ``{//未佩戴时的data是array型会导致错误
+                       apilog.L(`E: `,e)
+                       return
+               }
+               
+               c.Wearing_FansMedal = res.Data.Roominfo.Room_id//更新佩戴信息
+               if res.Data.Roominfo.Room_id == c.Roomid {
                        return
                }
        }
@@ -888,7 +953,7 @@ func (i *api) Switch_FansMedal() {
                if e := r.Reqf(p.Rval{
                        Url:`https://api.live.bilibili.com/fans_medal/v1/FansMedal/get_list_in_room`,
                        Header:map[string]string{
-                               `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                               `Cookie`:p.Map_2_Cookies_String(Cookie),
                        },
                        Timeout:10,
                        Retry:2,
@@ -920,18 +985,24 @@ func (i *api) Switch_FansMedal() {
                                return
                        }
                }
+
+               if medal_id == 0 {//无牌
+                       if c.Wearing_FansMedal == 0 {//当前没牌
+                               apilog.L(`I: `,`当前无粉丝牌,不切换`)
+                               return
+                       }
+               }
        }
        var (
                post_url string
                post_str string
        )
        {//生成佩戴信息
-               csrf := c.Cookie[`bili_jct`]
+               csrf := c.Cookie.LoadV(`bili_jct`).(string)
                if csrf == `` {apilog.L(`E: `,"Cookie错误,无bili_jct=");return}
                
                post_str = `csrf_token=`+csrf+`&csrf=`+csrf
                
-               i.wearing_FansMedal = medal_id != 0
                if medal_id == 0 {//无牌,不佩戴牌子
                        post_url = `https://api.live.bilibili.com/xlive/web-room/v1/fansMedal/take_off`
                } else {
@@ -945,7 +1016,7 @@ func (i *api) Switch_FansMedal() {
                        Url:post_url,
                        PostStr:post_str,
                        Header:map[string]string{
-                               `Cookie`:Cookie,
+                               `Cookie`:p.Map_2_Cookies_String(Cookie),
                                `Content-Type`:`application/x-www-form-urlencoded; charset=UTF-8`,
                                `Referer`: `https://passport.bilibili.com/login`,
                        },
@@ -957,7 +1028,8 @@ func (i *api) Switch_FansMedal() {
                }
                res := string(r.Respon)
                if v,ok := p.Json().GetValFromS(res, "code").(float64);ok && v == 0 {
-                       apilog.L(`W: `,`自动切换粉丝牌`)
+                       apilog.L(`I: `,`自动切换粉丝牌`)
+                       c.Wearing_FansMedal = medal_id//更新佩戴信息
                        return
                }
                if v,ok := p.Json().GetValFromS(res, "message").(string);ok {
@@ -971,10 +1043,16 @@ func (i *api) Switch_FansMedal() {
 //签到
 func Dosign() {
        apilog := apilog.Base_add(`签到`).L(`T: `,`签到`)
-       if len(c.Cookie) == 0 {apilog.L(`E: `,`失败!无cookie`);return}
+       if c.Cookie.Len() == 0 {apilog.L(`E: `,`失败!无cookie`);return}
        if api_limit.TO() {return}//超额请求阻塞,超时将取消
 
        {//检查是否签到
+               Cookie := make(map[string]string)
+               c.Cookie.Range(func(k,v interface{})(bool){
+                       Cookie[k.(string)] = v.(string)
+                       return true
+               })
+
                req := p.Req()
                if err := req.Reqf(p.Rval{
                        Url:`https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/WebGetSignInfo`,
@@ -989,7 +1067,7 @@ func Dosign() {
                                `Pragma`: `no-cache`,
                                `Cache-Control`: `no-cache`,
                                `Referer`:"https://live.bilibili.com/all",
-                               `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                               `Cookie`:p.Map_2_Cookies_String(Cookie),
                        },
                        Timeout:3,
                        Retry:2,
@@ -1015,6 +1093,12 @@ func Dosign() {
        }
 
        {//签到
+               Cookie := make(map[string]string)
+               c.Cookie.Range(func(k,v interface{})(bool){
+                       Cookie[k.(string)] = v.(string)
+                       return true
+               })
+
                req := p.Req()
                if err := req.Reqf(p.Rval{
                        Url:`https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/DoSign`,
@@ -1029,7 +1113,7 @@ func Dosign() {
                                `Pragma`: `no-cache`,
                                `Cache-Control`: `no-cache`,
                                `Referer`:"https://live.bilibili.com/all",
-                               `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                               `Cookie`:p.Map_2_Cookies_String(Cookie),
                        },
                        Timeout:3,
                        Retry:2,
@@ -1057,8 +1141,8 @@ func Dosign() {
 func (i *api) Get_LIVE_BUVID() (o *api){
        o = i
        apilog := apilog.Base_add(`LIVE_BUVID`).L(`T: `,`获取LIVE_BUVID`)
-       if c.Cookie[`LIVE_BUVID`] != `` {apilog.L(`I: `,`存在`);return}
-       if len(c.Cookie) == 0 {apilog.L(`E: `,`失败!无cookie`);return}
+       if c.Cookie.LoadV(`LIVE_BUVID`).(string) != `` {apilog.L(`I: `,`存在`);return}
+       if c.Cookie.Len() == 0 {apilog.L(`E: `,`失败!无cookie`);return}
        if api_limit.TO() {apilog.L(`E: `,`超时!`);return}//超额请求阻塞,超时将取消
 
        for {//获取
@@ -1086,7 +1170,7 @@ func (i *api) Get_LIVE_BUVID() (o *api){
                //cookie
                var has bool
                for k,v := range p.Cookies_List_2_Map(req.Response.Cookies()){
-                       c.Cookie[k] = v
+                       c.Cookie.Store(k, v)
                        if k == `LIVE_BUVID` {has = true}
                }
                if has {
@@ -1098,11 +1182,17 @@ func (i *api) Get_LIVE_BUVID() (o *api){
                }
        }
 
+       Cookie := make(map[string]string)
+       c.Cookie.Range(func(k,v interface{})(bool){
+               Cookie[k.(string)] = v.(string)
+               return true
+       })
+
        f := p.File()
        f.FileWR(p.Filel{
                File: `cookie.txt`,
                Write: true,
-               Context: []interface{}{p.Map_2_Cookies_String(c.Cookie)},
+               Context: []interface{}{p.Map_2_Cookies_String(Cookie)},
        })
        return
 }
@@ -1124,9 +1214,9 @@ type E_json struct{
 func (i *api) F_x25Kn() (o *api) {
        o = i
        apilog := apilog.Base_add(`小心心`).L(`T: `,`获取小心心`)
-       if o.wearing_FansMedal {apilog.L(`I: `,`无粉丝牌,不获取`);return}
-       if len(c.Cookie) == 0 {apilog.L(`E: `,`失败!无cookie`);return}
-       if c.Cookie[`LIVE_BUVID`] == `` {apilog.L(`E: `,`失败!无LIVE_BUVID`);return}
+       if c.Wearing_FansMedal == 0{apilog.L(`I: `,`无粉丝牌,不获取`);return}
+       if c.Cookie.Len() == 0 {apilog.L(`E: `,`失败!无cookie`);return}
+       if c.Cookie.LoadV(`LIVE_BUVID`).(string) == `` {apilog.L(`E: `,`失败!无LIVE_BUVID`);return}
        if o.Parent_area_id == -1 {apilog.L(`E: `,`失败!未获取Parent_area_id`);return}
        if o.Area_id == -1 {apilog.L(`E: `,`失败!未获取Area_id`);return}
        if api_limit.TO() {apilog.L(`E: `,`超时!`);return}//超额请求阻塞,超时将取消
@@ -1152,10 +1242,10 @@ func (i *api) F_x25Kn() (o *api) {
                loop_num = 0
        )
 
-       csrf := c.Cookie[`bili_jct`]
+       csrf := c.Cookie.LoadV(`bili_jct`).(string)
        if csrf == `` {apilog.L(`E: `,"Cookie错误,无bili_jct");return}
 
-       LIVE_BUVID := c.Cookie[`LIVE_BUVID`]
+       LIVE_BUVID := c.Cookie.LoadV(`LIVE_BUVID`).(string)
        if LIVE_BUVID == `` {apilog.L(`E: `,"Cookie错误,无LIVE_BUVID");return}
 
        var new_uuid string
@@ -1184,6 +1274,12 @@ func (i *api) F_x25Kn() (o *api) {
                PostStr += `csrf_token=`+csrf+`&csrf=`+csrf+`&`
                PostStr += `visit_id=`
 
+               Cookie := make(map[string]string)
+               c.Cookie.Range(func(k,v interface{})(bool){
+                       Cookie[k.(string)] = v.(string)
+                       return true
+               })
+
                req := p.Req()
                if err := req.Reqf(p.Rval{
                        Url:`https://live-trace.bilibili.com/xlive/data-interface/v1/x25Kn/E`,
@@ -1199,7 +1295,7 @@ func (i *api) F_x25Kn() (o *api) {
                                `Pragma`: `no-cache`,
                                `Cache-Control`: `no-cache`,
                                `Referer`:"https://live.bilibili.com/"+strconv.Itoa(o.Roomid),
-                               `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                               `Cookie`:p.Map_2_Cookies_String(Cookie),
                        },
                        PostStr:url.PathEscape(PostStr),
                        Timeout:3,
@@ -1278,7 +1374,13 @@ func (i *api) F_x25Kn() (o *api) {
                        } else {
                                PostStr = `s=`+wasm+`&`+PostStr
                        }
-                       
+
+                       Cookie := make(map[string]string)
+                       c.Cookie.Range(func(k,v interface{})(bool){
+                               Cookie[k.(string)] = v.(string)
+                               return true
+                       })
+
                        req := p.Req()
                        if err := req.Reqf(p.Rval{
                                Url:`https://live-trace.bilibili.com/xlive/data-interface/v1/x25Kn/X`,
@@ -1294,7 +1396,7 @@ func (i *api) F_x25Kn() (o *api) {
                                        `Pragma`: `no-cache`,
                                        `Cache-Control`: `no-cache`,
                                        `Referer`:"https://live.bilibili.com/"+strconv.Itoa(o.Roomid),
-                                       `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                                       `Cookie`:p.Map_2_Cookies_String(Cookie),
                                },
                                PostStr:url.PathEscape(PostStr),
                                Timeout:3,
@@ -1337,10 +1439,16 @@ type Gift_list_type_Data_List struct{
 
 func Gift_list() (list []Gift_list_type_Data_List) {
        apilog := apilog.Base_add(`礼物列表`).L(`T: `,`获取礼物列表`)
-       if len(c.Cookie) == 0 {apilog.L(`E: `,`失败!无cookie`);return}
+       if c.Cookie.Len() == 0 {apilog.L(`E: `,`失败!无cookie`);return}
        if c.Roomid == 0 {apilog.L(`E: `,`失败!无Roomid`);return}
        if api_limit.TO() {apilog.L(`E: `,`超时!`);return}//超额请求阻塞,超时将取消
 
+       Cookie := make(map[string]string)
+       c.Cookie.Range(func(k,v interface{})(bool){
+               Cookie[k.(string)] = v.(string)
+               return true
+       })
+
        req := p.Req()
        if err := req.Reqf(p.Rval{
                Url:`https://api.live.bilibili.com/xlive/web-room/v1/gift/bag_list?t=`+strconv.Itoa(int(p.Sys().GetMTime()))+`&room_id=`+strconv.Itoa(c.Roomid),
@@ -1355,7 +1463,7 @@ func Gift_list() (list []Gift_list_type_Data_List) {
                        `Pragma`: `no-cache`,
                        `Cache-Control`: `no-cache`,
                        `Referer`:"https://live.bilibili.com/"+strconv.Itoa(c.Roomid),
-                       `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                       `Cookie`:p.Map_2_Cookies_String(Cookie),
                },
                Timeout:3,
                Retry:2,
@@ -1383,11 +1491,17 @@ func Gift_list() (list []Gift_list_type_Data_List) {
 //银瓜子2硬币
 func Silver_2_coin() {
        apilog := apilog.Base_add(`银瓜子=>硬币`).L(`T: `,`银瓜子=>硬币`)
-       if len(c.Cookie) == 0 {apilog.L(`E: `,`失败!无cookie`);return}
+       if c.Cookie.Len() == 0 {apilog.L(`E: `,`失败!无cookie`);return}
        if api_limit.TO() {apilog.L(`E: `,`超时!`);return}//超额请求阻塞,超时将取消
 
        var Silver int
        {//验证是否还有机会
+               Cookie := make(map[string]string)
+               c.Cookie.Range(func(k,v interface{})(bool){
+                       Cookie[k.(string)] = v.(string)
+                       return true
+               })
+
                req := p.Req()
                if err := req.Reqf(p.Rval{
                        Url:`https://api.live.bilibili.com/pay/v1/Exchange/getStatus`,
@@ -1402,7 +1516,7 @@ func Silver_2_coin() {
                                `Pragma`: `no-cache`,
                                `Cache-Control`: `no-cache`,
                                `Referer`:`https://link.bilibili.com/p/center/index`,
-                               `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                               `Cookie`:p.Map_2_Cookies_String(Cookie),
                        },
                        Timeout:3,
                        Retry:2,
@@ -1441,6 +1555,12 @@ func Silver_2_coin() {
        }
 
        {//获取交换规则,验证数量足够
+               Cookie := make(map[string]string)
+               c.Cookie.Range(func(k,v interface{})(bool){
+                       Cookie[k.(string)] = v.(string)
+                       return true
+               })
+
                req := p.Req()
                if err := req.Reqf(p.Rval{
                        Url:`https://api.live.bilibili.com/pay/v1/Exchange/getRule`,
@@ -1455,7 +1575,7 @@ func Silver_2_coin() {
                                `Pragma`: `no-cache`,
                                `Cache-Control`: `no-cache`,
                                `Referer`:`https://link.bilibili.com/p/center/index`,
-                               `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                               `Cookie`:p.Map_2_Cookies_String(Cookie),
                        },
                        Timeout:3,
                        Retry:2,
@@ -1484,16 +1604,23 @@ func Silver_2_coin() {
                }
 
                if Silver < res.Data.Silver_2_coin_price{
-                       apilog.L(`E: `, `当前银瓜子数量不足`)
+                       apilog.L(`W: `, `当前银瓜子数量不足`)
                        return
                }
        }
        
        {//交换
-               csrf := c.Cookie[`bili_jct`]
+               csrf := c.Cookie.LoadV(`bili_jct`).(string)
                if csrf == `` {apilog.L(`E: `,"Cookie错误,无bili_jct=");return}
                
                post_str := `csrf_token=`+csrf+`&csrf=`+csrf
+
+               Cookie := make(map[string]string)
+               c.Cookie.Range(func(k,v interface{})(bool){
+                       Cookie[k.(string)] = v.(string)
+                       return true
+               })
+
                req := p.Req()
                if err := req.Reqf(p.Rval{
                        Url:`https://api.live.bilibili.com/pay/v1/Exchange/silver2coin`,
@@ -1510,7 +1637,7 @@ func Silver_2_coin() {
                                `Cache-Control`: `no-cache`,
                                `Content-Type`: `application/x-www-form-urlencoded`,
                                `Referer`:`https://link.bilibili.com/p/center/index`,
-                               `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                               `Cookie`:p.Map_2_Cookies_String(Cookie),
                        },
                        Timeout:3,
                        Retry:2,
@@ -1542,12 +1669,19 @@ func Silver_2_coin() {
 
 func save_cookie(Cookies []*http.Cookie){
        for k,v := range p.Cookies_List_2_Map(Cookies){
-               c.Cookie[k] = v
+               c.Cookie.Store(k, v)
        }
        f := p.File()
+
+       Cookie := make(map[string]string)
+       c.Cookie.Range(func(k,v interface{})(bool){
+               Cookie[k.(string)] = v.(string)
+               return true
+       })
+
        f.FileWR(p.Filel{
                File: `cookie.txt`,
                Write: true,
-               Context: []interface{}{p.Map_2_Cookies_String(c.Cookie)},
+               Context: []interface{}{p.Map_2_Cookies_String(Cookie)},
        })
 }
\ No newline at end of file
index 3864150beef637ab46367053a4413e4dff2c49c9..ee4db4365273e5bbb65e6e94ceee7080244acb31 100644 (file)
@@ -246,7 +246,13 @@ func Saveflvf(){
                        os.Rename(saveflv.path+".flv.dtmp", saveflv.path+".flv")
                }()
 
-               Cookie := p.Map_2_Cookies_String(c.Cookie)
+
+               CookieM := make(map[string]string)
+               c.Cookie.Range(func(k,v interface{})(bool){
+                       CookieM[k.(string)] = v.(string)
+                       return true
+               })
+               Cookie := p.Map_2_Cookies_String(CookieM)
                if i := strings.Index(Cookie, "PVID="); i != -1 {
                        if d := strings.Index(Cookie[i:], ";"); d == -1 {
                                Cookie = Cookie[:i]
@@ -748,7 +754,15 @@ func Save_to_json(Loc int,Context []interface{}) {
 
 //进入房间发送弹幕
 func Entry_danmu(){
-       if s,ok := c.K_v.LoadV(`进入房间发送弹幕`).(string);ok && s != ``{
-               send.Danmu_s(s,p.Map_2_Cookies_String(c.Cookie),c.Roomid)
+       if v,_ := c.K_v.LoadV(`进房弹幕_有粉丝牌时才发`).(bool);v && c.Wearing_FansMedal == 0{
+               return
+       }
+       if s,ok := c.K_v.LoadV(`进房弹幕_内容`).(string);ok && s != ``{
+               Cookie := make(map[string]string)
+               c.Cookie.Range(func(k,v interface{})(bool){
+                       Cookie[k.(string)] = v.(string)
+                       return true
+               })
+               send.Danmu_s(s,p.Map_2_Cookies_String(Cookie),c.Roomid)
        }
 }
\ No newline at end of file
index d95d6c3286e752b4886d406b0551bccd8294f2d6..bb525368baf38e21f8e7dd9784864b3aab1610ca 100644 (file)
@@ -682,11 +682,16 @@ func (replyF) danmu(s string) {
 //传入字符串即可发送
 //需要cookie
 func Msg_senddanmu(msg string){
-       if len(c.Cookie) == 0 || c.Roomid == 0 {
+       if c.Cookie.Len() == 0 || c.Roomid == 0 {
                msglog.L(`I: `, `c.Cookie == "" || c.Roomid == 0`)
                return
        }
-       send.Danmu_s(msg, p.Map_2_Cookies_String(c.Cookie), c.Roomid)
+       Cookie := make(map[string]string)
+       c.Cookie.Range(func(k,v interface{})(bool){
+               Cookie[k.(string)] = v.(string)
+               return true
+       })
+       send.Danmu_s(msg, p.Map_2_Cookies_String(Cookie), c.Roomid)
 }
 
 //弹幕显示
index 60fbbfcc39260b713ee01668cc3f3349a1337939..85c44bcb337af36c3b6b9f09a3757d4bcc2a43ef 100644 (file)
@@ -75,7 +75,7 @@ func init(){
 
 func TTS(uid,msg string) {
        if tts_limit.TO() {return}
-       tts_log.L(`I: `,uid, msg)
+       tts_log.L(`I: `,uid, strings.ReplaceAll(msg, "\n", " "))
        req := p.Req()
        if v,ok := tts_setting[uid];ok{
                msg = strings.ReplaceAll(v, "{D}", msg)
index 16931131f4442467a63760c7fc6a5b84bb3ea12a..65b0352377d9734403c9110d48a47cddd198bd13 100644 (file)
@@ -35,7 +35,7 @@ func Danmu_s(msg,Cookie string, roomid int) {
                }
        }
 
-       csrf := c.Cookie[`bili_jct`]
+       csrf := c.Cookie.LoadV(`bili_jct`).(string)
        if csrf == `` {l.L(`E: `,"Cookie错误,无bili_jct=");return}
 
        PostStr := `color=16777215&fontsize=25&mode=1&msg=` + msg + `&rnd=` + strconv.Itoa(int(p.Sys().GetSTime())) + `&roomid=` + strconv.Itoa(roomid) + `&bubble=0&csrf_token=` + csrf + `&csrf=` + csrf
index 190c81fd495f6355b1b3a0ca83d1136387074622..15af2a0b90328ae26d916ff42293157920952373 100644 (file)
@@ -33,7 +33,7 @@ func Send_pm(uid int, msg string) error {
                return errors.New(`不能发送给自己`)
        }
 
-       csrf := c.Cookie[`bili_jct`]
+       csrf := c.Cookie.LoadV(`bili_jct`).(string)
        if csrf == `` {return errors.New("Cookie错误,无bili_jct=")}
 
        var new_uuid string
@@ -50,6 +50,12 @@ func Send_pm(uid int, msg string) error {
 
        var send_str = `msg[sender_uid]=`+strconv.Itoa(c.Uid)+`&msg[receiver_id]=`+strconv.Itoa(uid)+`&msg[receiver_type]=1&msg[msg_type]=1&msg[msg_status]=0&msg[content]={"content":"`+msg+`"}&msg[timestamp]=`+strconv.Itoa(int(p.Sys().GetSTime()))+`&msg[new_face_version]=0&msg[dev_id]=`+strings.ToUpper(new_uuid)+`&from_firework=0&build=0&mobi_app=web&csrf_token=`+csrf+`&csrf=`+csrf
        
+       Cookie := make(map[string]string)
+       c.Cookie.Range(func(k,v interface{})(bool){
+               Cookie[k.(string)] = v.(string)
+               return true
+       })
+       
        req := p.Req()
        if e:= req.Reqf(p.Rval{
                Url:`https://api.vc.bilibili.com/web_im/v1/web_im/send_msg`,
@@ -67,7 +73,7 @@ func Send_pm(uid int, msg string) error {
                        `Pragma`: `no-cache`,
                        `Cache-Control`: `no-cache`,
                        `Referer`:"https://message.bilibili.com",
-                       `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                       `Cookie`:p.Map_2_Cookies_String(Cookie),
                },
        });e != nil {
                log.L(`E: `,e)
index e7168a8316576c43fc06b6e04ed843a76c58728a..f6e5455fe67bef55df8e35dda0d5b5e486ca48b8 100644 (file)
@@ -123,7 +123,7 @@ func Demo(roomid ...int) {
                                        danmulog.L(`I: `, "未检测到cookie.txt,如果需要登录请在本机打开以下网址扫码登录,不需要请忽略")
                                        //获取cookie
                                        F.Get_cookie()
-                                       if len(c.Cookie) != 0 {
+                                       if c.Cookie.Len() != 0 {
                                                danmulog.L(`I: `,"你已登录,刷新房间!")
                                                //刷新
                                                c.Danmu_Main_mq.Push_tag(`change_room`,nil)
@@ -133,7 +133,7 @@ func Demo(roomid ...int) {
                                        q.File = "cookie.txt"
                                        f := p.File().FileWR(q)
                                        for k,v := range p.Cookies_String_2_Map(f){
-                                               c.Cookie[k] = v
+                                               c.Cookie.Store(k, v)
                                        }
                                        if tmp_uid,e := g.SS(f,`DedeUserID=`,`;`,0,0);e == nil {
                                                if v,e := strconv.Atoi(tmp_uid);e == nil {
@@ -164,16 +164,22 @@ func Demo(roomid ...int) {
                        api.Get_Version()
                        //获取热门榜
                        api.Get_HotRank()
+                       //检查与切换粉丝牌,只在cookie存在时启用
+                       api.CheckSwitch_FansMedal()
                        //小心心
                        go api.F_x25Kn()
-                       //切换粉丝牌,只在cookie存在时启用
-                       api.Switch_FansMedal()
                        if len(api.Url) == 0 || api.Roomid == 0 || api.Token == "" || api.Uid == 0 || api.Locked {
                                danmulog.L(`E: `,"some err")
                                return
                        }
                        danmulog.L(`I: `,"连接到房间", c.Roomid)
 
+                       Cookie := make(map[string]string)
+                       c.Cookie.Range(func(k,v interface{})(bool){
+                               Cookie[k.(string)] = v.(string)
+                               return true
+                       })
+
                        //对每个弹幕服务器尝试
                        for _, v := range api.Url {
                                //ws启动
@@ -184,7 +190,7 @@ func Demo(roomid ...int) {
                                        Func_abort_close:func(){danmulog.L(`I: `,`服务器连接中断`)},
                                        Func_normal_close:func(){danmulog.L(`I: `,`服务器连接关闭`)},
                                        Header: map[string]string{
-                                               `Cookie`:p.Map_2_Cookies_String(c.Cookie),
+                                               `Cookie`:p.Map_2_Cookies_String(Cookie),
                                                `Host`: u.Hostname(),
                                                `User-Agent`: `Mozilla/5.0 (X11; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0`,
                                                `Accept`: `*/*`,
@@ -251,7 +257,7 @@ func Demo(roomid ...int) {
                                                        },
                                                })
 
-                                               if len(c.Cookie) != 0 {//附加功能 弹幕机 无cookie无法发送弹幕
+                                               if c.Cookie.Len() != 0 {//附加功能 弹幕机 无cookie无法发送弹幕
                                                        reply.Danmuji_auto(1)
                                                }
                                                {//附加功能 进房间发送弹幕 直播流保存 营收
index de93e4d4e39c354a01d6e4af6572f92ef0eb581a..a9ce995281ffee3cf21d4cc3754b3eb1c7da4fe3 100644 (file)
@@ -25,5 +25,7 @@
     "get_xiao_xinxin-help":"获取小心心",
     "get_xiao_xinxin":true,
 
-    "进入房间发送弹幕":" "
+    "进房弹幕-help":"进入房间发送弹幕",
+    "进房弹幕_内容":" ",
+    "进房弹幕_有粉丝牌时才发":true
 }
\ No newline at end of file
index dfea8c65da87eba4899e6dffda0dc8277c4a69cc..2b84bc2d5c56f4d9676da35f1e826d691ddccb84 100644 (file)
@@ -11,13 +11,13 @@ require (
        github.com/miekg/dns v1.1.38 // indirect
        github.com/mitchellh/mapstructure v1.4.1 // indirect
        github.com/qydysky/bili_danmu v0.5.7
-       github.com/qydysky/part v0.4.2 // indirect
+       github.com/qydysky/part v0.4.3 // indirect
        github.com/shirou/gopsutil v3.21.1+incompatible // indirect
        github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect
        github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect
        golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect
        golang.org/x/net v0.0.0-20210119194325-5f4716e94777 // indirect
-       golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c // indirect
+       golang.org/x/sys v0.0.0-20210217105451-b926d437f341 // indirect
 )
 
 replace (
index 0a5ae03727f62cac1f5b6009beff6913ee0ec1ed..6d58b37882d3e8a4c74b44329686885ef9108d7f 100644 (file)
@@ -143,6 +143,8 @@ github.com/qydysky/part v0.3.15 h1:dRdGUfMk3XMR88jE0xx54FoKwsz6e5Vh4gSFuY7oxpc=
 github.com/qydysky/part v0.3.15/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg=
 github.com/qydysky/part v0.4.2 h1:8guI/1YEwVsjTWuIPJ1euiSQbHYejWft4Tuhp8CVjAE=
 github.com/qydysky/part v0.4.2/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg=
+github.com/qydysky/part v0.4.3 h1:ckgSo+MefqrRgWdCjnHbJiS/Qy52VnzBj7YbFXPHNJU=
+github.com/qydysky/part v0.4.3/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=
@@ -241,6 +243,8 @@ golang.org/x/sys v0.0.0-20210113000019-eaf3bda374d2 h1:F9vNgpIiamoF+Q1/c78bikg/N
 golang.org/x/sys v0.0.0-20210113000019-eaf3bda374d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk=
 golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210217105451-b926d437f341 h1:2/QtM1mL37YmcsT8HaDNHDgTqqFVw+zr8UzMiBVLzYU=
+golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=