Skip to content

Instantly share code, notes, and snippets.

@fzls
Last active Jun 25, 2022
Embed
What would you like to do?

Revisions

  1. fzls revised this gist Dec 5, 2021. 1 changed file with 48 additions and 9 deletions.
    @@ -41,11 +41,11 @@ for (let i = 0; i < CookieJDs.length; i++) {
    }

    // 以下为注入互助码环境变量(仅nodejs内起效)的代码
    function SetShareCodesEnv(nameConfig = "", envName = "") {
    function SetShareCodesEnv(nameChinese = "", nameConfig = "", envName = "") {
    let rawCodeConfig = {}

    // 读取互助码
    shareCodeLogPath = `${process.env.QL_DIR}/log/.ShareCode/${nameConfig}.log`
    let shareCodeLogPath = `${process.env.QL_DIR}/log/.ShareCode/${nameConfig}.log`
    let fs = require('fs')
    if (fs.existsSync(shareCodeLogPath)) {
    // 因为faker2目前没有自带ini,改用已有的dotenv来解析
    @@ -59,7 +59,7 @@ function SetShareCodesEnv(nameConfig = "", envName = "") {
    }

    // 解析每个用户的互助码
    codes = {}
    let codes = {}
    Object.keys(rawCodeConfig).forEach(function (key) {
    if (key.startsWith(`My${nameConfig}`)) {
    codes[key] = rawCodeConfig[key]
    @@ -70,7 +70,7 @@ function SetShareCodesEnv(nameConfig = "", envName = "") {
    let helpOtherCodes = {}
    Object.keys(rawCodeConfig).forEach(function (key) {
    if (key.startsWith(`ForOther${nameConfig}`)) {
    helpCode = rawCodeConfig[key]
    let helpCode = rawCodeConfig[key]
    for (const [codeEnv, codeVal] of Object.entries(codes)) {
    helpCode = helpCode.replace("${" + codeEnv + "}", codeVal)
    }
    @@ -81,14 +81,24 @@ function SetShareCodesEnv(nameConfig = "", envName = "") {

    // 按顺序用&拼凑到一起,并放入环境变量,供目标脚本使用
    let shareCodes = []
    let totalCodeCount = Object.keys(helpOtherCodes).length
    for (let idx = 1; idx <= totalCodeCount; idx++) {
    let leftIndex = 1, rightIndex = Object.keys(helpOtherCodes).length

    // 判断是否是ptask并行触发,若是,则修改实际需要设置的互助码范围
    let ptaskLeft = process.env.PTASK_LEFT
    let ptaskRight = process.env.PTASK_RIGHT
    if (ptaskLeft && ptaskRight) {
    leftIndex = Number(ptaskLeft)
    rightIndex = Number(ptaskRight)
    }

    for (let idx = leftIndex; idx <= rightIndex; idx++) {
    shareCodes.push(helpOtherCodes[`ForOther${nameConfig}${idx}`])
    }
    let shareCodesStr = shareCodes.join('&')
    process.env[envName] = shareCodesStr

    console.info(`【风之凌殇】 友情提示:为避免ck超过45以上时,互助码环境变量过大而导致调用一些系统命令(如date/cat)时报 Argument list too long,改为在nodejs中设置 ${nameConfig} 的 互助码环境变量 ${envName},共计 ${totalCodeCount} 组互助码,总大小为 ${shareCodesStr.length}`)
    let totalCodeCount = rightIndex - leftIndex + 1
    console.info(`【风之凌殇】 友情提示:设置 ${nameChinese} 的 互助码环境变量 ${envName},共计 ${totalCodeCount} 组互助码,总大小为 ${shareCodesStr.length}`)
    }

    // 判断当前活动脚本是否在互助脚本列表中
    @@ -122,12 +132,41 @@ function GetCurrentActivityScriptFileName() {
    return path.basename(process.argv[1])
    }

    function randomString(e) {
    e = e || 32;
    let t = "abcdefhijkmnprstwxyz2345678",
    a = t.length,
    n = "";
    for (i = 0; i < e; i++)
    n += t.charAt(Math.floor(Math.random() * a));
    return n
    }

    // 若在task_before.sh 中设置了要设置互助码环境变量的活动名称和环境变量名称信息,则在nodejs中处理,供活动使用
    let nameChinese = process.env.ShareCodeConfigChineseName
    let nameConfig = process.env.ShareCodeConfigName
    let envName = process.env.ShareCodeEnvName
    if (nameConfig && envName) {
    SetShareCodesEnv(nameConfig, envName)
    if (nameChinese && nameConfig && envName) {
    SetShareCodesEnv(nameChinese, nameConfig, envName)
    } else if (IsShareJsFile()) {
    console.debug(`【风之凌殇】 友情提示:当前脚本为 ${GetCurrentActivityScriptFileName()},包含在互助脚本列表中,但未设置 ShareCodeConfigName 或 ShareCodeEnvName 环境变量,将不会尝试在nodejs中生成互助码的环境变量。ps: 两个值目前分别为 ${nameConfig} ${envName}`)
    console.debug(`看不惯上面的署名,就自己把这行注释掉<_< 或者不用`)
    }

    // 增加打印队伍信息
    // export JD_COOKIE_TEAM_INDEX=$j
    // export JD_COOKIE_TEAM_START_INDEX=$start_index
    // export JD_COOKIE_TEAM_END_INDEX=$end_index
    let teamIndex = process.env.JD_COOKIE_TEAM_INDEX
    let teamStartIndex = process.env.JD_COOKIE_TEAM_START_INDEX
    let teamEndIndex = process.env.JD_COOKIE_TEAM_END_INDEX
    if (teamIndex && teamStartIndex && teamEndIndex) {
    console.info(`当前是组队模式,队伍序号为 ${teamIndex},cookie范围为 [${teamStartIndex}, ${teamEndIndex}]`)
    }


    // 打印ptask并行调用的一些信息
    if (process.env.PTASK) {
    console.info(`检查到ptask并行执行(Powered By 风之凌殇),并发数为 ${process.env.PTASK_FINAL_THREADS},每个脚本处理 ${process.env.PTASK_BATCH} 个账号,全局账号数总计 ${process.env.PTASK_TOTAL}`)
    console.info(`当前脚本实例 ${randomString(4)} 处理账号范围 [${process.env.PTASK_LEFT}, ${process.env.PTASK_RIGHT}]`)
    }
  2. fzls revised this gist Nov 24, 2021. 1 changed file with 19 additions and 20 deletions.
    @@ -1,31 +1,30 @@
    # 本方案首先是自用,然后才是顺带分享给大家,所以我爱咋写咋写,请勿过多指责。没有强迫任何人使用。

    # 如介意示例方案中的日志中的署名,请不要原封不动的使用本脚本。

    ## 更新日志
    ### 2021.11.24
    1. 仅支持互助的活动脚本中打印相关提示

    ## 目录
    - [本方案首先是自用,然后才是顺带分享给大家,所以我爱咋写咋写,请勿过多指责。没有强迫任何人使用。](#本方案首先是自用然后才是顺带分享给大家所以我爱咋写咋写请勿过多指责没有强迫任何人使用)
    - [如介意示例方案中的日志中的署名,请不要原封不动的使用本脚本。](#如介意示例方案中的日志中的署名请不要原封不动的使用本脚本)
    - [更新日志](#更新日志)
    - [2021.11.24](#20211124)
    - [目录](#目录)
    - [太长不读](#太长不读)
    - [青龙v2.10.8及以后](#青龙v2108及以后)
    - [青龙v2.10.8以前](#青龙v2108以前)
    - [最初](#最初)
    - [当ck到一定数目后](#当ck到一定数目后)
    - [排查定位](#排查定位)
    - [现有解决方案](#现有解决方案)
    - [新的解决思路](#新的解决思路)
    - [最终方案](#最终方案)
    - [青龙v2.10.8及以后](#青龙v2108及以后-1)
    - [青龙v2.10.8以前](#青龙v2108以前-1)
    - [核心改动代码](#核心改动代码)
    - [shell中设置参数](#shell中设置参数)
    - [nodejs中实际处理](#nodejs中实际处理)
    - [效果](#效果)
    - [更新日志](#更新日志)
    - [2021.11.24](#20211124)
    - [目录](#目录)
    - [太长不读](#太长不读)
    - [青龙v2.10.8及以后](#青龙v2108及以后)
    - [青龙v2.10.8以前](#青龙v2108以前)
    - [最初](#最初)
    - [当ck到一定数目后](#当ck到一定数目后)
    - [排查定位](#排查定位)
    - [现有解决方案](#现有解决方案)
    - [新的解决思路](#新的解决思路)
    - [最终方案](#最终方案)
    - [青龙v2.10.8及以后](#青龙v2108及以后-1)
    - [青龙v2.10.8以前](#青龙v2108以前-1)
    - [核心改动代码](#核心改动代码)
    - [shell中设置参数](#shell中设置参数)
    - [nodejs中实际处理](#nodejs中实际处理)
    - [效果](#效果)

    ## 太长不读
    ### 青龙v2.10.8及以后
  3. fzls revised this gist Nov 24, 2021. 3 changed files with 73 additions and 31 deletions.
    @@ -1,23 +1,31 @@
    # 本方案首先是自用,然后才是顺带分享给大家,所以我爱咋写咋写,请勿过多指责。没有强迫任何人使用。
    # 如介意示例方案中的日志中的署名,请不要原封不动的使用本脚本。

    ## 更新日志
    ### 2021.11.24
    1. 仅支持互助的活动脚本中打印相关提示

    ## 目录
    - [目录](#目录)
    - [太长不读](#太长不读)
    - [青龙v2.10.8及以后](#青龙v2108及以后)
    - [青龙v2.10.8以前](#青龙v2108以前)
    - [最初](#最初)
    - [当ck到一定数目后](#当ck到一定数目后)
    - [排查定位](#排查定位)
    - [现有解决方案](#现有解决方案)
    - [新的解决思路](#新的解决思路)
    - [最终方案](#最终方案)
    - [青龙v2.10.8及以后](#青龙v2108及以后-1)
    - [青龙v2.10.8以前](#青龙v2108以前-1)
    - [核心改动代码](#核心改动代码)
    - [shell中设置参数](#shell中设置参数)
    - [nodejs中实际处理](#nodejs中实际处理)
    - [效果](#效果)
    - [本方案首先是自用,然后才是顺带分享给大家,所以我爱咋写咋写,请勿过多指责。没有强迫任何人使用。](#本方案首先是自用然后才是顺带分享给大家所以我爱咋写咋写请勿过多指责没有强迫任何人使用)
    - [如介意示例方案中的日志中的署名,请不要原封不动的使用本脚本。](#如介意示例方案中的日志中的署名请不要原封不动的使用本脚本)
    - [更新日志](#更新日志)
    - [2021.11.24](#20211124)
    - [目录](#目录)
    - [太长不读](#太长不读)
    - [青龙v2.10.8及以后](#青龙v2108及以后)
    - [青龙v2.10.8以前](#青龙v2108以前)
    - [最初](#最初)
    - [当ck到一定数目后](#当ck到一定数目后)
    - [排查定位](#排查定位)
    - [现有解决方案](#现有解决方案)
    - [新的解决思路](#新的解决思路)
    - [最终方案](#最终方案)
    - [青龙v2.10.8及以后](#青龙v2108及以后-1)
    - [青龙v2.10.8以前](#青龙v2108以前-1)
    - [核心改动代码](#核心改动代码)
    - [shell中设置参数](#shell中设置参数)
    - [nodejs中实际处理](#nodejs中实际处理)
    - [效果](#效果)

    ## 太长不读
    ### 青龙v2.10.8及以后
    @@ -91,12 +91,43 @@ function SetShareCodesEnv(nameConfig = "", envName = "") {
    console.info(`【风之凌殇】 友情提示:为避免ck超过45以上时,互助码环境变量过大而导致调用一些系统命令(如date/cat)时报 Argument list too long,改为在nodejs中设置 ${nameConfig} 的 互助码环境变量 ${envName},共计 ${totalCodeCount} 组互助码,总大小为 ${shareCodesStr.length}`)
    }

    // 判断当前活动脚本是否在互助脚本列表中
    function IsShareJsFile() {
    // 尝试获取在task_before.sh中设置的 互助活动的脚本文件名的关键部分 列表
    let rawJsNameList = process.env.ShareCodeJSNameList
    if (!rawJsNameList) {
    return false
    }

    // 转换为list
    let jsNameList = process.env.ShareCodeJSNameList.split(" ")

    // 判断当前
    let currentActivityScriptFileName = GetCurrentActivityScriptFileName()

    let isShareJsFile = false
    for (let idx = 0; idx < jsNameList.length; idx++) {
    if (currentActivityScriptFileName.includes(jsNameList[idx])) {
    isShareJsFile = true
    break
    }
    }

    return isShareJsFile
    }

    // 获取当前活动脚本的文件名
    function GetCurrentActivityScriptFileName() {
    const path = require('path')
    return path.basename(process.argv[1])
    }

    // 若在task_before.sh 中设置了要设置互助码环境变量的活动名称和环境变量名称信息,则在nodejs中处理,供活动使用
    let nameConfig = process.env.ShareCodeConfigName
    let envName = process.env.ShareCodeEnvName
    if (nameConfig && envName) {
    SetShareCodesEnv(nameConfig, envName)
    } else {
    console.debug(`【风之凌殇】 友情提示:当前未设置 ShareCodeConfigName 或 ShareCodeEnvName 环境变量,将不会尝试在nodejs中生成互助码的环境变量。ps: 两个值目前分别为 ${nameConfig} ${envName}`)
    console.debug(`如果当前活动并没有互助内容,请无视上面这句话`)
    } else if (IsShareJsFile()) {
    console.debug(`【风之凌殇】 友情提示:当前脚本为 ${GetCurrentActivityScriptFileName()},包含在互助脚本列表中,但未设置 ShareCodeConfigName 或 ShareCodeEnvName 环境变量,将不会尝试在nodejs中生成互助码的环境变量。ps: 两个值目前分别为 ${nameConfig} ${envName}`)
    console.debug(`看不惯上面的署名,就自己把这行注释掉<_< 或者不用`)
    }
    @@ -1,6 +1,6 @@
    #!/usr/bin/env bash

    # Build 20211009-001-test
    # Build 20211122-001

    name_js=(
    jd_fruit
    @@ -163,6 +163,7 @@ team_task(){
    for ((i=0; i<${#teamer_array[*]}; i++)); do
    combine_team ${teamer_array[i]} ${team_array[i]} ${activityId[i]} ${activityUrl[i]}
    [[ $q -ge $(($user_sum/p)) ]] && q=$(($user_sum/p))
    [[ q -lt 1 ]] && q=1
    for ((m = 0; m < $user_sum; m++)); do
    j=$((m + 1))
    x=$((m/q))
    @@ -258,7 +259,17 @@ combine_only() {
    # export ${env_name[i]}=$result
    export ShareCodeConfigName=${name_config[i]}
    export ShareCodeEnvName=${env_name[i]}
    echo "设置环境变量标记 ShareCodeConfigName=${ShareCodeConfigName} ShareCodeEnvName=${ShareCodeEnvName}, 供nodejs去实际生成互助码环境变量"

    # 在实际执行任务前,确保集合仓库的脚本目录中的jdCookie.js是修改版的内容
    # 青龙v2.10.8及以后,由deps功能自动覆盖
    echo "请确保魔改版jdCookie.js已放置在/ql/deps目录下,确保其会被自动覆盖,否则上述设置的环境变量不会生效 ..."
    echo "注意把映射目录增加 ./data/deps:/ql/deps"

    # 青龙v2.10.8以前 启用这段代码
    # echo 开始复制魔改版jdCookie.js ...
    # cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js
    # cp /ql/config/jdCookie.js /ql/scripts/cdle_carry/jdCookie.js
    # echo 复制完毕
    fi
    fi
    ;;
    @@ -283,13 +294,5 @@ fi
    # combine_all
    #fi

    # 在实际执行任务前,确保集合仓库的脚本目录中的jdCookie.js是修改版的内容
    # 青龙v2.10.8及以后,由deps功能自动覆盖
    echo "请确保魔改版jdCookie.js已放置在/ql/deps目录下,确保其会被自动覆盖 ..."
    echo "注意把映射目录增加 ./data/deps:/ql/deps"

    # 青龙v2.10.8以前 启用这段代码
    # echo 开始复制魔改版jdCookie.js ...
    # cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js
    # cp /ql/config/jdCookie.js /ql/scripts/cdle_carry/jdCookie.js
    # echo 复制完毕
    # 导出互助脚本列表,供 jdCookie.js 处使用
    export ShareCodeJSNameList="${name_js[@]}"
  4. fzls revised this gist Nov 24, 2021. 1 changed file with 1 addition and 1 deletion.
    @@ -1,4 +1,4 @@
    # 本脚本首先是自用,然后才是顺带分享给大家,所以我爱咋写咋写,请勿过多指责。没有强迫任何人使用。
    # 本方案首先是自用,然后才是顺带分享给大家,所以我爱咋写咋写,请勿过多指责。没有强迫任何人使用。
    # 如介意示例方案中的日志中的署名,请不要原封不动的使用本脚本。

    ## 目录
  5. fzls revised this gist Nov 24, 2021. 2 changed files with 3 additions and 2 deletions.
    @@ -1,3 +1,6 @@
    # 本脚本首先是自用,然后才是顺带分享给大家,所以我爱咋写咋写,请勿过多指责。没有强迫任何人使用。
    # 如介意示例方案中的日志中的署名,请不要原封不动的使用本脚本。

    ## 目录
    - [目录](#目录)
    - [太长不读](#太长不读)
    @@ -1,2 +0,0 @@
    # 本脚本首先是自用,然后才是顺带分享给大家,所以我爱咋写咋写,请勿过多指责。没有强迫任何人使用。
    # 如介意示例方案中的日志中的署名,请不要原封不动的使用本脚本。
  6. fzls revised this gist Nov 24, 2021. 1 changed file with 2 additions and 0 deletions.
    @@ -0,0 +1,2 @@
    # 本脚本首先是自用,然后才是顺带分享给大家,所以我爱咋写咋写,请勿过多指责。没有强迫任何人使用。
    # 如介意示例方案中的日志中的署名,请不要原封不动的使用本脚本。
  7. fzls revised this gist Nov 23, 2021. 1 changed file with 13 additions and 2 deletions.
    @@ -47,12 +47,14 @@ echo 复制完毕
    ## 最初
    之前使用的互助码脚本 task_before.sh 和 code.sh 是从 互助研究院电报群 获取的
    > https://t.me/update_help/41
    > https://t.me/update_help/45
    在cookie数目较少的情况下,一直运行良好,这里先感谢大佬的无私奉献。

    ## 当ck到一定数目后
    但是,在我拉了更多人一起挂青龙,ck到达89个时,很多脚本开始报 Argument list too long 错误,而且是一些系统命令,比如 timeout、date、cat等报的错,看的我一脸懵逼。

    ![image](https://user-images.githubusercontent.com/13483212/142473975-5ea3ba0b-08f3-4f91-8e08-e3453edeb641.png)

    ## 排查定位
    @@ -66,7 +68,9 @@ task_before.sh在shell环境中设置了一个很大的环境变量,其大小
    而系统默认的参数列表大小(包含环境变量)为 $(getconf ARG_MAX) = 131072,可见远远超出该值。因此后续调用任何系统命令,都将会报出 Argument list too long 而导致后续流程无法正常进行。

    ## 现有解决方案
    昨晚搜了下现有的做法,基本都是分多个青龙容器,每个保持在45个(这样大小约为81000),确保不会报错。这个方法很简洁,但是会带来维护上的麻烦,本来只要部署一套qinglong容器,现在需要维护多套,比较费心力。
    昨晚搜了下现有的做法,基本都是分多个青龙容器,每个保持在45个(这样大小约为81000),确保不会报错。

    这个方法很简洁,但是会带来维护上的麻烦,本来只要部署一套qinglong容器,现在需要维护多套,比较费心力。

    ## 新的解决思路
    昨天最初准备按这套走了,流程都构思完了。后来突然想到一个新思路,现在的问题是shell中设置的env太大了,导致其他流程不能正常执行。那么如果我把设置env的流程挪到nodejs中,不再经由shell的环境,那么shell中执行的其他命令就不会报错了。
    @@ -77,7 +81,10 @@ task_before.sh在shell环境中设置了一个很大的环境变量,其大小
    一番处理后,最终就有了下面的流程
    task_before.sh 不再直接设置环境变量,而是设置要处理的活动名称和对应互助码文件名称

    接下来需要在nodejs中某个地方去接收这两个参数来实际生成。如果仓库完全自己管控,那么直接新增一个模块,在模块内处理后塞入process.env,然后各个脚本中引入即可,与之前表现完全一致。
    接下来需要在nodejs中某个地方去接收这两个参数来实际生成。

    如果仓库完全自己管控,那么直接新增一个模块,在模块内处理后塞入process.env,然后各个脚本中引入即可,与之前表现完全一致。

    但是显然这样沟通成本有点高,这里可以取巧,观察可以发现,几乎每个脚本中都有下面这句
    ```javascript
    const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
    @@ -100,7 +107,9 @@ const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';

    ### 青龙v2.10.8以前
    如果你的青龙在此版本之前,则尚还没有覆盖自定义的依赖到脚本库的功能,需要自行实现,具体方式如下

    由于目前青龙会在定时任务完成前执行 task_before.sh ,所以我们可以在 task_before.sh 末尾加入以下内容,来实现这一目的

    默认的方案是以 shufflewzc/faker2 和 cdle/carry 为基准的,如果你是其他仓库,需要在task_before.sh末尾增加上同步jdCookie.js到你对应的仓库脚本目录
    ```shell
    # 在实际执行任务前,确保集合仓库的脚本目录中的jdCookie.js是修改版的内容
    @@ -166,7 +175,9 @@ if (nameConfig && envName) {

    ## 效果
    自此,即使你的ck很多,也不再用看到下面这一幕了。

    ![image](https://user-images.githubusercontent.com/13483212/142474215-af41b6c1-acdf-410f-985a-90ebe749103e.png)

    而是会看到

    ![image](https://user-images.githubusercontent.com/13483212/142474100-1c97d031-c49a-44e1-acf6-ac87d8aafdeb.png)
  8. fzls revised this gist Nov 23, 2021. 1 changed file with 16 additions and 6 deletions.
    @@ -1,12 +1,16 @@
    ## 目录
    - [目录](#目录)
    - [太长不读](#太长不读)
    - [青龙v2.10.8及以后](#青龙v2108及以后)
    - [青龙v2.10.8以前](#青龙v2108以前)
    - [最初](#最初)
    - [当ck到一定数目后](#当ck到一定数目后)
    - [排查定位](#排查定位)
    - [现有解决方案](#现有解决方案)
    - [新的解决思路](#新的解决思路)
    - [最终方案](#最终方案)
    - [青龙v2.10.8及以后](#青龙v2108及以后-1)
    - [青龙v2.10.8以前](#青龙v2108以前-1)
    - [核心改动代码](#核心改动代码)
    - [shell中设置参数](#shell中设置参数)
    - [nodejs中实际处理](#nodejs中实际处理)
    @@ -55,15 +59,18 @@ echo 复制完毕
    于是昨晚在青龙容器里对shell下断点,各种调试,也是一直毫无头绪,后来,在搜到下面这个帖子时,终于明白了这个报错的起因。
    > https://stackoverflow.com/a/28865503
    task_before.sh在shell环境中设置了一个很大的环境变量,其大小大概为 总ck数目 * 未被屏蔽的ck数目 * 单个互助码的大小,部分活动的互助码大小约为40。
    此时如果有80个ck,且全部启用,则大小将是 80 * 80 * 40 = 256000,而系统默认的参数列表大小(包含环境变量)为 $(getconf ARG_MAX) = 131072,
    可见远远超出该值。因此后续调用任何系统命令,都将会报出 Argument list too long 而导致后续流程无法正常进行。
    task_before.sh在shell环境中设置了一个很大的环境变量,其大小大概为 总ck数目 * 未被屏蔽的ck数目 * 单个互助码的大小。

    部分活动的互助码大小约为40,此时如果有80个ck,且全部启用,则大小将是 80 * 80 * 40 = 256000。

    而系统默认的参数列表大小(包含环境变量)为 $(getconf ARG_MAX) = 131072,可见远远超出该值。因此后续调用任何系统命令,都将会报出 Argument list too long 而导致后续流程无法正常进行。

    ## 现有解决方案
    昨晚搜了下现有的做法,基本都是分多个青龙容器,每个保持在45个(这样大小约为81000),确保不会报错。这个方法很简洁,但是会带来维护上的麻烦,本来只要部署一套qinglong容器,现在需要维护多套,比较费心力。

    ## 新的解决思路
    昨天最初准备按这套走了,流程都构思完了。后来突然想到一个新思路,现在的问题是shell中设置的env太大了,导致其他流程不能正常执行。那么如果我把设置env的流程挪到nodejs中,不再经由shell的环境,那么shell中执行的其他命令就不会报错了。

    有了思路后,问题就简单了。这下只需要把原先task_before.js中执行的解析互助码文件和转换后放入shell环境变量的流程换到nodejs中即可,这样这几十MB的环境变量就不再是作为参数传入了。

    ## 最终方案
    @@ -79,9 +86,12 @@ const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
    所以,我们可以魔改 jdCookie.js 这个文件,自己从基准仓库中复制一份,然后将我们的处理互助码的逻辑加到后面即可,这样就可以实现每个脚本自动调用我们的新流程了。

    所以最终就有了下面三个文件
    code.sh 原版,负责在 /ql/log/.ShareCode 生成互助码的文件
    task_before.sh 魔改版,负责确认当前活动是否需要互助码,若需要,则设置 活动名称ShareCodeConfigName 和 环境变量名称ShareCodeEnvName 这两个环境变量
    jdCookie.js 魔改版,判断前面两个环境变量是否存在,若存在,则解析对应活动的互助码文件,按照task_before.sh原有的逻辑转换后放入对应环境变量key中

    | 文件 | 说明 |
    | :---- | :---- |
    | code.sh | 原版,负责在 /ql/log/.ShareCode 生成互助码的文件 |
    | task_before.sh | 魔改版,负责确认当前活动是否需要互助码,若需要,则设置 活动名称ShareCodeConfigName 和 环境变量名称ShareCodeEnvName 这两个环境变量 |
    | jdCookie.js | 魔改版,判断前面两个环境变量是否存在,若存在,则解析对应活动的互助码文件,按照task_before.sh原有的逻辑转换后放入对应环境变量key中 |

    前两个按原有教程操作即可,魔改版的jdCookie.js需要执行任务前确保覆盖到对应目录。

  9. fzls revised this gist Nov 23, 2021. 1 changed file with 1 addition and 0 deletions.
    @@ -98,4 +98,5 @@ if (nameConfig && envName) {
    SetShareCodesEnv(nameConfig, envName)
    } else {
    console.debug(`【风之凌殇】 友情提示:当前未设置 ShareCodeConfigName 或 ShareCodeEnvName 环境变量,将不会尝试在nodejs中生成互助码的环境变量。ps: 两个值目前分别为 ${nameConfig} ${envName}`)
    console.debug(`如果当前活动并没有互助内容,请无视上面这句话`)
    }
  10. fzls revised this gist Nov 20, 2021. 1 changed file with 1 addition and 0 deletions.
    @@ -17,6 +17,7 @@
    复制 code.sh、task_before.sh 到/ql/config目录,用法与 https://t.me/update_help/45 中所述完全一致

    复制 jdCookie.js 到 /ql/deps 目录,确保更新脚本库后,魔改版本会被覆盖过去
    > 注意把映射目录增加 ./data/deps:/ql/deps
    ### 青龙v2.10.8以前
    复制 code.sh、task_before.sh 、jdCookie.js 到/ql/config目录,用法与 https://t.me/update_help/45 中所述完全一致
  11. fzls revised this gist Nov 20, 2021. 2 changed files with 10 additions and 0 deletions.
    @@ -15,13 +15,16 @@
    ## 太长不读
    ### 青龙v2.10.8及以后
    复制 code.sh、task_before.sh 到/ql/config目录,用法与 https://t.me/update_help/45 中所述完全一致

    复制 jdCookie.js 到 /ql/deps 目录,确保更新脚本库后,魔改版本会被覆盖过去

    ### 青龙v2.10.8以前
    复制 code.sh、task_before.sh 、jdCookie.js 到/ql/config目录,用法与 https://t.me/update_help/45 中所述完全一致

    如果你的青龙在此版本之前,则尚还没有覆盖自定义的依赖到脚本库的功能,需要自行实现,具体方式如下

    将下面这段shell代码复制到 task_before.sh的末尾,从而实现覆盖魔改版。

    默认的方案是以 shufflewzc/faker2 和 cdle/carry 为基准的,如果你是其他仓库,需要在task_before.sh末尾增加上同步jdCookie.js到你对应的仓库脚本目录
    ```shell
    # 在实际执行任务前,确保集合仓库的脚本目录中的jdCookie.js是修改版的内容
    @@ -284,5 +284,12 @@ fi
    #fi

    # 在实际执行任务前,确保集合仓库的脚本目录中的jdCookie.js是修改版的内容
    # 青龙v2.10.8及以后,由deps功能自动覆盖
    echo "请确保魔改版jdCookie.js已放置在/ql/deps目录下,确保其会被自动覆盖 ..."
    echo "注意把映射目录增加 ./data/deps:/ql/deps"

    # 青龙v2.10.8以前 启用这段代码
    # echo 开始复制魔改版jdCookie.js ...
    # cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js
    # cp /ql/config/jdCookie.js /ql/scripts/cdle_carry/jdCookie.js
    # echo 复制完毕
  12. fzls revised this gist Nov 20, 2021. 2 changed files with 27 additions and 10 deletions.
    @@ -13,8 +13,15 @@
    - [效果](#效果)

    ## 太长不读
    复制 code.sh、task_before.sh、jdCookie.js 到/ql/config目录,用法与 https://t.me/update_help/45 中所述完全一致
    ### 青龙v2.10.8及以后
    复制 code.sh、task_before.sh 到/ql/config目录,用法与 https://t.me/update_help/45 中所述完全一致
    复制 jdCookie.js 到 /ql/deps 目录,确保更新脚本库后,魔改版本会被覆盖过去

    ### 青龙v2.10.8以前
    复制 code.sh、task_before.sh 、jdCookie.js 到/ql/config目录,用法与 https://t.me/update_help/45 中所述完全一致

    如果你的青龙在此版本之前,则尚还没有覆盖自定义的依赖到脚本库的功能,需要自行实现,具体方式如下
    将下面这段shell代码复制到 task_before.sh的末尾,从而实现覆盖魔改版。
    默认的方案是以 shufflewzc/faker2 和 cdle/carry 为基准的,如果你是其他仓库,需要在task_before.sh末尾增加上同步jdCookie.js到你对应的仓库脚本目录
    ```shell
    # 在实际执行任务前,确保集合仓库的脚本目录中的jdCookie.js是修改版的内容
    @@ -73,12 +80,23 @@ task_before.sh 魔改版,负责确认当前活动是否需要互助码,
    jdCookie.js 魔改版,判断前面两个环境变量是否存在,若存在,则解析对应活动的互助码文件,按照task_before.sh原有的逻辑转换后放入对应环境变量key中

    前两个按原有教程操作即可,魔改版的jdCookie.js需要执行任务前确保覆盖到对应目录。

    ### 青龙v2.10.8及以后
    复制 jdCookie.js 到 /ql/deps 目录,确保更新脚本库后,魔改版本会被覆盖过去

    ### 青龙v2.10.8以前
    如果你的青龙在此版本之前,则尚还没有覆盖自定义的依赖到脚本库的功能,需要自行实现,具体方式如下
    由于目前青龙会在定时任务完成前执行 task_before.sh ,所以我们可以在 task_before.sh 末尾加入以下内容,来实现这一目的
    默认的方案是以 shufflewzc/faker2 和 cdle/carry 为基准的,如果你是其他仓库,需要在task_before.sh末尾增加上同步jdCookie.js到你对应的仓库脚本目录
    ```shell
    # 在实际执行任务前,确保集合仓库的脚本目录中的jdCookie.js是修改版的内容
    echo 开始复制魔改版jdCookie.js ...
    cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js
    cp /ql/config/jdCookie.js /ql/scripts/cdle_carry/jdCookie.js
    # 在这里加上你实际的仓库,比如说是xxx/yyy这个仓库,则是
    # cp /ql/config/jdCookie.js /ql/scripts/xxx_yyy/jdCookie.js
    echo 复制完毕
    ```

    @@ -112,11 +130,12 @@ combine_only() {
    # ...........................
    # 在实际执行任务前,确保集合仓库的脚本目录中的jdCookie.js是修改版的内容
    echo 开始复制魔改版jdCookie.js ...
    cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js
    cp /ql/config/jdCookie.js /ql/scripts/cdle_carry/jdCookie.js
    echo 复制完毕
    # 青龙v2.10.8以前 启用这段代码
    # # 在实际执行任务前,确保集合仓库的脚本目录中的jdCookie.js是修改版的内容
    # echo 开始复制魔改版jdCookie.js ...
    # cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js
    # cp /ql/config/jdCookie.js /ql/scripts/cdle_carry/jdCookie.js
    # echo 复制完毕
    ```

    ### nodejs中实际处理
    @@ -284,7 +284,5 @@ fi
    #fi

    # 在实际执行任务前,确保集合仓库的脚本目录中的jdCookie.js是修改版的内容
    echo 开始复制魔改版jdCookie.js ...
    cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js
    cp /ql/config/jdCookie.js /ql/scripts/cdle_carry/jdCookie.js
    echo 复制完毕
    echo "请确保魔改版jdCookie.js已放置在/ql/deps目录下,确保其会被自动覆盖 ..."
    echo "注意把映射目录增加 ./data/deps:/ql/deps"
  13. fzls revised this gist Nov 20, 2021. 2 changed files with 32 additions and 9 deletions.
    @@ -13,12 +13,20 @@
    - [效果](#效果)

    ## 太长不读
    复制 code.sh、task_before.sh、task_after.sh、jdCookie.js 到/ql/config目录,用法与 https://t.me/update_help/45 中所述完全一致
    复制 code.sh、task_before.sh、jdCookie.js 到/ql/config目录,用法与 https://t.me/update_help/45 中所述完全一致

    默认的方案是以 shufflewzc/faker2 为基准的,如果你是其他仓库,需要修改以下内容
    1. 修改jdCookie.js为那个仓库中几乎每个活动脚本都要引入的脚本,就像faker2中的jdCookie.js
    2. 将我这里对jdCookie.js的修改内容复制到你那个脚本中
    3. 将task_after.sh中的复制目标改成你选的这个新的脚本
    默认的方案是以 shufflewzc/faker2 和 cdle/carry 为基准的,如果你是其他仓库,需要在task_before.sh末尾增加上同步jdCookie.js到你对应的仓库脚本目录
    ```shell
    # 在实际执行任务前,确保集合仓库的脚本目录中的jdCookie.js是修改版的内容
    echo 开始复制魔改版jdCookie.js ...
    cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js
    cp /ql/config/jdCookie.js /ql/scripts/cdle_carry/jdCookie.js
    # 在这里加上你实际的仓库,比如说是xxx/yyy这个仓库,则是
    # cp /ql/config/jdCookie.js /ql/scripts/xxx_yyy/jdCookie.js
    echo 复制完毕
    ```


    ## 最初
    @@ -64,12 +72,14 @@ code.sh 原版,负责在 /ql/log/.ShareCode 生成互助码的文
    task_before.sh 魔改版,负责确认当前活动是否需要互助码,若需要,则设置 活动名称ShareCodeConfigName 和 环境变量名称ShareCodeEnvName 这两个环境变量
    jdCookie.js 魔改版,判断前面两个环境变量是否存在,若存在,则解析对应活动的互助码文件,按照task_before.sh原有的逻辑转换后放入对应环境变量key中

    前两个按原有教程操作即可,魔改版的jdCookie.js需要在拉库完强行覆盖
    由于目前青龙会在定时任务完成后执行task_after.sh,所以我们可以在task_after.sh中加入以下内容,来实现这一目的
    前两个按原有教程操作即可,魔改版的jdCookie.js需要执行任务前确保覆盖到对应目录
    由于目前青龙会在定时任务完成前执行 task_before.sh ,所以我们可以在 task_before.sh 末尾加入以下内容,来实现这一目的
    ```shell
    #!/usr/bin/env bash
    echo 开始复制魔改版jdCookie.js
    # 在实际执行任务前,确保集合仓库的脚本目录中的jdCookie.js是修改版的内容
    echo 开始复制魔改版jdCookie.js ...
    cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js
    cp /ql/config/jdCookie.js /ql/scripts/cdle_carry/jdCookie.js
    echo 复制完毕
    ```

    ## 核心改动代码
    @@ -99,6 +109,14 @@ combine_only() {
    esac
    done
    }
    # ...........................
    # 在实际执行任务前,确保集合仓库的脚本目录中的jdCookie.js是修改版的内容
    echo 开始复制魔改版jdCookie.js ...
    cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js
    cp /ql/config/jdCookie.js /ql/scripts/cdle_carry/jdCookie.js
    echo 复制完毕
    ```

    ### nodejs中实际处理
    @@ -283,3 +283,8 @@ fi
    # combine_all
    #fi

    # 在实际执行任务前,确保集合仓库的脚本目录中的jdCookie.js是修改版的内容
    echo 开始复制魔改版jdCookie.js ...
    cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js
    cp /ql/config/jdCookie.js /ql/scripts/cdle_carry/jdCookie.js
    echo 复制完毕
  14. fzls revised this gist Nov 19, 2021. 1 changed file with 1 addition and 1 deletion.
    @@ -19,7 +19,7 @@
    1. 修改jdCookie.js为那个仓库中几乎每个活动脚本都要引入的脚本,就像faker2中的jdCookie.js
    2. 将我这里对jdCookie.js的修改内容复制到你那个脚本中
    3. 将task_after.sh中的复制目标改成你选的这个新的脚本
    ```


    ## 最初
    之前使用的互助码脚本 task_before.sh 和 code.sh 是从 互助研究院电报群 获取的
  15. fzls revised this gist Nov 19, 2021. 1 changed file with 10 additions and 8 deletions.
    @@ -13,13 +13,12 @@
    - [效果](#效果)

    ## 太长不读
    复制 task_before.sh 和 code.sh 到config.sh,用法与 https://t.me/update_help/45 中所述完全一致
    复制 code.sh、task_before.sh、task_after.sh、jdCookie.js 到/ql/config目录,用法与 https://t.me/update_help/45 中所述完全一致

    拉取仓库时,在最后加上 ` && cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js`,从而在拉完库时强行将魔改版的该文件覆盖过去。

    这里以 shufflewzc/faker2 为例
    ```shell
    ql repo https://ghproxy.com/https://github.com/shufflewzc/faker2.git "jd_|jx_|gua_|jddj_|getJDCookie" "activity|backUp" "^jd[^_]|USER|function|utils|sendNotify.py|sendNotify.js|notify.py|ZooFaker_Necklace.js|JDJRValidator_|sign_graphics_validate|ql" && cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js
    默认的方案是以 shufflewzc/faker2 为基准的,如果你是其他仓库,需要修改以下内容
    1. 修改jdCookie.js为那个仓库中几乎每个活动脚本都要引入的脚本,就像faker2中的jdCookie.js
    2. 将我这里对jdCookie.js的修改内容复制到你那个脚本中
    3. 将task_after.sh中的复制目标改成你选的这个新的脚本
    ```
    ## 最初
    @@ -65,9 +64,12 @@ code.sh 原版,负责在 /ql/log/.ShareCode 生成互助码的文
    task_before.sh 魔改版,负责确认当前活动是否需要互助码,若需要,则设置 活动名称ShareCodeConfigName 和 环境变量名称ShareCodeEnvName 这两个环境变量
    jdCookie.js 魔改版,判断前面两个环境变量是否存在,若存在,则解析对应活动的互助码文件,按照task_before.sh原有的逻辑转换后放入对应环境变量key中

    前两个按原有教程操作即可,魔改版的jdCookie.js在拉库完强行覆盖,也就是在原有ql repo指令后加上下面这句
    前两个按原有教程操作即可,魔改版的jdCookie.js需要在拉库完强行覆盖。
    由于目前青龙会在定时任务完成后执行task_after.sh,所以我们可以在task_after.sh中加入以下内容,来实现这一目的
    ```shell
    && cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js
    #!/usr/bin/env bash
    echo 开始复制魔改版jdCookie.js
    cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js
    ```

    ## 核心改动代码
  16. fzls created this gist Nov 18, 2021.
    119 README.md
    @@ -0,0 +1,119 @@
    ## 目录
    - [目录](#目录)
    - [太长不读](#太长不读)
    - [最初](#最初)
    - [当ck到一定数目后](#当ck到一定数目后)
    - [排查定位](#排查定位)
    - [现有解决方案](#现有解决方案)
    - [新的解决思路](#新的解决思路)
    - [最终方案](#最终方案)
    - [核心改动代码](#核心改动代码)
    - [shell中设置参数](#shell中设置参数)
    - [nodejs中实际处理](#nodejs中实际处理)
    - [效果](#效果)

    ## 太长不读
    复制 task_before.sh 和 code.sh 到config.sh,用法与 https://t.me/update_help/45 中所述完全一致

    拉取仓库时,在最后加上 ` && cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js`,从而在拉完库时强行将魔改版的该文件覆盖过去。

    这里以 shufflewzc/faker2 为例
    ```shell
    ql repo https://ghproxy.com/https://github.com/shufflewzc/faker2.git "jd_|jx_|gua_|jddj_|getJDCookie" "activity|backUp" "^jd[^_]|USER|function|utils|sendNotify.py|sendNotify.js|notify.py|ZooFaker_Necklace.js|JDJRValidator_|sign_graphics_validate|ql" && cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js
    ```

    ## 最初
    之前使用的互助码脚本 task_before.sh 和 code.sh 是从 互助研究院电报群 获取的
    > https://t.me/update_help/41
    > https://t.me/update_help/45
    在cookie数目较少的情况下,一直运行良好,这里先感谢大佬的无私奉献。

    ## 当ck到一定数目后
    但是,在我拉了更多人一起挂青龙,ck到达89个时,很多脚本开始报 Argument list too long 错误,而且是一些系统命令,比如 timeout、date、cat等报的错,看的我一脸懵逼。
    ![image](https://user-images.githubusercontent.com/13483212/142473975-5ea3ba0b-08f3-4f91-8e08-e3453edeb641.png)

    ## 排查定位
    于是昨晚在青龙容器里对shell下断点,各种调试,也是一直毫无头绪,后来,在搜到下面这个帖子时,终于明白了这个报错的起因。
    > https://stackoverflow.com/a/28865503
    task_before.sh在shell环境中设置了一个很大的环境变量,其大小大概为 总ck数目 * 未被屏蔽的ck数目 * 单个互助码的大小,部分活动的互助码大小约为40。
    此时如果有80个ck,且全部启用,则大小将是 80 * 80 * 40 = 256000,而系统默认的参数列表大小(包含环境变量)为 $(getconf ARG_MAX) = 131072,
    可见远远超出该值。因此后续调用任何系统命令,都将会报出 Argument list too long 而导致后续流程无法正常进行。

    ## 现有解决方案
    昨晚搜了下现有的做法,基本都是分多个青龙容器,每个保持在45个(这样大小约为81000),确保不会报错。这个方法很简洁,但是会带来维护上的麻烦,本来只要部署一套qinglong容器,现在需要维护多套,比较费心力。

    ## 新的解决思路
    昨天最初准备按这套走了,流程都构思完了。后来突然想到一个新思路,现在的问题是shell中设置的env太大了,导致其他流程不能正常执行。那么如果我把设置env的流程挪到nodejs中,不再经由shell的环境,那么shell中执行的其他命令就不会报错了。
    有了思路后,问题就简单了。这下只需要把原先task_before.js中执行的解析互助码文件和转换后放入shell环境变量的流程换到nodejs中即可,这样这几十MB的环境变量就不再是作为参数传入了。

    ## 最终方案
    一番处理后,最终就有了下面的流程
    task_before.sh 不再直接设置环境变量,而是设置要处理的活动名称和对应互助码文件名称

    接下来需要在nodejs中某个地方去接收这两个参数来实际生成。如果仓库完全自己管控,那么直接新增一个模块,在模块内处理后塞入process.env,然后各个脚本中引入即可,与之前表现完全一致。
    但是显然这样沟通成本有点高,这里可以取巧,观察可以发现,几乎每个脚本中都有下面这句
    ```javascript
    const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
    ```

    所以,我们可以魔改 jdCookie.js 这个文件,自己从基准仓库中复制一份,然后将我们的处理互助码的逻辑加到后面即可,这样就可以实现每个脚本自动调用我们的新流程了。

    所以最终就有了下面三个文件
    code.sh 原版,负责在 /ql/log/.ShareCode 生成互助码的文件
    task_before.sh 魔改版,负责确认当前活动是否需要互助码,若需要,则设置 活动名称ShareCodeConfigName 和 环境变量名称ShareCodeEnvName 这两个环境变量
    jdCookie.js 魔改版,判断前面两个环境变量是否存在,若存在,则解析对应活动的互助码文件,按照task_before.sh原有的逻辑转换后放入对应环境变量key中

    前两个按原有教程操作即可,魔改版的jdCookie.js在拉库完强行覆盖,也就是在原有ql repo指令后加上下面这句
    ```shell
    && cp /ql/config/jdCookie.js /ql/scripts/shufflewzc_faker2/jdCookie.js
    ```

    ## 核心改动代码
    ### shell中设置参数
    ```shell
    ## 正常依次运行时,组合互助码格式化为全局变量
    combine_only() {
    for ((i = 0; i < ${#env_name[*]}; i++)); do
    case $1 in
    *${name_js[i]}*.js | *${name_js[i]}*.ts)
    if [[ -f $dir_log/.ShareCode/${name_config[i]}.log ]]; then
    . $dir_log/.ShareCode/${name_config[i]}.log
    result=$(combine_sub ${var_name[i]})
    if [[ $result ]]; then
    # 魔改说明:直接设置在ck超过45时,会导致env过大,部分系统命令无法执行,导致脚本执行失败
    # 这里改成设置一个标记,在nodejs中去实际设置环境变量
    # export ${env_name[i]}=$result
    export ShareCodeConfigName=${name_config[i]}
    export ShareCodeEnvName=${env_name[i]}
    echo "设置环境变量标记 ShareCodeConfigName=${ShareCodeConfigName} ShareCodeEnvName=${ShareCodeEnvName}, 供nodejs去实际生成互助码环境变量"
    fi
    fi
    ;;
    *)
    export ${env_name[i]}=""
    ;;
    esac
    done
    }
    ```

    ### nodejs中实际处理
    ```javascript
    // 若在task_before.sh 中设置了要设置互助码环境变量的活动名称和环境变量名称信息,则在nodejs中处理,供活动使用
    let nameConfig = process.env.ShareCodeConfigName
    let envName = process.env.ShareCodeEnvName
    if (nameConfig && envName) {
    SetShareCodesEnv(nameConfig, envName)
    } else {
    console.debug(`【风之凌殇】 友情提示:当前未设置 ShareCodeConfigName 或 ShareCodeEnvName 环境变量,将不会尝试在nodejs中生成互助码的环境变量。ps: 两个值目前分别为 ${nameConfig} ${envName}`)
    }
    ```

    ## 效果
    自此,即使你的ck很多,也不再用看到下面这一幕了。
    ![image](https://user-images.githubusercontent.com/13483212/142474215-af41b6c1-acdf-410f-985a-90ebe749103e.png)

    而是会看到
    ![image](https://user-images.githubusercontent.com/13483212/142474100-1c97d031-c49a-44e1-acf6-ac87d8aafdeb.png)
    697 code.sh
    @@ -0,0 +1,697 @@
    #!/usr/bin/env bash

    ## Build 20211009-001

    ## 导入通用变量与函数
    dir_shell=/ql/shell
    . $dir_shell/share.sh

    ## 预设的仓库及默认调用仓库设置
    ## 将"repo=$repo1"改成repo=$repo2"或其他,以默认调用其他仓库脚本日志
    ## 也可自行搜索本脚本内的"name_js=("和"name_js_only",将"repo"改成"repo2"或其他,用以自由组合调用仓库的脚本日志
    repo1='panghu999_jd_scripts' #预设的 panghu999 仓库
    repo2='JDHelloWorld_jd_scripts' #预设的 JDHelloWorld 仓库
    repo3='he1pu_JDHelp' #预设的 he1pu 仓库
    repo4='shufflewzc_faker2' #预设的 shufflewzc 仓库
    repo5='Wenmoux_scripts_wen_chinnkarahoi' #预设的 Wenmoux 仓库,用于读取口袋书店互助码。需提前拉取温某人的仓库或口袋书店脚本并完整运行。
    repo6='Aaron-lv_sync_jd_scripts' #预设的 Aaron-lv 仓库
    repo7='smiek2221_scripts' #预设的 smiek2221 仓库
    repo=$repo4 #默认调用 shufflewzc_faker2 仓库脚本日志

    ## 调试模式开关,默认是0,表示关闭;设置为1,表示开启
    DEBUG="1"

    ## 本脚本限制的最大线程数量
    proc_num="8"

    ## 备份配置文件开关,默认是1,表示开启;设置为0,表示关闭。备份路径 /ql/config/bak/
    BACKUP="1"
    ## 是否删除指定天数以前的备份文件开关,默认是1,表示开启;设置为0,表示关闭。删除路径 /ql/config/bak/
    CLEANBAK="1"
    ## 定义删除指定天数以前的备份文件
    CLEANBAK_DAYS="2"

    ## 定义 jcode 脚本导出的互助码模板样式(选填)
    ## 不填 使用“按编号顺序互助模板”,Cookie编号在前的优先助力
    ## 填 0 使用“全部一致互助模板”,所有账户要助力的码全部一致
    ## 填 1 使用“均等机会互助模板”,所有账户获得助力次数一致
    ## 填 2 使用“随机顺序互助模板”,本套脚本内账号间随机顺序助力,每次生成的顺序都不一致。
    HelpType=""

    ## 定义指定活动采用指定的互助模板。
    ## 设定值为 DiyHelpType="1" 表示启用功能;不填或填其他内容表示不开启功能。
    ## 如果只是想要控制某个活动以执行某种互助规则,可以参考下面 case 这个命令的例子来控制
    ## 活动名称参见 name_config 定义内容;具体可在本脚本中搜索 name_config=( 获悉
    DiyHelpType="0"
    diy_help_rules(){
    case $1 in
    Fruit)
    tmp_helptype="0" # 东东农场使用“全部一致互助模板”,所有账户要助力的码全部一致
    ;;
    DreamFactory | JdFactory)
    tmp_helptype="1" # 京喜工厂和东东工厂使用“均等机会互助模板”,所有账户获得助力次数一致
    ;;
    Jdzz | Joy)
    tmp_helptype="2" # 京东赚赚和疯狂的Joy使用“随机顺序互助模板”,本套脚本内账号间随机顺序助力,每次生成的顺序都不一致。
    ;;
    *)
    tmp_helptype=$HelpType # 其他活动仍按默认互助模板生产互助规则。
    ;;
    esac
    }

    ## 定义屏蔽模式。被屏蔽的账号将不被助力,被屏蔽的账号仍然可以助力其他账号。
    ## 设定值为 BreakHelpType="1" 表示启用屏蔽模式;不填或填其他内容表示不开启功能。
    ## 自定义屏蔽账号序号或序号区间。当 BreakHelpType="1"时生效。
    ## 设定值为一个或多个不相同正整数,每个正整数不大于账号总数;也可以设置正整数区间,最大正整数不大于账号总数;
    ## 如:a) 设定为 BreakHelpNum="3" 表示第 3 个账号不被助力;
    ## b) 设定为 BreakHelpNum="5 7 8 10" 表示第 5 7 8 10 个账号均不被助力;
    ## c) 设定为 BreakHelpNum="6-12" 表示从第 6 至 12 个账号均不被助力;
    ## d) 设定为 BreakHelpNum="4 9-14 15~18 19_21" 表示第4个账号、第9至14账号、第15至18账号、第19至21账号均不被助力。注意序号区间连接符仅支持 - ~ _;
    ## 不按示例填写可能引发报错。
    BreakHelpType="0" ## 屏蔽模式
    BreakHelpNum="4 9-14 15~18 19_21" ## 屏蔽账号序号或序号区间

    ## 定义是否自动更新配置文件中的互助码和互助规则
    ## 默认为 UpdateType="1" 表示更新互助码和互助规则;UpdateType="2" 表示只更新互助码,不更新互助规则;UpdateType="3" 表示只更新互助规则,不更新互助码;留空或其他数值表示不更新。
    UpdateType="1"

    ## 定义是否自动安装或修复缺失的依赖,默认为1,表示自动修复;留空或其他数值表示不修复。
    FixDependType="1"
    ## 定义监控修复的依赖名称
    package_name="canvas png-js date-fns axios crypto-js ts-md5 tslib @types/node dotenv typescript fs require tslib jsdom"

    ## 需组合的环境变量列表,env_name需要和var_name一一对应,如何有新活动按照格式添加(不懂勿动)
    env_name=(
    FRUITSHARECODES
    PETSHARECODES
    PLANT_BEAN_SHARECODES
    DREAM_FACTORY_SHARE_CODES
    DDFACTORY_SHARECODES
    JDJOY_SHARECODES
    JDZZ_SHARECODES
    JXNC_SHARECODES
    BOOKSHOP_SHARECODES
    JD_CASH_SHARECODES
    JDSGMH_SHARECODES
    JDCFD_SHARECODES
    JDHEALTH_SHARECODES
    JD818_SHARECODES
    CITY_SHARECODES
    MONEYTREE_SHARECODES
    )
    var_name=(
    ForOtherFruit
    ForOtherPet
    ForOtherBean
    ForOtherDreamFactory
    ForOtherJdFactory
    ForOtherJoy
    ForOtherJdzz
    ForOtherJxnc
    ForOtherBookShop
    ForOtherCash
    ForOtherSgmh
    ForOtherCfd
    ForOtherHealth
    ForOtherCarni
    ForOtherCity
    ForOtherMoneyTree
    )

    ## name_js为脚本文件名,如果使用ql repo命令拉取,文件名含有作者名
    ## 所有有互助码的活动,把脚本名称列在 name_js 中,对应 config.sh 中互助码后缀列在 name_config 中,中文名称列在 name_chinese 中。
    ## name_js、name_config 和 name_chinese 中的三个名称必须一一对应。
    name_js=(
    "$repo"_jd_fruit
    "$repo"_jd_pet
    "$repo"_jd_plantBean
    "$repo"_jd_dreamFactory
    "$repo"_jd_jdfactory
    "$repo"_jd_crazy_joy
    "$repo"_jd_jdzz
    "$repo"_jd_jxnc
    "$repo"_jd_bookshop
    "$repo"_jd_cash
    "$repo"_jd_sgmh
    "$repo"_jd_cfd
    "$repo"_jd_health
    "$repo"_jd_carnivalcity
    "$repo"_jd_city
    "$repo"_jd_moneyTree_heip
    "$repo"_jd_cfd
    )

    name_config=(
    Fruit
    Pet
    Bean
    DreamFactory
    JdFactory
    Joy
    Jdzz
    Jxnc
    BookShop
    Cash
    Sgmh
    Cfd
    Health
    Carni
    City
    MoneyTree
    TokenJxnc
    )

    name_chinese=(
    东东农场
    东东萌宠
    京东种豆得豆
    京喜工厂
    东东工厂
    crazyJoy任务
    京东赚赚
    京喜农场
    口袋书店
    签到领现金
    闪购盲盒
    京喜财富岛
    东东健康社区
    京东手机狂欢城
    城城领现金
    摇钱树
    京喜token
    )

    ## 生成pt_pin清单
    gen_pt_pin_array() {
    local envs=$(eval echo "\$JD_COOKIE")
    local array=($(echo $envs | sed 's/&/ /g'))
    local tmp1 tmp2 i pt_pin_temp
    for i in "${!array[@]}"; do
    pt_pin_temp=$(echo ${array[i]} | perl -pe "{s|.*pt_pin=([^; ]+)(?=;?).*|\1|; s|%|\\\x|g}")
    remark_name[i]=$(cat $dir_db/env.db | grep ${array[i]} | perl -pe "{s|.*remarks\":\"([^\"]+).*|\1|g}" | tail -1)
    [[ $pt_pin_temp == *\\x* ]] && pt_pin[i]=$(printf $pt_pin_temp) || pt_pin[i]=<