--- /dev/null
+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
|B_I.go|字节整数互转模块|
|F.go|websocket消息生成与检查模块|
|api.go|b站api获取模块|
+|CookieCrypo.go|cookie保存获取|
|xinxin.go|小心心加密模块(websocket<->js)
---
\ No newline at end of file
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))
}
//有新实例,退出
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`,
apilog.L(`I: `,`获取到LIVE_BUVID,保存cookie`)
break
} else {
- apilog.L(`I: `,`未获取到,重试`)
+ apilog.L(`I: `, roomid,`未获取到,重试`)
time.Sleep(time.Second)
}
}
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
}
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
#### 其他特性
+- [x] cookie加密
- [x] 弹幕自动重连(30s)
- [x] 直播流开播自动下载
- [x] 直播流断流再保存
### 说明
本项目使用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
+```
#### 小心心
在登录后,可以自动获取小心心
func Demo(roomid ...int) {
var danmulog = c.Log.Base(`bilidanmu Demo`)
-
+ defer danmulog.Block(1000)
+
//ctrl+c退出
interrupt := make(chan os.Signal, 1)
for !exit_sign {
//获取cookies
{
- var q = p.Filel{
- Write:false,
- }
var get_cookie = func(){
danmulog.L(`I: `, "未检测到cookie.txt,如果需要登录请在本机打开以下网址扫码登录,不需要请忽略")
//获取cookie
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为空`)
"自动弹幕机":false,
"自动弹幕机-help":"间隔最小5s,空字符串不会发送但仍会等待",
"自动弹幕机_内容":["hhh",""],
- "自动弹幕机_发送间隔s":30
+ "自动弹幕机_发送间隔s":30,
+
+ "cookie保护":"下填路径",
+ "cookie加密公钥":"public.pem",
+ "cookie解密私钥":"private.pem"
}
\ No newline at end of file
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
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=
--- /dev/null
+-----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-----
--- /dev/null
+-----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-----