-
-
Save munfaqqiha/44ab04e9020bc8d887591fa88ce3355b to your computer and use it in GitHub Desktop.
| ### BY: MUNFAQQIHA #################################################################################################################################### | |
| ######################### A BASH SHELL SCRIPT FOR LINUX AND WINDOWS TO AUTOMATICALLY NON-STOP UPLOAD FILES TO WWW.TERABOX.COM ######################### | |
| ####################################################################################################################################################### | |
| ### ----------------------------------------------------------------------------------------------------------------------------------------------- ### | |
| ### | sample of successful upload: on linux: https://s.id/teraupnix || on windows: https://s.id/teraupwin | ### | |
| ### ----------------------------------------------------------------------------------------------------------------------------------------------- ### | |
| ### it is possible to upload multiple different types of files recursively, except 0-byte file size, in a folder where you run it. The maximum size ### | |
| ### of a single uploaded file allowed by terabox is 2147483648 Bytes (2.00 GiB). if a file exceeds that, this script will split it into pieces, and ### | |
| ### 120MiB is the upper limit of a single segment size allowed for multipart upload. however, terabox limits the maximum size of a single file that ### | |
| ### can be stored on their server. the total size of a single file for premium user is limited to 21474836479 Bytes (20.00 GiB), & 4294967296 Bytes ### | |
| ### (4.00 GiB) for a free member - https://s.id/1IMx2. ### | |
| ### ----------------------------------------------------------------------------------------------------------------------------------------------- ### | |
| ### ### | |
| ### catch the following steps to make it successful (run it on VPS / RDP for faster speed): ### | |
| ### ### | |
| ### 1. install jq: ### | |
| ### ### | |
| ### a. on linux do as usual. ### | |
| ### b. on windows: choose one of the following: ### | |
| ### (1). install linux with WSL: ubuntu or debian (highly recommended). ### | |
| ### (2). install gitforwindows (gitforwindows.org). ### | |
| ### (*). choose all of its default options. ### | |
| ### (*). run this on its shell: curl -Lo /usr/bin/jq.exe https://github.com/stedolan/jq/releases/latest/download/jq-win64.exe && jq -V ### | |
| ### ### | |
| ### 2. set the value for each of the following variables: ### | |
| ### ### | |
| ### it is all those little steps to get the value of the following 3 variables jt (jsToken), bt (bdstoken), and co (cookie): ### | |
| ### ### | |
| ### a. login to terabox account via chrome on desktop. ### | |
| ### b. press CTRL + R, then F12, next type "getinfo" in the "Filter" column ### | |
| ### c. so click "Networks" tab, right-click the url that says "getinfo" ### | |
| ### d. select copy >> Copy as cURL (bash), and don't event miss to paste it into your text editor. its usage is below: ### | |
| ### ### | |
| ### (1). for "jt" value, copy from "jsToken" section after "=" sign and before "&". ### | |
| ### (2). for "bt" value, copy from "bdstoken" section after as "jt" above. ### | |
| ### (3). for "co" value, copy from "cookie" section as usually. ### | |
| ### ### | |
| ### jt="" ### | |
| ### bt="" ### | |
| ### co="" ### | |
| ### ### | |
| ### e. the next let you go to fill out all variables (pay attention to text case): ### | |
| ### ### | |
| ### (1). full location path of a folder containing the files to be uploaded to terabox. ### | |
| ### ### | |
| ### # sample output of pwd command on linux shell. ### | |
| ### fl="/home/munfaqqiha/Pilem/Jadul" ### | |
| ### ### | |
| ### # sample output of pwd command on gitforwindows shell. ### | |
| ### fl="/c/Pilem/Jadul" ### | |
| ### ### | |
| ### (2). full path of your terabox folder where you'd like to store your files. ### | |
| ### ### | |
| ### rf="/Pilem/Jadul" ### | |
| ### ### | |
| ### (3). do you wanna move your files to another place after they're uploaded?: <yes/no>. ### | |
| ### ### | |
| ### mv="no" ### | |
| ### ### | |
| ### (4). if you decide that, please specify a full path of a backup folder to move them. ### | |
| ### ### | |
| ### # sample output of pwd command on linux shell. ### | |
| ### bu="/home/munfaqqiha/Pilem/Backup" ### | |
| ### ### | |
| ### # sample output of pwd command on gitforwindows shell. ### | |
| ### bu="/c/Pilem/Backup" ### | |
| ### ### | |
| ### (5). would you like to get a shared & download link of each uploaded file?: <yes/no>. all will be saved into a text file named "link.id". ### | |
| ### ### | |
| ### ds="yes" ### | |
| ### ### | |
| ### (6). while you'd agree to the points above, set its expiration date either 7, 30 (days), or 0 (forever). ### | |
| ### ### | |
| ### on="0" ### | |
| ### ### | |
| ### (7). please decide whether files may be deleted from the folder after they're uploaded: <yes/no>. ### | |
| ### ### | |
| ### rm="no" ### | |
| ### ### | |
| ####################################################################################################################################################### | |
| ### ALERT: ### | |
| ### .... After you've obtained your credentials, DO NOT press the "Sign Out" on the terabox.com when leaving it. It is enough to clear your cookies ### | |
| ### .... via the browser's built-in feature. If you do, then you'll not be able to upload files. You'll get an error something like: "need verify". ### | |
| ### ### | |
| ### NOTES: ### | |
| ### (*). it is also possible to run the code with the command: "bash yours.sh". if you picking on this, please include all variables in your file. ### | |
| ### (*). don't forget to watch a sample of successful upload on linux & windows at here: https://cuty.io/teraput. ### | |
| ### (*). for the multiple lines bash command code get it at here: https://cuty.io/linuxwintera. ### | |
| ####################################################################################################################################################### | |
| { ATTENTION } | |
| There are two versions of the script currently available. The first one below is my original codes. Unfortunately, due to personal reasons, I decided | |
| not to maintain it anymore. No worries, it's still 100% working perfectly (October 20, 2025). Therefore, the last one is a forked version. | |
| { GOOD NEWS } | |
| This script has been forked and maintained by a smart & humble user, @nis267. He also added simultaneous capabilities to this script. You can interact | |
| with him at: https://gist.github.com/nis267/74c6315f6dbd24a0b8889acdd08789e6 | |
| ### THE CODE STARTS FROM HERE ######################################################################################################################### | |
| set +H | |
| jt="your stuffing" | |
| bt="............." | |
| co="............." | |
| fl="............." | |
| rf="............." | |
| mv="............." | |
| bu="............." | |
| ds="............." | |
| on="............." | |
| rm="............." | |
| [[ -n ${fl} && -d ${fl} ]] && cd "${fl}" && \ | |
| ua='okhttp/7.4' && \ | |
| bo='https://www.terabox.com' && \ | |
| set +H && \ | |
| find . -name "*piece[[:digit:]]*" ! -regex ".*\.\(sh\|id\)" -delete && \ | |
| echo -e "\n$(ls 2>&- --color -Ss1pq --block-size=1 "${PWD}/"*)" && \ | |
| readarray -t mi <<<"$(find . -type f ! -regex ".*\.\(sh\|id\)" -size +0 -printf "%f\n")" && \ | |
| vi=$(curl -s "${bo}/rest/2.0/membership/proxy/user?method=query" -A "${ua}" -b "${co}" -e "${bo}/" | jq -r '.data.member_info.is_vip') && \ | |
| for yu in "${mi[@]}"; do | |
| nfo=$(curl -sL "${bo}" -A "${ua}" -b "${co}" -e "${bo}/" | perl -pe 's/\%(\w\w)/chr hex $1/ge' | sed "s#\"#\\n#g;s|:||g;s|,||g" | awk 'NF') && \ | |
| jt=$(echo "$nfo" | grep -i 'jstok.*' -A1 | tail -1) && \ | |
| bt=$(echo "$nfo" | grep -i 'bdsto.*' -A1 | tail -1) && \ | |
| sz=$(du -b "${yu}" 2>&- | awk '{print $1}') && \ | |
| fn=${yu} && \ | |
| qt=$(curl -s "${bo}/api/quota?checkexpire=1&checkfree=1&app_id=250528&jsToken=${jt}" -A "${ua}" -b "${co}" -e "${bo}/") && \ | |
| to=$(echo "$qt" | jq -r '.total') && \ | |
| us=$(echo "$qt" | jq -r '.used') && \ | |
| if [[ ! ( $(grep -s '[[:digit:]]' <<<${to}) ) || ! ( $(grep -s '[[:digit:]]' <<<${on}) ) || ( -z ${rf} || -z ${mv} || -z ${bu} || -z ${ds} || -z ${on} || -z ${rm} ) ]]; then | |
| echo -e "\n$(echo "# recheck: the value of your variables, and don't forget to paste all on the shell." | sed 's/# re.*ck:/\o033[1;41m&\o033[0m/I')" && \ | |
| break | |
| elif [[ $((to - us)) -lt ${sz} ]]; then | |
| echo -e "\n$(echo "# quota: is smaller than the size of current file ($(numfmt --to=iec-i --suffix=B --format='%.2f' ${sz} | sed 's/[0-9]\+/& /2')). your remaining space is $(numfmt --to=iec-i --suffix=B --format='%.2f' $((to - us)) | sed 's/[0-9]\+/& /2')." | sed 's/# quota:/\o033[1;41m&\o033[0m/I')" && \ | |
| break | |
| elif [[ -z "${sz/[ ]*\n/}" ]]; then | |
| echo -e "\n$(echo '# notice: please double check whether your file exists or not!.' | sed 's/# notice:/\o033[1;41m&\o033[0m/I')" && \ | |
| break | |
| else | |
| echo -e "\n$(echo '### TERABOX: preparing..! ||' "$(echo "QUOTA:" $(numfmt --to=iec-i --suffix=B --format='%.2f' "$us" | sed 's/[0-9]\+/& /2') / $(numfmt --to=iec-i --suffix=B --format='%.2f' "$to" | sed 's/[0-9]\+/& /2'))" $(printf "%$(tput cols)s" | tr " " "#") | cut -c -$COLUMNS | sed -E 's/t.*x:|q.*:/\o033[1;41m&\o033[0m/Ig')\n" && \ | |
| if [[ ( ${vi} -eq 1 && ${sz} -le 21474836479 ) || ( ${vi} -eq 0 && ${sz} -le 4294967296 ) ]]; then | |
| [[ ${sz} -ge 2147483648 ]] && \ | |
| echo -e "$(echo "# info: your file is larger than 2147483648 bytes (2.00 GiB). please wait it will be splitted into pieces!." | sed 's/# info:/\o033[1;41m&\o033[0m/I')\n" && \ | |
| sleep 3 && \ | |
| (split --verbose -b 120M "${yu}" --suffix-length=3 --numeric-suffixes=0 "${yu}".piece && \ | |
| echo -e "$(ls -1 *piece[[:digit:]]* > piece0a)") || \ | |
| echo "${yu}" > piece0a | |
| else | |
| echo -e "$(echo "# info: size limit exceeded!. the total size of a single file for vip user is limited to 21474836479 bytes, and 4294967296 bytes for a non." | sed 's/# info:/\o033[1;41m&\o033[0m/I')\n" && \ | |
| break | |
| fi && \ | |
| cat piece0a | while read md; do | |
| md5sum <<<"${md}" | md5sum | cut -d ' ' -f1 >> piece0b | |
| done && \ | |
| md5=$(cat piece0b | sed -n 's/^/"/;s/$/"/;H;${x;s/\n/,/g;s/^,//;p}' | awk '{print "["$0"]"}') && \ | |
| fp=$(echo "${rf}/${yu}" | jq -Rr @uri) && \ | |
| tp=$(echo "${rf}/" | sed 's#/*$##;${s|$|/|}') && \ | |
| pc=$(curl -s "${bo}/api/precreate?app_id=250528&jsToken=${jt}" -A "${ua}" -b "${co}" -H "Origin: ${bo}" -e "${bo}/" --data-raw "path=${fp}&size=${sz}&autoinit=1&rtype=3&target_path=${tp}&block_list=${md5}") && \ | |
| echo "$pc" | jq -C --arg fs "$(numfmt --to=iec-i --suffix=B --format='%.2f' <<<${sz} | sed 's/[0-9]\+/& /2') (${sz} Bytes)" '.filesize = $fs | .block_list |= tostring' 2>&- || true && \ | |
| sleep 3 && \ | |
| if grep -Eiq 'uploadid.*' <<<${pc}; then | |
| echo -e "\n$(echo '### TERABOX: uploading..!' $(printf "%$(tput cols)s" | tr " " "#") | cut -c -$COLUMNS | sed "s,t.*:,\o033[1;41m&\o033[0m,I")" && \ | |
| ui=$(echo $pc | jq -r '.uploadid') && bl=$(cat piece0a | wc -l) && \ | |
| ls -1 *part* >/dev/null 2>&1 && pr=0 || pr=1 && ps=0 && \ | |
| while read mi; do | |
| ls -1 *piece[[:digit:]]* &>/dev/null && \ | |
| echo -e "\n$(echo "# uploading: piece #${pr} of #${bl} left | file: ${mi} | md5: $(cat piece0b | head -1 && sed -i '1d' piece0b)" | sed -e 's/# up.*ng:/\o033[1;41m&\o033[0m/Ig' -Ee 's/piece\s|left|file:|md5:/\x1b[32m&\x1b[0m/Ig')\n" || \ | |
| echo -e "$(true)" && \ | |
| up=$(curl -iF "file=@${mi}" "$(echo $bo | sed 's/www/c-jp/')/rest/2.0/pcs/superfile2?method=upload&type=tmpfile&app_id=250528&path=${fp}&uploadid=${ui}&partseq=${ps}" -A "${ua}" -b "${co}" -H "Origin: ${bo}" -e "${bo}/") && \ | |
| echo -e "\n$(echo "${up}" | tail -1 | jq -C 2>&-)" && \ | |
| echo "${up}" | sed '$!d' | jq -r '.md5' >> piece0c && \ | |
| ((bl--)) && \ | |
| pr=$((pr+1)) && \ | |
| ps=$(expr $ps + 1) | |
| done < piece0a && \ | |
| md5=$(cat piece0c | sed -n 's/^/"/;s/$/"/;H;${x;s/\n/,/g;s/^,//;p}' | awk '{print "["$0"]"}') && \ | |
| if grep -Eiq 'md5.*' <<<${up}; then | |
| echo -e "\n$(echo '### TERABOX: finishing..!' $(printf "%$(tput cols)s" | tr " " "#") | cut -c -$COLUMNS | sed "s,t.*:,\o033[1;41m&\o033[0m,I")\n" && \ | |
| if [[ ${mv} == *"yes"* ]]; then | |
| mkdir -p ${bu} && \ | |
| mv -f ${yu} ${bu} | |
| elif [[ ${rm} == *"yes"* ]]; then | |
| rm -rf ${yu} | |
| fi && \ | |
| create=$(curl -s "${bo}/api/create?isdir=0&rtype=1&bdstoken=${bt}&app_id=250528&jsToken=${jt}" -A "${ua}" -b "${co}" -H "Origin: ${bo}" -e "${bo}/" --data-raw "path=${fp}&size=${sz}&uploadid=${ui}&target_path=${tp}&block_list=${md5}") && \ | |
| fi=$(echo -e "$(echo ${create} | jq --arg fs "$(numfmt --to=iec-i --suffix=B --format='%.2f' <<<${sz} | sed 's/[0-9]\+/& /2') (${sz} Bytes)" '.size = $fs | {"uploaded": "Glory to God for His great work!"} + .')") && \ | |
| grep -Eiq 'yes' <<<${ds} && \ | |
| pl=$(echo ${create} | jq '.path' | jq -Rr @uri) && \ | |
| pl=$(echo $pl | sed -n 'H;${x;s/\n/,/g;s/^,//;p}' | awk '{print "["$0"]"}') && \ | |
| sl=$(curl -s "${bo}/share/pset?app_id=250528&bdstoken=${bt}" -A "${ua}" -b "${co}" -e "${bo}/" --data-raw "schannel=0&channel_list=[0]&period=${on}&path_list=${pl}&public=1" | jq -r '.link') && \ | |
| ma=$(echo $sl | awk -F 's/1' '{print $2}') && \ | |
| dl=$(curl -s "${bo}/share/list?shorturl=${ma}&root=1&app_id=250528&jsToken=${jt}" -A "${ua}" -b "${co}" -e "${bo}/" | jq -r '.list[].dlink') && \ | |
| echo "$fi" | jq -C '.sharedlink="'"${sl}"'" | .downloadlink="'"${dl}"'"' && \ | |
| echo -e "Storedname: ${yu}\nSharedlink: ${sl}\nD/loadlink: ${dl}\n" >> link.id || \ | |
| echo "$fi" | jq -C && \ | |
| sleep 3 && \ | |
| rm -rf *piece[[:digit:]]* | |
| else | |
| echo -e "\n$(echo '# notice: look at the uploading log above..!' $(echo "${up}" | grep -oi 'http.*' | head -1 | sed 's/\s$//') | sed -e 's/# notice:/\o033[1;41m&\o033[0m/I' -e 's/http.*/\x1b[91m&\x1b[0m/Ig')" | |
| fi | |
| else | |
| echo -e "\n$(echo '# notice: please, look at the precreate section..!' | sed 's/# notice:/\o033[1;41m&\o033[0m/I')\n" | |
| fi | |
| fi | |
| done && \ | |
| echo -e "\n$(ls 2>&- --color -Ss1pq --block-size=1 *)" || \ | |
| echo -e "\n$(echo "# notice: check the variable values of your file source directory and its exist or not!." | sed 's/# notice:/\o033[1;41m&\o033[0m/I')\n" | |
| ### CODE ENDS HERE #################################################################################################################################### |
In the script you use some sleeps for what are they necessary? @munfaqqiha
I removed the sleeps in my changes.
Hello, nis267:
I'm very sorry for my delay in responding.
In the script you use some sleeps for what are they necessary? @munfaqqiha. I removed the sleeps in my changes.
It's just to see the output during the process.
I added the possibility to upload multiple files simultaneously here are the changes in my fork. It's much faster now for example to upload pictures I had 50.000 to uplaod.
I'm very happy to see you were able to add capabilities to the script.
And maybe create a repository in github so people can contribute and create pull requests?
Sure, I've activities in real life that I can't leave behind. So, I decided to give you a full freedom of access to improve, including to create a repository to organize the script. I trust your abilities. No worries, the entire script is free.
Maybe add it in your scipt? @munfaqqiha.
I haven't tried it, also I read in your fork that there's a user who are having problems with the script. So, you can fix it and do it as it should.
Good luck, and thanks a lot. Have a nice day.
I fixed the problems with the script and it's working now here are the changes in my fork
Can anyone tell me if this still works
I added the possibility to upload multiple files simultaneously here are the changes in my fork.
it's much faster now for example to upload pictures I had 50.000 to uplaod.
Maybe add it in your scipt? @munfaqqiha
And maybe create a repository in github so people can contribute and create pull requests?