├── .gitignore ├── LICENSE ├── conf ├── demo_app.conf ├── demo_config.yaml ├── demo_qbot.yaml └── demo_reply.php ├── controllers ├── account.go ├── base.go └── login.go ├── fix.sh ├── go.mod ├── go.sum ├── lastupdate.tmp ├── main.go ├── models ├── SendLimit.go ├── admin.go ├── alias.go ├── asset.go ├── available.go ├── bot.go ├── cmd.go ├── command.go ├── config.go ├── container.go ├── cron.go ├── daily_push.go ├── db.go ├── deamon.go ├── env.go ├── handle.go ├── help.go ├── init.go ├── push.go ├── pushplus.go ├── qywx.go ├── reply.go ├── repos.go ├── sf.go ├── sms.go ├── task.go ├── tbot.go ├── toekn.go ├── ua.go ├── user.go ├── useradmin.go ├── version.go ├── wck.go ├── wish.go └── wskey.go ├── qbot ├── login.go └── main.go ├── ql.sh ├── readme.md ├── run.sh ├── scripts ├── USER_AGENTS.js ├── if_checkin.txt ├── jdDreamFactoryShareCodes.js ├── jdFactoryShareCodes.js ├── jdFruitShareCodes.js ├── jdJxncShareCodes.js ├── jdPetShareCodes.js ├── jdPlantBeanShareCodes.js ├── jd_all_bean_change.js ├── jd_angryBean.js ├── jd_angryCash.js ├── jd_angryKoi.js ├── jd_bean_change_new.js ├── jd_cash_exchange.js ├── jd_dyj_help.js ├── jd_earn30.js ├── jd_get_share_code.js ├── jd_goodMorning.js ├── jd_joy_park_help.js ├── jd_morningSc.js ├── jd_sendBeans.js ├── jd_tyt.js ├── package-lock.json ├── package.json ├── sendNotify.js ├── test.py └── womail.py ├── static ├── 2233login.af9c53d.png ├── hb.jpg ├── loadTV.99606e2.gif ├── ok.svg ├── test.txt └── zfb.jpg ├── theme ├── admin.html ├── bidong.html ├── kuduan.html ├── noodin.html ├── random.html ├── summer.html ├── survey.html └── wave.html └── ua.txt /.gitignore: -------------------------------------------------------------------------------- 1 | test 2 | .DS_Store 3 | *.db 4 | config.sh 5 | *.exe 6 | list.sh 7 | xdd_darwin_amd64 8 | xdd 9 | test.go 10 | vendor/ 11 | .idea 12 | .vscode 13 | config.hjson 14 | config.yml 15 | session.token 16 | device.json 17 | data/ 18 | logs/ 19 | conf/app.conf 20 | conf/config.yaml 21 | conf/config_cdle.yaml 22 | conf/reply.php 23 | jdCookie.js 24 | scripts/node_modules 25 | task/* 26 | *.repo 27 | repos 28 | /theme/userCenter.html 29 | /theme/plus.html -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 764763903a 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /conf/demo_app.conf: -------------------------------------------------------------------------------- 1 | #扫码端口 2 | httpport = 8080 -------------------------------------------------------------------------------- /conf/demo_config.yaml: -------------------------------------------------------------------------------- 1 | mode: parallel 2 | containers: 3 | - address: http://192.168.31.233:5700 4 | username: admin 5 | password: admin 6 | cid: admin 7 | secret: admin 8 | weigth: 9 | mode: parallel 10 | limit: 9999 11 | AtTime: #填写1-12之间的数 填错自负默认为10 10点容易出现高峰超时。 12 | IsHelp: #填写true或者false false 13 | IsOldV4: #填写true或者false false是否新版或者旧版V4 14 | Wskey: # 填空默认禁用wskey转换 需要的填true 15 | IsAddFriend: #填写true或者false false 16 | Lim: #填写1-N 代表限制次数 17 | Tyt: #填写1-N 代表推一推需要的互助值,默认为8 18 | Later: #延时防止黑IP自己设置 默认60 不怕黑的改为1即可 单位是秒 19 | ApiToken: #短信接入token参数 20 | theme: 21 | static: ./static 22 | master: 23 | database: 24 | qywx_key: 25 | daily_push: 26 | resident: 27 | user_agent: 28 | telegram_bot_token: 29 | telegram_user_id: 30 | TGURL: #填写TG代理地址参考https://www.kejiwanjia.com/server/5221.html#3worker 31 | qquid: 32 | qqgid: 33 | qbot_public_mode: true 34 | default_priority: 35 | no_ghproxy: true 36 | daily_asset_push_cron: 37 | repos: 38 | - git: https://github.com/shufflewzc/faker2.git 39 | -------------------------------------------------------------------------------- /conf/demo_qbot.yaml: -------------------------------------------------------------------------------- 1 | # go-cqhttp 默认配置文件 2 | 3 | account: # 账号相关 4 | uin: 1565396344 # QQ账号 5 | password: '' # 密码为空时使用扫码登录 6 | encrypt: false # 是否开启密码加密 7 | status: 0 # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态 8 | relogin: # 重连设置 9 | delay: 3 # 首次重连延迟, 单位秒 10 | interval: 3 # 重连间隔 11 | max-times: 0 # 最大重连次数, 0为无限制 12 | 13 | # 是否使用服务器下发的新地址进行重连 14 | # 注意, 此设置可能导致在海外服务器上连接情况更差 15 | use-sso-address: true 16 | 17 | heartbeat: 18 | # 心跳频率, 单位秒 19 | # -1 为关闭心跳 20 | interval: 5 21 | 22 | message: 23 | # 上报数据类型 24 | # 可选: string,array 25 | post-format: string 26 | # 是否忽略无效的CQ码, 如果为假将原样发送 27 | ignore-invalid-cqcode: false 28 | # 是否强制分片发送消息 29 | # 分片发送将会带来更快的速度 30 | # 但是兼容性会有些问题 31 | force-fragment: false 32 | # 是否将url分片发送 33 | fix-url: false 34 | # 下载图片等请求网络代理 35 | proxy-rewrite: '' 36 | # 是否上报自身消息 37 | report-self-message: false 38 | # 移除服务端的Reply附带的At 39 | remove-reply-at: false 40 | # 为Reply附加更多信息 41 | extra-reply-data: false 42 | # 跳过 Mime 扫描, 忽略错误数据 43 | skip-mime-scan: false 44 | 45 | output: 46 | # 日志等级 trace,debug,info,warn,error 47 | log-level: warn 48 | # 日志时效 单位天. 超过这个时间之前的日志将会被自动删除. 设置为 0 表示永久保留. 49 | log-aging: 15 50 | # 是否在每次启动时强制创建全新的文件储存日志. 为 false 的情况下将会在上次启动时创建的日志文件续写 51 | log-force-new: true 52 | # 是否启用 DEBUG 53 | debug: false # 开启调试模式 54 | 55 | # 默认中间件锚点 56 | default-middlewares: &default 57 | # 访问密钥, 强烈推荐在公网的服务器设置 58 | access-token: '' 59 | # 事件过滤器文件目录 60 | filter: '' 61 | # API限速设置 62 | # 该设置为全局生效 63 | # 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配 64 | # 目前该限速设置为令牌桶算法, 请参考: 65 | # https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin 66 | rate-limit: 67 | enabled: false # 是否启用限速 68 | frequency: 1 # 令牌回复频率, 单位秒 69 | bucket: 1 # 令牌桶大小 70 | 71 | database: # 数据库相关设置 72 | leveldb: 73 | # 是否启用内置leveldb数据库 74 | # 启用将会增加10-20MB的内存占用和一定的磁盘空间 75 | # 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能 76 | enable: true 77 | 78 | # 连接服务列表 79 | # 连接服务列表 80 | servers: 81 | # 添加方式,同一连接方式可添加多个,具体配置说明请查看文档 82 | #- http: # http 通信 83 | #- ws: # 正向 Websocket 84 | #- ws-reverse: # 反向 Websocket 85 | #- pprof: #性能分析服务器 86 | # 正向WS设置 87 | # - ws: 88 | # # 正向WS服务器监听地址 89 | # host: 127.0.0.1 90 | # # 正向WS服务器监听端口 91 | # port: 6700 92 | # middlewares: 93 | # <<: *default # 引用默认中间件 94 | # 反向WS设置 95 | # - ws-reverse: 96 | # # 反向WS Universal 地址 97 | # # 注意 设置了此项地址后下面两项将会被忽略 98 | # universal: ws://127.0.0.1:8765/ws 99 | # # 反向WS API 地址 100 | # api: ws://127.0.0.1:8765/api 101 | # # 反向WS Event 地址 102 | # event: ws://127.0.0.1:8765/event 103 | # # 重连间隔 单位毫秒 104 | # reconnect-interval: 3000 105 | # middlewares: 106 | # <<: *default # 引用默认中间件 -------------------------------------------------------------------------------- /conf/demo_reply.php: -------------------------------------------------------------------------------- 1 | return reply( 2 | [ 3 | `早上好`=>`good morning` 4 | `扫码` => `扫个锤子,看公告` 5 | `你好`=> `我还行` 6 | `美腿` => `https://api.iyk0.com/mtt` 7 | `毒鸡汤`=>`https://www.hlapi.cn/api/djt?charset=utf-8&encode=text` 8 | `笑话`=>`https://www.hlapi.cn/api/gxdz` 9 | `妹妹` => `https://3650000.xyz/api/` 10 | `精神语录`=>`https://api.xcboke.cn/api/yulu?c=1002&encode=text` 11 | `网抑云`=>`https://api.xcboke.cn/api/yulu?c=1003&encode=text` 12 | `朋友圈文案`=>`https://api.xcboke.cn/api/yulu?c=1008&encode=text` 13 | `.*来对线`=>`https://api.xcboke.cn/api/yulu?c=1009&encode=text` 14 | `动漫台词`=>`https://api.xcboke.cn/api/yulu?c=2001&encode=text` 15 | `游戏台词`=>`https://api.xcboke.cn/api/yulu?c=2003&encode=text` 16 | `壁纸` => `http://api.btstu.cn/sjbz/?lx=dongman` 17 | `小清新` => `http://api.btstu.cn/sjbz/?lx=meizi` 18 | `.*美女` => `https://api.lyiqk.cn/purelady` 19 | `二次元图` => `https://acg.toubiec.cn/random.php` 20 | `.*换一个` => `http://api.btstu.cn/sjbz/?lx=m_dongman` 21 | `动漫头像` => `http://shengapi.cn/api/image/acgtx.php` 22 | `舔狗日记` => `http://shengapi.cn/api/tgrj.php` 23 | `.*骚话.*`=>`https://api.vvhan.com/api/sao` 24 | `文明` => `http://api.btstu.cn/sjbz/zsy.php` 25 | `富强` => `http://api.btstu.cn/sjbz/?m_lx=suiji` 26 | `和谐` => `https://api.btstu.cn/sjbz/api.php` 27 | `民主` => `https://cdn.seovx.com/?mom=302` 28 | `语录` => `https://api.ixiaowai.cn/ylapi/index.php` 29 | `舔狗` => `https://api.ixiaowai.cn/tgrj/index.php` 30 | `.*一言.*`=>`https://api.ixiaowai.cn/ylapi/index.php` 31 | `说明`=>`https://ghproxy.com/https://raw.githubusercontent.com/U188/JDC/master/sm.jpg` 32 | `咨询`=>`https://ghproxy.com/https://raw.githubusercontent.com/U188/JDC/master/zx.png` 33 | `密码` => `你猜` 34 | `菜单` => ` 35 | 京东菜单 36 | ——————————— 37 | 说明 丨 咨询 38 | 打卡 丨 余额 39 | 许愿 40 | ——————————— 41 | 娱乐菜单 42 | ——————————— 43 | 富强 丨 民主 44 | 文明 丨 和谐 45 | 妹妹 丨 美女 46 | 风景 丨 壁纸 47 | 你好 丨 美腿 48 | 状态 丨 笑话 49 | 骚话 丨 对线 50 | 精神语录丨 毒鸡汤 51 | 动漫台词丨 朋友圈文案 52 | ——————————— 53 | 管理员菜单 54 | ——————————— 55 | 状态 丨 升级 56 | 重启 丨 转账 57 | 删除 丨 通知 58 | 执行 丨 优先级 59 | 绑定 丨 命令 60 | 导出 丨 助力 61 | 回复 丨 屏蔽 62 | 更新账号 | 清理过期账号 63 | 取消屏蔽 | 任务列表 64 | 设置管理员 | 取消管理员 65 | ——————————— 66 | 京东机器人` 67 | ] 68 | ) 69 | -------------------------------------------------------------------------------- /controllers/account.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | import ( 4 | "github.com/cdle/xdd/models" 5 | ) 6 | 7 | type AccountController struct { 8 | BaseController 9 | } 10 | 11 | func (c *AccountController) NextPrepare() { 12 | c.Logined() 13 | } 14 | 15 | func (c *AccountController) List() { 16 | var page = c.GetQueryInt("page") 17 | var limit = c.GetQueryInt("limit") 18 | var cks = models.GetJdCookies() 19 | if !c.Master { 20 | tmp := cks 21 | cks = []models.JdCookie{} 22 | for _, ck := range tmp { 23 | if ck.PtPin == c.PtPin { 24 | cks = append(cks, ck) 25 | break 26 | } 27 | } 28 | } 29 | var len = len(cks) 30 | var total = []int{len} 31 | if page == 0 { 32 | page = 1 33 | } 34 | if limit == 0 { 35 | limit = 1 36 | } 37 | var from = (page - 1) * limit 38 | var to = page * limit 39 | if from >= len-1 { 40 | from = len - 1 41 | } 42 | if to >= len { 43 | to = len 44 | } 45 | if from < 0 { 46 | from = 0 47 | } 48 | var data = cks[from:to] 49 | c.Data["json"] = map[string]interface{}{ 50 | "code": 200, 51 | "data": data, 52 | "message": total, 53 | } 54 | c.ServeJSON() 55 | } 56 | 57 | func (c *AccountController) CreateOrUpdate() { 58 | ps := &models.JdCookie{} 59 | c.Validate(ps) 60 | if ps.PtPin != "" { 61 | ps.Pool = "" 62 | if !c.Master { 63 | ps.Priority = 0 64 | ps.PtKey = "" 65 | ps.PtPin = c.PtPin 66 | } 67 | ps.Updates(*ps) 68 | } 69 | go func() { 70 | models.Save <- &models.JdCookie{} 71 | }() 72 | c.Response(nil, "操作成功") 73 | } 74 | 75 | func (c *AccountController) Admin() { 76 | c.Ctx.WriteString(models.Admin) 77 | } 78 | 79 | func (c *AccountController) UserCenter() { 80 | c.Ctx.WriteString(models.UserCenter) 81 | } 82 | -------------------------------------------------------------------------------- /controllers/base.go: -------------------------------------------------------------------------------- 1 | package controllers 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/beego/beego/v2/core/logs" 6 | beego "github.com/beego/beego/v2/server/web" 7 | "github.com/cdle/xdd/models" 8 | "github.com/go-playground/locales/zh" 9 | ut "github.com/go-playground/universal-translator" 10 | "gopkg.in/go-playground/validator.v9" 11 | zh_translations "gopkg.in/go-playground/validator.v9/translations/zh" 12 | "net/http" 13 | "strconv" 14 | "strings" 15 | ) 16 | 17 | var validate *validator.Validate 18 | var trans ut.Translator 19 | 20 | func init() { 21 | //验证器注册翻译器 22 | var zhCh = zh.New() 23 | validate = validator.New() 24 | var uni = ut.New(zhCh) 25 | trans, _ = uni.GetTranslator("zh") 26 | zh_translations.RegisterDefaultTranslations(validate, trans) 27 | } 28 | 29 | //BaseController 基础控制器 30 | type BaseController struct { 31 | beego.Controller 32 | PtPin string 33 | Master bool 34 | } 35 | 36 | //NextPrepare 下一个准备 37 | type NextPrepare interface { 38 | NextPrepare() 39 | } 40 | 41 | //Prepare 准备 42 | func (c *BaseController) Prepare() { 43 | // c.Ctx.ResponseWriter.Header().Add("Master-IP-Address", models.GetMasteraddr()) 44 | if app, ok := c.AppController.(NextPrepare); ok { 45 | app.NextPrepare() 46 | } 47 | } 48 | 49 | //Response 响应 50 | func (c *BaseController) Response(ps ...interface{}) { //数据、信息、状态码 51 | rsp := struct { 52 | //状态码 53 | Code int `json:"code"` // 0 成功 1 失败 54 | //数据 55 | Data interface{} `json:"data"` 56 | //描述信息 57 | Msg string `json:"msg"` 58 | }{} 59 | switch len(ps) { 60 | case 3: 61 | rsp.Code = ps[2].(int) 62 | fallthrough 63 | case 2: 64 | switch ps[1].(type) { 65 | case string: 66 | rsp.Msg = ps[1].(string) 67 | case error: 68 | rsp.Msg = ps[1].(error).Error() 69 | } 70 | fallthrough 71 | case 1: 72 | rsp.Data = ps[0] 73 | } 74 | c.Data["json"] = rsp 75 | c.ServeJSON() 76 | c.StopRun() 77 | } 78 | 79 | //ResponseError 响应错误 80 | func (c *BaseController) ResponseError(ps ...interface{}) *BaseController { 81 | if ps[0] == nil { 82 | return c 83 | } 84 | // var status = http.StatusBadRequest 85 | var text = "" 86 | 87 | for _, p := range ps { 88 | switch t := p.(type) { 89 | case int: //状态码 90 | // status = t 91 | break 92 | case error: //错误 93 | text = t.Error() 94 | break 95 | case string: //字符描述 96 | text = t 97 | break 98 | } 99 | } 100 | // c.Ctx.ResponseWriter.WriteHeader(status) 101 | // if text != "" { 102 | // c.Ctx.WriteString(text) 103 | // } 104 | c.Response(nil, text, 1) 105 | // c.StopRun() 106 | return nil 107 | } 108 | 109 | //Logined 登录 110 | func (c *BaseController) Logined() *BaseController { 111 | if v := c.GetSession("pin"); v == nil { 112 | c.Ctx.Redirect(302, "/") 113 | c.StopRun() 114 | } else { 115 | logs.Warn("登录成功") 116 | c.PtPin = v.(string) 117 | logs.Info(models.Config.Master) 118 | if strings.EqualFold(models.Config.Master, v.(string)) { 119 | c.Master = true 120 | } 121 | } 122 | return c 123 | } 124 | 125 | //Validate 表单验证 126 | func (c *BaseController) Validate(ps interface{}) *BaseController { 127 | c.ResponseError(json.Unmarshal(c.Ctx.Input.CopyBody(10000000), ps), http.StatusBadRequest) 128 | if err := validate.Struct(ps); err != nil { 129 | for _, err := range err.(validator.ValidationErrors) { 130 | c.ResponseError(err.Translate(trans), http.StatusBadRequest) 131 | } 132 | } 133 | return c 134 | } 135 | 136 | //GetPathInt64 137 | func (c *BaseController) GetPathInt64(v string) int64 { 138 | r := c.Ctx.Input.Param(":" + v) 139 | if r == "" { 140 | return 0 141 | } 142 | i, err := strconv.Atoi(r) 143 | c.ResponseError(err) 144 | return int64(i) 145 | } 146 | 147 | //GetPathInt 148 | func (c *BaseController) GetPathInt(v string) int { 149 | r := c.Ctx.Input.Param(":" + v) 150 | if r == "" { 151 | return 0 152 | } 153 | i, err := strconv.Atoi(r) 154 | c.ResponseError(err) 155 | return i 156 | } 157 | 158 | //GetPathInt32 159 | func (c *BaseController) GetPathInt32(v string) int32 { 160 | r := c.Ctx.Input.Param(":" + v) 161 | if r == "" { 162 | return 0 163 | } 164 | i, err := strconv.Atoi(r) 165 | c.ResponseError(err) 166 | return int32(i) 167 | } 168 | 169 | //GetQueryInt64 170 | func (c *BaseController) GetQueryInt64(v string) int64 { 171 | r := c.GetString(v) 172 | if r == "" { 173 | return 0 174 | } 175 | i, err := strconv.Atoi(r) 176 | c.ResponseError(err) 177 | return int64(i) 178 | } 179 | 180 | //GetQueryInt 181 | func (c *BaseController) GetQueryInt(v string) int { 182 | r := c.GetString(v) 183 | if r == "" { 184 | return 0 185 | } 186 | i, err := strconv.Atoi(r) 187 | c.ResponseError(err) 188 | return i 189 | } 190 | 191 | //GetQueryInt32 192 | func (c *BaseController) GetQueryInt32(v string) int32 { 193 | r := c.GetString(v) 194 | if r == "" { 195 | return 0 196 | } 197 | i, err := strconv.Atoi(r) 198 | c.ResponseError(err) 199 | return int32(i) 200 | } 201 | -------------------------------------------------------------------------------- /fix.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ "$(grep 'transfer.nz.lu' /etc/hosts)" = "" ]; 4 | then 5 | echo "127.0.0.1 transfer.nz.lu" | tee -a /etc/hosts 6 | fi 7 | 8 | if [ "$(grep 'nz.lu' /etc/hosts)" = "127.0.0.1 transfer.nz.lu" ]; 9 | then 10 | echo "127.0.0.1 nz.lu" | tee -a /etc/hosts 11 | fi 12 | 13 | if [ "$(grep 'transfer.nz.lu' /etc/hosts)" = "" ]; 14 | then 15 | echo "127.0.0.1 transfer.nz.lu" | tee -a /etc/hosts 16 | fi 17 | 18 | if [ "$(grep 'jdsharecode.xyz' /etc/hosts)" = "" ]; 19 | then 20 | echo "127.0.0.1 jdsharecode.xyz" | tee -a /etc/hosts 21 | fi 22 | 23 | if [ "$(grep 'helpu.cf' /etc/hosts)" = "" ]; 24 | then 25 | echo "127.0.0.1 helpu.cf" | tee -a /etc/hosts 26 | fi 27 | 28 | #result=$(grep 'smiek.tk' /etc/hosts) 29 | # if [ "$reusult" = "" ] 30 | # then 31 | #$ echo "127.0.0.1 smiek.tk" | sudo tee -a /etc/hosts 32 | # fi 33 | # 34 | 35 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/cdle/xdd 2 | 3 | go 1.16 4 | 5 | replace github.com/willf/bitset v1.2.0 => github.com/bits-and-blooms/bitset v1.2.0 6 | 7 | replace github.com/Mrs4s/go-cqhttp v1.0.0-beta5 => github.com/cdle/go-cqhttp v1.1.2 8 | 9 | require ( 10 | github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f 11 | github.com/Mrs4s/MiraiGo v0.0.0-20210726103104-1d68826cef0e 12 | github.com/Mrs4s/go-cqhttp v1.0.0-beta5 13 | github.com/beego/beego/v2 v2.0.1 14 | github.com/buger/jsonparser v1.1.1 15 | github.com/go-playground/locales v0.13.0 16 | github.com/go-playground/universal-translator v0.17.0 17 | github.com/go-playground/validator/v10 v10.4.1 // indirect 18 | github.com/guonaihong/gout v0.2.1 19 | github.com/leodido/go-urn v1.2.1 // indirect 20 | github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible 21 | github.com/mattn/go-isatty v0.0.13 // indirect 22 | github.com/pkg/errors v0.9.1 23 | github.com/robfig/cron/v3 v3.0.1 24 | github.com/sirupsen/logrus v1.8.1 25 | github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e 26 | github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816 27 | github.com/tidwall/gjson v1.8.1 28 | github.com/tuotoo/qrcode v0.0.0-20190222102259-ac9c44189bf2 29 | golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e 30 | golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect 31 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect 32 | golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b 33 | gopkg.in/go-playground/assert.v1 v1.2.1 // indirect 34 | gopkg.in/go-playground/validator.v9 v9.31.0 35 | gopkg.in/tucnak/telebot.v2 v2.4.0 36 | gopkg.in/yaml.v2 v2.2.8 37 | gorm.io/driver/mysql v1.1.2 38 | gorm.io/driver/postgres v1.1.0 39 | gorm.io/driver/sqlite v1.1.4 40 | gorm.io/gorm v1.21.13 41 | ) 42 | -------------------------------------------------------------------------------- /lastupdate.tmp: -------------------------------------------------------------------------------- 1 | {"/Users/cdle/Desktop/jd_study/jdc/controllers":1627349014997994106} -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "io/ioutil" 5 | "os" 6 | "strings" 7 | "time" 8 | 9 | "github.com/beego/beego/v2/client/httplib" 10 | "github.com/beego/beego/v2/core/logs" 11 | "github.com/beego/beego/v2/server/web/context" 12 | 13 | "github.com/beego/beego/v2/server/web" 14 | "github.com/cdle/xdd/controllers" 15 | "github.com/cdle/xdd/models" 16 | "github.com/cdle/xdd/qbot" 17 | ) 18 | 19 | var theme = "" 20 | 21 | func main() { 22 | go func() { 23 | models.Save <- &models.JdCookie{} 24 | }() 25 | web.Get("/count", func(ctx *context.Context) { 26 | ctx.WriteString(models.Count()) 27 | }) 28 | web.Get("/", func(ctx *context.Context) { 29 | if models.Config.Theme == "" { 30 | models.Config.Theme = models.GhProxy + "https://ghproxy.com/https://raw.githubusercontent.com/764763903a/xdd-plus/main/theme/admin.html" 31 | } 32 | if theme != "" { 33 | ctx.WriteString(theme) 34 | return 35 | } 36 | if strings.Contains(models.Config.Theme, "http") { 37 | logs.Info("下载最新主题") 38 | s, _ := httplib.Get(models.Config.Theme).String() 39 | if s != "" { 40 | theme = s 41 | ctx.WriteString(s) 42 | return 43 | } 44 | logs.Warn("主题下载失败,使用默认主题") 45 | } 46 | f, err := os.Open(models.Config.Theme) 47 | if err == nil { 48 | d, _ := ioutil.ReadAll(f) 49 | theme = string(d) 50 | ctx.WriteString(string(d)) 51 | return 52 | } 53 | }) 54 | web.Router("/api/login/qrcode", &controllers.LoginController{}, "get:GetQrcode") 55 | web.Router("/api/login/qrcode.png", &controllers.LoginController{}, "get:GetQrcode") 56 | web.Router("/api/login/qrcode1", &controllers.LoginController{}, "get:GetQrcode1") 57 | web.Router("/api/login/query", &controllers.LoginController{}, "get:Query") 58 | web.Router("/api/login/cookie", &controllers.LoginController{}, "get:Cookie") 59 | web.Router("/api/login/admin", &controllers.LoginController{}, "post:IsAdmin") 60 | web.Router("/api/login/cklogin", &controllers.LoginController{}, "post:CkLogin") 61 | web.Router("/api/login/smslogin", &controllers.LoginController{}, "post:SMSLogin") 62 | web.Router("/api/getUserInfo", &controllers.LoginController{}, "post:GetUserInfo") 63 | web.Router("/api/getUserInfo", &controllers.LoginController{}, "get:GetUserInfo") 64 | web.Router("/api/account", &controllers.AccountController{}, "get:List") 65 | web.Router("/api/account", &controllers.AccountController{}, "post:CreateOrUpdate") 66 | web.Router("/admin", &controllers.AccountController{}, "get:Admin") 67 | web.Router("/admin", &controllers.AccountController{}, "post:Admin") 68 | web.Router("/userCenter", &controllers.AccountController{}, "get:UserCenter") 69 | web.Router("/userCenter", &controllers.AccountController{}, "post:UserCenter") 70 | 71 | if models.Config.Static == "" { 72 | models.Config.Static = "./static" 73 | } 74 | web.BConfig.WebConfig.StaticDir["/static"] = models.Config.Static 75 | web.BConfig.AppName = models.AppName 76 | web.BConfig.WebConfig.AutoRender = false 77 | web.BConfig.CopyRequestBody = true 78 | web.BConfig.WebConfig.Session.SessionOn = true 79 | web.BConfig.WebConfig.Session.SessionGCMaxLifetime = 3600 80 | web.BConfig.WebConfig.Session.SessionName = models.AppName 81 | go func() { 82 | time.Sleep(time.Second * 4) 83 | (&models.JdCookie{}).Push("小滴滴已启动") 84 | }() 85 | if models.Config.QQID != 0 || models.Config.QQGroupID != 0 { 86 | go qbot.Main() 87 | } 88 | web.Run() 89 | } 90 | -------------------------------------------------------------------------------- /models/SendLimit.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "github.com/beego/beego/v2/core/logs" 5 | "time" 6 | ) 7 | 8 | type Limit struct { 9 | ID int `gorm:"column:ID;primaryKey"` 10 | Number int 11 | ActiveAt string 12 | Typ int 13 | Num int 14 | } 15 | 16 | func getLimit(uid int, typ int) bool { 17 | if Config.Lim == 0 { 18 | return true 19 | } 20 | u := &Limit{} 21 | err := db.Where("number = ? and typ = ? and active_at = ?", uid, typ, time.Now().Format("2006-01-02")).First(&u).Error 22 | if err == nil { 23 | logs.Info(u.Number) 24 | if u.Num < Config.Lim { 25 | db.Where("ID = ?", u.ID).Updates(&Limit{ 26 | Num: u.Num + 1, 27 | }) 28 | return true 29 | } else { 30 | return false 31 | } 32 | } else { 33 | begin := db.Begin() 34 | begin.Create(&Limit{ 35 | ActiveAt: time.Now().Format("2006-01-02"), 36 | Typ: typ, 37 | Number: uid, 38 | Num: 1, 39 | }) 40 | begin.Commit() 41 | return true 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /models/alias.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | type Alias struct { 4 | ID int 5 | Key string 6 | Value string 7 | } 8 | 9 | // alias /asset $1 => run jd_bean_change.js $1 -w 10 | -------------------------------------------------------------------------------- /models/bot.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "fmt" 5 | "io/ioutil" 6 | "os" 7 | "regexp" 8 | "strconv" 9 | "strings" 10 | "time" 11 | 12 | "github.com/beego/beego/v2/client/httplib" 13 | "github.com/beego/beego/v2/core/logs" 14 | ) 15 | 16 | var SendQQ = func(a int64, b interface{}) { 17 | 18 | } 19 | var SendQQGroup = func(a int64, b int64, c interface{}) { 20 | 21 | } 22 | 23 | var ListenQQPrivateMessage = func(uid int64, msg string) { 24 | SendQQ(uid, handleMessage(msg, "qq", int(uid))) 25 | } 26 | 27 | var ListenQQGroupMessage = func(gid int64, uid int64, msg string) { 28 | if gid == Config.QQGroupID { 29 | if Config.QbotPublicMode { 30 | SendQQGroup(gid, uid, handleMessage(msg, "qqg", int(uid), int(gid))) 31 | } else { 32 | SendQQ(uid, handleMessage(msg, "qq", int(uid))) 33 | } 34 | } 35 | } 36 | 37 | var replies = map[string]string{} 38 | 39 | func AggQQ() { 40 | 41 | } 42 | 43 | func InitReplies() { 44 | f, err := os.Open(ExecPath + "/conf/reply.php") 45 | if err == nil { 46 | defer f.Close() 47 | data, _ := ioutil.ReadAll(f) 48 | ss := regexp.MustCompile("`([^`]+)`\\s*=>\\s*`([^`]+)`").FindAllStringSubmatch(string(data), -1) 49 | for _, s := range ss { 50 | replies[s[1]] = s[2] 51 | } 52 | } 53 | if _, ok := replies["壁纸"]; !ok { 54 | replies["壁纸"] = "https://acg.toubiec.cn/random.php" 55 | } 56 | } 57 | 58 | var handleMessage = func(msgs ...interface{}) interface{} { 59 | msg := msgs[0].(string) 60 | args := strings.Split(msg, " ") 61 | head := args[0] 62 | contents := args[1:] 63 | sender := &Sender{ 64 | UserID: msgs[2].(int), 65 | Type: msgs[1].(string), 66 | Contents: contents, 67 | } 68 | if len(msgs) >= 4 { 69 | sender.ChatID = msgs[3].(int) 70 | } 71 | if sender.Type == "tgg" { 72 | sender.MessageID = msgs[4].(int) 73 | sender.Username = msgs[5].(string) 74 | sender.ReplySenderUserID = msgs[6].(int) 75 | } 76 | if sender.UserID == Config.TelegramUserID || sender.UserID == int(Config.QQID) { 77 | sender.IsAdmin = true 78 | } 79 | if sender.IsAdmin == false { 80 | if IsUserAdmin(strconv.Itoa(sender.UserID)) { 81 | sender.IsAdmin = true 82 | } 83 | } 84 | for i := range codeSignals { 85 | for j := range codeSignals[i].Command { 86 | if codeSignals[i].Command[j] == head { 87 | return func() interface{} { 88 | if codeSignals[i].Admin && !sender.IsAdmin { 89 | return "你没有权限操作" 90 | } 91 | return codeSignals[i].Handle(sender) 92 | }() 93 | } 94 | } 95 | } 96 | switch msg { 97 | default: 98 | { //沃邮箱 99 | ss := regexp.MustCompile(`https://nyan.mail.*3D`).FindStringSubmatch(msg) 100 | if len(ss) > 0 { 101 | var u User 102 | if db.Where("number = ?", sender.UserID).First(&u).Error != nil { 103 | return 0 104 | } 105 | db.Model(u).Updates(map[string]interface{}{ 106 | "womail": ss[0], 107 | }) 108 | sender.Reply(fmt.Sprintf("沃邮箱提交成功!")) 109 | return nil 110 | } 111 | } 112 | { 113 | ss := regexp.MustCompile(`pin=([^;=\s]+);wskey=([^;=\s]+)`).FindAllStringSubmatch(msg, -1) 114 | if len(ss) > 0 { 115 | for _, s := range ss { 116 | wkey := "pin=" + s[1] + ";wskey=" + s[2] + ";" 117 | //rsp := cmd(fmt.Sprintf(`python3 test.py "%s"`, wkey), &Sender{}) 118 | rsp, err := getKey(wkey) 119 | if err != nil { 120 | logs.Error(err) 121 | } 122 | if strings.Contains(rsp, "fake_") { 123 | logs.Error("wskey错误") 124 | sender.Reply(fmt.Sprintf("wskey错误 除京东APP皆不可用")) 125 | } else { 126 | ptKey := FetchJdCookieValue("pt_key", rsp) 127 | ptPin := FetchJdCookieValue("pt_pin", rsp) 128 | ck := JdCookie{ 129 | PtPin: ptPin, 130 | PtKey: ptKey, 131 | WsKey: s[2], 132 | } 133 | if CookieOK(&ck) { 134 | 135 | if sender.IsQQ() { 136 | ck.QQ = sender.UserID 137 | } else if sender.IsTG() { 138 | ck.Telegram = sender.UserID 139 | } 140 | if nck, err := GetJdCookie(ck.PtPin); err == nil { 141 | nck.InPool(ck.PtKey) 142 | if nck.WsKey == "" || len(nck.WsKey) == 0 { 143 | if sender.IsQQ() { 144 | ck.Update(QQ, ck.QQ) 145 | } 146 | nck.Update(WsKey, ck.WsKey) 147 | msg := fmt.Sprintf("写入WsKey,并更新账号%s", ck.PtPin) 148 | sender.Reply(fmt.Sprintf(msg)) 149 | (&JdCookie{}).Push(msg) 150 | logs.Info(msg) 151 | } else { 152 | if nck.WsKey == ck.WsKey { 153 | msg := fmt.Sprintf("重复写入") 154 | sender.Reply(fmt.Sprintf(msg)) 155 | (&JdCookie{}).Push(msg) 156 | logs.Info(msg) 157 | } else { 158 | nck.Updates(JdCookie{ 159 | WsKey: ck.WsKey, 160 | }) 161 | msg := fmt.Sprintf("更新WsKey,并更新账号%s", ck.PtPin) 162 | sender.Reply(fmt.Sprintf(msg)) 163 | (&JdCookie{}).Push(msg) 164 | logs.Info(msg) 165 | } 166 | } 167 | 168 | } else { 169 | NewJdCookie(&ck) 170 | 171 | msg := fmt.Sprintf("添加账号,账号名:%s", ck.PtPin) 172 | 173 | if sender.IsQQ() { 174 | ck.Update(QQ, ck.QQ) 175 | } 176 | 177 | sender.Reply(fmt.Sprintf(msg)) 178 | sender.Reply(ck.Query()) 179 | (&JdCookie{}).Push(msg) 180 | } 181 | } 182 | go func() { 183 | Save <- &JdCookie{} 184 | }() 185 | return nil 186 | } 187 | } 188 | } 189 | } 190 | { //tyt 191 | ss := regexp.MustCompile(`packetId=(\S+)(&|&)currentActId`).FindStringSubmatch(msg) 192 | if len(ss) > 0 { 193 | if !sender.IsAdmin { 194 | coin := GetCoin(sender.UserID) 195 | if coin < Config.Tyt { 196 | return fmt.Sprintf("推一推需要%d个互助值", Config.Tyt) 197 | } 198 | RemCoin(sender.UserID, Config.Tyt) 199 | sender.Reply(fmt.Sprintf("推一推即将开始,已扣除%d个互助值", Config.Tyt)) 200 | } else { 201 | sender.Reply(fmt.Sprintf("推一推即将开始,已扣除%d个互助值,管理员通道", Config.Tyt)) 202 | } 203 | 204 | runTask(&Task{Path: "jd_tyt.js", Envs: []Env{ 205 | {Name: "tytpacketId", Value: ss[1]}, 206 | }}, sender) 207 | return nil 208 | } 209 | } 210 | { 211 | if strings.Contains(msg, "pt_key") { 212 | ptKey := FetchJdCookieValue("pt_key", msg) 213 | ptPin := FetchJdCookieValue("pt_pin", msg) 214 | if len(ptPin) > 0 && len(ptKey) > 0 { 215 | ck := JdCookie{ 216 | PtKey: ptKey, 217 | PtPin: ptPin, 218 | } 219 | if CookieOK(&ck) { 220 | if sender.IsQQ() { 221 | ck.QQ = sender.UserID 222 | } else if sender.IsTG() { 223 | ck.Telegram = sender.UserID 224 | } 225 | if HasKey(ck.PtKey) { 226 | sender.Reply(fmt.Sprintf("重复提交")) 227 | } else { 228 | if nck, err := GetJdCookie(ck.PtPin); err == nil { 229 | nck.InPool(ck.PtKey) 230 | msg := fmt.Sprintf("更新账号,%s", ck.PtPin) 231 | if sender.IsQQ() { 232 | ck.Update(QQ, ck.QQ) 233 | } 234 | sender.Reply(fmt.Sprintf(msg)) 235 | (&JdCookie{}).Push(msg) 236 | logs.Info(msg) 237 | } else { 238 | if Cdle { 239 | ck.Hack = True 240 | } 241 | NewJdCookie(&ck) 242 | msg := fmt.Sprintf("添加账号,账号名:%s", ck.PtPin) 243 | if sender.IsQQ() { 244 | ck.Update(QQ, ck.QQ) 245 | } 246 | sender.Reply(fmt.Sprintf(msg)) 247 | sender.Reply(ck.Query()) 248 | (&JdCookie{}).Push(msg) 249 | logs.Info(msg) 250 | } 251 | } 252 | } else { 253 | sender.Reply(fmt.Sprintf("无效")) 254 | } 255 | } 256 | go func() { 257 | Save <- &JdCookie{} 258 | }() 259 | return nil 260 | } 261 | } 262 | { 263 | o := findShareCode(msg) 264 | if o != "" { 265 | return "导入互助码成功" 266 | } 267 | } 268 | for k, v := range replies { 269 | if regexp.MustCompile(k).FindString(msg) != "" { 270 | if strings.Contains(msg, "妹") && time.Now().Unix()%10 == 0 { 271 | v = "https://pics4.baidu.com/feed/d833c895d143ad4bfee5f874cfdcbfa9a60f069b.jpeg?token=8a8a0e1e20d4626cd31c0b838d9e4c1a" 272 | } 273 | if regexp.MustCompile(`^https{0,1}://[^\x{4e00}-\x{9fa5}\n\r\s]{3,}$`).FindString(v) != "" { 274 | url := v 275 | rsp, err := httplib.Get(url).Response() 276 | if err != nil { 277 | return nil 278 | } 279 | ctp := rsp.Header.Get("content-type") 280 | if ctp == "" { 281 | rsp.Header.Get("Content-Type") 282 | } 283 | if strings.Contains(ctp, "text") || strings.Contains(ctp, "json") { 284 | data, _ := ioutil.ReadAll(rsp.Body) 285 | return string(data) 286 | } 287 | return rsp 288 | } 289 | return v 290 | } 291 | } 292 | } 293 | return nil 294 | } 295 | 296 | func FetchJdCookieValue(key string, cookies string) string { 297 | match := regexp.MustCompile(key + `=([^;]*);{0,1}`).FindStringSubmatch(cookies) 298 | if len(match) == 2 { 299 | return match[1] 300 | } else { 301 | return "" 302 | } 303 | } 304 | -------------------------------------------------------------------------------- /models/cmd.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "bufio" 5 | "io" 6 | "os/exec" 7 | "time" 8 | 9 | "github.com/beego/beego/v2/core/logs" 10 | ) 11 | 12 | func cmd(str string, sender *Sender) string { 13 | cmd := exec.Command("sh", "-c", str) 14 | stdout, err := cmd.StdoutPipe() 15 | stderr, err := cmd.StderrPipe() 16 | if err != nil { 17 | logs.Warn("cmd.StdoutPipe: ", err) 18 | return err.Error() 19 | } 20 | cmd.Dir = ExecPath + "/scripts/" 21 | err = cmd.Start() 22 | if err != nil { 23 | logs.Warn("%v", err) 24 | return err.Error() 25 | } 26 | go func() { 27 | msg := "" 28 | reader := bufio.NewReader(stderr) 29 | for { 30 | line, err2 := reader.ReadString('\n') 31 | if err2 != nil || io.EOF == err2 { 32 | break 33 | } 34 | msg += line 35 | } 36 | if msg != "" { 37 | sender.Reply(msg) 38 | } 39 | }() 40 | msg := "" 41 | reader := bufio.NewReader(stdout) 42 | st := time.Now() 43 | for { 44 | line, err2 := reader.ReadString('\n') 45 | if err2 != nil || io.EOF == err2 { 46 | break 47 | } 48 | msg += line 49 | nt := time.Now() 50 | if (nt.Unix() - st.Unix()) > 15 { 51 | sender.Reply(msg) 52 | st = nt 53 | msg = "" 54 | } 55 | } 56 | if msg != "" { 57 | sender.Reply(msg) 58 | } 59 | err = cmd.Wait() 60 | return msg 61 | } 62 | -------------------------------------------------------------------------------- /models/config.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "github.com/Mrs4s/MiraiGo/utils" 5 | "io" 6 | "io/ioutil" 7 | "os" 8 | 9 | "github.com/beego/beego/v2/client/httplib" 10 | "github.com/beego/beego/v2/core/logs" 11 | "gopkg.in/yaml.v2" 12 | ) 13 | 14 | type Yaml struct { 15 | Containers []Container 16 | // Tasks []Task 17 | Qrcode string 18 | Master string 19 | Mode string 20 | Static string 21 | Database string 22 | QywxKey string `yaml:"qywx_key"` 23 | Resident string 24 | UserAgent string `yaml:"user_agent"` 25 | Theme string 26 | TelegramBotToken string `yaml:"telegram_bot_token"` 27 | TelegramUserID int `yaml:"telegram_user_id"` 28 | QQID int64 `yaml:"qquid"` 29 | QQGroupID int64 `yaml:"qqgid"` 30 | DefaultPriority int `yaml:"default_priority"` 31 | NoGhproxy bool `yaml:"no_ghproxy"` 32 | QbotPublicMode bool `yaml:"qbot_public_mode"` 33 | DailyAssetPushCron string `yaml:"daily_asset_push_cron"` 34 | Version string `yaml:"version"` 35 | CTime string `yaml:"AtTime"` 36 | IsHelp bool `yaml:"IsHelp"` 37 | IsOldV4 bool `yaml:"IsOldV4"` 38 | ApiToken string `yaml:"ApiToken"` 39 | Wskey bool `yaml:"Wskey"` 40 | TGURL string `yaml:"TGURL"` 41 | SMSAddress string `yaml:"SMSAddress"` 42 | IsAddFriend bool `yaml:"IsAddFriend"` 43 | Lim int `yaml:"Lim"` 44 | Tyt int `yaml:"Tyt"` 45 | IFC bool `yaml:"IFC"` 46 | Later int `yaml:"Later"` 47 | Node string 48 | Npm string 49 | Python string 50 | Pip string 51 | NoAdmin bool `yaml:"no_admin"` 52 | QbotConfigFile string `yaml:"qbot_config_file"` 53 | Repos []Repo 54 | HttpProxyServerPort int `yaml:"http_proxy_server_port"` 55 | } 56 | 57 | var Balance = "balance" 58 | var Parallel = "parallel" 59 | var GhProxy = "https://ghproxy.com/" 60 | var Cdle = false 61 | 62 | var Config Yaml 63 | 64 | func initConfig() { 65 | confDir := ExecPath + "/conf" 66 | if _, err := os.Stat(confDir); err != nil { 67 | os.MkdirAll(confDir, os.ModePerm) 68 | } 69 | for _, name := range []string{"app.conf", "config.yaml", "reply.php", "qbot.yaml"} { 70 | f, err := os.OpenFile(ExecPath+"/conf/"+name, os.O_RDWR|os.O_CREATE, 0777) 71 | if err != nil { 72 | logs.Warn(err) 73 | } 74 | s, _ := ioutil.ReadAll(f) 75 | if len(s) == 0 { 76 | logs.Info("下载配置%s", name) 77 | r, err := httplib.Get(GhProxy + "https://raw.githubusercontent.com/764763903a/xdd-plus/main/conf/demo_" + name).Response() 78 | if err == nil { 79 | io.Copy(f, r.Body) 80 | } 81 | } 82 | f.Close() 83 | } 84 | content, err := ioutil.ReadFile(ExecPath + "/conf/config.yaml") 85 | if err != nil { 86 | logs.Warn("解析config.yaml读取错误: %v", err) 87 | } 88 | if yaml.Unmarshal(content, &Config) != nil { 89 | logs.Warn("解析config.yaml出错: %v", err) 90 | } 91 | if ExecPath == "/Users/cdle/Desktop/xdd" || Config.NoAdmin { 92 | Cdle = true 93 | } 94 | if Config.Master == "" { 95 | Config.Master = "xxxx" 96 | } 97 | if Config.CTime == "" { 98 | Config.CTime = "10" 99 | } 100 | if Config.Mode != Parallel { 101 | Config.Mode = Balance 102 | } 103 | if Config.Qrcode != "" { 104 | Config.Theme = Config.Qrcode 105 | } 106 | if Config.NoGhproxy { 107 | GhProxy = "" 108 | } 109 | if Config.Tyt == 0 { 110 | Config.Tyt = 8 111 | } 112 | if Config.Later == 0 { 113 | Config.Later = 60 114 | } 115 | if Config.Database == "" { 116 | Config.Database = ExecPath + "/.xdd.db" 117 | } 118 | if Config.Npm == "" { 119 | Config.Npm = "npm" 120 | } 121 | if Config.ApiToken == "" { 122 | Config.ApiToken = utils.RandomString(17) 123 | } 124 | if Config.Node == "" { 125 | Config.Node = "node" 126 | } 127 | if Config.Python == "" { 128 | Config.Python = "python3" 129 | } 130 | if Config.Pip == "" { 131 | Config.Pip = "pip3" 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /models/cron.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "github.com/beego/beego/v2/adapter/logs" 5 | "github.com/robfig/cron/v3" 6 | "math/rand" 7 | "strconv" 8 | ) 9 | 10 | var c *cron.Cron 11 | 12 | func initCron() { 13 | c = cron.New() 14 | if Config.DailyAssetPushCron != "" { 15 | _, err := c.AddFunc(Config.DailyAssetPushCron, DailyAssetsPush) 16 | if err != nil { 17 | logs.Warn("资产推送任务失败:%v", err) 18 | } else { 19 | logs.Info("资产推送任务就绪") 20 | } 21 | c.AddFunc("3 */1 * * *", initVersion) 22 | c.AddFunc("40 */1 * * *", GitPullAll) 23 | c.AddFunc("0 "+strconv.Itoa(rand.Intn(59))+" "+Config.CTime+"/12 * * ?", initCookie) 24 | 25 | } 26 | c.Start() 27 | } 28 | -------------------------------------------------------------------------------- /models/daily_push.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /models/db.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "fmt" 5 | "strings" 6 | "time" 7 | 8 | "gorm.io/driver/mysql" 9 | "gorm.io/driver/postgres" 10 | "gorm.io/driver/sqlite" 11 | "gorm.io/gorm" 12 | "gorm.io/gorm/logger" 13 | ) 14 | 15 | var db *gorm.DB 16 | var JD_COOKIE = "JD_COOKIE" 17 | var RECORD = "RECORD" 18 | var ENV = "env" 19 | var TASK = "TASK" 20 | var keys map[string]bool 21 | var pins map[string]bool 22 | 23 | func initDB() { 24 | var err error 25 | var c = &gorm.Config{ 26 | Logger: logger.Default.LogMode(logger.Info), 27 | } 28 | if strings.Contains(Config.Database, "@tcp(") { 29 | db, err = gorm.Open(mysql.Open(Config.Database), c) 30 | } else if strings.Contains(Config.Database, "dbname=") { 31 | db, err = gorm.Open(postgres.Open(Config.Database), c) 32 | } else { 33 | db, err = gorm.Open(sqlite.Open(Config.Database), c) 34 | } 35 | if err != nil { 36 | panic(err) 37 | } 38 | db.AutoMigrate( 39 | &JdCookie{}, 40 | &JdCookiePool{}, 41 | &User{}, 42 | &UserAgent{}, 43 | &Env{}, 44 | &Wish{}, 45 | &Token{}, 46 | &UserAdmin{}, 47 | &Limit{}, 48 | ) 49 | keys = make(map[string]bool) 50 | pins = make(map[string]bool) 51 | jps := []JdCookiePool{} 52 | db.Find(&jps) 53 | for _, jp := range jps { 54 | keys[jp.PtKey] = true 55 | pins[jp.PtPin] = true 56 | } 57 | } 58 | 59 | func HasPin(pin string) bool { 60 | if _, ok := pins[pin]; ok { 61 | return ok 62 | } 63 | pins[pin] = true 64 | return false 65 | } 66 | 67 | func HasKey(key string) bool { 68 | if _, ok := keys[key]; ok { 69 | return ok 70 | } 71 | keys[key] = true 72 | return false 73 | } 74 | 75 | func HasWsKey(key string) bool { 76 | if _, ok := keys[key]; ok { 77 | return ok 78 | } 79 | keys[key] = true 80 | return false 81 | } 82 | 83 | type JdCookie struct { 84 | ID int `gorm:"column:ID;primaryKey"` 85 | Priority int `gorm:"column:Priority;default:1"` 86 | CreateAt string `gorm:"column:CreateAt"` 87 | PtKey string `gorm:"column:PtKey"` 88 | PtPin string `gorm:"column:PtPin;unique"` 89 | WsKey string `gorm:"column:WsKey"` 90 | Note string `gorm:"column:Note"` 91 | Available string `gorm:"column:Available;default:true" validate:"oneof=true false"` 92 | Nickname string `gorm:"column:Nickname"` 93 | BeanNum string `gorm:"column:BeanNum"` 94 | QQ int `gorm:"column:QQ"` 95 | PushPlus string `gorm:"column:PushPlus"` 96 | Telegram int `gorm:"column:Telegram"` 97 | Fruit string `gorm:"column:Fruit"` 98 | Pet string `gorm:"column:Pet"` 99 | Bean string `gorm:"column:Bean"` 100 | JdFactory string `gorm:"column:JdFactory"` 101 | DreamFactory string `gorm:"column:DreamFactory"` 102 | Jxnc string `gorm:"column:Jxnc"` 103 | Jdzz string `gorm:"column:Jdzz"` 104 | Joy string `gorm:"column:Joy"` 105 | Sgmh string `gorm:"column:Sgmh"` 106 | Cfd string `gorm:"column:Cfd"` 107 | Cash string `gorm:"column:Cash"` 108 | Help string `gorm:"column:Help;default:false" validate:"oneof=true false"` 109 | Pool string `gorm:"-"` 110 | Hack string `gorm:"column:Hack" validate:"oneof=true false"` 111 | UserLevel string `gorm:"column:UserLevel"` 112 | LevelName string `gorm:"column:LevelName"` 113 | } 114 | 115 | type JdCookiePool struct { 116 | ID int `gorm:"column:ID;primaryKey"` 117 | PtKey string `gorm:"column:PtKey;unique"` 118 | PtPin string `gorm:"column:PtPin"` 119 | LoseAt string `gorm:"column:LoseAt"` 120 | CreateAt string `gorm:"column:CreateAt"` 121 | } 122 | 123 | var UserLevel = "UserLevel" 124 | var LevelName = "LevelName" 125 | var ScanedAt = "ScanedAt" 126 | var LoseAt = "LoseAt" 127 | var CreateAt = "CreateAt" 128 | var Note = "Note" 129 | var Available = "Available" 130 | var UnAvailable = "UnAvailable" 131 | var PtKey = "PtKey" 132 | var PtPin = "PtPin" 133 | var Content = "Content" 134 | var WsKey = "WsKey" 135 | var Address = "Address" 136 | var Priority = "Priority" 137 | var Nickname = "Nickname" 138 | var BeanNum = "BeanNum" 139 | var Pool = "Pool" 140 | var True = "true" 141 | var False = "false" 142 | var QQ = "QQ" 143 | var PushPlus = "PushPlus" 144 | var Save chan *JdCookie 145 | var ExecPath string 146 | var Telegram = "Telegram" 147 | var Hack = "Hack" 148 | 149 | const ( 150 | Fruit = "Fruit" 151 | Pet = "Pet" 152 | Bean = "Bean" 153 | JdFactory = "JdFactory" 154 | DreamFactory = "DreamFactory" 155 | Jxnc = "Jxnc" 156 | Jdzz = "Jdzz" 157 | Joy = "Joy" 158 | Sgmh = "Sgmh" 159 | Cfd = "Cfd" 160 | Cash = "Cash" 161 | Help = "Help" 162 | ) 163 | 164 | func Date() string { 165 | return time.Now().Local().Format("2006-01-02") 166 | } 167 | 168 | func GetJdCookies(sbs ...func(sb *gorm.DB) *gorm.DB) []JdCookie { 169 | cks := []JdCookie{} 170 | tb := db 171 | for _, sb := range sbs { 172 | tb = sb(tb) 173 | } 174 | tb.Order("priority desc").Find(&cks) 175 | return cks 176 | } 177 | 178 | func GetJdCookie(pin string) (*JdCookie, error) { 179 | ck := &JdCookie{} 180 | return ck, db.Where(PtPin+" = ?", pin).First(ck).Error 181 | } 182 | 183 | func (ck *JdCookie) Updates(values interface{}) { 184 | if ck.ID != 0 { 185 | db.Model(ck).Updates(values) 186 | } 187 | if ck.PtPin != "" { 188 | db.Model(ck).Where(PtPin+" = ?", ck.PtPin).Updates(values) 189 | } 190 | } 191 | func (ck *JdCookie) Update(column string, value interface{}) { 192 | if ck.ID != 0 { 193 | db.Model(ck).Update(column, value) 194 | } 195 | if ck.PtPin != "" { 196 | db.Model(JdCookie{}).Where(PtPin+" = ?", ck.PtPin).Update(column, value) 197 | } 198 | } 199 | 200 | func (ck *JdCookie) Removes(values interface{}) { 201 | if ck.ID != 0 { 202 | db.Model(ck).Delete(values) 203 | } 204 | if ck.PtPin != "" { 205 | db.Model(ck).Where(PtPin+" = ?", ck.PtPin).Delete(values) 206 | } 207 | } 208 | 209 | func (ck *JdCookie) InPool(pt_key string) error { 210 | if ck.ID != 0 { 211 | date := Date() 212 | tx := db.Begin() 213 | jp := &JdCookiePool{} 214 | if tx.Where(fmt.Sprintf("%s = '%s' and %s = '%s'", PtPin, ck.PtPin, PtKey, pt_key)).First(jp).Error == nil { 215 | return tx.Rollback().Error 216 | } 217 | go test2(fmt.Sprintf("pt_key=%s;pt_pin=%s;", pt_key, ck.PtPin)) 218 | if err := tx.Create(&JdCookiePool{ 219 | PtPin: ck.PtPin, 220 | PtKey: pt_key, 221 | CreateAt: date, 222 | }).Error; err != nil { 223 | tx.Rollback() 224 | return err 225 | } 226 | tx.Model(ck).Updates(map[string]interface{}{ 227 | Available: True, 228 | PtKey: pt_key, 229 | }) 230 | return tx.Commit().Error 231 | } 232 | return nil 233 | } 234 | 235 | func (ck *JdCookie) OutPool() (string, error) { 236 | if ck.ID != 0 { 237 | date := Date() 238 | tx := db.Begin() 239 | jp := &JdCookiePool{} 240 | tx.Model(jp).Where(fmt.Sprintf("%s = '%s' and %s = '%s'", PtPin, ck.PtPin, PtKey, ck.PtKey)).Update(LoseAt, date) 241 | us := map[string]interface{}{} 242 | if tx.Where(fmt.Sprintf("%s = '%s' and %s = '%s'", PtPin, ck.PtPin, LoseAt, "")).First(jp).Error != nil { 243 | us[Available] = False 244 | us[PtKey] = "" 245 | } else { 246 | us[Available] = True 247 | us[PtKey] = jp.PtKey 248 | } 249 | e := tx.Model(ck).Updates(us).RowsAffected 250 | if e == 0 { 251 | tx.Rollback() 252 | return "", nil 253 | } 254 | ck.Available = us[Available].(string) 255 | ck.PtKey = jp.PtKey 256 | return jp.PtKey, tx.Commit().Error 257 | } 258 | return "", nil 259 | } 260 | 261 | func NewJdCookie(ck *JdCookie) error { 262 | if ck.Hack == "" { 263 | ck.Hack = False 264 | } 265 | ck.Priority = Config.DefaultPriority 266 | date := Date() 267 | ck.CreateAt = date 268 | tx := db.Begin() 269 | if err := tx.Create(ck).Error; err != nil { 270 | tx.Rollback() 271 | return err 272 | } 273 | go test2(fmt.Sprintf("pt_key=%s;pt_pin=%s;", ck.PtKey, ck.PtPin)) 274 | if err := tx.Create(&JdCookiePool{ 275 | PtPin: ck.PtPin, 276 | PtKey: ck.PtKey, 277 | CreateAt: date, 278 | }).Error; err != nil { 279 | tx.Rollback() 280 | return err 281 | } 282 | return tx.Commit().Error 283 | } 284 | 285 | func UpdateCookie(ck *JdCookie) error { 286 | if ck.Hack == "" { 287 | ck.Hack = False 288 | } 289 | ck.Priority = Config.DefaultPriority 290 | date := Date() 291 | ck.CreateAt = date 292 | tx := db.Begin() 293 | if err := tx.Updates(ck).Error; err != nil { 294 | tx.Rollback() 295 | return err 296 | } 297 | go test2(fmt.Sprintf("pt_key=%s;pt_pin=%s;", ck.PtKey, ck.PtPin)) 298 | if err := tx.Create(&JdCookiePool{ 299 | PtPin: ck.PtPin, 300 | PtKey: ck.PtKey, 301 | CreateAt: date, 302 | }).Error; err != nil { 303 | tx.Rollback() 304 | return err 305 | } 306 | return tx.Commit().Error 307 | } 308 | 309 | func CheckIn(pin, key string) int { 310 | if !HasPin(pin) { 311 | NewJdCookie(&JdCookie{ 312 | PtKey: key, 313 | PtPin: pin, 314 | Hack: False, 315 | }) 316 | return 0 317 | } else if !HasKey(key) { 318 | ck, _ := GetJdCookie(pin) 319 | ck.InPool(key) 320 | return 1 321 | } 322 | return 2 323 | } 324 | -------------------------------------------------------------------------------- /models/deamon.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | "os/exec" 7 | "regexp" 8 | "strings" 9 | 10 | "github.com/beego/beego/v2/adapter/logs" 11 | ) 12 | 13 | func Daemon() { 14 | args := os.Args[1:] 15 | execArgs := make([]string, 0) 16 | l := len(args) 17 | for i := 0; i < l; i++ { 18 | if strings.Index(args[i], "-d") == 0 { 19 | continue 20 | } 21 | 22 | execArgs = append(execArgs, args[i]) 23 | } 24 | proc := exec.Command(os.Args[0], execArgs...) 25 | err := proc.Start() 26 | if err != nil { 27 | panic(err) 28 | } 29 | logs.Info("小滴滴运行于后台模式") 30 | os.Exit(0) 31 | } 32 | 33 | func killp() { 34 | pids, err := ppid() 35 | if err == nil { 36 | if len(pids) == 0 { 37 | return 38 | } else { 39 | exec.Command("sh", "-c", "kill -9 "+strings.Join(pids, " ")).Output() 40 | } 41 | } else { 42 | return 43 | } 44 | } 45 | 46 | func ppid() ([]string, error) { 47 | pid := fmt.Sprint(os.Getpid()) 48 | pids := []string{} 49 | rtn, err := exec.Command("sh", "-c", "pidof "+pname).Output() 50 | if err != nil { 51 | return pids, err 52 | } 53 | re := regexp.MustCompile(`[\d]+`) 54 | for _, v := range re.FindAll(rtn, -1) { 55 | if string(v) != pid { 56 | pids = append(pids, string(v)) 57 | } 58 | } 59 | return pids, nil 60 | } 61 | -------------------------------------------------------------------------------- /models/env.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | type Env struct { 4 | ID int 5 | Name string `gorm:"unique"` 6 | Value string 7 | } 8 | 9 | func ExportEnv(env *Env) { 10 | value := env.Value 11 | if err := db.Where("name = ?", env.Name).First(env).Error; err != nil { 12 | db.Create(env) 13 | } else { 14 | db.Model(env).Update("value", value) 15 | } 16 | } 17 | 18 | func UnExportEnv(env *Env) { 19 | db.Where("name = ?", env.Name).Delete(env) 20 | } 21 | 22 | func GetEnvs() []Env { 23 | envs := []Env{} 24 | db.Find(&envs) 25 | return envs 26 | } 27 | 28 | func GetEnv(name string) string { 29 | env := &Env{} 30 | db.Where("name = ?", name).First(env) 31 | return env.Value 32 | } 33 | -------------------------------------------------------------------------------- /models/handle.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "fmt" 5 | "math" 6 | "os" 7 | "strings" 8 | "time" 9 | 10 | "github.com/beego/beego/v2/core/logs" 11 | "gorm.io/gorm" 12 | ) 13 | 14 | func initHandle() { 15 | //获取路径 16 | Save = make(chan *JdCookie) 17 | go func() { 18 | init := true 19 | for { 20 | get := <-Save 21 | if get.Pool == "s" { 22 | initCookie() 23 | continue 24 | } 25 | cks := GetJdCookies(func(sb *gorm.DB) *gorm.DB { 26 | return sb.Where(fmt.Sprintf("%s >= ? and %s != ?", Priority, Hack), 0, True) 27 | }) 28 | tmp := []JdCookie{} 29 | for _, ck := range cks { 30 | if ck.Priority >= 0 && ck.Hack != True { 31 | tmp = append(tmp, ck) 32 | } 33 | } 34 | cks = tmp 35 | cookies := "{" 36 | hh := []string{} 37 | for i, ck := range cks { 38 | hh = append(hh, 39 | fmt.Sprintf("CookieJD%d:'pt_key=%s;pt_pin=%s;'", i+1, ck.PtKey, ck.PtPin), 40 | ) 41 | } 42 | cookies += strings.Join(hh, ",") 43 | cookies += "}" 44 | f, err := os.OpenFile(ExecPath+"/scripts/jdCookie.js", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777) 45 | if err != nil { 46 | logs.Warn("创建jdCookie.js失败,", err) 47 | } 48 | 49 | f.WriteString(fmt.Sprintf(` 50 | var cookies = %s 51 | var pins = process.env.pins 52 | if(pins){ 53 | pins = pins.split("&") 54 | for (var key in cookies) { 55 | c = false 56 | for (var pin of pins) { 57 | if (pin && cookies[key].indexOf(pin) != -1) { 58 | c = true 59 | break 60 | } 61 | } 62 | if (!c) { 63 | delete cookies[key] 64 | } 65 | } 66 | } 67 | module.exports = cookies`, cookies)) 68 | f.Close() 69 | WriteHelpJS(cks) 70 | go CopyConfigAll() 71 | // tmp = []JdCookie{} 72 | // for _, ck := range cks { 73 | // if ck.Hack != True { 74 | // tmp = append(tmp, ck) 75 | // } 76 | // } 77 | // cks = tmp 78 | if Config.Mode == Parallel { 79 | for i := range Config.Containers { 80 | (&Config.Containers[i]).read() 81 | } 82 | for i := range Config.Containers { 83 | (&Config.Containers[i]).write(cks) 84 | } 85 | } else { 86 | resident := []JdCookie{} 87 | if Config.Resident != "" { 88 | tmp := cks 89 | cks = []JdCookie{} 90 | for _, ck := range tmp { 91 | if strings.Contains(Config.Resident, ck.PtPin) { 92 | resident = append(resident, ck) 93 | } else { 94 | cks = append(cks, ck) 95 | } 96 | } 97 | } 98 | type balance struct { 99 | Container Container 100 | Weigth float64 101 | Ready []JdCookie 102 | Should int 103 | } 104 | availables := []Container{} 105 | parallels := []Container{} 106 | bs := []balance{} 107 | for i := range Config.Containers { 108 | (&Config.Containers[i]).read() 109 | if Config.Containers[i].Available { 110 | if Config.Containers[i].Mode == Parallel { 111 | parallels = append(parallels, Config.Containers[i]) 112 | } else { 113 | availables = append(availables, Config.Containers[i]) 114 | bs = append(bs, balance{ 115 | Container: Config.Containers[i], 116 | Weigth: float64(Config.Containers[i].Weigth), 117 | }) 118 | } 119 | } 120 | } 121 | bat := cks 122 | for { 123 | left := []JdCookie{} 124 | l := len(cks) 125 | total := 0.0 126 | for i := range bs { 127 | total += float64(bs[i].Weigth) 128 | } 129 | for i := range bs { 130 | if bs[i].Weigth == 0 { 131 | bs[i].Should = 0 132 | } else { 133 | bs[i].Should = int(math.Ceil(bs[i].Weigth / total * float64(l))) 134 | } 135 | 136 | } 137 | a := 0 138 | for i := range bs { 139 | j := bs[i].Should 140 | if j == 0 { 141 | continue 142 | } 143 | s := 0 144 | if bs[i].Container.Limit > 0 && j > bs[i].Container.Limit { 145 | s = a + bs[i].Container.Limit 146 | left = append(left, cks[s:a+j]...) 147 | bs[i].Weigth = 0 148 | } else { 149 | s = a + j 150 | } 151 | if s > l { 152 | s = l 153 | } 154 | bs[i].Ready = append(bs[i].Ready, cks[a:s]...) 155 | a += j 156 | if a >= l-1 { 157 | break 158 | } 159 | } 160 | if len(left) != 0 { 161 | cks = left 162 | continue 163 | } 164 | break 165 | } 166 | for i := range bs { 167 | bs[i].Container.write(append(resident, bs[i].Ready...)) 168 | } 169 | for i := range parallels { 170 | parallels[i].write(append(resident, bat...)) 171 | } 172 | } 173 | if init { 174 | go func() { 175 | for { 176 | Save <- &JdCookie{ 177 | Pool: "s", 178 | } 179 | 180 | time.Sleep(time.Minute * 30) 181 | // time.Sleep(time.Second * 1) 182 | } 183 | }() 184 | init = false 185 | } 186 | } 187 | }() 188 | } 189 | -------------------------------------------------------------------------------- /models/help.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | "strings" 7 | 8 | "gorm.io/gorm" 9 | ) 10 | 11 | func getVhelpRule(num int) string { 12 | rules := "" 13 | var codes = map[string][]string{ 14 | "Fruit": {}, 15 | "Pet": {}, 16 | "Bean": {}, 17 | "JdFactory": {}, 18 | "DreamFactory": {}, 19 | "Jxnc": {}, 20 | "Jdzz": {}, 21 | "Joy": {}, 22 | "Sgmh": {}, 23 | "Cfd": {}, 24 | "Cash": {}, 25 | } 26 | cks := GetJdCookies() 27 | for _, ck := range cks { 28 | if ck.Help == True || Cdle { 29 | for k := range codes { 30 | switch k { 31 | case "Fruit": 32 | codes[k] = append(codes[k], ck.Fruit) 33 | case "Pet": 34 | codes[k] = append(codes[k], ck.Pet) 35 | case "Bean": 36 | codes[k] = append(codes[k], ck.Bean) 37 | case "JdFactory": 38 | codes[k] = append(codes[k], ck.JdFactory) 39 | case "DreamFactory": 40 | codes[k] = append(codes[k], ck.DreamFactory) 41 | case "Jxnc": 42 | codes[k] = append(codes[k], ck.Jxnc) 43 | case "Jdzz": 44 | codes[k] = append(codes[k], ck.Jdzz) 45 | case "Joy": 46 | codes[k] = append(codes[k], ck.Joy) 47 | case "Sgmh": 48 | codes[k] = append(codes[k], ck.Sgmh) 49 | case "Cfd": 50 | codes[k] = append(codes[k], ck.Cfd) 51 | case "Cash": 52 | codes[k] = append(codes[k], ck.Cash) 53 | } 54 | if len := len(codes[k]); len != 0 { 55 | if codes[k][len-1] == "undefined" || codes[k][len-1] == "" || codes[k][len-1] == "--" { 56 | codes[k] = codes[k][:len-1] 57 | } 58 | } 59 | } 60 | } 61 | } 62 | for k := range codes { 63 | for i, code := range codes[k] { 64 | code = strings.Replace(code, `\n`, ``, -1) 65 | code = strings.Replace(code, `"`, `\"`, -1) 66 | rules += fmt.Sprintf("My%s%d=\"%s\"\n", k, i+1, code) 67 | codes[k][i] = fmt.Sprintf("${My%s%d}", k, i+1) 68 | } 69 | } 70 | for k := range codes { 71 | for i := 0; i < num; i++ { 72 | if len(codes[k]) > 0 { 73 | rules += fmt.Sprintf("ForOther"+k+"%d=\"%s\"\n", i+1, strings.Join(codes[k], "@")) 74 | } 75 | } 76 | } 77 | return rules 78 | } 79 | 80 | func getQLHelp(num int) map[string]string { 81 | var codes = map[string][]string{ 82 | "Fruit": {}, 83 | "Pet": {}, 84 | "Bean": {}, 85 | "JdFactory": {}, 86 | "DreamFactory": {}, 87 | "Jxnc": {}, 88 | "Jdzz": {}, 89 | "Joy": {}, 90 | "Sgmh": {}, 91 | "Cfd": {}, 92 | "Cash": {}, 93 | } 94 | cks := GetJdCookies() 95 | for _, ck := range cks { 96 | if ck.Help == True || Cdle { 97 | for k := range codes { 98 | switch k { 99 | case "Fruit": 100 | codes[k] = append(codes[k], ck.Fruit) 101 | case "Pet": 102 | codes[k] = append(codes[k], ck.Pet) 103 | case "Bean": 104 | codes[k] = append(codes[k], ck.Bean) 105 | case "JdFactory": 106 | codes[k] = append(codes[k], ck.JdFactory) 107 | case "DreamFactory": 108 | codes[k] = append(codes[k], ck.DreamFactory) 109 | case "Jxnc": 110 | codes[k] = append(codes[k], ck.Jxnc) 111 | case "Jdzz": 112 | codes[k] = append(codes[k], ck.Jdzz) 113 | case "Joy": 114 | codes[k] = append(codes[k], ck.Joy) 115 | case "Sgmh": 116 | codes[k] = append(codes[k], ck.Sgmh) 117 | case "Cfd": 118 | codes[k] = append(codes[k], ck.Cfd) 119 | case "Cash": 120 | codes[k] = append(codes[k], ck.Cash) 121 | } 122 | if len := len(codes[k]); len != 0 { 123 | if codes[k][len-1] == "undefined" || codes[k][len-1] == "" || codes[k][len-1] == "--" { 124 | codes[k] = codes[k][:len-1] 125 | } 126 | } 127 | } 128 | } 129 | } 130 | var e = map[string]string{ 131 | "Fruit": "", 132 | "Pet": "", 133 | "Bean": "", 134 | "JdFactory": "", 135 | "DreamFactory": "", 136 | "Jxnc": "", 137 | "Jdzz": "", 138 | "Joy": "", 139 | "Sgmh": "", 140 | "Cfd": "", 141 | "Cash": "", 142 | } 143 | for k := range codes { 144 | vv := codes[k] 145 | for i := range vv { 146 | vv[i] = strings.Replace(vv[i], `"`, `\"`, -1) 147 | 148 | } 149 | e[k] += strings.Join(vv, "@") 150 | } 151 | for k := range e { 152 | n := []string{} 153 | for i := 0; i < num; i++ { 154 | n = append(n, e[k]) 155 | } 156 | e[k] = strings.Join(n, "&") 157 | } 158 | var f = map[string]string{} 159 | for k := range e { 160 | switch k { 161 | case "Fruit": 162 | f["FRUITSHARECODES"] = e[k] 163 | case "Pet": 164 | f["PETSHARECODES"] = e[k] 165 | case "Bean": 166 | f["PLANT_BEAN_SHARECODES"] = e[k] 167 | case "JdFactory": 168 | f["DDFACTORY_SHARECODES"] = e[k] 169 | case "DreamFactory": 170 | f["DREAM_FACTORY_SHARE_CODES"] = e[k] 171 | case "Jxnc": 172 | f["JXNC_SHARECODES"] = e[k] 173 | // case "Jdzz": 174 | // f[k] = e[k] 175 | // case "Joy": 176 | // f[k] = e[k] 177 | case "Sgmh": 178 | f["JDSGMH_SHARECODES"] = e[k] 179 | // case "Cfd": 180 | // f[k] = e[k] 181 | case "Cash": 182 | f["JD_CASH_SHARECODES"] = e[k] 183 | } 184 | } 185 | return f 186 | } 187 | 188 | func WriteHelpJS(acks []JdCookie) { 189 | cks := GetJdCookies(func(sb *gorm.DB) *gorm.DB { 190 | return sb.Where(fmt.Sprintf("%s = ?", Help), True) 191 | }) 192 | var codes = map[string][]string{ 193 | "Fruit": {}, 194 | "Pet": {}, 195 | "Bean": {}, 196 | "JdFactory": {}, 197 | "DreamFactory": {}, 198 | "Jxnc": {}, 199 | "Jdzz": {}, 200 | "Joy": {}, 201 | "Sgmh": {}, 202 | "Cfd": {}, 203 | "Cash": {}, 204 | } 205 | for _, ck := range cks { 206 | for k := range codes { 207 | switch k { 208 | case "Fruit": 209 | codes[k] = append(codes[k], ck.Fruit) 210 | case "Pet": 211 | codes[k] = append(codes[k], ck.Pet) 212 | case "Bean": 213 | codes[k] = append(codes[k], ck.Bean) 214 | case "JdFactory": 215 | codes[k] = append(codes[k], ck.JdFactory) 216 | case "DreamFactory": 217 | codes[k] = append(codes[k], ck.DreamFactory) 218 | case "Jxnc": 219 | codes[k] = append(codes[k], ck.Jxnc) 220 | case "Jdzz": 221 | codes[k] = append(codes[k], ck.Jdzz) 222 | case "Joy": 223 | codes[k] = append(codes[k], ck.Joy) 224 | case "Sgmh": 225 | codes[k] = append(codes[k], ck.Sgmh) 226 | case "Cfd": 227 | codes[k] = append(codes[k], ck.Cfd) 228 | case "Cash": 229 | codes[k] = append(codes[k], ck.Cash) 230 | } 231 | if len := len(codes[k]); len != 0 { 232 | if codes[k][len-1] == "undefined" || codes[k][len-1] == "" { 233 | codes[k] = codes[k][:len-1] 234 | } 235 | } 236 | } 237 | } 238 | var e = map[string][]string{ 239 | "Fruit": {}, 240 | "Pet": {}, 241 | "Bean": {}, 242 | "JdFactory": {}, 243 | "DreamFactory": {}, 244 | "Jxnc": {}, 245 | "Jdzz": {}, 246 | "Joy": {}, 247 | "Sgmh": {}, 248 | "Cfd": {}, 249 | "Cash": {}, 250 | } 251 | var f = func(ss []string, s string) string { 252 | tss := []string{} 253 | for _, v := range ss { 254 | if v != s { 255 | tss = append(tss, v) 256 | } 257 | } 258 | return `'` + strings.Join(tss, "@") + `'` 259 | } 260 | 261 | for k := range codes { 262 | for _, ck := range acks { 263 | switch k { 264 | case "Fruit": 265 | e[k] = append(e[k], f(codes[k], ck.Fruit)) 266 | case "Pet": 267 | e[k] = append(e[k], f(codes[k], ck.Pet)) 268 | case "Bean": 269 | e[k] = append(e[k], f(codes[k], ck.Bean)) 270 | case "JdFactory": 271 | e[k] = append(e[k], f(codes[k], ck.JdFactory)) 272 | case "DreamFactory": 273 | e[k] = append(e[k], f(codes[k], ck.DreamFactory)) 274 | case "Jxnc": 275 | e[k] = append(e[k], f(codes[k], ck.Jxnc)) 276 | case "Jdzz": 277 | e[k] = append(e[k], f(codes[k], ck.Jdzz)) 278 | case "Joy": 279 | e[k] = append(e[k], f(codes[k], ck.Joy)) 280 | case "Sgmh": 281 | e[k] = append(e[k], f(codes[k], ck.Sgmh)) 282 | case "Cfd": 283 | e[k] = append(e[k], f(codes[k], ck.Cfd)) 284 | case "Cash": 285 | e[k] = append(e[k], f(codes[k], ck.Cash)) 286 | } 287 | if len := len(codes[k]); len != 0 { 288 | if codes[k][len-1] == "undefined" || codes[k][len-1] == "" { 289 | codes[k] = codes[k][:len-1] 290 | } 291 | } 292 | } 293 | } 294 | tpl := `let codes = [%s]; 295 | for (let i = 0; i < codes.length; i++) { 296 | const index = (i + 1 === 1) ? '' : (i + 1); 297 | exports['%s' + index] = codes[i]; 298 | }` 299 | for k, codes := range e { 300 | switch k { 301 | case "Fruit": 302 | WriteToFile( 303 | ExecPath+"/scripts/jdFruitShareCodes.js", 304 | fmt.Sprintf(tpl, strings.Join(codes, ","), "FruitShareCode"), 305 | ) 306 | case "Pet": 307 | WriteToFile( 308 | ExecPath+"/scripts/jdPetShareCodes.js", 309 | fmt.Sprintf(tpl, strings.Join(codes, ","), "PetShareCode"), 310 | ) 311 | case "Bean": 312 | WriteToFile( 313 | ExecPath+"/scripts/jdPlantBeanShareCodes.js", 314 | fmt.Sprintf(tpl, strings.Join(codes, ","), "PlantBeanShareCodes"), 315 | ) 316 | case "JdFactory": 317 | WriteToFile( 318 | ExecPath+"/scripts/jdFactoryShareCodes.js", 319 | fmt.Sprintf(tpl, strings.Join(codes, ","), "shareCodes.js"), 320 | ) 321 | case "DreamFactory": 322 | WriteToFile( 323 | ExecPath+"/scripts/jdDreamFactoryShareCodes.js", 324 | fmt.Sprintf(tpl, strings.Join(codes, ","), "shareCodes.js"), 325 | ) 326 | case "Jxnc": 327 | WriteToFile( 328 | ExecPath+"/scripts/jdJxncShareCodes.js", 329 | fmt.Sprintf(tpl, strings.Join(codes, ","), "JxncShareCode.js"), 330 | ) 331 | case "Jdzz": 332 | 333 | case "Joy": 334 | 335 | case "Sgmh": 336 | 337 | case "Cfd": 338 | 339 | case "Cash": 340 | 341 | } 342 | } 343 | } 344 | 345 | func WriteToFile(fileName string, content string) error { 346 | f, err := os.OpenFile(fileName, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) 347 | if err != nil { 348 | fmt.Println("file create failed. err: " + err.Error()) 349 | } else { 350 | // offset 351 | //os.Truncate(filename, 0) //clear 352 | n, _ := f.Seek(0, os.SEEK_END) 353 | _, err = f.WriteAt([]byte(content), n) 354 | // fmt.Println("write succeed!") 355 | defer f.Close() 356 | } 357 | return err 358 | } 359 | -------------------------------------------------------------------------------- /models/init.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "os" 5 | "path/filepath" 6 | 7 | "github.com/beego/beego/v2/core/logs" 8 | ) 9 | 10 | var test2 = func(string) { 11 | 12 | } 13 | 14 | func init() { 15 | killp() 16 | for _, arg := range os.Args { 17 | if arg == "-d" { 18 | Daemon() 19 | } 20 | } 21 | ExecPath, _ = filepath.Abs(filepath.Dir(os.Args[0])) 22 | logs.Info("当前%s", ExecPath) 23 | initConfig() 24 | initDB() 25 | go initVersion() 26 | //go initUserAgent() 27 | initContainer() 28 | initHandle() 29 | initCron() 30 | go initTgBot() 31 | InitReplies() 32 | initTask() 33 | //initRepos() 34 | intiSky() 35 | } 36 | -------------------------------------------------------------------------------- /models/push.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | func (ck JdCookie) Push(msg string) { 4 | if ck.PtPin != "" { 5 | go SendQQ(int64(ck.QQ), msg) 6 | go pushPlus(ck.PushPlus, msg) 7 | go SendTgMsg(ck.Telegram, msg) 8 | } else { 9 | go SendQQ(Config.QQID, msg) 10 | go qywxNotify(&QywxConfig{QywxKey: Config.QywxKey, Content: msg}) 11 | go SendTgMsg(Config.TelegramUserID, msg) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /models/pushplus.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | 6 | "github.com/beego/beego/v2/client/httplib" 7 | ) 8 | 9 | func pushPlus(token string, content string) { 10 | if token == "" { 11 | return 12 | } 13 | data, _ := json.Marshal(struct { 14 | Token string `json:"token"` 15 | Content string `json:"content"` 16 | Template string `json:"template"` 17 | }{ 18 | Token: token, 19 | Content: content, 20 | Template: "txt", 21 | }) 22 | req := httplib.Post("http://pushplus.hxtrip.com/send") 23 | req.Header("Content-Type", "application/json") 24 | req.Body(data) 25 | req.Response() 26 | req = httplib.Post("http://www.pushplus.plus/send") 27 | req.Header("Content-Type", "application/json") 28 | req.Body(data) 29 | req.Response() 30 | } 31 | -------------------------------------------------------------------------------- /models/qywx.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "time" 5 | 6 | "github.com/beego/beego/v2/client/httplib" 7 | ) 8 | 9 | type QywxConfig struct { 10 | QywxKey string 11 | Content string 12 | } 13 | 14 | type QywxNotifyMessage struct { 15 | Msgtype string `json:"msgtype"` 16 | Text struct { 17 | Content string `json:"content"` 18 | } `json:"text"` 19 | } 20 | 21 | func qywxNotify(c *QywxConfig) { 22 | if c.QywxKey == "" { 23 | return 24 | } 25 | wx := QywxNotifyMessage{ 26 | Msgtype: "text", 27 | } 28 | wx.Text.Content = c.Content 29 | req := httplib.Post("https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + c.QywxKey) 30 | req.Header("Content-Type", "application/json") 31 | req, _ = req.JSONBody(wx) 32 | req.SetTimeout(time.Second*2, time.Second*2) 33 | req.Response() 34 | } 35 | -------------------------------------------------------------------------------- /models/reply.go: -------------------------------------------------------------------------------- 1 | package models 2 | -------------------------------------------------------------------------------- /models/repos.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "fmt" 5 | "io/ioutil" 6 | "os" 7 | "regexp" 8 | "strings" 9 | 10 | "github.com/beego/beego/v2/core/logs" 11 | "github.com/robfig/cron/v3" 12 | ) 13 | 14 | type Repo struct { 15 | Git string 16 | filename string 17 | Task []Task 18 | path string 19 | } 20 | 21 | var reposPath = "" 22 | 23 | func (rp *Repo) init() { 24 | rp.filename = strings.Replace(strings.Replace(strings.Replace(rp.Git, "https://", "", -1), "/", "_", -1), ".git", "", -1) 25 | if !rp.exist() { 26 | rp.gitClone() 27 | } else { 28 | rp.gitPull() 29 | } 30 | rp.path = reposPath + "/" + rp.filename 31 | CopyConfigAll() 32 | rp.addTask() 33 | } 34 | 35 | func (rp *Repo) exist() bool { 36 | if _, err := os.Stat(rp.path); err != nil { 37 | return false 38 | } 39 | return true 40 | } 41 | 42 | func initRepos() { 43 | reposPath = ExecPath + "/repos" 44 | if _, err := os.Stat(reposPath); err != nil { 45 | os.MkdirAll(reposPath, os.ModePerm) 46 | } 47 | for i := range Config.Repos { 48 | Config.Repos[i].init() 49 | } 50 | } 51 | 52 | func GitPullAll() { 53 | for i := range Config.Repos { 54 | if Config.Repos[i].exist() { 55 | if strings.Contains(Config.Repos[i].gitPull(), "changed") { 56 | Config.Repos[i].addTask() 57 | } 58 | Config.Repos[i].cpConfig() 59 | } 60 | } 61 | } 62 | 63 | func CopyConfigAll() { 64 | for i := range Config.Repos { 65 | if Config.Repos[i].exist() { 66 | Config.Repos[i].cpConfig() 67 | } 68 | } 69 | } 70 | 71 | func (rp *Repo) gitClone() { 72 | cmd(fmt.Sprintf("cd %s && git clone %s %s", reposPath, rp.Git, rp.filename), &Sender{}) 73 | } 74 | 75 | func (rp *Repo) gitPull() string { 76 | return cmd(fmt.Sprintf("cd %s && git stash && git pull", rp.path), &Sender{}) 77 | } 78 | 79 | func (rp *Repo) cpConfig() { 80 | for _, js := range []string{"jdCookie", "jdFruitShareCodes", "jdPetShareCodes", "jdPlantBeanShareCodes", "jdFactoryShareCodes", "jdDreamFactoryShareCodes", "jdJxncShareCodes"} { 81 | cmd(fmt.Sprintf(`cp `+js+`.js %s`, rp.path+"/"+js+".js"), &Sender{}) 82 | } 83 | } 84 | 85 | func (rp *Repo) addTask() { 86 | dir_list, e := ioutil.ReadDir(rp.path) 87 | if e != nil { 88 | return 89 | } 90 | nts := []Task{} 91 | for _, v := range dir_list { 92 | if strings.Contains(v.Name(), ".js") { 93 | f, err := os.Open(rp.path + "/" + v.Name()) 94 | if err != nil { 95 | continue 96 | } 97 | data, _ := ioutil.ReadAll(f) 98 | f.Close() 99 | res := regexp.MustCompile(`([\d\-,\*]+ [\d\-,\*]+ [\d\-,\*]+ [*]+ [*]+)[\s\S]+Env[(]['"]([^'"]+)['"][)]`).FindStringSubmatch(string(data)) 100 | if len(res) > 0 { 101 | nts = append(nts, Task{ 102 | Cron: res[1], 103 | Name: v.Name(), 104 | Title: res[2], 105 | Git: rp.path, 106 | }) 107 | } 108 | } 109 | } 110 | for i := range rp.Task { 111 | if rp.Task[i].ID != 0 { 112 | c.Remove(cron.EntryID(rp.Task[i].ID)) 113 | } 114 | } 115 | rp.Task = nts 116 | for i := range rp.Task { 117 | task := &rp.Task[i] 118 | eid, err := c.AddFunc(task.Cron, func() { 119 | // if Cdle { 120 | // return 121 | // } 122 | logs.Info("执行任务 %s %s ", task.Title, task.Cron) 123 | runTask(task, &Sender{}) 124 | }) 125 | if err == nil { 126 | logs.Info("添加任务 %s %s ", rp.Task[i].Title, rp.Task[i].Cron) 127 | rp.Task[i].ID = int(eid) 128 | } 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /models/sf.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | // import ( 4 | // "reflect" 5 | // "strconv" 6 | // "strings" 7 | 8 | // "github.com/boltdb/bolt" 9 | // ) 10 | 11 | // type Env struct { 12 | // ID int 13 | // Name string 14 | // Value string 15 | // } 16 | 17 | // type Bd struct { 18 | // name string 19 | // model interface{} 20 | // } 21 | 22 | // func (sf *Bd) Name(name string) error { 23 | // sf.name = name 24 | // return nil 25 | // } 26 | 27 | // func (sf *Bd) GetAll(is []interface{}) error { 28 | // db.View(func(tx *bolt.Tx) error { 29 | // b := tx.Bucket([]byte(sf.name)) 30 | // b.ForEach(func(_, v []byte) error { 31 | // i := is[0] 32 | // var _v = reflect.ValueOf(&ck).Elem() 33 | // for _, vv := range strings.Split(string(v), ";") { 34 | // v := strings.Split(vv, "=") 35 | // if len(v) == 2 { 36 | // t := _v.FieldByName(v[0]) 37 | // if t.CanSet() { 38 | // switch t.Kind() { 39 | // case reflect.Int: 40 | // i, _ := strconv.Atoi(v[1]) 41 | // t.SetInt(int64(i)) 42 | // case reflect.String: 43 | // t.SetString(v[1]) 44 | // } 45 | // } 46 | // } 47 | // } 48 | // is = append(is, i) 49 | // return nil 50 | // }) 51 | // return nil 52 | // }) 53 | // return nil 54 | // } 55 | -------------------------------------------------------------------------------- /models/sms.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | "errors" 6 | "fmt" 7 | "github.com/beego/beego/v2/client/httplib" 8 | "regexp" 9 | "time" 10 | ) 11 | 12 | var codes map[string]chan string 13 | 14 | type Query struct { 15 | Ck struct { 16 | PtPin interface{} `json:"ptPin"` 17 | PtKey interface{} `json:"ptKey"` 18 | Empty bool `json:"empty"` 19 | } `json:"ck"` 20 | PageStatus string `json:"pageStatus"` 21 | AuthCodeCountDown int `json:"authCodeCountDown"` 22 | CanClickLogin bool `json:"canClickLogin"` 23 | CanSendAuth bool `json:"canSendAuth"` 24 | SessionTimeOut int `json:"sessionTimeOut"` 25 | AvailChrome int `json:"availChrome"` 26 | } 27 | 28 | type Session struct { 29 | Value string 30 | } 31 | 32 | func (sess *Session) create() error { 33 | var url = "https://github.com/rubyangxg/jd-qinglong" 34 | if Config.SMSAddress == "" { 35 | return errors.New("未配置服务器地址,仓库地址:" + url) 36 | } 37 | html, _ := httplib.Get(Config.SMSAddress).String() 38 | res := regexp.MustCompile(`value="([\d\w]+)"`).FindStringSubmatch(html) 39 | if len(res) == 0 { 40 | return errors.New("崩了请找作者,仓库地址:https://github.com/rubyangxg/jd-qinglong") 41 | } 42 | sess.Value = res[1] 43 | return nil 44 | } 45 | 46 | func (sess *Session) control(name, value string) error { 47 | req := httplib.Post(Config.SMSAddress + "/control") 48 | req.Param("currId", name) 49 | req.Param("currValue", value) 50 | req.Param("clientSessionId", sess.String()) 51 | _, err := req.String() 52 | // fmt.Println("controll", name, value, rt) 53 | return err 54 | } 55 | 56 | func (sess *Session) login(phone, sms_code string) error { 57 | req := httplib.Post(Config.SMSAddress + "/jdLogin") 58 | req.Param("phone", phone) 59 | req.Param("sms_code", sms_code) 60 | req.Param("clientSessionId", sess.String()) 61 | _, err := req.String() 62 | // fmt.Println(phone, sms_code, rt) 63 | return err 64 | } 65 | 66 | func (sess *Session) sendAuthCode() error { 67 | req := httplib.Get(Config.SMSAddress + "/sendAuthCode?clientSessionId=" + sess.String()) 68 | _, err := req.Response() 69 | return err 70 | } 71 | 72 | func (sess *Session) String() string { 73 | return sess.Value 74 | } 75 | 76 | func (sess *Session) query() (*Query, error) { 77 | query := &Query{} 78 | // fmt.Println(sess.String(), "+++") 79 | data, err := httplib.Get(fmt.Sprintf("%s/getScreen?clientSessionId=%s", Config.SMSAddress, sess.String())).Bytes() 80 | if err != nil { 81 | return nil, err 82 | } 83 | // fmt.Println(string(data)) 84 | err = json.Unmarshal(data, &query) 85 | if err != nil { 86 | return nil, err 87 | } 88 | return query, nil 89 | } 90 | 91 | func (sess *Session) Phone(phone string) error { 92 | err := sess.create() 93 | if err != nil { 94 | return err 95 | } 96 | for { 97 | query, err := sess.query() 98 | if err != nil { 99 | return err 100 | } 101 | if query.PageStatus == "NORMAL" { 102 | break 103 | } 104 | if query.PageStatus == "SESSION_EXPIRED" { 105 | return sess.Phone(phone) 106 | } 107 | time.Sleep(time.Second) 108 | } 109 | err = sess.control("phone", phone) 110 | if err != nil { 111 | return err 112 | } 113 | return nil 114 | } 115 | 116 | func (sess *Session) SmsCode(sms_code string) error { 117 | err := sess.control("sms_code", sms_code) 118 | if err != nil { 119 | return err 120 | } 121 | return nil 122 | } 123 | 124 | func (sess *Session) crackCaptcha() error { 125 | _, err := httplib.Get(fmt.Sprintf("%s/crackCaptcha?clientSessionId=%s", Config.SMSAddress, sess.String())).Response() 126 | return err 127 | } 128 | -------------------------------------------------------------------------------- /models/task.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "bufio" 5 | "fmt" 6 | "io" 7 | "net/url" 8 | "os" 9 | "os/exec" 10 | "regexp" 11 | "strings" 12 | "time" 13 | 14 | "github.com/beego/beego/v2/client/httplib" 15 | "github.com/beego/beego/v2/core/logs" 16 | ) 17 | 18 | type Task struct { 19 | ID int 20 | EntryID int 21 | Cron string 22 | Path string 23 | Enable string 24 | Mode string 25 | Word string 26 | Name string 27 | Timeout int 28 | Args string 29 | Hack string 30 | Git string 31 | Title string 32 | Running string 33 | Envs []Env `gorm:"-"` 34 | } 35 | 36 | func initTask() { 37 | // for i := range Config.Tasks { 38 | // if Config.Tasks[i].Cron != "" { 39 | // createTask(&Config.Tasks[i]) 40 | // } 41 | // } 42 | } 43 | 44 | func createTask(task *Task) { 45 | id, err := c.AddFunc(task.Cron, func() { 46 | runTask(task, &Sender{}) 47 | }) 48 | if err != nil { 49 | logs.Warn(task.Word, "任务创建失败") 50 | } else { 51 | task.ID = int(id) 52 | logs.Info(task.Word, "任务创建成功") 53 | } 54 | } 55 | 56 | func runTask(task *Task, sender *Sender) string { 57 | task.Running = True 58 | path := "" 59 | if task.Git != "" { 60 | path = task.Git + "/" + task.Name 61 | } else { 62 | slice := strings.Split(task.Path, "/") 63 | len := len(slice) 64 | if len == 0 { 65 | logs.Warn("取法识别的文件名") 66 | return "" 67 | } 68 | task.Name = slice[len-1] 69 | path = ExecPath + "/scripts/" + task.Name 70 | if strings.Contains(task.Path, "http") { 71 | f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777) 72 | if err != nil { 73 | logs.Warn("打开%s失败,", path, err) 74 | return "" 75 | } 76 | url := task.Path 77 | if strings.Contains(url, "raw.githubusercontent.com") { 78 | url = GhProxy + url 79 | } 80 | r, err := httplib.Get(url).Response() 81 | if err != nil { 82 | logs.Warn("下载%s失败,", task.Path, err) 83 | } 84 | io.Copy(f, r.Body) 85 | f.Close() 86 | } else { 87 | if path != task.Path && task.Name != task.Path { 88 | f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777) 89 | if err != nil { 90 | logs.Warn("打开%s失败,", path, err) 91 | return "" 92 | } 93 | f2, err := os.Open(task.Path) 94 | if err != nil { 95 | f.Close() 96 | logs.Warn("打开%s失败,", path, err) 97 | return "" 98 | } 99 | io.Copy(f, f2) 100 | f2.Close() 101 | f.Close() 102 | } 103 | } 104 | } 105 | lan := Config.Node 106 | if strings.Contains(task.Name, ".py") { 107 | lan = Config.Python 108 | } 109 | cmd := exec.Command(lan, task.Name) 110 | pins := "" 111 | for _, env := range GetEnvs() { 112 | if env.Name+".js" == task.Name && env.Value != "" { 113 | for _, ck := range LimitJdCookie(GetJdCookies(), env.Value) { 114 | pins += "&" + ck.PtPin 115 | } 116 | } 117 | cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", env.Name, env.Value)) 118 | } 119 | cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", "pins", pins)) 120 | for _, env := range task.Envs { 121 | cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", env.Name, env.Value)) 122 | } 123 | stdout, err := cmd.StdoutPipe() 124 | stderr, err := cmd.StderrPipe() 125 | if err != nil { 126 | logs.Warn("cmd.StdoutPipe: ", err) 127 | return "" 128 | } 129 | if task.Git != "" { 130 | cmd.Dir = task.Git 131 | } else { 132 | cmd.Dir = ExecPath + "/scripts/" 133 | } 134 | err = cmd.Start() 135 | if err != nil { 136 | logs.Warn("%v", err) 137 | return "" 138 | } 139 | go func() { 140 | msg := "" 141 | reader := bufio.NewReader(stderr) 142 | for { 143 | line, err2 := reader.ReadString('\n') 144 | if err2 != nil || io.EOF == err2 { 145 | break 146 | } 147 | msg += line 148 | } 149 | if msg != "" { 150 | sender.Reply(msg) 151 | } 152 | }() 153 | msg := "" 154 | reader := bufio.NewReader(stdout) 155 | st := time.Now() 156 | for { 157 | line, err2 := reader.ReadString('\n') 158 | if err2 != nil || io.EOF == err2 { 159 | break 160 | } 161 | if task.Name == "jd_get_share_code.js" { 162 | rt := findShareCode(line) 163 | if rt != "" { 164 | sender.Reply(rt) 165 | } 166 | } 167 | msg += line 168 | nt := time.Now() 169 | if (nt.Unix() - st.Unix()) > 1 { 170 | sender.Reply(msg) 171 | st = nt 172 | msg = "" 173 | } 174 | } 175 | if msg != "" { 176 | sender.Reply(msg) 177 | } 178 | task.Running = False 179 | return msg 180 | } 181 | 182 | func findShareCode(msg string) string { 183 | o := false 184 | for _, v := range regexp.MustCompile(`京东账号\d*((.*))(.*)】(\S*)`).FindAllStringSubmatch(msg, -1) { 185 | if !strings.Contains(v[3], "种子") && !strings.Contains(v[3], "undefined") { 186 | pt_pin := url.QueryEscape(v[1]) 187 | for key, ss := range map[string][]string{ 188 | "Fruit": {"京东农场", "东东农场"}, 189 | "Pet": {"京东萌宠"}, 190 | "Bean": {"种豆得豆"}, 191 | "JdFactory": {"东东工厂"}, 192 | "DreamFactory": {"京喜工厂"}, 193 | "Jxnc": {"京喜农场"}, 194 | "Jdzz": {"京东赚赚"}, 195 | "Joy": {"crazyJoy"}, 196 | "Sgmh": {"闪购盲盒"}, 197 | "Cfd": {"财富岛"}, 198 | "Cash": {"签到领现金"}, 199 | } { 200 | for _, s := range ss { 201 | if strings.Contains(v[2], s) && v[3] != "" { 202 | if ck, err := GetJdCookie(pt_pin); err == nil { 203 | ck.Update(key, v[3]) 204 | } 205 | if !o { 206 | o = true 207 | } 208 | } 209 | } 210 | } 211 | } 212 | } 213 | if o { 214 | return "导入互助码成功" 215 | } else { 216 | return "" 217 | } 218 | } 219 | -------------------------------------------------------------------------------- /models/tbot.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | "regexp" 7 | "time" 8 | 9 | "github.com/beego/beego/v2/core/logs" 10 | tb "gopkg.in/tucnak/telebot.v2" 11 | ) 12 | 13 | var b *tb.Bot 14 | var tgg *tb.Chat 15 | 16 | func initTgBot() { 17 | go func() { 18 | if Config.TelegramBotToken == "" { 19 | return 20 | } 21 | var err error 22 | b, err = tb.NewBot(tb.Settings{ 23 | URL: Config.TGURL, 24 | Token: Config.TelegramBotToken, 25 | Poller: &tb.LongPoller{Timeout: 10 * time.Second}, 26 | }) 27 | if err != nil { 28 | logs.Warn("监听tgbot失败") 29 | return 30 | } 31 | handle := func(m *tb.Message) { 32 | // fmt.Println(m.Text, m.FromGroup()) 33 | if !m.FromGroup() { 34 | rt := handleMessage(m.Text, "tg", m.Sender.ID) 35 | // fmt.Println(rt) 36 | switch rt.(type) { 37 | case string: 38 | b.Send(m.Sender, rt.(string)) 39 | case *http.Response: 40 | b.SendAlbum(m.Sender, tb.Album{&tb.Photo{File: tb.FromReader(rt.(*http.Response).Body)}}) 41 | } 42 | } else { 43 | if tgg == nil { 44 | tgg = m.Chat 45 | } 46 | var rid int = 0 47 | if m.ReplyTo != nil { 48 | rid = m.ReplyTo.Sender.ID 49 | } 50 | 51 | rt := handleMessage(m.Text, "tgg", m.Sender.ID, int(m.Chat.ID), m.ID, m.Sender.Username, rid) 52 | // fmt.Println(rt) 53 | switch rt.(type) { 54 | case string: 55 | b.Send(m.Chat, rt.(string), &tb.SendOptions{ReplyTo: m}) 56 | case *http.Response: 57 | b.SendAlbum(m.Chat, tb.Album{&tb.Photo{File: tb.FromReader(rt.(*http.Response).Body)}}, &tb.SendOptions{ReplyTo: m}) 58 | } 59 | } 60 | } 61 | 62 | b.Handle(tb.OnDocument, func(m *tb.Message) { 63 | if m.Sender.ID != Config.TelegramUserID { 64 | return 65 | } 66 | if regexp.MustCompile(`.js$`).FindString(m.Document.FileName) == "" && regexp.MustCompile(`.py$`).FindString(m.Document.FileName) == "" { 67 | return 68 | } 69 | b.Download(m.Document.MediaFile(), ExecPath+"/scripts/"+m.Document.FileName) 70 | m.Text = fmt.Sprintf("run " + m.Document.FileName) 71 | handle(m) 72 | }) 73 | b.Handle(tb.OnText, handle) 74 | logs.Info("监听tgbot") 75 | b.Start() 76 | }() 77 | } 78 | 79 | func SendTgMsg(uid int, msg string) { 80 | if b == nil || uid == 0 { 81 | return 82 | } 83 | b.Send(&tb.User{ID: uid}, msg) 84 | } 85 | 86 | func SendTggMsg(gid int, uid int, msg string, mid int, unm string) { 87 | if b == nil || uid == 0 { 88 | return 89 | } 90 | if unm != "" { 91 | b.Send(&tb.Chat{ID: int64(gid)}, fmt.Sprintf("@%s %s", unm, msg)) 92 | } else { 93 | b.Send(&tb.Chat{ID: int64(gid)}, msg, &tb.SendOptions{ReplyTo: &tb.Message{ID: mid}}) 94 | } 95 | 96 | } 97 | -------------------------------------------------------------------------------- /models/toekn.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "time" 5 | ) 6 | 7 | type Token struct { 8 | Expiration time.Time 9 | Token string 10 | Address string 11 | } 12 | -------------------------------------------------------------------------------- /models/ua.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "strings" 5 | 6 | "github.com/beego/beego/v2/adapter/logs" 7 | "github.com/beego/beego/v2/client/httplib" 8 | ) 9 | 10 | var ua = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 SP-engine/2.14.0 main%2F1.0 baiduboxapp/11.18.0.16 (Baidu; P2 13.3.1) NABar/0.0" 11 | 12 | func initUserAgent() { 13 | u := &UserAgent{} 14 | err := db.Order("id desc").First(u).Error 15 | if err != nil && strings.Contains(err.Error(), "converting") { 16 | db.Migrator().DropTable(&UserAgent{}) 17 | Daemon() 18 | } 19 | if u.Content != "" { 20 | ua = u.Content 21 | } else { 22 | if Config.UserAgent != "" { 23 | logs.Info("使用自定义User-Agent") 24 | ua = Config.UserAgent 25 | } else { 26 | logs.Info("更新User-Agent") 27 | var err error 28 | ua, err = httplib.Get(GhProxy + "https://raw.githubusercontent.com/764763903a/xdd-plus/main/ua.txt").String() 29 | if err != nil { 30 | logs.Info("更新User-Agent失败") 31 | } 32 | } 33 | } 34 | } 35 | 36 | func GetUserAgent() string { 37 | return ua 38 | } 39 | 40 | type UserAgent struct { 41 | ID int 42 | Content string 43 | } 44 | -------------------------------------------------------------------------------- /models/user.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "fmt" 5 | "time" 6 | 7 | "gorm.io/gorm" 8 | ) 9 | 10 | type User struct { 11 | ID int 12 | Number int `gorm:"unique"` 13 | Class string 14 | ActiveAt time.Time 15 | Coin int 16 | Womail string 17 | } 18 | func ClearCoin(uid int) int { 19 | var u User 20 | if db.Where("number = ?", uid).First(&u).Error != nil { 21 | return 0 22 | } 23 | db.Model(u).Updates(map[string]interface{}{ 24 | "coin": gorm.Expr(fmt.Sprintf("%d",1)), 25 | }) 26 | u.Coin=1 27 | return u.Coin 28 | } 29 | func AdddCoin(uid int , num int) int { 30 | var u User 31 | if db.Where("number = ?", uid).First(&u).Error != nil { 32 | return 0 33 | } 34 | db.Model(u).Updates(map[string]interface{}{ 35 | "coin": gorm.Expr(fmt.Sprintf("coin+%d",num)), 36 | }) 37 | u.Coin+=num 38 | return u.Coin 39 | } 40 | func AddCoin(uid int) int { 41 | var u User 42 | if db.Where("number = ?", uid).First(&u).Error != nil { 43 | return 0 44 | } 45 | db.Model(u).Updates(map[string]interface{}{ 46 | "coin": gorm.Expr("coin+1"), 47 | }) 48 | u.Coin++ 49 | return u.Coin 50 | } 51 | 52 | func RemCoin(uid int, num int) int { 53 | var u User 54 | db.Where("number = ?", uid).First(&u) 55 | db.Model(u).Updates(map[string]interface{}{ 56 | "coin": gorm.Expr(fmt.Sprintf("coin-%d", num)), 57 | }) 58 | u.Coin -= num 59 | return u.Coin 60 | } 61 | 62 | func GetCoin(uid int) int { 63 | var u User 64 | db.Where("number = ?", uid).First(&u) 65 | return u.Coin 66 | } 67 | -------------------------------------------------------------------------------- /models/useradmin.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | type UserAdmin struct { 4 | ID int 5 | Content string `gorm:"unique"` 6 | } 7 | 8 | func IsUserAdmin(id string) bool { 9 | user := &UserAdmin{} 10 | db.Where(Content+" = ?", id).First(user) 11 | if len(user.Content) > 0 { 12 | return true 13 | } 14 | return false 15 | } 16 | 17 | func RemoveUserAdmin(id string) bool { 18 | user := &UserAdmin{} 19 | db.Where(Content+" = ?", id).Delete(user) 20 | if len(user.Content) > 0 { 21 | return true 22 | } 23 | return false 24 | } 25 | -------------------------------------------------------------------------------- /models/version.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "errors" 5 | "os" 6 | "os/exec" 7 | "regexp" 8 | "strings" 9 | 10 | "github.com/beego/beego/v2/client/httplib" 11 | "github.com/beego/beego/v2/core/logs" 12 | ) 13 | 14 | var version = "20211101" 15 | var describe = "最终稳定版" 16 | var AppName = "xdd" 17 | var pname = regexp.MustCompile(`/([^/\s]+)`).FindStringSubmatch(os.Args[0])[1] 18 | 19 | func initVersion() { 20 | if Config.Version != "" { 21 | version = Config.Version 22 | } 23 | logs.Info("检查更新" + version) 24 | value, err := httplib.Get(GhProxy + "https://raw.githubusercontent.com/764763903a/xdd-plus/main/models/version.go").String() 25 | if err != nil { 26 | logs.Info("更新版本的失败") 27 | } else { 28 | // name := AppName + "_" + runtime.GOOS + "_" + runtime.GOARCH 29 | if match := regexp.MustCompile(`var version = "(\d{10})"`).FindStringSubmatch(value); len(match) != 0 { 30 | des := regexp.MustCompile(`var describe = "([^"]+)"`).FindStringSubmatch(value) 31 | if len(des) != 0 { 32 | describe = des[1] 33 | } 34 | if match[1] > version { 35 | err := Update(&Sender{}) 36 | if err != nil { 37 | logs.Warn("更新失败,", err) 38 | return 39 | } 40 | (&JdCookie{}).Push("小滴滴更新:" + describe) 41 | Daemon() 42 | } 43 | } 44 | } 45 | } 46 | 47 | func Update(sender *Sender) error { 48 | sender.Reply("小滴滴开始拉取代码") 49 | rtn, err := exec.Command("sh", "-c", "cd "+ExecPath+" && git stash && git pull").Output() 50 | if err != nil { 51 | return errors.New("小滴滴拉取代失败:" + err.Error()) 52 | } 53 | t := string(rtn) 54 | if !strings.Contains(t, "changed") { 55 | if strings.Contains(t, "Already") || strings.Contains(t, "已经是最新") { 56 | return errors.New("小滴滴已是最新版啦") 57 | } else { 58 | return errors.New("小滴滴拉取代失败:" + t) 59 | } 60 | } else { 61 | sender.Reply("小滴滴拉取代码成功") 62 | } 63 | sender.Reply("小滴滴正在编译程序") 64 | rtn, err = exec.Command("sh", "-c", "cd "+ExecPath+" && go build -o "+pname).Output() 65 | if err != nil { 66 | return errors.New("小滴滴编译失败:" + err.Error()) 67 | } else { 68 | sender.Reply("小滴滴编译成功") 69 | } 70 | return nil 71 | } 72 | -------------------------------------------------------------------------------- /models/wck.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/beego/beego/v2/client/httplib" 6 | "github.com/beego/beego/v2/core/logs" 7 | "github.com/buger/jsonparser" 8 | "net/http" 9 | "net/url" 10 | "strings" 11 | ) 12 | 13 | var ua2 = `okhttp/3.12.1;jdmall;android;version/10.1.2;build/89743;screen/1440x3007;os/11;network/wifi;` 14 | 15 | type AutoGenerated struct { 16 | ClientVersion string `json:"clientVersion"` 17 | Client string `json:"client"` 18 | Sv string `json:"sv"` 19 | St string `json:"st"` 20 | UUID string `json:"uuid"` 21 | Sign string `json:"sign"` 22 | FunctionID string `json:"functionId"` 23 | } 24 | 25 | func getSign() *AutoGenerated { 26 | data, _ := httplib.Get("https://pan.smxy.xyz/sign").SetUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36").Bytes() 27 | t := &AutoGenerated{} 28 | json.Unmarshal(data, t) 29 | logs.Info(t.Sign) 30 | if t != nil { 31 | t.FunctionID = "genToken" 32 | } 33 | return t 34 | } 35 | 36 | func getKey(WSCK string) (string, error) { 37 | v := url.Values{} 38 | s := getSign() 39 | v.Add("functionId", s.FunctionID) 40 | v.Add("clientVersion", s.ClientVersion) 41 | v.Add("client", s.Client) 42 | v.Add("uuid", s.UUID) 43 | v.Add("st", s.St) 44 | v.Add("sign", s.Sign) 45 | v.Add("sv", s.Sv) 46 | req := httplib.Post(`https://api.m.jd.com/client.action?` + v.Encode()) 47 | req.Header("cookie", WSCK) 48 | req.Header("User-Agent", ua2) 49 | req.Header("content-type", `application/x-www-form-urlencoded; charset=UTF-8`) 50 | req.Header("charset", `UTF-8`) 51 | req.Header("accept-encoding", `br,gzip,deflate`) 52 | req.Body(`body=%7B%22action%22%3A%22to%22%2C%22to%22%3A%22https%253A%252F%252Fplogin.m.jd.com%252Fcgi-bin%252Fm%252Fthirdapp_auth_page%253Ftoken%253DAAEAIEijIw6wxF2s3bNKF0bmGsI8xfw6hkQT6Ui2QVP7z1Xg%2526client_type%253Dandroid%2526appid%253D879%2526appup_type%253D1%22%7D&`) 53 | data, err := req.Bytes() 54 | if err != nil { 55 | return "", err 56 | } 57 | logs.Info(string(data)) 58 | logs.Info("获取token正常") 59 | tokenKey, _ := jsonparser.GetString(data, "tokenKey") 60 | ptKey, err := appjmp(tokenKey) 61 | logs.Info(ptKey) 62 | if err != nil { 63 | return "", err 64 | } 65 | return ptKey, nil 66 | } 67 | 68 | func appjmp(tokenKey string) (string, error) { 69 | v := url.Values{} 70 | v.Add("tokenKey", tokenKey) 71 | v.Add("to", ``) 72 | v.Add("client_type", "android") 73 | v.Add("appid", "879") 74 | v.Add("appup_type", "1") 75 | req := httplib.Get(`https://un.m.jd.com/cgi-bin/app/appjmp?` + v.Encode()) 76 | req.Header("User-Agent", ua2) 77 | req.Header("accept", `text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3`) 78 | req.SetCheckRedirect(func(req *http.Request, via []*http.Request) error { 79 | return http.ErrUseLastResponse 80 | }) 81 | rsp, err := req.Response() 82 | if err != nil { 83 | return "", err 84 | } 85 | cookies := strings.Join(rsp.Header.Values("Set-Cookie"), " ") 86 | //ptKey := FetchJdCookieValue("pt_key", cookies) 87 | return cookies, nil 88 | } 89 | -------------------------------------------------------------------------------- /models/wish.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "time" 5 | ) 6 | 7 | type Wish struct { 8 | ID int 9 | CreatedAt time.Time 10 | UserNumber int 11 | Content string 12 | Coin int 13 | Status int // 1 2 14 | } 15 | -------------------------------------------------------------------------------- /models/wskey.go: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import ( 4 | "fmt" 5 | "github.com/beego/beego/v2/core/logs" 6 | "github.com/robfig/cron/v3" 7 | "math/rand" 8 | "strconv" 9 | ) 10 | 11 | func intiSky() { 12 | c := cron.New(cron.WithSeconds()) //精确到秒 13 | 14 | //定时任务 15 | spec := "0 " + strconv.Itoa(rand.Intn(59)) + " " + Config.CTime + "/12 * * ?" //cron表达式,每秒一次 16 | logs.Info(spec) 17 | if Config.Wskey { 18 | c.AddFunc(spec, func() { 19 | fmt.Println("开始wskey转换") 20 | updateCookie() 21 | }) 22 | 23 | c.Start() 24 | } 25 | //c.AddFunc(spec, func() { 26 | // fmt.Println("开始wskey转换") 27 | // updateCookie() 28 | //}) 29 | // 30 | //c.Start() 31 | } 32 | -------------------------------------------------------------------------------- /qbot/login.go: -------------------------------------------------------------------------------- 1 | package qbot 2 | 3 | import ( 4 | "bufio" 5 | "bytes" 6 | "os" 7 | "strings" 8 | "time" 9 | 10 | qrcodeTerminal "github.com/Baozisoftware/qrcode-terminal-go" 11 | "github.com/Mrs4s/MiraiGo/client" 12 | "github.com/pkg/errors" 13 | log "github.com/sirupsen/logrus" 14 | "github.com/tuotoo/qrcode" 15 | 16 | "github.com/Mrs4s/go-cqhttp/global" 17 | ) 18 | 19 | var console = bufio.NewReader(os.Stdin) 20 | 21 | var readLine = func() (str string) { 22 | str, _ = console.ReadString('\n') 23 | str = strings.TrimSpace(str) 24 | return 25 | } 26 | 27 | var readLineTimeout = func(t time.Duration, de string) (str string) { 28 | r := make(chan string) 29 | go func() { 30 | select { 31 | case r <- readLine(): 32 | case <-time.After(t): 33 | } 34 | }() 35 | str = de 36 | select { 37 | case str = <-r: 38 | case <-time.After(t): 39 | } 40 | return 41 | } 42 | 43 | var cli *client.QQClient 44 | 45 | // ErrSMSRequestError SMS请求出错 46 | var ErrSMSRequestError = errors.New("sms request error") 47 | 48 | func commonLogin() error { 49 | res, err := cli.Login() 50 | if err != nil { 51 | return err 52 | } 53 | return loginResponseProcessor(res) 54 | } 55 | 56 | func qrcodeLogin() error { 57 | rsp, err := cli.FetchQRCode() 58 | if err != nil { 59 | return err 60 | } 61 | fi, err := qrcode.Decode(bytes.NewReader(rsp.ImageData)) 62 | if err != nil { 63 | return err 64 | } 65 | _ = os.WriteFile("qrcode.png", rsp.ImageData, 0o644) 66 | defer func() { _ = os.Remove("qrcode.png") }() 67 | if cli.Uin != 0 { 68 | log.Infof("请使用账号 %v 登录手机QQ扫描二维码 (qrcode.png) : ", cli.Uin) 69 | } else { 70 | log.Infof("请使用手机QQ扫描二维码 (qrcode.png) : ") 71 | } 72 | time.Sleep(time.Second) 73 | qrcodeTerminal.New().Get(fi.Content).Print() 74 | s, err := cli.QueryQRCodeStatus(rsp.Sig) 75 | if err != nil { 76 | return err 77 | } 78 | prevState := s.State 79 | for { 80 | time.Sleep(time.Second) 81 | s, _ = cli.QueryQRCodeStatus(rsp.Sig) 82 | if s == nil { 83 | continue 84 | } 85 | if prevState == s.State { 86 | continue 87 | } 88 | prevState = s.State 89 | switch s.State { 90 | case client.QRCodeCanceled: 91 | log.Fatalf("扫码被用户取消.") 92 | case client.QRCodeTimeout: 93 | log.Fatalf("二维码过期") 94 | case client.QRCodeWaitingForConfirm: 95 | log.Infof("扫码成功, 请在手机端确认登录.") 96 | case client.QRCodeConfirmed: 97 | res, err := cli.QRCodeLogin(s.LoginInfo) 98 | if err != nil { 99 | return err 100 | } 101 | return loginResponseProcessor(res) 102 | case client.QRCodeImageFetch, client.QRCodeWaitingForScan: 103 | // ignore 104 | } 105 | } 106 | } 107 | 108 | func loginResponseProcessor(res *client.LoginResponse) error { 109 | var err error 110 | for { 111 | if err != nil { 112 | return err 113 | } 114 | if res.Success { 115 | return nil 116 | } 117 | var text string 118 | switch res.Error { 119 | case client.SliderNeededError: 120 | log.Warnf("登录需要滑条验证码. ") 121 | log.Warnf("请参考文档 -> https://docs.go-cqhttp.org/faq/slider.html <- 进行处理") 122 | log.Warnf("1. 自行抓包并获取 Ticket 输入.") 123 | log.Warnf("2. 使用手机QQ扫描二维码登入. (推荐)") 124 | log.Warn("请输入(1 - 2) (将在10秒后自动选择2):") 125 | text = readLineTimeout(time.Second*10, "2") 126 | if strings.Contains(text, "1") { 127 | println() 128 | log.Warnf("请用浏览器打开 -> %v <- 并获取Ticket.", res.VerifyUrl) 129 | println() 130 | log.Warn("请输入Ticket: (Enter 提交)") 131 | text = readLine() 132 | res, err = cli.SubmitTicket(text) 133 | continue 134 | } 135 | cli.Disconnect() 136 | cli.Release() 137 | cli = client.NewClientEmpty() 138 | return qrcodeLogin() 139 | case client.NeedCaptcha: 140 | log.Warnf("登录需要验证码.") 141 | _ = os.WriteFile("captcha.jpg", res.CaptchaImage, 0o644) 142 | log.Warnf("请输入验证码 (captcha.jpg): (Enter 提交)") 143 | text = readLine() 144 | global.DelFile("captcha.jpg") 145 | res, err = cli.SubmitCaptcha(text, res.CaptchaSign) 146 | continue 147 | case client.SMSNeededError: 148 | log.Warnf("账号已开启设备锁, 按 Enter 向手机 %v 发送短信验证码.", res.SMSPhone) 149 | readLine() 150 | if !cli.RequestSMS() { 151 | log.Warnf("发送验证码失败,可能是请求过于频繁.") 152 | return errors.WithStack(ErrSMSRequestError) 153 | } 154 | log.Warn("请输入短信验证码: (Enter 提交)") 155 | text = readLine() 156 | res, err = cli.SubmitSMS(text) 157 | continue 158 | case client.SMSOrVerifyNeededError: 159 | log.Warnf("账号已开启设备锁,请选择验证方式:") 160 | log.Warnf("1. 向手机 %v 发送短信验证码", res.SMSPhone) 161 | log.Warnf("2. 使用手机QQ扫码验证.") 162 | log.Warn("请输入(1 - 2) (将在10秒后自动选择2):") 163 | text = readLineTimeout(time.Second*10, "2") 164 | if strings.Contains(text, "1") { 165 | if !cli.RequestSMS() { 166 | log.Warnf("发送验证码失败,可能是请求过于频繁.") 167 | return errors.WithStack(ErrSMSRequestError) 168 | } 169 | log.Warn("请输入短信验证码: (Enter 提交)") 170 | text = readLine() 171 | res, err = cli.SubmitSMS(text) 172 | continue 173 | } 174 | fallthrough 175 | case client.UnsafeDeviceError: 176 | log.Warnf("账号已开启设备锁,请前往 -> %v <- 验证后重启Bot.", res.VerifyUrl) 177 | log.Infof("按 Enter 或等待 5s 后继续....") 178 | readLineTimeout(time.Second*5, "") 179 | // os.Exit(0) 180 | case client.OtherLoginError, client.UnknownLoginError, client.TooManySMSRequestError: 181 | msg := res.ErrorMessage 182 | if strings.Contains(msg, "版本") { 183 | msg = "密码错误或账号被冻结" 184 | } 185 | if strings.Contains(msg, "冻结") { 186 | log.Fatalf("账号被冻结") 187 | } 188 | log.Warnf("登录失败: %v", msg) 189 | log.Infof("按 Enter 或等待 5s 后继续....") 190 | readLineTimeout(time.Second*5, "") 191 | // os.Exit(0) 192 | } 193 | } 194 | } 195 | -------------------------------------------------------------------------------- /ql.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | clear 4 | 5 | echo -e "\e[36m 6 | ▄▄▄▄ ██ ▄▄▄▄ 7 | ██▀▀██ ▀▀ ▀▀██ 8 | ██ ██ ████ ██▄████▄ ▄███▄██ ██ ▄████▄ ██▄████▄ ▄███▄██ 9 | ██ ██ ██ ██▀ ██ ██▀ ▀██ ██ ██▀ ▀██ ██▀ ██ ██▀ ▀██ 10 | ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ 11 | ██▄▄██▀ ▄▄▄██▄▄▄ ██ ██ ▀██▄▄███ ██▄▄▄ ▀██▄▄██▀ ██ ██ ▀██▄▄███ 12 | ▀▀▀██ ▀▀▀▀▀▀▀▀ ▀▀ ▀▀ ▄▀▀▀ ██ ▀▀▀▀ ▀▀▀▀ ▀▀ ▀▀ ▄▀▀▀ ██ 13 | ▀ ▀████▀▀ ▀████▀▀ 14 | \e[0m\n" 15 | 16 | DOCKER_IMG_NAME="764763903/qinglong" 17 | JD_PATH="" 18 | SHELL_FOLDER=$(pwd) 19 | CONTAINER_NAME="" 20 | TAG="latest" 21 | NETWORK="bridge" 22 | JD_PORT=5700 23 | NINJA_PORT=5701 24 | 25 | HAS_IMAGE=false 26 | PULL_IMAGE=true 27 | HAS_CONTAINER=false 28 | DEL_CONTAINER=true 29 | INSTALL_WATCH=false 30 | INSTALL_NINJA=true 31 | ENABLE_HANGUP=true 32 | ENABLE_WEB_PANEL=true 33 | OLD_IMAGE_ID="" 34 | ENABLE_HANGUP_ENV="--env ENABLE_HANGUP=true" 35 | ENABLE_WEB_PANEL_ENV="--env ENABLE_WEB_PANEL=true" 36 | 37 | 38 | log() { 39 | echo -e "\e[32m\n$1 \e[0m\n" 40 | } 41 | 42 | inp() { 43 | echo -e "\e[33m\n$1 \e[0m\n" 44 | } 45 | 46 | opt() { 47 | echo -n -e "\e[36m输入您的选择->\e[0m" 48 | } 49 | 50 | warn() { 51 | echo -e "\e[31m$1 \e[0m\n" 52 | } 53 | 54 | cancelrun() { 55 | if [ $# -gt 0 ]; then 56 | echo -e "\e[31m $1 \e[0m" 57 | fi 58 | exit 1 59 | } 60 | 61 | docker_install() { 62 | echo "检测 Docker......" 63 | if [ -x "$(command -v docker)" ]; then 64 | echo "检测到 Docker 已安装!" 65 | else 66 | if [ -r /etc/os-release ]; then 67 | lsb_dist="$(. /etc/os-release && echo "$ID")" 68 | fi 69 | if [ $lsb_dist == "openwrt" ]; then 70 | echo "openwrt 环境请自行安装 docker" 71 | exit 1 72 | else 73 | echo "安装 docker 环境..." 74 | curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 75 | echo "安装 docker 环境...安装完成!" 76 | systemctl enable docker 77 | systemctl start docker 78 | fi 79 | fi 80 | } 81 | 82 | docker_install 83 | warn "Faker系列仓库一键安装配置,一键安装的青龙版本为2.9.3稳定版,小白回车到底,一路默认选择" 84 | # 配置文件保存目录 85 | echo -n -e "\e[33m一、请输入配置文件保存的绝对路径(示例:/root),回车默认为当前目录:\e[0m" 86 | read jd_path 87 | if [ -z "$jd_path" ]; then 88 | JD_PATH=$SHELL_FOLDER 89 | elif [ -d "$jd_path" ]; then 90 | JD_PATH=$jd_path 91 | else 92 | mkdir -p $jd_path 93 | JD_PATH=$jd_path 94 | fi 95 | CONFIG_PATH=$JD_PATH/ql/config 96 | DB_PATH=$JD_PATH/ql/db 97 | REPO_PATH=$JD_PATH/ql/repo 98 | RAW_PATH=$JD_PATH/ql/raw 99 | SCRIPT_PATH=$JD_PATH/ql/scripts 100 | LOG_PATH=$JD_PATH/ql/log 101 | JBOT_PATH=$JD_PATH/ql/jbot 102 | NINJA_PATH=$JD_PATH/ql/ninja 103 | 104 | # 检测镜像是否存在 105 | if [ ! -z "$(docker images -q $DOCKER_IMG_NAME:$TAG 2> /dev/null)" ]; then 106 | HAS_IMAGE=true 107 | OLD_IMAGE_ID=$(docker images -q --filter reference=$DOCKER_IMG_NAME:$TAG) 108 | inp "检测到先前已经存在的镜像,是否拉取最新的镜像:\n1) 拉取[默认]\n2) 不拉取" 109 | opt 110 | read update 111 | if [ "$update" = "2" ]; then 112 | PULL_IMAGE=false 113 | fi 114 | fi 115 | 116 | # 检测容器是否存在 117 | check_container_name() { 118 | if [ ! -z "$(docker ps -a | grep $CONTAINER_NAME 2> /dev/null)" ]; then 119 | HAS_CONTAINER=true 120 | inp "检测到先前已经存在的容器,是否删除先前的容器:\n1) 删除[默认]\n2) 不删除" 121 | opt 122 | read update 123 | if [ "$update" = "2" ]; then 124 | PULL_IMAGE=false 125 | inp "您选择了不删除之前的容器,需要重新输入容器名称" 126 | input_container_name 127 | fi 128 | fi 129 | } 130 | 131 | # 容器名称 132 | input_container_name() { 133 | echo -n -e "\e[33m\n二、请输入要创建的 Docker 容器名称[默认为:qinglong]->\e[0m" 134 | read container_name 135 | if [ -z "$container_name" ]; then 136 | CONTAINER_NAME="qinglong" 137 | else 138 | CONTAINER_NAME=$container_name 139 | fi 140 | check_container_name 141 | } 142 | input_container_name 143 | 144 | # 是否安装 WatchTower 145 | inp "是否安装 containrrr/watchtower 自动更新 Docker 容器:\n1) 安装\n2) 不安装[默认]" 146 | opt 147 | read watchtower 148 | if [ "$watchtower" = "1" ]; then 149 | INSTALL_WATCH=true 150 | fi 151 | 152 | inp "请选择容器的网络类型:\n1) host\n2) bridge[默认]" 153 | opt 154 | read net 155 | if [ "$net" = "1" ]; then 156 | NETWORK="host" 157 | MAPPING_JD_PORT="" 158 | MAPPING_NINJA_PORT="" 159 | fi 160 | 161 | inp "是否在启动容器时自动启动挂机程序:\n1) 开启[默认]\n2) 关闭" 162 | opt 163 | read hang_s 164 | if [ "$hang_s" = "2" ]; then 165 | ENABLE_HANGUP_ENV="" 166 | fi 167 | 168 | inp "是否启用青龙面板:\n1) 启用[默认]\n2) 不启用" 169 | opt 170 | read pannel 171 | if [ "$pannel" = "2" ]; then 172 | ENABLE_WEB_PANNEL_ENV="" 173 | fi 174 | 175 | inp "是否安装 Ninja:\n1) 安装[默认]\n2) 不安装" 176 | opt 177 | read Ninja 178 | if [ "$Ninja" = "2" ]; then 179 | INSTALL_NINJA=false 180 | MAPPING_NINJA_PORT="" 181 | fi 182 | 183 | # 端口问题 184 | modify_ql_port() { 185 | inp "是否修改青龙端口[默认 5700]:\n1) 修改\n2) 不修改[默认]" 186 | opt 187 | read change_ql_port 188 | if [ "$change_ql_port" = "1" ]; then 189 | echo -n -e "\e[36m输入您想修改的端口->\e[0m" 190 | read JD_PORT 191 | fi 192 | } 193 | modify_Ninja_port() { 194 | inp "是否修改 Ninja 端口[默认 5701]:\n1) 修改\n2) 不修改[默认]" 195 | opt 196 | read change_Ninja_port 197 | if [ "$change_Ninja_port" = "1" ]; then 198 | echo -n -e "\e[36m输入您想修改的端口->\e[0m" 199 | read NINJA_PORT 200 | fi 201 | } 202 | if [ "$NETWORK" = "bridge" ]; then 203 | inp "是否映射端口:\n1) 映射[默认]\n2) 不映射" 204 | opt 205 | read port 206 | if [ "$port" = "2" ]; then 207 | MAPPING_JD_PORT="" 208 | MAPPING_NINJA_PORT="" 209 | else 210 | modify_ql_port 211 | if [ "$INSTALL_NINJA" = true ]; then 212 | modify_Ninja_port 213 | fi 214 | fi 215 | fi 216 | 217 | 218 | # 配置已经创建完成,开始执行 219 | log "1.开始创建配置文件目录" 220 | PATH_LIST=($CONFIG_PATH $DB_PATH $REPO_PATH $RAW_PATH $SCRIPT_PATH $LOG_PATH $JBOT_PATH $NINJA_PATH) 221 | for i in ${PATH_LIST[@]}; do 222 | mkdir -p $i 223 | done 224 | 225 | if [ $HAS_CONTAINER = true ] && [ $DEL_CONTAINER = true ]; then 226 | log "2.1.删除先前的容器" 227 | docker stop $CONTAINER_NAME >/dev/null 228 | docker rm $CONTAINER_NAME >/dev/null 229 | fi 230 | 231 | if [ $HAS_IMAGE = true ] && [ $PULL_IMAGE = true ]; then 232 | if [ ! -z "$OLD_IMAGE_ID" ] && [ $HAS_CONTAINER = true ] && [ $DEL_CONTAINER = true ]; then 233 | log "2.2.删除旧的镜像" 234 | docker image rm $OLD_IMAGE_ID 235 | fi 236 | log "2.3.开始拉取最新的镜像" 237 | docker pull $DOCKER_IMG_NAME:$TAG 238 | if [ $? -ne 0 ] ; then 239 | cancelrun "** 错误:拉取不到镜像!" 240 | fi 241 | fi 242 | 243 | # 端口存在检测 244 | check_port() { 245 | echo "正在检测端口:$1" 246 | netstat -tlpn | grep "\b$1\b" 247 | } 248 | if [ "$port" != "2" ]; then 249 | while check_port $JD_PORT; do 250 | echo -n -e "\e[31m端口:$JD_PORT 被占用,请重新输入青龙面板端口:\e[0m" 251 | read JD_PORT 252 | done 253 | echo -e "\e[34m恭喜,端口:$JD_PORT 可用\e[0m" 254 | MAPPING_JD_PORT="-p $JD_PORT:5700" 255 | fi 256 | if [ "$Ninja" != "2" ]; then 257 | while check_port $NINJA_PORT; do 258 | echo -n -e "\e[31m端口:$NINJA_PORT 被占用,请重新输入 Ninja 面板端口:\e[0m" 259 | read NINJA_PORT 260 | done 261 | echo -e "\e[34m恭喜,端口:$NINJA_PORT 可用\e[0m" 262 | MAPPING_NINJA_PORT="-p $NINJA_PORT:5701" 263 | fi 264 | 265 | 266 | log "3.开始创建容器并执行" 267 | docker run -dit \ 268 | -t \ 269 | -v $CONFIG_PATH:/ql/config \ 270 | -v $DB_PATH:/ql/db \ 271 | -v $LOG_PATH:/ql/log \ 272 | -v $REPO_PATH:/ql/repo \ 273 | -v $RAW_PATH:/ql/raw \ 274 | -v $SCRIPT_PATH:/ql/scripts \ 275 | -v $JBOT_PATH:/ql/jbot \ 276 | -v $NINJA_PATH:/ql/ninja \ 277 | $MAPPING_JD_PORT \ 278 | $MAPPING_NINJA_PORT \ 279 | --name $CONTAINER_NAME \ 280 | --hostname qinglong \ 281 | --restart always \ 282 | --network $NETWORK \ 283 | $ENABLE_HANGUP_ENV \ 284 | $ENABLE_WEB_PANEL_ENV \ 285 | $DOCKER_IMG_NAME:$TAG 286 | 287 | if [ $? -ne 0 ] ; then 288 | cancelrun "** 错误:容器创建失败,请翻译以上英文报错,Google/百度尝试解决问题!" 289 | fi 290 | 291 | if [ $INSTALL_WATCH = true ]; then 292 | log "3.1.开始创建容器并执行" 293 | docker run -d \ 294 | --name watchtower \ 295 | --restart always \ 296 | -v /var/run/docker.sock:/var/run/docker.sock \ 297 | containrrr/watchtower -c\ 298 | --schedule "13,14,15 3 * * * *" \ 299 | $CONTAINER_NAME 300 | fi 301 | 302 | # 检查 config 文件是否存在 303 | if [ ! -f "$CONFIG_PATH/config.sh" ]; then 304 | docker cp $CONTAINER_NAME:/ql/sample/config.sample.sh $CONFIG_PATH/config.sh 305 | if [ $? -ne 0 ] ; then 306 | cancelrun "** 错误:找不到配置文件!" 307 | fi 308 | fi 309 | 310 | log "4.下面列出所有容器" 311 | docker ps 312 | 313 | # Nginx 静态解析检测 314 | log "5.开始检测 Nginx 静态解析" 315 | echo "开始扫描静态解析是否在线!" 316 | ps -fe|grep nginx|grep -v grep 317 | if [ $? -ne 0 ]; then 318 | echo "$(date +%Y-%m-%d" "%H:%M:%S) 扫描结束!Nginx 静态解析停止!准备重启!" 319 | docker exec -it $CONTAINER_NAME nginx -c /etc/nginx/nginx.conf 320 | echo "$(date +%Y-%m-%d" "%H:%M:%S) Nginx 静态解析重启完成!" 321 | else 322 | echo "$(date +%Y-%m-%d" "%H:%M:%S) 扫描结束!Nginx 静态解析正常!" 323 | fi 324 | 325 | if [ "$port" = "2" ]; then 326 | log "6.安装已完成,请自行调整端口映射并进入面板一次以便进行内部配置" 327 | else 328 | log "6.安装已完成,请进入面板一次以便进行内部配置" 329 | log "6.1.用户名和密码已显示,请登录 ip:$JD_PORT" 330 | cat $CONFIG_PATH/auth.json 331 | echo -e "\n" 332 | fi 333 | 334 | # 防止 CPU 占用过高导致死机 335 | echo -e "-------- 机器累了,休息 20s,趁机去操作一下吧 --------" 336 | sleep 20 337 | 338 | # 显示 auth.json 339 | inp "是否显示被修改的密码:\n1) 显示[默认]\n2) 不显示" 340 | opt 341 | read display 342 | if [ "$display" != "2" ]; then 343 | echo -e "\n" 344 | cat $CONFIG_PATH/auth.json 345 | echo -e "\n" 346 | log "6.2.用被修改的密码登录面板并进入" 347 | fi 348 | 349 | # token 检测 350 | inp "是否已进入面板:\n1) 进入[默认]\n2) 未进入" 351 | opt 352 | read access 353 | log "6.3.观察 token 是否成功生成" 354 | cat $CONFIG_PATH/auth.json 355 | echo -e "\n" 356 | if [ "$access" != "2" ]; then 357 | if [ "$(grep -c "token" $CONFIG_PATH/auth.json)" != 0 ]; then 358 | log "7.开始安装或重装 Ninja" 359 | if [ "$INSTALL_NINJA" = true ]; then 360 | docker exec -it $CONTAINER_NAME bash -c "cd /ql;ps -ef|grep ninja|grep -v grep|awk '{print $1}'|xargs kill -9;rm -rf /ql/ninja;git clone https://ghproxy.com/https://github.com/shufflewzc/Waikiki_ninja.git /ql/ninja;cd /ql/ninja/backend;pnpm install;cp .env.example .env;cp sendNotify.js /ql/scripts/sendNotify.js;sed -i \"s/ALLOW_NUM=40/ALLOW_NUM=100/\" /ql/ninja/backend/.env;pm2 start" 361 | docker exec -it $CONTAINER_NAME bash -c "sed -i \"s/ALLOW_NUM=40/ALLOW_NUM=100/\" /ql/ninja/backend/.env && cd /ql/ninja/backend && pm2 start" 362 | fi 363 | log "8.开始青龙内部配置" 364 | docker exec -it $CONTAINER_NAME bash -c "$(curl -fsSL https://ghproxy.com/https://github.com/shufflewzc/VIP/blob/main/Scripts/sh/1customCDN.sh)" 365 | else 366 | warn "8.未检测到 token,取消内部配置" 367 | fi 368 | else 369 | exit 0 370 | fi 371 | 372 | log "/n部署完成了,另外Faker教程内有一键安装依赖脚本,按需使用" 373 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | 自用、学习、爱用不用。我就是上传数据也不叫偷,我自己脚本还不是想咋写就咋写,整天偷偷偷的,毛病。 2 | 3 | ## 注意事项 4 | 5 | 1. master:的值即为密码,后面不可带注释,全匹配方可登录,也不要pt_pin 可自定义 6 | 2. 2.9+版本需要配置 cid和secret 在青龙里面系统设置,添加应用后配置 7 | 8 | # 支持作者 9 | 10 | 就当是支持支持作者更新吧 谢谢各位了。 11 | 12 | ![微信图片_20211026143647.jpg](https://i.loli.net/2021/10/26/Av6oWqYS5UpFf2g.jpg) 13 | # 更新日志 14 | 15 | ## 开发目标 16 | - plus登陆页面 已完成 17 | - 新增头部账号按次序进入容器助力模式 已完成 18 | - 增加定制APP接口适配 已完成 19 | - 增加CK过期检测指令 已完成 20 | - 任务完成自动通知 已完成 21 | - 增加查询内容,领现金金额,京喜工厂生产情况,账号更新日期,七天内京豆过期情况 已完成 22 | - 多容器头部CK的需求 已完成 23 | - 更新方式啥时候改成一键升级? 再说吧 24 | - 新增功能导出所有CK到txt(一行一个分割好了) 已完成 25 | - 新增微信扫码订阅 已完成 26 | - 增加返利 已完成 27 | 28 | ## 5-21 V4.0 520情人节特别版 29 | - 更新公开版,更开了啥看下面的开发文档,下面部分是VIP专享其他都开放了。 30 | - 修改Wskey转换问题 31 | - 修复了临时对话问题 32 | - 33 | - VIP功能: 34 | - 可对接短信登录,需NARK 35 | - 多接口wskey转换 36 | - 定制APP接口适配 37 | - vip循环车头模式 38 | - 图片查询,网页查询 39 | - 哎其实也不用进V群也没啥好东西。 40 | 41 | 42 | 43 | 44 | ## 4-13 v3.3 45 | - 增加查询转图片,优化图片查询 46 | - 修复疯兔二次验证堆积 47 | - 优化随机算法 48 | - 还搞了啥我忘了反正挺多东西的 49 | 50 | 51 | ## 4-10 v3.3 52 | - 修复版本号提示错误问题 53 | - 修复本地数据库推一推异常问题 54 | - 优化随机算法 55 | - 内置推一推如果有0.0很多汇报 56 | - 内置查询转图片,测试优化中,下个版本开放 57 | - 增加重置推一推指令(每天都要发,或者没次数了就发) 58 | - 对接疯兔增加参数Madurl: http://127.0.0.1:5801 59 | 60 | ## 4-6 v3.2 61 | - 适配一键更新--卡死了 62 | - 启用参数WsToken: #可不填写 填写后走动物园转换接口 不写走ZY接口(暂时停止旧的接口) 63 | - 推一推启用订单号记录,外置tyt 64 | - # OpenQQ填写任意参数 视为不启动QQ,如果无此需求不要配置 65 | OpenQQ: 66 | - 修复管理员无法查询的BUG 67 | - 增加指令--导出所有账号(在XDD根目录下) 68 | 69 | ## 3-25 v3.1 70 | - 增加三条Wskey更新线路 71 | - 优化Cookie检测效率(剔除) 72 | - 修复卡密BUG 73 | - 修复了图片问题(手撸了cq) 74 | - 修复错误版本号 75 | - 新增指令 导出临时CK 76 | - 内置助力池接口 77 | - 新增功能导出所有CK到txt(一行一个分割好了) 78 | - 新增微信扫码订阅 79 | - 新增双参数使用 80 | Invalid: #自定义失效回复放空默认 81 | Query: #自定义查询空回复,放空默认 82 | Query1: #自定义下方自定义,放空默认 83 | - 新增喜豆查询 84 | - 完善农场通知 85 | 86 | ## 3-13 v3.0 87 | - 增加任务检测,检测到农场和萌宠完成发送消息推送(下一步接入微信关注推送) 88 | - 增加登陆后直接推送一次查询信息 89 | - 去除无用代码 90 | - 提升推一推识别率,IOS端以及特殊连接均可识别 91 | - 增加指令生成卡密 默认魏Tyt的值可自定义 生成卡密 数量 值 92 | - 优化推一推,采用队列的做法,三线程并发,用户可无限加入池子,按顺序拉取完成。 93 | - 去除登录相关代码,优化mark接入 94 | - 修复多用户同时登录BUG 95 | 96 | ## 1-11 v2.2 97 | - Wskey改为每天3次每次间隔八个小时 98 | - 年兽改为基础功能 99 | - 新增膨胀,天降助力指令 100 | - 新增权限设置为管理员可用 101 | - 修改日志说明 102 | - 修改版本号 103 | ps 下个版本增加任务完成通知 新增年兽组队助力 104 | 105 | ## 1-11 v2.0 106 | - 修复部分版本号疯狂提醒问题 107 | - 内置推一推 108 | - 内置年兽助力 发送 年兽+口令 即可完成助力 109 | - 优化代码逻辑 110 | 111 | ## 12-16 v1.9 112 | - 优化Wskey,增加转换失败提示+pin,增加双线路获取sign减少转换失败问题。 113 | - 增加版本号提醒 114 | - 修复过期数量加入平衡问题,来自大白熊PR 115 | - 修复适配诺兰最新版 116 | 117 | ## 12-15 v1.8 118 | - 适配诺兰最新版 119 | - 解决无限请稍后等待问题 120 | 121 | ## 12-7 V1.7 122 | - 升级qbot版本为最新 123 | - 取消默认延迟60s设置,如果不设置Later就是0秒 124 | - 修改过期和未绑定提示语 125 | 126 | ## 11-27 v1.6 127 | - 修改失效提示为NickName 128 | - 修改开始检测通知提醒 129 | - 修复登录提示错误问题 130 | - 修复空白NickName自动补齐 131 | - 修复重大BUG,定时检测写错位置,导致根本没检测,妈的我个智障。怪我抱歉各位。 132 | - 现在检测暂时修改为早上8点下午四点定时检测 133 | - 增加wskey模糊匹配,无需之前的pin=xxx;wskey=xxx;只要是带pin和wskey或者ptpin的都能正常用 134 | ps:下个版本推出微服务XDD 即多个服务器轮询查询,彻底解决查询黑IP问题。 135 | 136 | ## 11-22 V1.5 137 | - 增加查询间隔 138 | - 发送登陆后才可以发送手机号 139 | - 增加"开始检测“指令 140 | - 增加配置是否开启搏一把等相关功能,默认false 141 | - 增加配置填写pin或者note 填写pin青龙的备注会是pin填写note就是xdd的备注同步到青龙 142 | 143 | ## 11-16 V1.3 144 | - 修复删除账号后出现的BUG 145 | - 增加临时对话功能 146 | - 一键更新功能(调试阶段,勿用) 147 | - 集成发财挖宝,发送连接完成126次助力(后续完成自动挖宝提现) 148 | - 修复玄学BUG 149 | - 更改授权接口,启用新授权模式--记录IP以及设备编号 150 | 151 | ## 11-12 152 | - CK调整顺序,不设检测,新增CK,更新CK秒级更新 153 | - CK检测调整为12小时统一检测一次,每个账号检测延迟设置为10S 154 | - 修复滑块,限制五次滑块,超过五次停止滑块 155 | - 简化查询通知 156 | ## 11-11 157 | - 新增若兰短信对接 158 | - 修复部分号段无法识别问题 159 | - 解决超出上限循环问题。 160 | ## 11-04 161 | - 增加了砍一刀连接功能 162 | - 增加口令转连接功能 163 | - 增加大赢家自动完成并助力提现功能全自动一条龙 164 | - 增加推一推功能 165 | ## 10-26 166 | - 修复了推一推不正常扣余额问题 167 | - 恢复soha等功能 慎用 168 | - 下个版本推出砍价功能 169 | - 发财大赢家助力功能 170 | - 171 | 172 | ## 10-11 173 | 174 | - 适配V2.8+版本包括即将来的3.0版本都适配了 = - 基本你们能用到黄了把 175 | - 修复了QQ转账功能 176 | 177 | ## 10-07 178 | 179 | - 新增延时设置,怕黑号调高,不怕的调低 180 | 181 | ## 10-04 182 | 183 | - 新增QQ转账功能 格式 QQ转账 QQ 钱 例如 QQ转账 7647 100 184 | - 各位大老爷支持支持作者吧 谢谢啦 185 | 186 | ## 10-03 187 | 188 | - 修复空pin可导入问题 189 | - 剔除ck批量导入功能 190 | 191 | ## 10-02 192 | 193 | - 修复删除指令没有删除jdcookiepool 194 | 195 | ## 10-01 196 | 197 | - 大家安心过节 国庆快乐 198 | - 修复WSkey自动无限更新问题 199 | - 修复删除指令不够彻底问题 200 | 201 | ## 9-27 202 | 203 | - 增加配置是否自动添加好友 注意看配置 204 | - 增加短信自动绑定QQ (此接口面向傻妞对接) 205 | - 增加lim配置,可对查询等各种命令进行次数限制。 206 | 207 | - 会员中心代码内测中 208 | 209 | 210 | ## 9-24 211 | 212 | - 即将上线CK提交页面,会员中心页面 213 | 214 | 215 | ## 9-21 216 | 217 | - 新增加好友自动同意 218 | - 修复清理过期账号指令 219 | - 新增扫码登录(暂停) 220 | - 新增删除WCK指令 删除过期wskey 221 | - 修复之前临时屏蔽失效通知,临时关闭失效账号处理。 222 | - 下个开发重点是登录页面和会员中心 223 | 224 | ## 9-20 225 | 226 | 感谢大佬增加xdd的接入 227 | 228 | [Y佬的JD-qinglong](https://github.com/rubyangxg/jd-qinglong ) 229 | 230 | 配置config中的apiToken,即可完成与Y佬的短信对接 231 | 232 | XDD_URL格式为http://IP地址:端口/api/login/smslogin 233 | 234 | ![image-20210920125520315](C:\Users\76476\AppData\Roaming\Typora\typora-user-images\image-20210920125520315.png) 235 | 236 | 再次感谢Y佬 具体教程问问群里或者等好心群友提供我顶置更新 237 | 238 | ## 9-19 239 | 240 | - 短信对接接口等待Y对接 241 | - fix 七连失效通知 242 | 243 | ## 09-18之前 244 | 245 | 1. 发送wskey即可自动添加账号 246 | 2. 账号过期自动换key 247 | 3. 定时十二小时自动换key 248 | 4. 缓存token 249 | 5. 批量绑定wskey 250 | 6. 多容器 token缓存过期问题修复 251 | 7. 解决%!(EXTRA 错误 252 | 8. 手动指令更新 253 | 9. 可替换失效wskey 254 | 10. wskey失效检测 255 | 11. Whiskey更新 256 | 12. 新增删除账号指令 257 | 13. 清理过期账号指令 258 | 14. 合并详细查询功能 259 | 15. 支持所有格式得CK ALOOK 京东APP等啥都行 260 | 16. 写入失败问题已解决wskey失效两次转换 261 | 17. wskey过期提示 262 | 18. 修复更新指定跳过空wskey 263 | 19. 修复转换错误自动改为false 修复七次无限转换问题 264 | 20. 新增 AtTime参数 不配置导致失败得别怪我 265 | 21. AtTime: #填写1-12之间的数 填错自负默认为10 10点容易出现高峰超时。 266 | 22. IsHelp: #填写true或者false 默认false 是否往容器添加助力码 267 | 23. IsOldV4: #填写true或者false 默认false 是否新版或者旧版V4 268 | 269 | ## 重大更新 270 | 271 | fix 重大BUG修复,解决以下几个问题, 272 | 273 | - 新增账号部分参数空白 274 | - 不管是CK新增还是WSKEY新增账号导致清空CK,由1导致的 275 | - 新增添加后自动回复查询参数。 276 | - 修复账号无限判错问题。 277 | - 新增纯CK版本 可配置调整为WSKEY+CK 和纯CK版本 278 | - Wskey: # 填空默认禁用wskey转换 需要的填true新增配置 默认关闭wskey 需要的自己设置下 279 | 280 | 281 | 282 | 283 | # 鸣谢 284 | 285 | [jd-qinglong](https://github.com/rubyangxg/jd-qinglong ) 286 | 287 | [傻妞](https://github.com/rubyangxg/jd-qinglong ) 288 | 289 | [fuckee的拓展插件](https://github.com/ufuckee/jd_cookie) 290 | 291 | 以及大大小小的模块作者 292 | 293 | # 安装教程 294 | 295 | xdd-plus安装教程 296 | 第一步:下载go 297 | cd /usr/local && wget https://golang.google.cn/dl/go1.16.7.linux-amd64.tar.gz -O go1.16.7.linux-amd64.tar.gz 298 | 第二步:解压go 299 | tar -xvzf go1.16.7.linux-amd64.tar.gz 300 | 第三步:设置环境变量 301 | vi /etc/profile 302 | 将文本复制到最后一行 303 | export GO111MODULE=on 304 | export GOPROXY=https://goproxy.cn 305 | export GOROOT=/usr/local/go 306 | export GOPATH=/usr/local/go/path 307 | export PATH=$PATH:$GOROOT/bin:$GOPATH/bin 308 | 第五步:先按 esc 309 | 然后输入 :wq 310 | 保存文件后 311 | source /etc/profile 312 | 第六步:检查go安装 313 | go env 314 | 第七步:拉xdd-plus的库 315 | cd ~ && git clone https://ghproxy.com/https://github.com/764763903a/xdd-plus.git 316 | 第八步:编译xdd-plus 317 | cd /root/xdd-plus && go build 318 | 319 | # 常见问题 320 | 321 | 编码问题参考 322 | https://blog.csdn.net/qq_29499107/article/details/83583983 323 | /usr/lib64/python3.6/http 324 | 325 | Token故障请先用官方教程重装 已排查是nginx问题 326 | https://thin-hill-428.notion.site/2-8Faker-QL-pannel-Faker-Repository-environment-Setup-45edcbfe90d74d8abb2d71896eab3be7 327 | 请使用官方一键安装 就解决此问题了 328 | 329 | 330 | 331 | 1. 如何自动更新短信镜像 332 | 333 | ``` 334 | docker run -d \ 335 | --name watchtower \ 336 | --restart always \ 337 | -v /var/run/docker.sock:/var/run/docker.sock \ 338 | containrrr/watchtower \ 339 | --cleanup 340 | ``` 341 | 342 | 343 | 344 | 345 | 有问题自己提需求啊。。。有空就解决没空靠自己了各位铁子 346 | 347 | -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | arch=`uname -m` 3 | case $arch in 4 | x86_64) 5 | arch="amd64" 6 | ;; 7 | aarch64) 8 | arch="arm64" 9 | ;; 10 | *) 11 | arch="arm" 12 | ;; 13 | esac 14 | filename="xdd-linux-${arch}" 15 | url="https://github.91chi.fun/https://github.com/764763903a/xdd-plus/releases/download/main/${filename}" 16 | dirname="xdd" 17 | cd $HOME 18 | if [ ! -d dirname ];then 19 | mkdir dirname 20 | fi 21 | cd xdd 22 | #curl -L $url -O $filename 23 | curl -L $url -o xdd 24 | chmod 777 xdd 25 | ./xdd -d 26 | -------------------------------------------------------------------------------- /scripts/USER_AGENTS.js: -------------------------------------------------------------------------------- 1 | const USER_AGENTS = [ 2 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; ONEPLUS A5010 Build/QKQ1.191014.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 3 | "jdapp;iPhone;10.0.2;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 4 | "jdapp;android;10.0.2;9;network/4g;Mozilla/5.0 (Linux; Android 9; Mi Note 3 Build/PKQ1.181007.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36", 5 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; GM1910 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 6 | "jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; 16T Build/PKQ1.190616.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 7 | "jdapp;iPhone;10.0.2;13.6;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 8 | "jdapp;iPhone;10.0.2;13.6;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 9 | "jdapp;iPhone;10.0.2;13.5;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 10 | "jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 11 | "jdapp;iPhone;10.0.2;13.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 12 | "jdapp;iPhone;10.0.2;13.7;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 13 | "jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 14 | "jdapp;iPhone;10.0.2;13.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 15 | "jdapp;iPhone;10.0.2;13.4;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 16 | "jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 17 | "jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; MI 6 Build/PKQ1.190118.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 18 | "jdapp;android;10.0.2;11;network/wifi;Mozilla/5.0 (Linux; Android 11; Redmi K30 5G Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045511 Mobile Safari/537.36", 19 | "jdapp;iPhone;10.0.2;11.4;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 11_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15F79", 20 | "jdapp;android;10.0.2;10;;network/wifi;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 21 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 22 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; ONEPLUS A6000 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045224 Mobile Safari/537.36", 23 | "jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; MHA-AL00 Build/HUAWEIMHA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 24 | "jdapp;android;10.0.2;8.1.0;network/wifi;Mozilla/5.0 (Linux; Android 8.1.0; 16 X Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 25 | "jdapp;android;10.0.2;8.0.0;network/wifi;Mozilla/5.0 (Linux; Android 8.0.0; HTC U-3w Build/OPR6.170623.013; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 26 | "jdapp;iPhone;10.0.2;14.0.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 27 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; LYA-AL00 Build/HUAWEILYA-AL00L; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 28 | "jdapp;iPhone;10.0.2;14.2;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 29 | "jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 30 | "jdapp;iPhone;10.0.2;14.2;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 31 | "jdapp;android;10.0.2;8.1.0;network/wifi;Mozilla/5.0 (Linux; Android 8.1.0; MI 8 Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36", 32 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; Redmi K20 Pro Premium Edition Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36", 33 | "jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 34 | "jdapp;iPhone;10.0.2;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 35 | "jdapp;android;10.0.2;11;network/wifi;Mozilla/5.0 (Linux; Android 11; Redmi K20 Pro Premium Edition Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045513 Mobile Safari/537.36", 36 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36", 37 | "jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 38 | ] 39 | /** 40 | * 生成随机数字 41 | * @param {number} min 最小值(包含) 42 | * @param {number} max 最大值(不包含) 43 | */ 44 | function randomNumber(min = 0, max = 100) { 45 | return Math.min(Math.floor(min + Math.random() * (max - min)), max); 46 | } 47 | const USER_AGENT = USER_AGENTS[randomNumber(0, USER_AGENTS.length)]; 48 | 49 | module.exports = { 50 | USER_AGENT 51 | } -------------------------------------------------------------------------------- /scripts/if_checkin.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/764763903a/xdd-plus/f40b87dde4859d8101bd2a9a7c40b22a3edf9436/scripts/if_checkin.txt -------------------------------------------------------------------------------- /scripts/jdDreamFactoryShareCodes.js: -------------------------------------------------------------------------------- 1 | let codes = ['Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ','VUTjZf0D1aZhzRTn9R_o3Q== @Bz0ca61N3tL5zO9LnNej_6DrtvFSQkmRwCu_Ko8UAt0= @O8XcstN59em7FpkYD7sWjg== ']; 2 | for (let i = 0; i < codes.length; i++) { 3 | const index = (i + 1 === 1) ? '' : (i + 1); 4 | exports['shareCodes.js' + index] = codes[i]; 5 | } -------------------------------------------------------------------------------- /scripts/jdFactoryShareCodes.js: -------------------------------------------------------------------------------- 1 | let codes = ['T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ','T018v_h2RRcc91HUJxub1ACjVWnYaS5kRrbA @T024a33Ml7aPIMl39bJKQV-0Lmf-CjVWnYaS5kRrbA @T0205KkcGFhvtyO_UUKiz6R4CjVWnYaS5kRrbA ']; 2 | for (let i = 0; i < codes.length; i++) { 3 | const index = (i + 1 === 1) ? '' : (i + 1); 4 | exports['shareCodes.js' + index] = codes[i]; 5 | } -------------------------------------------------------------------------------- /scripts/jdFruitShareCodes.js: -------------------------------------------------------------------------------- 1 | let codes = ['01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ','86e1a8145dc54f23a7add9fd604138c4 @01e8a758e24749c4ae2e051336eaca6c @0c823478bd7d45f6828aa40b07daf08a ']; 2 | for (let i = 0; i < codes.length; i++) { 3 | const index = (i + 1 === 1) ? '' : (i + 1); 4 | exports['FruitShareCode' + index] = codes[i]; 5 | } -------------------------------------------------------------------------------- /scripts/jdJxncShareCodes.js: -------------------------------------------------------------------------------- 1 | let codes = ['{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ','{"smp":"3537878dea471bd7b9a1c30e95d87653","active":"jdnc_1_2yuanhamigua210709_2","joinnum":1} @{"smp":"1493079ef0dbd39f98cc8e33bad7268e","active":"jdnc_1_xiacheng210315_2","joinnum":1} @{"smp":"dfecbe8656d29a1150eb588871b690dd","active":"jdnc_1_guamian210305_2","joinnum":1} ']; 2 | for (let i = 0; i < codes.length; i++) { 3 | const index = (i + 1 === 1) ? '' : (i + 1); 4 | exports['JxncShareCode.js' + index] = codes[i]; 5 | } -------------------------------------------------------------------------------- /scripts/jdPetShareCodes.js: -------------------------------------------------------------------------------- 1 | let codes = ['MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ','MTE1NDQ5OTIwMDAwMDAwNDI5ODY1NDE= @MTE1NDQ5OTUwMDAwMDAwNDM2MzczMjk= @MTE1NDAxNzgwMDAwMDAwNDM4OTQ2MTM= ']; 2 | for (let i = 0; i < codes.length; i++) { 3 | const index = (i + 1 === 1) ? '' : (i + 1); 4 | exports['PetShareCode' + index] = codes[i]; 5 | } -------------------------------------------------------------------------------- /scripts/jdPlantBeanShareCodes.js: -------------------------------------------------------------------------------- 1 | let codes = ['pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ','i5hast2vy447ogos6nbnxrxngq3h7wlwy7o5jii @pfuw5smhkmxx4xo2rw6sd24u2qnow7nqbygdqfq @u72q4vdn3zes3gblgsgbbld67mc2qddz5t22sdy @fmspunpftrw5g57oj6avw5jbeiiihtygr3qjhci ']; 2 | for (let i = 0; i < codes.length; i++) { 3 | const index = (i + 1 === 1) ? '' : (i + 1); 4 | exports['PlantBeanShareCodes' + index] = codes[i]; 5 | } -------------------------------------------------------------------------------- /scripts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "got": "^11.8.2", 4 | "tough-cookie": "^4.0.0" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /scripts/test.py: -------------------------------------------------------------------------------- 1 | import json, requests, re 2 | import sys 3 | requests.packages.urllib3.disable_warnings() 4 | ws=sys.argv[1] 5 | def getsign(): 6 | try: 7 | sign = 'https://pan.smxy.xyz/sign' 8 | s = requests.get(url=sign).json() 9 | svv = s['sv'] 10 | stt = s['st'] 11 | suid = s['uuid'] 12 | sign = s['sign'] 13 | return svv, stt, suid, sign 14 | except: 15 | print('调用sign出错!') 16 | 17 | 18 | def getToken(wskey): 19 | sv, st, uuid, sign = getsign() 20 | headers = {'cookie': wskey, 21 | 'User-Agent': 'okhttp/3.12.1;jdmall;android;version/10.1.2;build/89743;screen/1440x3007;os/11;network/wifi;', 22 | 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', 'charset': 'UTF-8', 23 | 'accept-encoding': 'br,gzip,deflate'} 24 | params = {'functionId': 'genToken', 'clientVersion': '10.1.2', 'client': 'android', 'uuid': uuid, 'st': st, 25 | 'sign': sign, 'sv': sv} 26 | url = 'https://api.m.jd.com/client.action' 27 | data = 'body=%7B%22action%22%3A%22to%22%2C%22to%22%3A%22https%253A%252F%252Fplogin.m.jd.com%252Fcgi-bin%252Fm%252Fthirdapp_auth_page%253Ftoken%253DAAEAIEijIw6wxF2s3bNKF0bmGsI8xfw6hkQT6Ui2QVP7z1Xg%2526client_type%253Dandroid%2526appid%253D879%2526appup_type%253D1%22%7D&' 28 | res = requests.post(url=url, params=params, headers=headers, data=data, verify=False) 29 | res_json = json.loads(res.text) 30 | tokenKey = res_json['tokenKey'] 31 | return appjmp(wskey, tokenKey) 32 | 33 | def appjmp(wskey, tokenKey): 34 | headers = { 35 | 'User-Agent': 'okhttp/3.12.1;jdmall;android;version/10.1.2;build/89743;screen/1440x3007;os/11;network/wifi;', 36 | 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', } 37 | params = {'tokenKey': tokenKey, 38 | 'to': 'https://plogin.m.jd.com/cgi-bin/m/thirdapp_auth_page?token=AAEAIEijIw6wxF2s3bNKF0bmGsI8xfw6hkQT6Ui2QVP7z1Xg', 39 | 'client_type': 'android', 'appid': 879, 'appup_type': 1, } 40 | url = 'https://un.m.jd.com/cgi-bin/app/appjmp' 41 | res = requests.get(url=url, headers=headers, params=params, verify=False, allow_redirects=False) 42 | res_set = res.cookies.get_dict() 43 | pt_key = 'pt_key=' + res_set['pt_key'] 44 | pt_pin = 'pt_pin=' + res_set['pt_pin'] 45 | jd_ck = str(pt_key) + ';' + str(pt_pin) + ';' 46 | # print(jd_ck) 47 | wskey = wskey.split(";")[0] 48 | if 'fake' in pt_key: 49 | print("wskey格式错误!") 50 | else: 51 | print(jd_ck) 52 | 53 | 54 | def checkwskey(wskey): 55 | flag = "wskey=" in wskey 56 | flag1 = "pin=" in wskey 57 | if flag == True & flag1 == True: 58 | return True 59 | else : 60 | return False 61 | 62 | if __name__ == '__main__': 63 | getToken(ws) 64 | 65 | -------------------------------------------------------------------------------- /static/2233login.af9c53d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/764763903a/xdd-plus/f40b87dde4859d8101bd2a9a7c40b22a3edf9436/static/2233login.af9c53d.png -------------------------------------------------------------------------------- /static/hb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/764763903a/xdd-plus/f40b87dde4859d8101bd2a9a7c40b22a3edf9436/static/hb.jpg -------------------------------------------------------------------------------- /static/loadTV.99606e2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/764763903a/xdd-plus/f40b87dde4859d8101bd2a9a7c40b22a3edf9436/static/loadTV.99606e2.gif -------------------------------------------------------------------------------- /static/ok.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/test.txt: -------------------------------------------------------------------------------- 1 | Hello world! -------------------------------------------------------------------------------- /static/zfb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/764763903a/xdd-plus/f40b87dde4859d8101bd2a9a7c40b22a3edf9436/static/zfb.jpg -------------------------------------------------------------------------------- /theme/admin.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Login 6 | 68 | 69 | 70 |
71 |

Login

72 | 73 | 74 |
75 | 76 | 110 | 111 | -------------------------------------------------------------------------------- /theme/bidong.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 哔咚哔咚 8 | 57 | 58 | 59 | 60 |
61 |
62 | 63 |
64 |
65 | 66 |
67 |
扫描二维码登录
68 |
或通过 京东手机客户端
69 |
跳转登录
70 |
或扫码下载APP
71 |
72 | 73 |
74 | 75 |
76 | 77 | 160 | 161 | -------------------------------------------------------------------------------- /theme/kuduan.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 何必烦忧 8 | 9 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 53 |
54 | 77 | 78 | 164 | 165 | -------------------------------------------------------------------------------- /theme/noodin.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 吃面啦 8 | 42 | 43 | 44 | 45 |
46 |

47 | 48 |

49 |
50 |

51 |
52 |

53 | 扫码登陆
54 |

55 |

56 | 京东APP登陆 57 |
58 |

59 |

TG交流: 60 | ✈️  好好学习 ✈️ 61 |
62 | 扫码程序: 63 | 64 | © 65 | Cdle作者 66 |  网页源码: 67 | 68 | © 69 | 不知道 70 |  最终修改: 71 | 72 | © 73 | MADAO 74 |
75 | 程序版本 v1.0.2 76 |

77 | 78 |
79 |
80 |
81 | 82 |
83 |
84 | 85 | 点击右上角选择浏览器中打开 86 |
87 |
88 | 89 | 177 | 178 | 179 | -------------------------------------------------------------------------------- /theme/random.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | JD — 任务助手 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 |
26 |
27 | 62 |
63 |
64 |
65 | 66 | 146 | 147 | -------------------------------------------------------------------------------- /theme/summer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | JD自动挂机 8 | 15 | 16 | 17 | 18 | 19 | 27 |
28 | 29 |
30 |
31 | 84 |
85 | 86 | 87 |
88 |
89 | 90 | 170 | 171 | -------------------------------------------------------------------------------- /theme/survey.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 问卷调查 7 | 8 | 9 | 10 | 154 | 155 | 156 | -------------------------------------------------------------------------------- /ua.txt: -------------------------------------------------------------------------------- 1 | Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 SP-engine/2.14.0 main%2F1.0 baiduboxapp/11.18.0.16 (Baidu; P2 13.3.1) NABar/0.0 --------------------------------------------------------------------------------