From: qydysky Date: Thu, 4 Mar 2021 21:17:31 +0000 (+0800) Subject: cookie加密 X-Git-Tag: v0.5.8~1^2~26 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=86082565615a1f3dc08ad116ee6e7fde226a50ac;p=bili_danmu%2F.git cookie加密 --- diff --git a/F/CookieCrypo.go b/F/CookieCrypo.go new file mode 100644 index 0000000..1a6d314 --- /dev/null +++ b/F/CookieCrypo.go @@ -0,0 +1,96 @@ +package F + +import ( + "fmt" + c "github.com/qydysky/bili_danmu/CV" + p "github.com/qydysky/part" + crypto "github.com/qydysky/part/crypto" +) + + +//公私钥加密 +var ( + clog = c.Log.Base(`cookie加密`) + pub []byte + pri []byte +) + +func CookieGet() ([]byte) { + clog := clog.Base_add(`获取`) + if len(pri) == 0 { + if priS,ok := c.K_v.LoadV(`cookie解密私钥`).(string);ok && priS != ``{ + if d,e := crypto.FileLoad(priS);e != nil { + clog.L(`E: `,e) + return []byte{} + } else { + pri = d + } + } else if pubS,ok := c.K_v.LoadV(`cookie加密公钥`).(string);ok && pubS != ``{ + c.Log.Block(1000)//等待所有日志输出完毕 + priS := `` + fmt.Printf("cookie密钥路径: ") + _, err := fmt.Scanln(&priS) + if err != nil { + clog.L(`E: `, "输入错误", err) + return []byte{} + } + if d,e := crypto.FileLoad(priS);e != nil { + clog.L(`E: `,e) + return []byte{} + } else { + pri = d + } + } else { + if d,e := crypto.FileLoad(`cookie.txt`);e != nil || string(d[:3]) != `nol` { + clog.L(`E: `, e, `cookie保存格式:`, string(d[:3])) + return []byte{} + } else { + return d[3:] + } + } + } + if source,e := crypto.FileLoad(`cookie.txt`);e != nil || string(source[:3]) != `pem` { + clog.L(`E: `, e, `cookie保存格式:`, string(source[:3])) + return []byte{} + } else if s,e := crypto.Decrypt(source[3:],pri);e != nil{ + clog.L(`E: `,e) + return []byte{} + } else { + return s + } +} + +func CookieSet(source []byte) { + clog := clog.Base_add(`设置`) + if len(pub) == 0 { + if pubS,ok := c.K_v.LoadV(`cookie加密公钥`).(string);ok && pubS != ``{ + if d,e := crypto.FileLoad(pubS);e != nil { + clog.L(`E: `,e) + return + } else { + pub = d + } + } else { + f := p.File() + f.FileWR(p.Filel{ + File:`cookie.txt`, + Write:true, + Loc:0, + Context:[]interface{}{`nol`,source}, + }) + return + } + } + if source,e := crypto.Encrypt(source,pub);e != nil{ + clog.L(`E: `,e) + return + } else { + f := p.File() + f.FileWR(p.Filel{ + File:`cookie.txt`, + Write:true, + Loc:0, + Context:[]interface{}{`pem`,source}, + }) + } +} \ No newline at end of file diff --git a/F/README.md b/F/README.md index 03749be..438fe73 100644 --- a/F/README.md +++ b/F/README.md @@ -7,5 +7,6 @@ |B_I.go|字节整数互转模块| |F.go|websocket消息生成与检查模块| |api.go|b站api获取模块| +|CookieCrypo.go|cookie保存获取| |xinxin.go|小心心加密模块(websocket<->js) --- \ No newline at end of file diff --git a/F/api.go b/F/api.go index f77c4f9..e75fd7d 100644 --- a/F/api.go +++ b/F/api.go @@ -913,13 +913,8 @@ func Get_cookie() { t := []rune(cookieString) cookieString = string(t[:len(t)-2]) } - f := p.File() - f.FileWR(p.Filel{ - File:`cookie.txt`, - Write:true, - Loc:0, - Context:[]interface{}{cookieString}, - }) + + CookieSet([]byte(cookieString)) } //有新实例,退出 @@ -1274,7 +1269,7 @@ func (i *api) Get_LIVE_BUVID() (o *api){ for _,roomid := range roomIdList{//获取 req := p.Req() if err := req.Reqf(p.Rval{ - Url:`https://live.bilibili.com/`+roomid, + Url:`https://api.live.bilibili.com/live/getRoomKanBanModel?roomid=`+roomid, Header:map[string]string{ `Host`: `live.bilibili.com`, `User-Agent`: `Mozilla/5.0 (X11; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0`, @@ -1304,7 +1299,7 @@ func (i *api) Get_LIVE_BUVID() (o *api){ apilog.L(`I: `,`获取到LIVE_BUVID,保存cookie`) break } else { - apilog.L(`I: `,`未获取到,重试`) + apilog.L(`I: `, roomid,`未获取到,重试`) time.Sleep(time.Second) } } @@ -1314,13 +1309,9 @@ func (i *api) Get_LIVE_BUVID() (o *api){ Cookie[k.(string)] = v.(string) return true }) + + CookieSet([]byte(p.Map_2_Cookies_String(Cookie))) - f := p.File() - f.FileWR(p.Filel{ - File: `cookie.txt`, - Write: true, - Context: []interface{}{p.Map_2_Cookies_String(Cookie)}, - }) return } @@ -1822,17 +1813,11 @@ func save_cookie(Cookies []*http.Cookie){ for k,v := range p.Cookies_List_2_Map(Cookies){ 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(Cookie)}, - }) + CookieSet([]byte(p.Map_2_Cookies_String(Cookie))) } \ No newline at end of file diff --git a/README.md b/README.md index 0c4d289..e729d14 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ golang go version go1.15 linux/amd64 #### 其他特性 +- [x] cookie加密 - [x] 弹幕自动重连(30s) - [x] 直播流开播自动下载 - [x] 直播流断流再保存 @@ -94,6 +95,25 @@ golang go version go1.15 linux/amd64 ### 说明 本项目使用github action自动构建,构建过程详见[yml](https://github.com/qydysky/bili_danmu/blob/master/.github/workflows/go.yml) +#### cookie加密 +保护cooki.txt + +在`demo/config/config_K_v.json`中可找到配置项 +``` +"cookie加密公钥":"public.pem", +"cookie解密私钥":"private.pem" +``` +- 当配置了公钥路径后,cookie将被加密(若公钥无效,将会导致cookie无法储存)。若未配置私钥路径,则每次启动都会要求输入私钥路径。(若私钥无效,将会导致cookie被清除) +- 当未配置公钥路径(空字符串),cookie将明文储存。 +- 默认使用了`demo/`下的(public.pem)(private.pem)进行加密,使用时注意自行生成公私钥并按照上述说明使用 + +注意,每次更换设置(设置或未设置公钥),cookie会失效。 + +附:创建公(public.pem)私(private.pem)钥 +``` +openssl genrsa -out private.pem 2048 +openssl rsa -in private.pem -pubout -out public.pem +``` #### 小心心 在登录后,可以自动获取小心心 diff --git a/bili_danmu.go b/bili_danmu.go index 194447d..df0bfcb 100644 --- a/bili_danmu.go +++ b/bili_danmu.go @@ -33,7 +33,8 @@ func init() { func Demo(roomid ...int) { var danmulog = c.Log.Base(`bilidanmu Demo`) - + defer danmulog.Block(1000) + //ctrl+c退出 interrupt := make(chan os.Signal, 1) @@ -116,9 +117,6 @@ func Demo(roomid ...int) { for !exit_sign { //获取cookies { - var q = p.Filel{ - Write:false, - } var get_cookie = func(){ danmulog.L(`I: `, "未检测到cookie.txt,如果需要登录请在本机打开以下网址扫码登录,不需要请忽略") //获取cookie @@ -138,8 +136,8 @@ func Demo(roomid ...int) { go get_cookie() p.Sys().Timeoutf(3) } else { - q.File = "cookie.txt" - cookieString := p.File().FileWR(q) + + cookieString := string(F.CookieGet()) if cookieString == `` {//cookie.txt为空 danmulog.L(`T: `, `cookie.txt为空`) diff --git a/demo/config/config_K_v.json b/demo/config/config_K_v.json index e033b6c..c40db6b 100644 --- a/demo/config/config_K_v.json +++ b/demo/config/config_K_v.json @@ -52,5 +52,9 @@ "自动弹幕机":false, "自动弹幕机-help":"间隔最小5s,空字符串不会发送但仍会等待", "自动弹幕机_内容":["hhh",""], - "自动弹幕机_发送间隔s":30 + "自动弹幕机_发送间隔s":30, + + "cookie保护":"下填路径", + "cookie加密公钥":"public.pem", + "cookie解密私钥":"private.pem" } \ No newline at end of file diff --git a/demo/go.mod b/demo/go.mod index 12c74e1..b735f72 100644 --- a/demo/go.mod +++ b/demo/go.mod @@ -11,7 +11,7 @@ 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.7 // indirect + github.com/qydysky/part v0.4.11 // 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 diff --git a/demo/go.sum b/demo/go.sum index 9d67d20..f640a33 100644 --- a/demo/go.sum +++ b/demo/go.sum @@ -153,6 +153,12 @@ github.com/qydysky/part v0.4.6 h1:QC0iefkmv8RKYrQsZFyX1BWwK91DtjT0TWTM9RvyDdY= github.com/qydysky/part v0.4.6/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg= github.com/qydysky/part v0.4.7 h1:iKf3t5w7MBkoC7oOBkjJj1q0m/Mwe5e8a0FFFDQGW7s= github.com/qydysky/part v0.4.7/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg= +github.com/qydysky/part v0.4.9 h1:x+8UP7/Vf9jzBgrzIX4gF+VUtbtdEu2JpkBGF+HnfUs= +github.com/qydysky/part v0.4.9/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg= +github.com/qydysky/part v0.4.10 h1:ODg4HRBgX4Hz1D1euiLjPta3sLZuRehcp15HF7e/36s= +github.com/qydysky/part v0.4.10/go.mod h1:43opuciW71sZvOR67kye50jgMDSDrn/t6+LefNdlXPg= +github.com/qydysky/part v0.4.11 h1:oZRzXPThKm/ibeZPxWxQrzaxcPRUujEdTp5xHVWntZg= +github.com/qydysky/part v0.4.11/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= diff --git a/demo/private.pem b/demo/private.pem new file mode 100644 index 0000000..860625d --- /dev/null +++ b/demo/private.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAthnXhQH/5+JfT/imXP58C0ysFMMyxYpJrkDZVCaS9IKIe+DC +iVtTKvQHDpkLCivogMpxXyN8Dx4PD+0/ZObLICsCSMyPsq+59ly1H8CBuYauOlbJ +ihux6+qF38FX54lGulANN2bU8LzrxqY2CuWtZNeDZZ7XJOPqal9oQ6U/F57+gqgY +VJZf4Qu0pfmvQkjMa77u4a+EaMzaIPCj6Els/6y7W0BBE1FRexzgh+ypVq5NeKx2 +m5bLm405zOSWzlOGAjRMT3upV3rAi6AzpUdcDjIbFiKT/SpLzaYkbO6PX92Wu2t9 ++rhwB0ZurFrheh8RHy6j0/EZkrAfkw/gte5+vwIDAQABAoIBAQCdg1zYwBILEdQ/ +6GR+q+HAJGH006NnG2cAQze5gmQ6+23zOUcMaOJXlR1FkzvpYHGMdY/7K0Z0DRwa +Oq1LKhcpjAo9zjO97CJ+51IEVQ/g2o56B/fsbmhIGGQUV7khnayAHB5SfbBTTBbl +jX/RjTmesIwHqo2Oa1apDD2zxYv9cSQ86+62mDjseq/vwV3HPU9hp1HRv/O03ctQ +ym1ftabwsjOF3+MRHSMI99UrP8KM9VVoPDmkV30AGqVjhDypRVWfVv1REgxOwqXB +liZTkJgRETMwCZH7FFZpAd4Er/1Mix94HYB//aXc3J3Nw9i2TLy3YACP8t957GvL +T7ea/2qBAoGBANwqiJqQzRqak+SGPbIEh41yrHRPrb2da035wSRVf6sHPFK5vNpW +s+8VvgpWK5e3Q9Yxud8AvaFUntQhZMC8ibJ8ZYg2xIvmJvWoSLNfSgC/VQ0TVK3E +ayOscZsVEhxo+HHz2MXiJilUHe0faEGIvC/PtLWzOc0HA/7ETG3xpLlLAoGBANO9 +R4pTZewE2BKyMIxEfyzE8ipBADwK9XP0OD/e7m7rrk/0l2AoM6gFulH0GShl3XxG +Ery90I+LZQPqwFv4M3fhzcT/3MWTpzoR0gKT6/aBLvkNJsOXJ9kFtfxqgw98GHZ8 +TAPCKZ/QswsT1zX4lk/qHfxcvplwheEdr7WgavvdAoGAKpV/foXrZe3oFRdx73C4 +1z8K5CRVMou0KYzZMrHm06m+nTGXuZNzkhbefxlTrTChSlir3tpB02aOofEjj7Pn +3kH5UXNmaLjHaFR4W1le8u4PAUxv4HxRTMEZ6CkXK6+R/lhv4TZwsyW19BtTCvnr +jEPcbBiSYXmt6CUHs2w9tCkCgYBAVEZS8UmK7mHTNE3pn7nfmSpVyg/PLikqhG0+ +gnWAP5xi8FW5Qh2Hk83qrjWif2hOJF/29dhSdDBJg13T01GXv4OrsWyanmR1EQrz ++4r6Bn+F7Qf07oyNs915hcaxwqsP/G1/ytKomlh7Khj9bbwFJYTcsjS6G2ShY0qJ +7OX0BQKBgQDTmEJEZfUxKi866C3hPlml4uhKEvOLGDKPsEjy6t7Spz6paM6zr4By +xOmkXXhfOudhgzsOpIiKuzG+D/7q0MCoDIwrW1EiB3IiMS0aSeN3UTffDAhDnnMu +q+xXywYgDO4/tI4eckasLdEoIjYeM9lBK08EN1tSeEEAyLXDPcO6/A== +-----END RSA PRIVATE KEY----- diff --git a/demo/public.pem b/demo/public.pem new file mode 100644 index 0000000..a40171d --- /dev/null +++ b/demo/public.pem @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAthnXhQH/5+JfT/imXP58 +C0ysFMMyxYpJrkDZVCaS9IKIe+DCiVtTKvQHDpkLCivogMpxXyN8Dx4PD+0/ZObL +ICsCSMyPsq+59ly1H8CBuYauOlbJihux6+qF38FX54lGulANN2bU8LzrxqY2CuWt +ZNeDZZ7XJOPqal9oQ6U/F57+gqgYVJZf4Qu0pfmvQkjMa77u4a+EaMzaIPCj6Els +/6y7W0BBE1FRexzgh+ypVq5NeKx2m5bLm405zOSWzlOGAjRMT3upV3rAi6AzpUdc +DjIbFiKT/SpLzaYkbO6PX92Wu2t9+rhwB0ZurFrheh8RHy6j0/EZkrAfkw/gte5+ +vwIDAQAB +-----END PUBLIC KEY-----