Forked from munfaqqiha/Shell Script for Linux & Windows to Non-Stop Upload Files to TeraBox
Last active
May 2, 2025 17:58
-
-
Save nis267/74c6315f6dbd24a0b8889acdd08789e6 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
### 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" ### | |
### (9). amount of files to upload simultaneously (default 1) ### | |
### ### | |
### max_files_uploading="1" ### | |
### ### | |
####################################################################################################################################################### | |
### 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. ### | |
####################################################################################################################################################### | |
### THE CODE STARTS FROM HERE ######################################################################################################################### | |
set +H | |
jt="your stuffing" | |
bt="............." | |
co="............." | |
fl="............." | |
rf="............." | |
mv="............." | |
bu="............." | |
ds="............." | |
on="............." | |
rm="............." | |
max_files_uploading="1" | |
# Define a function to process a batch of files | |
process_file_upload() { | |
yu="$1" | |
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} || -z ${max_files_uploading}) ]]; 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')" && exit 1 | |
elif [[ $((to - us)) -lt ${sz} ]]; then | |
echo -e "\n$(echo "# quota: is smaller than the size of the 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')" && exit 1 | |
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')" && return | |
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" && | |
(split --verbose -b 120M "${yu}" --suffix-length=3 --numeric-suffixes=0 piece"${yu}" && | |
echo -e $(ls -1 *piece"${yu}"[[:digit:]]* > "piece${yu}0a")) || echo "${yu}" > "piece${yu}0a" | |
else | |
echo -e "$(echo "# info: size limit exceeded!. the total size of a single file for a VIP user is limited to 21474836479 bytes, \ | |
and 4294967296 bytes for a non." | sed 's/# info:/\o033[1;41m&\o033[0m/I')\n" && return | |
fi && | |
cat "piece${yu}0a" | while read md; do | |
md5sum <<<"${md}" | md5sum | cut -d ' ' -f1 >>"piece${yu}0b" | |
done && | |
md5=$(cat "piece${yu}0b" | 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 && | |
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 "piece${yu}0a" | wc -l) && | |
pr=0 || pr=1 && ps=0 && | |
while read mi; do | |
ls -1 *piece"${yu}"[[:digit:]]* &>/dev/null && | |
echo -e "\n$(echo "# uploading: piece #${pr} of #${bl} left | file: ${mi} | md5: $(cat "piece${yu}0b" | head -1 && | |
sed -i '1d' "piece${yu}0b")" | 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' >>"piece${yu}0c" && | |
((bl--)) && pr=$((pr + 1)) && ps=$(expr $ps + 1) | |
done < "piece${yu}0a" && | |
md5=$(cat "piece${yu}0c" | 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 && rm -rf *piece"${yu}"[[: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 | |
} | |
[[ -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")" && | |
[ $(echo "${mi[@]}" | wc -w) -gt 0 ] && | |
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') && | |
# Process files | |
for yu in "${mi[@]}"; do | |
process_file_upload "${yu}" & | |
# Wait until the number of background jobs is less than the maximum allowed | |
while [ "$(jobs -r | wc -l)" -ge "$max_files_uploading" ]; do | |
sleep 1 | |
done | |
done && | |
wait && | |
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 existence or not!." | | |
sed 's/# notice:/\o033[1;41m&\o033[0m/I')\n" | |
### CODE ENDS HERE #################################################################################################################################### |
@miju12 thanks for posting your script, it works like a charm. However, it seems like there is no
cookie
token in the copied cURL command. It only containsjsToken
,pcftoken
&bdstoken
as url parameters andcsrfToken
inside a Cookie. What exactly do i have to assign as "co" value?1. Install [Mozilla Firefox](https://www.mozilla.org/en-US/firefox) and [Fiddler Classic](https://api.getfiddler.com/fc/latest). 2. Open your Firefox then Fiddler Classic (make sure the `File > Capture Traffic` is checked). 3. Sign in to your terabox.com account on Firefox. 4. Back to Fiddler Classic, press `CTR + F` then paste and search `getinfo`. 5. Right click on one of yellow highlighted text and select `Copy > Headers only`. 6. Paste the copied text into text editor like notepad. 7. Find and copy only the `ndus` part (it has 45 characters), i.e. `ndus=SftCdCQeWuHQ6aSRDUliAGd8etw2cj076wXtYe6p`. 8. You can then assign it as `co` value, i.e. `co="ndus=SftCdCQeWuHQ6aSRDUliAGd8etw2cj076wXtYe6p"`.
Hope this helps. Thank you.
Para conseguir obter os dados do site do terabox, que está em HTTPs, sigao tutorial abaixo:
https://docs.telerik.com/fiddler/configure-fiddler/tasks/firefoxhttps
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
File > Capture Traffic
is checked).CTR + F
then paste and searchgetinfo
.Copy > Headers only
.ndus
part (it has 45 characters), i.e.ndus=SftCdCQeWuHQ6aSRDUliAGd8etw2cj076wXtYe6p
.co
value, i.e.co="ndus=SftCdCQeWuHQ6aSRDUliAGd8etw2cj076wXtYe6p"
.Hope this helps. Thank you.