Skip to content

Instantly share code, notes, and snippets.

@fzls
Last active July 9, 2024 14:02
Show Gist options
  • Save fzls/14f8d1d3ebb2fef64750ad91d268e4f6 to your computer and use it in GitHub Desktop.
Save fzls/14f8d1d3ebb2fef64750ad91d268e4f6 to your computer and use it in GitHub Desktop.
解决 青龙面板中存放的cookie数目过多(如超过45)时,会报 Argument list too long 而无法正常执行部分脚本的问题

本方案首先是自用,然后才是顺带分享给大家,所以我爱咋写咋写,请勿过多指责。没有强迫任何人使用。

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

更新日志

2021.11.24

  1. 仅支持互助的活动脚本中打印相关提示

目录

太长不读

青龙v2.10.8及以后

复制 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 中所述完全一致

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

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

默认的方案是以 shufflewzc/faker2 和 cdle/carry 为基准的,如果你是其他仓库,需要在task_before.sh末尾增加上同步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

# 在这里加上你实际的仓库,比如说是xxx/yyy这个仓库,则是
# cp /ql/config/jdCookie.js /ql/scripts/xxx_yyy/jdCookie.js

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

排查定位

于是昨晚在青龙容器里对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,然后各个脚本中引入即可,与之前表现完全一致。

但是显然这样沟通成本有点高,这里可以取巧,观察可以发现,几乎每个脚本中都有下面这句

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需要执行任务前确保覆盖到对应目录。

青龙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到你对应的仓库脚本目录

# 在实际执行任务前,确保集合仓库的脚本目录中的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 复制完毕

核心改动代码

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
}

# ...........................

# 青龙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中实际处理

// 若在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

而是会看到

image

#!/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]=$pt_pin_temp
done
}
## 导出互助码的通用程序,$1:去掉后缀的脚本名称,$2:config.sh中的后缀,$3:活动中文名称
export_codes_sub() {
local task_name=$1
local config_name=$2
local chinese_name=$3
local config_name_my=My$config_name
local config_name_for_other=ForOther$config_name
local tmp_helptype=$HelpType
local BreakHelpInterval=$(echo $BreakHelpNum | perl -pe "{s|~|-|; s|_|-|}" | sed 's/\(\d\+\)-\(\d\+\)/{\1..\2}/g')
local BreakHelpNumArray=($(eval echo $BreakHelpInterval))
local BreakHelpNumVerify=$(echo $BreakHelpNum | sed 's/ //g' | perl -pe "{s|-||; s|~||; s|_||}" | sed 's/^\d\+$//g')
local i j k m n t pt_pin_in_log code tmp_grep tmp_my_code tmp_for_other user_num tmp_helptype HelpTemp random_num_list
local envs=$(eval echo "\$JD_COOKIE")
local array=($(echo $envs | sed 's/&/ /g'))
local user_sum=${#array[*]}
if cd $dir_log/$task_name &>/dev/null && [[ $(ls) ]]; then
## 寻找所有互助码以及对应的pt_pin
i=0
pt_pin_in_log=()
code=()
pt_pin_and_code=$(ls -r *.log | xargs awk -v var="$chinese_name好友互助码" 'BEGIN{FS="[( )】]+"; OFS="&"} $3~var {print $2,$4}')
for line in $pt_pin_and_code; do
pt_pin_in_log[i]=$(echo $line | awk -F "&" '{print $1}')
code[i]=$(echo $line | awk -F "&" '{print $2}')
let i++
done
## 输出My系列变量
if [[ ${#code[*]} -gt 0 ]]; then
for ((m = 0; m < ${#pt_pin[*]}; m++)); do
tmp_my_code=""
j=$((m + 1))
for ((n = 0; n < ${#code[*]}; n++)); do
if [[ ${pt_pin[m]} == ${pt_pin_in_log[n]} ]]; then
tmp_my_code=${code[n]}
break
fi
done
echo "$config_name_my$j='$tmp_my_code'"
done
else
echo "## 从日志中未找到任何互助码"
fi
## 输出ForOther系列变量
if [[ ${#code[*]} -gt 0 ]]; then
[[ $DiyHelpType = "1" ]] && diy_help_rules $2
case $tmp_helptype in
0) ## 全部一致
HelpTemp="全部一致"
echo -e "\n## 采用\"$HelpTemp\"互助模板:"
tmp_for_other=""
for ((m = 0; m < ${#pt_pin[*]}; m++)); do
j=$((m + 1))
if [[ $BreakHelpType = "1" ]]; then
if [ "$BreakHelpNumVerify" = "" ]; then
for ((t = 0; t < ${#BreakHelpNumArray[*]}; t++)); do
[[ "${BreakHelpNumArray[t]}" = "$j" ]] && continue 2
done
tmp_for_other="$tmp_for_other@\${$config_name_my$j}"
else
echo -e "\n#【`date +%X`】 变量值填写不规范,请检查后重试!"
tmp_for_other="$tmp_for_other@\${$config_name_my$j}"
fi
else
tmp_for_other="$tmp_for_other@\${$config_name_my$j}"
fi
done
echo "${config_name_for_other}1=\"$tmp_for_other\"" | perl -pe "s|($config_name_for_other\d+=\")@|\1|"
for ((m = 1; m < ${#pt_pin[*]}; m++)); do
j=$((m + 1))
echo "$config_name_for_other$j=\"$tmp_for_other\"" | perl -pe "s|($config_name_for_other\d+=\")@|\1|"
done
;;
1) ## 均等助力
HelpTemp="均等助力"
echo -e "\n## 采用\"$HelpTemp\"互助模板:"
for ((m = 0; m < ${#pt_pin[*]}; m++)); do
tmp_for_other=""
j=$((m + 1))
for ((n = $m; n < $(($user_sum + $m)); n++)); do
[[ $m -eq $n ]] && continue
if [[ $((n + 1)) -le $user_sum ]]; then
k=$((n + 1))
else
k=$((n + 1 - $user_sum))
fi
if [[ $BreakHelpType = "1" ]]; then
if [ "$BreakHelpNumVerify" = "" ]; then
for ((t = 0; t < ${#BreakHelpNumArray[*]}; t++)); do
[[ "${BreakHelpNumArray[t]}" = "$k" ]] && continue 2
done
tmp_for_other="$tmp_for_other@\${$config_name_my$k}"
else
echo -e "\n#【`date +%X`】 变量值填写不规范,请检查后重试!"
tmp_for_other="$tmp_for_other@\${$config_name_my$k}"
fi
else
tmp_for_other="$tmp_for_other@\${$config_name_my$k}"
fi
done
echo "$config_name_for_other$j=\"$tmp_for_other\"" | perl -pe "s|($config_name_for_other\d+=\")@|\1|"
done
;;
2) ## 本套脚本内账号间随机顺序助力
HelpTemp="随机顺序"
echo -e "\n## 采用\"$HelpTemp\"互助模板:"
for ((m = 0; m < ${#pt_pin[*]}; m++)); do
tmp_for_other=""
random_num_list=$(seq $user_sum | sort -R)
j=$((m + 1))
for n in $random_num_list; do
[[ $j -eq $n ]] && continue
if [[ $BreakHelpType = "1" ]]; then
if [ "$BreakHelpNumVerify" = "" ]; then
for ((t = 0; t < ${#BreakHelpNumArray[*]}; t++)); do
[[ "${BreakHelpNumArray[t]}" = "$n" ]] && continue 2
done
tmp_for_other="$tmp_for_other@\${$config_name_my$n}"
else
echo -e "\n#【`date +%X`】 变量值填写不规范,请检查后重试!"
tmp_for_other="$tmp_for_other@\${$config_name_my$n}"
fi
else
tmp_for_other="$tmp_for_other@\${$config_name_my$n}"
fi
done
echo "$config_name_for_other$j=\"$tmp_for_other\"" | perl -pe "s|($config_name_for_other\d+=\")@|\1|"
done
;;
*) ## 按编号优先
HelpTemp="按编号优先"
echo -e "\n## 采用\"$HelpTemp\"互助模板"
for ((m = 0; m < ${#pt_pin[*]}; m++)); do
tmp_for_other=""
j=$((m + 1))
for ((n = 0; n < $user_sum; n++)); do
[[ $m -eq $n ]] && continue
k=$((n + 1))
if [[ $BreakHelpType = "1" ]]; then
if [ "$BreakHelpNumVerify" = "" ]; then
for ((t = 0; t < ${#BreakHelpNumArray[*]}; t++)); do
[[ "${BreakHelpNumArray[t]}" = "$k" ]] && continue 2
done
tmp_for_other="$tmp_for_other@\${$config_name_my$k}"
else
echo -e "\n#【`date +%X`】 变量值填写不规范,请检查后重试!"
tmp_for_other="$tmp_for_other@\${$config_name_my$k}"
fi
else
tmp_for_other="$tmp_for_other@\${$config_name_my$k}"
fi
done
echo "$config_name_for_other$j=\"$tmp_for_other\"" | perl -pe "s|($config_name_for_other\d+=\")@|\1|"
done
;;
esac
fi
else
echo "#【`date +%X`】 未运行过 $task_name.js 脚本,未产生日志"
fi
}
## 汇总输出
export_all_codes() {
gen_pt_pin_array
[[ $DEBUG = "1" ]] && echo -e "\n#【`date +%X`】 当前 code.sh 的线程数量:$ps_num"
[[ $DEBUG = "1" ]] && echo -e "\n#【`date +%X`】 预设的 JD_COOKIE 数量:`echo $JD_COOKIE | grep -o 'pt_key' | wc -l`"
[[ $DEBUG = "1" ]] && echo -e "\n#【`date +%X`】 预设的 JD_COOKIE 环境变量数量:`echo $JD_COOKIE | sed 's/&/\n/g' | wc -l`"
[[ $DEBUG = "1" && "$(echo $JD_COOKIE | sed 's/&/\n/g' | wc -l)" = "1" && "$(echo $JD_COOKIE | grep -o 'pt_key' | wc -l)" -gt 1 ]] && echo -e "\n#【`date +%X`】 检测到您将多个 COOKIES 填写到单个环境变量值,请注意将各 COOKIES 采用 & 分隔,否则将无法完整输出互助码及互助规则!"
echo -e "\n#【`date +%X`】 从日志提取互助码,编号和配置文件中Cookie编号完全对应,如果为空就是所有日志中都没有。\n\n#【`date +%X`】 即使某个MyXxx变量未赋值,也可以将其变量名填在ForOtherXxx中,jtask脚本会自动过滤空值。\n"
if [[ $DiyHelpType = "1" ]]; then
echo -e "#【`date +%X`】 您已启用指定活动采用指定互助模板功能!"
else
echo -n "#【`date +%X`】 您选择的互助码模板为:"
case $HelpType in
0)
echo "所有账号助力码全部一致。"
;;
1)
echo "所有账号机会均等助力。"
;;
2)
echo "本套脚本内账号间随机顺序助力。"
;;
*)
echo "按账号编号优先。"
;;
esac
fi
[[ $BreakHelpType = "1" ]] && echo -e "\n#【`date +%X`】 您已启用屏蔽模式,账号 $BreakHelpNum 将不被助力!"
if [ "$ps_num" -gt $proc_num ]; then
echo -e "\n#【`date +%X`】 检测到 code.sh 的线程过多 ,请稍后再试!"
exit
elif [ -z $repo ]; then
echo -e "\n#【`date +%X`】 未检测到兼容的活动脚本日志,无法读取互助码,退出!"
exit
else
echo -e "\n#【`date +%X`】 默认调用 $repo 的脚本日志,格式化导出互助码,生成互助规则!"
dump_user_info
for ((i = 0; i < ${#name_js[*]}; i++)); do
echo -e "\n## ${name_chinese[i]}"
export_codes_sub "${name_js[i]}" "${name_config[i]}" "${name_chinese[i]}"
done
fi
}
#更新配置文件中互助码的函数
help_codes(){
local envs=$(eval echo "\$JD_COOKIE")
local array=($(echo $envs | sed 's/&/ /g'))
local user_sum=${#array[*]}
local config_name=$1
local chinese_name=$2
local config_name_my=My$config_name
local config_name_for_other=ForOther$config_name
local ShareCode_dir="$dir_log/.ShareCode"
local ShareCode_log="$ShareCode_dir/$config_name.log"
local i j k
#更新配置文件中的互助码
[[ ! -d $ShareCode_dir ]] && mkdir -p $ShareCode_dir
[[ "$1" = "TokenJxnc" ]] && config_name_my=$1
if [ ! -f $ShareCode_log ] || [ -z "$(cat $ShareCode_log | grep "^$config_name_my\d")" ]; then
echo -e "\n## $chinese_name\n${config_name_my}1=''\n" >> $ShareCode_log
fi
for ((i=1; i<=200; i++)); do
local new_code="$(cat $latest_log_path | grep "^$config_name_my$i=.\+'$" | sed "s/\S\+'\([^']*\)'$/\1/")"
local old_code="$(cat $ShareCode_log | grep "^$config_name_my$i=.\+'$" | sed "s/\S\+'\([^']*\)'$/\1/")"
if [[ $i -le $user_sum ]]; then
if [ -z "$(grep "^$config_name_my$i" $ShareCode_log)" ]; then
sed -i "/^$config_name_my$[$i-1]='.*'/ s/$/\n$config_name_my$i=\'\'/" $ShareCode_log
fi
if [ "$new_code" != "$old_code" ]; then
if [[ "$new_code" != "undefined" ]] && [[ "$new_code" != "{}" ]]; then
sed -i "s/^$config_name_my$i='$old_code'$/$config_name_my$i='$new_code'/" $ShareCode_log
fi
fi
elif [[ $i -gt $user_sum ]] && [[ $i -gt 1 ]]; then
sed -i "/^$config_name_my$i/d" $ShareCode_log
elif [[ $i -eq 1 ]] && [[ -z "$new_code" ]]; then
sed -i "s/^$config_name_my$i='\S*'$/$config_name_my$i=''/" $ShareCode_log
fi
done
sed -i "1c ## 上次导入时间:$(date +%Y年%m月%d日\ %X)" $ShareCode_log
}
#更新配置文件中互助规则的函数
help_rules(){
local envs=$(eval echo "\$JD_COOKIE")
local array=($(echo $envs | sed 's/&/ /g'))
local user_sum=${#array[*]}
local config_name=$1
local chinese_name=$2
local config_name_my=My$config_name
local config_name_for_other=ForOther$config_name
local ShareCode_dir="$dir_log/.ShareCode"
local ShareCode_log="$ShareCode_dir/$config_name.log"
local i j k
#更新配置文件中的互助规则
if [ -z "$(cat $ShareCode_log | grep "^$config_name_for_other\d")" ]; then
echo -e "${config_name_for_other}1=\"\"" >> $ShareCode_log
fi
for ((j=1; j<=200; j++)); do
local new_rule="$(cat $latest_log_path | grep "^$config_name_for_other$j=.\+\"$" | sed "s/\S\+\"\([^\"]*\)\"$/\1/")"
local old_rule="$(cat $ShareCode_log | grep "^$config_name_for_other$j=.\+\"$" | sed "s/\S\+\"\([^\"]*\)\"$/\1/")"
if [[ $j -le $user_sum ]]; then
if [ -z "$(grep "^$config_name_for_other$j" $ShareCode_log)" ]; then
sed -i "/^$config_name_for_other$[$j-1]=".*"/ s/$/\n$config_name_for_other$j=\"\"/" $ShareCode_log
fi
if [ "$new_rule" != "$old_rule" ]; then
sed -i "s/^$config_name_for_other$j=\"$old_rule\"$/$config_name_for_other$j=\"$new_rule\"/" $ShareCode_log
fi
elif [[ $j -gt $user_sum ]] && [[ $j -gt 1 ]]; then
sed -i "/^$config_name_for_other$j/d" $ShareCode_log
elif [[ $j -eq 1 ]] && [[ -z "$new_rule" ]]; then
sed -i "s/^$config_name_for_other$j=\"\S*\"$/$config_name_for_other$j=\"\"/" $ShareCode_log
fi
done
sed -i "1c ## 上次导入时间:$(date +%Y年%m月%d日\ %X)" $ShareCode_log
}
export_codes_sub_only(){
if [ "$(cat $dir_scripts/"$repo"_jd_cfd.js | grep "// console.log(\`token")" != "" ]; then
echo -e "\n# 正在修改 "$repo"_jd_cfd.js ,待完全运行 "$repo"_jd_cfd.js 后即可输出 token !"
fi
sed -i 's/.*\(c.*log\).*\(${JSON.*token)}\).*/ \1(\`\\n【京东账号${$.index}(${$.UserName})的京喜token好友互助码】\2\\n\`)/g' /ql/scripts/*_jd_cfd.js
local task_name=$1
local config_name=$2
local chinese_name=$3
local i j k m n pt_pin_in_log code tmp_grep tmp_my_code tmp_for_other user_num random_num_list
local envs=$(eval echo "\$JD_COOKIE")
local array=($(echo $envs | sed 's/&/ /g'))
local user_sum=${#array[*]}
if cd $dir_log/$task_name &>/dev/null && [[ $(ls) ]]; then
## 寻找所有互助码以及对应的pt_pin
i=0
pt_pin_in_log=()
code=()
pt_pin_and_code=$(ls -r *.log | xargs awk -v var="$chinese_name好友互助码" 'BEGIN{FS="[( )】]+"; OFS="&"} $3~var {print $2,$4}')
for line in $pt_pin_and_code; do
pt_pin_in_log[i]=$(echo $line | awk -F "&" '{print $1}')
code[i]=$(echo $line | awk -F "&" '{print $2}')
let i++
done
## 输出互助码
if [[ ${#code[*]} -gt 0 ]]; then
for ((m = 0; m < ${#pt_pin[*]}; m++)); do
tmp_my_code=""
j=$((m + 1))
for ((n = 0; n < ${#code[*]}; n++)); do
if [[ ${pt_pin[m]} == ${pt_pin_in_log[n]} ]]; then
tmp_my_code=${code[n]}
break
fi
done
echo "$config_name$j='$tmp_my_code'"
done
else
echo "## 从日志中未找到任何互助码"
fi
fi
}
#更新互助码和互助规则
update_help(){
case $UpdateType in
1)
if [ "$ps_num" -le $proc_num ] && [ -f $latest_log_path ]; then
backup_del
echo -e "\n#【`date +%X`】 开始更新配置文件的互助码和互助规则"
for ((i = 0; i < ${#name_config[*]}; i++)); do
help_codes "${name_config[i]}" "${name_chinese[i]}"
[[ "${name_config[i]}" != "TokenJxnc" ]] && help_rules "${name_config[i]}" "${name_chinese[i]}"
done
echo -e "\n#【`date +%X`】 配置文件的互助码和互助规则已完成更新"
elif [ ! -f $latest_log_path ]; then
echo -e "\n#【`date +%X`】 日志文件不存在,请检查后重试!"
fi
;;
2)
if [ "$ps_num" -le $proc_num ] && [ -f $latest_log_path ]; then
backup_del
echo -e "\n#【`date +%X`】 开始更新配置文件的互助码,不更新互助规则"
for ((i = 0; i < ${#name_config[*]}; i++)); do
help_codes "${name_config[i]}" "${name_chinese[i]}"
done
echo -e "\n#【`date +%X`】 配置文件的互助码已完成更新"
elif [ ! -f $latest_log_path ]; then
echo -e "\n#【`date +%X`】 日志文件不存在,请检查后重试!"
fi
;;
3)
if [ "$ps_num" -le $proc_num ] && [ -f $latest_log_path ]; then
backup_del
echo -e "\n#【`date +%X`】 开始更新配置文件的互助规则,不更新互助码"
for ((i = 0; i < ${#name_config[*]}; i++)); do
[[ "${name_config[i]}" != "TokenJxnc" ]] && help_rules "${name_config[i]}" "${name_chinese[i]}"
done
echo -e "\n#【`date +%X`】 配置文件的互助规则已完成更新"
elif [ ! -f $latest_log_path ]; then
echo -e "\n#【`date +%X`】 日志文件不存在,请检查后重试!"
fi
;;
*)
echo -e "\n#【`date +%X`】 您已设置不更新配置文件的互助码和互助规则,跳过更新!"
;;
esac
}
check_jd_cookie(){
local test_connect="$(curl -I -s --connect-timeout 5 https://bean.m.jd.com/bean/signIndex.action -w %{http_code} | tail -n1)"
local test_jd_cookie="$(curl -s --noproxy "*" "https://bean.m.jd.com/bean/signIndex.action" -H "cookie: $1")"
if [ "$test_connect" -eq "302" ]; then
[[ "$test_jd_cookie" ]] && echo "(COOKIE 有效)" || echo "(COOKIE 已失效)"
else
echo "(API 连接失败)"
fi
}
dump_user_info(){
echo -e "\n## 账号用户名及 COOKIES 整理如下:"
local envs=$(eval echo "\$JD_COOKIE")
local array=($(echo $envs | sed 's/&/ /g'))
for ((m = 0; m < ${#pt_pin[*]}; m++)); do
j=$((m + 1))
echo -e "## 用户名 $j${pt_pin[m]} 备注:${remark_name[m]} `check_jd_cookie ${array[m]}`\nCookie$j=\"${array[m]}\""
done
}
backup_del(){
[[ ! -d $dir_log/.bak_ShareCode ]] && mkdir -p $dir_log/.bak_ShareCode
local bak_ShareCode_full_path_list=$(find $dir_log/.bak_ShareCode/ -name "*.log")
local diff_time
if [[ $BACKUP = "1" ]]; then
for ((i = 0; i < ${#name_config[*]}; i++)); do
[[ -f $dir_log/.ShareCode/${name_config[i]}.log ]] && cp $dir_log/.ShareCode/${name_config[i]}.log $dir_log/.bak_ShareCode/${name_config[i]}_`date "+%Y-%m-%d-%H-%M-%S"`.log
done
fi
if [[ $CLEANBAK = "1" ]]; then
for log in $bak_ShareCode_full_path_list; do
local log_date=$(echo $log | awk -F "_" '{print $NF}' | cut -c1-10)
if [[ $(date +%s -d $log_date 2>/dev/null) ]]; then
if [[ $is_macos -eq 1 ]]; then
diff_time=$(($(date +%s) - $(date -j -f "%Y-%m-%d" "$log_date" +%s)))
else
diff_time=$(($(date +%s) - $(date +%s -d "$log_date")))
fi
[[ $diff_time -gt $(($CLEANBAK_DAYS * 86400)) ]] && rm -vf $log
fi
done
fi
}
install_dependencies_normal(){
for i in $@; do
case $i in
canvas)
cd /ql/scripts
if [[ "$(echo $(npm ls $i) | grep ERR)" != "" ]]; then
npm uninstall $i
fi
if [[ "$(npm ls $i)" =~ (empty) ]]; then
apk add --no-cache build-base g++ cairo-dev pango-dev giflib-dev && npm i $i --prefix /ql/scripts --build-from-source
fi
;;
*)
if [[ "$(npm ls $i)" =~ $i ]]; then
npm uninstall $i
elif [[ "$(echo $(npm ls $i -g) | grep ERR)" != "" ]]; then
npm uninstall $i -g
fi
if [[ "$(npm ls $i -g)" =~ (empty) ]]; then
[[ $i = "typescript" ]] && npm i $i -g --force || npm i $i -g
fi
;;
esac
done
}
install_dependencies_force(){
for i in $@; do
case $i in
canvas)
cd /ql/scripts
if [[ "$(npm ls $i)" =~ $i && "$(echo $(npm ls $i) | grep ERR)" != "" ]]; then
npm uninstall $i
rm -rf /ql/scripts/node_modules/$i
rm -rf /usr/local/lib/node_modules/lodash/*
fi
if [[ "$(npm ls $i)" =~ (empty) ]]; then
apk add --no-cache build-base g++ cairo-dev pango-dev giflib-dev && npm i $i --prefix /ql/scripts --build-from-source --force
fi
;;
*)
cd /ql/scripts
if [[ "$(npm ls $i)" =~ $i ]]; then
npm uninstall $i
rm -rf /ql/scripts/node_modules/$i
rm -rf /usr/local/lib/node_modules/lodash/*
elif [[ "$(npm ls $i -g)" =~ $i && "$(echo $(npm ls $i -g) | grep ERR)" != "" ]]; then
npm uninstall $i -g
rm -rf /ql/scripts/node_modules/$i
rm -rf /usr/local/lib/node_modules/lodash/*
fi
if [[ "$(npm ls $i -g)" =~ (empty) ]]; then
npm i $i -g --force
fi
;;
esac
done
}
install_dependencies_all(){
install_dependencies_normal $package_name
for i in $package_name; do
{install_dependencies_force $i} &
done
}
kill_proc(){
ps -ef|grep "$1"|grep -Ev "$2"|awk '{print $1}'|xargs kill -9
}
## 执行并写入日志
kill_proc "code.sh" "grep|$$" >/dev/null 2>&1
[[ $FixDependType = "1" ]] && [[ "$ps_num" -le $proc_num ]] && install_dependencies_all >/dev/null 2>&1 &
latest_log=$(ls -r $dir_code | head -1)
latest_log_path="$dir_code/$latest_log"
ps_num="$(ps | grep code.sh | grep -v grep | wc -l)"
export_all_codes | perl -pe "{s|京东种豆|种豆|; s|crazyJoy任务|疯狂的JOY|}"
sleep 5
update_help
## 修改curtinlv入会领豆配置文件的参数
[[ -f /ql/repo/curtinlv_JD-Script/OpenCard/OpenCardConfig.ini ]] && sed -i "4c JD_COOKIE = '$(echo $JD_COOKIE | sed "s/&/ /g; s/\S*\(pt_key=\S\+;\)\S*\(pt_pin=\S\+;\)\S*/\1\2/g;" | perl -pe "s| |&|g")'" /ql/repo/curtinlv_JD-Script/OpenCard/OpenCardConfig.ini
/*
================================================================================
魔改自 https://github.com/shufflewzc/faker2/blob/main/jdCookie.js
修改内容:与task_before.sh配合,由task_before.sh设置要设置要做互助的活动的 ShareCodeConfigName 和 ShareCodeEnvName 环境变量,
然后在这里实际解析/ql/log/.ShareCode中该活动对应的配置信息(由code.sh生成和维护),注入到nodejs的环境变量中
修改原因:原先的task_before.sh直接将互助信息注入到shell的env中,在ck超过45以上时,互助码环境变量过大会导致调用一些系统命令
(如date/cat)时报 Argument list too long,而在node中修改环境变量不会受这个限制,也不会影响外部shell环境,确保脚本可以正常运行
魔改作者:风之凌殇
================================================================================
此文件为Node.js专用。其他用户请忽略
*/
//此处填写京东账号cookie。
let CookieJDs = [
]
// 判断环境变量里面是否有京东ck
if (process.env.JD_COOKIE) {
if (process.env.JD_COOKIE.indexOf('&') > -1) {
CookieJDs = process.env.JD_COOKIE.split('&');
} else if (process.env.JD_COOKIE.indexOf('\n') > -1) {
CookieJDs = process.env.JD_COOKIE.split('\n');
} else {
CookieJDs = [process.env.JD_COOKIE];
}
}
if (JSON.stringify(process.env).indexOf('GITHUB')>-1) {
console.log(`请勿使用github action运行此脚本,无论你是从你自己的私库还是其他哪里拉取的源代码,都会导致我被封号\n`);
!(async () => {
await require('./sendNotify').sendNotify('提醒', `请勿使用github action、滥用github资源会封我仓库以及账号`)
await process.exit(0);
})()
}
CookieJDs = [...new Set(CookieJDs.filter(item => !!item))]
console.log(`\n====================共${CookieJDs.length}个京东账号Cookie=========\n`);
console.log(`==================脚本执行- 北京时间(UTC+8):${new Date(new Date().getTime() + new Date().getTimezoneOffset()*60*1000 + 8*60*60*1000).toLocaleString('zh', {hour12: false}).replace(' 24:',' 00:')}=====================\n`)
if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {};
for (let i = 0; i < CookieJDs.length; i++) {
if (!CookieJDs[i].match(/pt_pin=(.+?);/) || !CookieJDs[i].match(/pt_key=(.+?);/)) console.log(`\n提示:京东cookie 【${CookieJDs[i]}】填写不规范,可能会影响部分脚本正常使用。正确格式为: pt_key=xxx;pt_pin=xxx;(分号;不可少)\n`);
const index = (i + 1 === 1) ? '' : (i + 1);
exports['CookieJD' + index] = CookieJDs[i].trim();
}
// 以下为注入互助码环境变量(仅nodejs内起效)的代码
function SetShareCodesEnv(nameChinese = "", nameConfig = "", envName = "") {
let rawCodeConfig = {}
// 读取互助码
let shareCodeLogPath = `${process.env.QL_DIR}/log/.ShareCode/${nameConfig}.log`
let fs = require('fs')
if (fs.existsSync(shareCodeLogPath)) {
// 因为faker2目前没有自带ini,改用已有的dotenv来解析
// // 利用ini模块读取原始互助码和互助组信息
// let ini = require('ini')
// rawCodeConfig = ini.parse(fs.readFileSync(shareCodeLogPath, 'utf-8'))
// 使用env模块
require('dotenv').config({path: shareCodeLogPath})
rawCodeConfig = process.env
}
// 解析每个用户的互助码
let codes = {}
Object.keys(rawCodeConfig).forEach(function (key) {
if (key.startsWith(`My${nameConfig}`)) {
codes[key] = rawCodeConfig[key]
}
});
// 解析每个用户要帮助的互助码组,将用户实际的互助码填充进去
let helpOtherCodes = {}
Object.keys(rawCodeConfig).forEach(function (key) {
if (key.startsWith(`ForOther${nameConfig}`)) {
let helpCode = rawCodeConfig[key]
for (const [codeEnv, codeVal] of Object.entries(codes)) {
helpCode = helpCode.replace("${" + codeEnv + "}", codeVal)
}
helpOtherCodes[key] = helpCode
}
});
// 按顺序用&拼凑到一起,并放入环境变量,供目标脚本使用
let shareCodes = []
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
let totalCodeCount = rightIndex - leftIndex + 1
console.info(`【风之凌殇】 友情提示:设置 ${nameChinese} 的 互助码环境变量 ${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])
}
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 (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}]`)
}
#!/usr/bin/env bash
# Build 20211122-001
name_js=(
jd_fruit
jd_pet
jd_plantBean
jd_dreamFactory
jd_jdfactory
jd_crazy_joy
jd_jdzz
jd_jxnc
jd_bookshop
jd_cash
jd_sgmh
jd_cfd
jd_health
jd_carnivalcity
jd_city
jd_moneyTree_heip
jd_cfdtx
)
name_config=(
Fruit
Pet
Bean
DreamFactory
JdFactory
Joy
Jdzz
Jxnc
BookShop
Cash
Sgmh
Cfd
Health
Carni
City
MoneyTree
TokenJxnc
)
env_name=(
FRUITSHARECODES ## 1、东东农场互助码
PETSHARECODES ## 2、东东萌宠互助码
PLANT_BEAN_SHARECODES ## 3、种豆得豆互助码
DREAM_FACTORY_SHARE_CODES ## 4、京喜工厂互助码
DDFACTORY_SHARECODES ## 5、东东工厂互助码
JDJOY_SHARECODES ## 6、疯狂的JOY互助码
JDZZ_SHARECODES ## 7、京东赚赚互助码
JXNC_SHARECODES ## 8、京喜农场助力码
BOOKSHOP_SHARECODES ## 9、口袋书店互助码
JD_CASH_SHARECODES ## 10、签到领现金互助码
JDSGMH_SHARECODES ## 11、闪购盲盒互助码
JDCFD_SHARECODES ## 12、京喜财富岛互助码
JDHEALTH_SHARECODES ## 13、东东健康社区互助码
JD818_SHARECODES ## 14、京东手机狂欢城互助码
CITY_SHARECODES ## 15、城城领现金互助码
MONEYTREE_SHARECODES ## 16、摇钱树
JXNCTOKENS ## 17、京喜Token(京喜财富岛提现用)
)
var_name=(
ForOtherFruit ## 1、东东农场互助规则
ForOtherPet ## 2、东东萌宠互助规则
ForOtherBean ## 3、种豆得豆互助规则
ForOtherDreamFactory ## 4、京喜工厂互助规则
ForOtherJdFactory ## 5、东东工厂互助规则
ForOtherJoy ## 6、疯狂的JOY互助规则
ForOtherJdzz ## 7、京东赚赚互助规则
ForOtherJxnc ## 8、京喜农场助力码
ForOtherBookShop ## 9、口袋书店互助规则
ForOtherCash ## 10、签到领现金互助规则
ForOtherSgmh ## 11、闪购盲盒互助规则
ForOtherCfd ## 12、京喜财富岛互助规则
ForOtherHealth ## 13、东东健康社区互助规则
ForOtherCarni ## 14、京东手机狂欢城互助规则
ForOtherCity ## 15、城城领现金互助规则
ForOtherMoneyTree ## 16、摇钱树
TokenJxnc ## 17、京喜Token(京喜财富岛提现用)
)
## 临时屏蔽某账号运行活动脚本(账号序号匹配)
TempBlock_JD_COOKIE(){
source $file_env
local TempBlockCookieInterval="$(echo $TempBlockCookie | perl -pe "{s|~|-|; s|_|-|}" | sed 's/\(\d\+\)-\(\d\+\)/{\1..\2}/g')"
local TempBlockCookieArray=($(eval echo $TempBlockCookieInterval))
local envs=$(eval echo "\$JD_COOKIE")
local array=($(echo $envs | sed 's/&/ /g'))
local user_sum=${#array[*]}
local m n t
for ((m = 1; m <= $user_sum; m++)); do
n=$((m - 1))
for ((t = 0; t < ${#TempBlockCookieArray[*]}; t++)); do
[[ "${TempBlockCookieArray[t]}" = "$m" ]] && unset array[n]
done
done
jdCookie=$(echo ${array[*]} | sed 's/\ /\&/g')
[[ ! -z $jdCookie ]] && export JD_COOKIE="$jdCookie"
temp_user_sum=${#array[*]}
}
## 临时屏蔽某账号运行活动脚本(pt_pin匹配)
TempBlock_JD_PT_PIN(){
[[ -z $JD_COOKIE ]] && source $file_env
local TempBlockPinArray=($TempBlockPin)
local envs=$(eval echo "\$JD_COOKIE")
local array=($(echo $envs | sed 's/&/ /g'))
local i m n t pt_pin_temp pt_pin_temp_block
for i in "${!array[@]}"; do
pt_pin_temp=$(echo ${array[i]} | perl -pe "{s|.*pt_pin=([^; ]+)(?=;?).*|\1|; s|%|\\\x|g}")
[[ $pt_pin_temp == *\\x* ]] && pt_pin[i]=$(printf $pt_pin_temp) || pt_pin[i]=$pt_pin_temp
for n in "${!TempBlockPinArray[@]}"; do
pt_pin_temp_block=$(echo ${TempBlockPinArray[n]} | perl -pe "{s|%|\\\x|g}")
[[ $pt_pin_temp_block == *\\x* ]] && pt_pin_block[n]=$(printf $pt_pin_temp_block) || pt_pin_block[n]=$pt_pin_temp_block
[[ "${pt_pin[i]}" =~ "${pt_pin_block[n]}" ]] && unset array[i]
done
done
jdCookie=$(echo ${array[*]} | sed 's/\ /\&/g')
[[ ! -z $jdCookie ]] && export JD_COOKIE="$jdCookie"
temp_user_sum=${#array[*]}
}
## 随机账号运行活动
Random_JD_COOKIE(){
[[ -z $JD_COOKIE ]] && source $file_env
local envs=$(eval echo "\$JD_COOKIE")
local array=($(echo $envs | sed 's/&/ /g'))
local user_sum=${#array[*]}
local combined_all
if [[ $RandomMode = "1" ]]; then
[[ ! $ran_num ]] && ran_num=$user_sum
if [ $(echo $ran_num|grep '[0-9]') ]; then
[[ $ran_num -gt $user_sum || $ran_num -lt 2 ]] && ran_num=$user_sum
ran_sub="$(seq $user_sum | sort -R | head -$ran_num)"
for i in $ran_sub; do
tmp="${array[i]}"
combined_all="$combined_all&$tmp"
done
jdCookie=$(echo $combined_all | sed 's/^&//g')
[[ ! -z $jdCookie ]] && export JD_COOKIE="$jdCookie"
fi
fi
}
## 组队任务
combine_team(){
p=$1
q=$2
export jd_zdjr_activityId=$3
export jd_zdjr_activityUrl=$4
}
team_task(){
[[ -z $JD_COOKIE ]] && source $file_env
local envs=$(eval echo "\$JD_COOKIE")
local array=($(echo $envs | sed 's/&/ /g'))
local user_sum=${#array[*]}
local i j k x y p q
local scr=$scr_name
local teamer_array=($teamer_num)
local team_array=($team_num)
if [[ -f /ql/scripts/$scr ]]; then
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))
y=$(((p - 1)*m + 1))
COOKIES_HEAD="${array[x]}"
COOKIES=""
if [[ $j -le $q ]]; then
for ((n = 1; n < $p; n++)); do
COOKIES="$COOKIES&${array[y]}"
let y++
done
elif [[ $j -eq $((q + 1)) ]]; then
for ((n = 1; n < $((p-1)); n++)); do
COOKIES_HEAD="${array[x]}&${array[0]}"
COOKIES="$COOKIES&${array[y]}"
let y++
done
elif [[ $j -gt $((q + 1)) ]]; then
[[ $((y+1)) -le $user_sum ]] && y=$(((p - 1)*m)) || break
for ((n = $m; n < $((m + p -1)); n++)); do
COOKIES="$COOKIES&${array[y]}"
let y++
[[ $y = $x ]] && y=$((y+1))
[[ $((y+1)) -gt $user_sum ]] && break
done
fi
result=$(echo -e "$COOKIES_HEAD$COOKIES")
if [[ $result ]]; then
export JD_COOKIE=$result
node /ql/scripts/$scr
fi
# echo $JD_COOKIE
done
done
exit
fi
}
## 组合互助码格式化为全局变量的函数
combine_sub() {
source $file_env
local what_combine=$1
local combined_all=""
local tmp1 tmp2
local TempBlockCookieInterval="$(echo $TempBlockCookie | perl -pe "{s|~|-|; s|_|-|}" | sed 's/\(\d\+\)-\(\d\+\)/{\1..\2}/g')"
local TempBlockCookieArray=($(eval echo $TempBlockCookieInterval))
local envs=$(eval echo "\$JD_COOKIE")
local array=($(echo $envs | sed 's/&/ /g'))
local user_sum=${#array[*]}
local a b i j t sum combined_all
for ((i=1; i <= $user_sum; i++)); do
local tmp1=$what_combine$i
local tmp2=${!tmp1}
[[ ${tmp2} ]] && sum=$i || break
done
[[ ! $sum ]] && sum=$user_sum
for ((j = 1; j <= $sum; j++)); do
a=$temp_user_sum
b=$sum
if [[ $a -ne $b ]]; then
for ((t = 0; t < ${#TempBlockCookieArray[*]}; t++)); do
[[ "${TempBlockCookieArray[t]}" = "$j" ]] && continue 2
done
fi
local tmp1=$what_combine$j
local tmp2=${!tmp1}
combined_all="$combined_all&$tmp2"
done
echo $combined_all | perl -pe "{s|^&||; s|^@+||; s|&@|&|g; s|@+&|&|g; s|@+|@|g; s|@+$||}"
}
## 正常依次运行时,组合互助码格式化为全局变量
combine_all() {
for ((i = 0; i < ${#env_name[*]}; i++)); do
result=$(combine_sub ${var_name[i]})
if [[ $result ]]; then
export ${env_name[i]}="$result"
fi
done
}
## 正常依次运行时,组合互助码格式化为全局变量
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]}
# 在实际执行任务前,确保集合仓库的脚本目录中的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
;;
*)
export ${env_name[i]}=""
;;
esac
done
}
TempBlock_JD_COOKIE && TempBlock_JD_PT_PIN && Random_JD_COOKIE
if [ $scr_name ]; then
team_task
else
combine_only "$1"
fi
#if [[ $(ls $dir_code) ]]; then
# latest_log=$(ls -r $dir_code | head -1)
# . $dir_code/$latest_log
# combine_all
#fi
# 导出互助脚本列表,供 jdCookie.js 处使用
export ShareCodeJSNameList="${name_js[@]}"
@byasoo
Copy link

byasoo commented Nov 23, 2021

1194E170-FCDC-43A0-A83F-A80ABD1D4E6D
还有这个

@fzls
Copy link
Author

fzls commented Nov 23, 2021

C1B2C99F-8C51-41A2-B3B0-EFF6ED312F8A 大佬,2.10.7用了还是这样,怎么解决

你的task_before.sh没用修改版的吧

@zz112211
Copy link

86464F78-1D2E-4F53-AB2C-8CF4064128E5
大佬,请问为啥复制不过去啊。。。

@Nothend
Copy link

Nothend commented Feb 8, 2022

大佬 你好 多谢提供这么优秀的代码,感激不尽。有个问题请假下,就是青龙2.11.2版本中,脚本都放到以库命名的文件夹中,脚本名称不再含有库名字,我运行后提示:

东东农场:

#【09:10:11】 未运行过 KingRan_JDJB_jd_fruit.js 脚本,未产生日志

东东萌宠:

从日志中未找到任何互助码

种豆得豆:

从日志中未找到任何互助码

是我哪里设置错误,还是需要修改一下code.sh?还望拨冗指点,感激不尽!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment