新增 /ip_profile、/ip_quality API 与网络 UI 组件,默认隐藏摄像头/拉流导航;同步更新 README。 Co-authored-by: Cursor <cursoragent@cursor.com>
2643 lines
105 KiB
Bash
2643 lines
105 KiB
Bash
#!/bin/bash
|
||
script_version="v2026-03-29"
|
||
check_bash(){
|
||
current_bash_version=$(bash --version|head -n 1|awk -F ' ' '{for (i=1; i<=NF; i++) if ($i ~ /^[0-9]+\.[0-9]+\.[0-9]+/) {print $i; exit}}'|cut -d . -f 1)
|
||
if [ "$current_bash_version" = "0" ]||[ "$current_bash_version" = "1" ]||[ "$current_bash_version" = "2" ]||[ "$current_bash_version" = "3" ];then
|
||
echo "ERROR: Bash version is lower than 4.0!"
|
||
echo "Tips: Run the following script to automatically upgrade Bash."
|
||
echo "bash <(curl -sL https://raw.githubusercontent.com/xykt/IPQuality/main/ref/upgrade_bash.sh)"
|
||
exit 0
|
||
fi
|
||
}
|
||
check_bash
|
||
Font_B="\033[1m"
|
||
Font_D="\033[2m"
|
||
Font_I="\033[3m"
|
||
Font_U="\033[4m"
|
||
Font_Black="\033[30m"
|
||
Font_Red="\033[31m"
|
||
Font_Green="\033[32m"
|
||
Font_Yellow="\033[33m"
|
||
Font_Blue="\033[34m"
|
||
Font_Purple="\033[35m"
|
||
Font_Cyan="\033[36m"
|
||
Font_White="\033[37m"
|
||
Back_Black="\033[40m"
|
||
Back_Red="\033[41m"
|
||
Back_Green="\033[42m"
|
||
Back_Yellow="\033[43m"
|
||
Back_Blue="\033[44m"
|
||
Back_Purple="\033[45m"
|
||
Back_Cyan="\033[46m"
|
||
Back_White="\033[47m"
|
||
Font_Suffix="\033[0m"
|
||
Font_LineClear="\033[2K"
|
||
Font_LineUp="\033[1A"
|
||
declare ADLines
|
||
declare -A aad
|
||
declare IP=""
|
||
declare IPhide
|
||
declare fullIP=0
|
||
declare YY="cn"
|
||
declare -A maxmind
|
||
declare -A ipinfo
|
||
declare -A scamalytics
|
||
declare -A ipregistry
|
||
declare -A ipapi
|
||
declare -A abuseipdb
|
||
declare -A ip2location
|
||
declare -A dbip
|
||
declare -A ipdata
|
||
declare -A ipqs
|
||
declare -A tiktok
|
||
declare -A disney
|
||
declare -A netflix
|
||
declare -A youtube
|
||
declare -A amazon
|
||
declare -A reddit
|
||
declare -A chatgpt
|
||
declare IPV4
|
||
declare IPV6
|
||
declare IPV4check=1
|
||
declare IPV6check=1
|
||
declare IPV4work=0
|
||
declare IPV6work=0
|
||
declare ERRORcode=0
|
||
declare shelp
|
||
declare -A swarn
|
||
declare -A sinfo
|
||
declare -A shead
|
||
declare -A sbasic
|
||
declare -A stype
|
||
declare -A sscore
|
||
declare -A sfactor
|
||
declare -A smedia
|
||
declare -A smail
|
||
declare -A smailstatus
|
||
declare -A stail
|
||
declare mode_no=0
|
||
declare mode_yes=0
|
||
declare mode_lite=0
|
||
declare mode_json=0
|
||
declare mode_menu=0
|
||
declare mode_output=0
|
||
declare mode_privacy=0
|
||
declare ipjson
|
||
declare ibar=0
|
||
declare bar_pid
|
||
declare ibar_step=0
|
||
declare main_pid=$$
|
||
declare PADDING=""
|
||
declare useNIC=""
|
||
declare usePROXY=""
|
||
declare CurlARG=""
|
||
declare UA_Browser
|
||
declare rawgithub
|
||
declare Media_Cookie
|
||
declare IATA_Database
|
||
shelp_lines=(
|
||
"IP QUALITY CHECK SCRIPT IP质量体检脚本"
|
||
"Interactive Interface: bash <(curl -sL https://IP.Check.Place) -EM"
|
||
"交互界面: bash <(curl -sL https://IP.Check.Place) -M"
|
||
"Parameters 参数运行: bash <(curl -sL https://IP.Check.Place) [-4] [-6] [-f] [-h] [-i iface] [-j] [-l language] [-n] [-o outputpath] [-p] [-x proxy] [-y] [-E] [-M]"
|
||
" -4 Test IPv4 测试IPv4"
|
||
" -6 Test IPv6 测试IPv6"
|
||
" -f Show full IP on reports 报告展示完整IP地址"
|
||
" -h Help information 帮助信息"
|
||
" -i eth0 Specify network interface 指定检测网卡"
|
||
" ipaddress Specify outbound IP Address 指定检测出口IP"
|
||
" -j JSON output JSON输出"
|
||
" -l cn|en|jp|es|de|fr|ru|pt Specify script language 指定报告语言"
|
||
" -n No OS or dependencies check 跳过系统检测及依赖安装"
|
||
" -o /path/to/file.ansi Output ANSI report to file 输出ANSI报告至文件"
|
||
" /path/to/file.json Output JSON result to file 输出JSON结果至文件"
|
||
" /path/to/file.anyother Output plain text report to file 输出纯文本报告至文件"
|
||
" -p Privacy mode - no generate report link 隐私模式:不生成报告链接"
|
||
" -x http://usr:pwd@proxyurl:p Specify http proxy 指定http代理"
|
||
" https://usr:pwd@proxyurl:p Specify https proxy 指定https代理"
|
||
" socks5://usr:pwd@proxyurl:p Specify socks5 proxy 指定socks5代理"
|
||
" -y Install dependencies without interupt 自动安装依赖"
|
||
" -E Specify English Output 指定英文输出"
|
||
" -M Run with Interactive Interface 交互界面方式运行")
|
||
shelp=$(printf "%s\n" "${shelp_lines[@]}")
|
||
set_language(){
|
||
case "$YY" in
|
||
"en"|"jp"|"es"|"de"|"fr"|"ru"|"pt")swarn[1]="ERROR: Unsupported parameters!"
|
||
swarn[2]="ERROR: IP address format error!"
|
||
swarn[3]="ERROR: Dependent programs are missing. Please run as root or install sudo!"
|
||
swarn[4]="ERROR: Parameter -4 conflicts with -i or -6!"
|
||
swarn[6]="ERROR: Parameter -6 conflicts with -i or -4!"
|
||
swarn[7]="ERROR: The specified network interface or outbound IP is invalid or does not exist!"
|
||
swarn[8]="ERROR: The specified proxy parameter is invalid or not working!"
|
||
swarn[10]="ERROR: Output file already exist!"
|
||
swarn[11]="ERROR: Output file is not writable!"
|
||
swarn[40]="ERROR: IPv4 is not available!"
|
||
swarn[60]="ERROR: IPv6 is not available!"
|
||
sinfo[database]="Checking IP database "
|
||
sinfo[media]="Checking stream media "
|
||
sinfo[ai]="Checking AI provider "
|
||
sinfo[mail]="Connecting Email server "
|
||
sinfo[dnsbl]="Checking Blacklist database "
|
||
sinfo[ldatabase]=21
|
||
sinfo[lmedia]=22
|
||
sinfo[lai]=21
|
||
sinfo[lmail]=24
|
||
sinfo[ldnsbl]=28
|
||
shead[title]="IP QUALITY CHECK REPORT: "
|
||
shead[title_lite]="IP QUALITY CHECK REPORT(LITE): "
|
||
shead[ver]="Version: $script_version"
|
||
shead[bash]="bash <(curl -sL https://Check.Place) -EI"
|
||
shead[git]="https://github.com/xykt/IPQuality"
|
||
shead[time_raw]=$(date -u +"%Y-%m-%d %H:%M:%S UTC")
|
||
shead[time]="Report Time: ${shead[time_raw]}"
|
||
shead[ltitle]=25
|
||
shead[ltitle_lite]=31
|
||
shead[ptime]=$(printf '%7s' '')
|
||
sbasic[title]="1. Basic Information (${Font_I}Maxmind Database$Font_Suffix)"
|
||
sbasic[title_lite]="1. Basic Information (${Font_I}IPinfo Database$Font_Suffix)"
|
||
sbasic[asn]="ASN: "
|
||
sbasic[noasn]="Not Assigned"
|
||
sbasic[org]="Organization: "
|
||
sbasic[location]="Location: "
|
||
sbasic[map]="Map: "
|
||
sbasic[city]="City: "
|
||
sbasic[country]="Actual Region: "
|
||
sbasic[regcountry]="Registered Region: "
|
||
sbasic[continent]="Continent: "
|
||
sbasic[timezone]="Time Zone: "
|
||
sbasic[type]="IP Type: "
|
||
sbasic[type0]=" Geo-consistent "
|
||
sbasic[type1]=" Geo-discrepant "
|
||
stype[business]=" $Back_Yellow$Font_White$Font_B Business $Font_Suffix "
|
||
stype[isp]=" $Back_Green$Font_White$Font_B ISP $Font_Suffix "
|
||
stype[hosting]=" $Back_Red$Font_White$Font_B Hosting $Font_Suffix "
|
||
stype[education]="$Back_Yellow$Font_White$Font_B Education $Font_Suffix "
|
||
stype[government]="$Back_Yellow$Font_White$Font_B Government $Font_Suffix"
|
||
stype[banking]=" $Back_Yellow$Font_White$Font_B Banking $Font_Suffix "
|
||
stype[organization]="$Back_Yellow$Font_White${Font_B}Organization$Font_Suffix"
|
||
stype[military]=" $Back_Yellow$Font_White$Font_B Military $Font_Suffix "
|
||
stype[library]=" $Back_Yellow$Font_White$Font_B Library $Font_Suffix "
|
||
stype[cdn]=" $Back_Red$Font_White$Font_B CDN $Font_Suffix "
|
||
stype[lineisp]=" $Back_Green$Font_White$Font_B Line ISP $Font_Suffix "
|
||
stype[mobile]="$Back_Green$Font_White$Font_B Mobile ISP $Font_Suffix"
|
||
stype[spider]="$Back_Red$Font_White$Font_B Web Spider $Font_Suffix"
|
||
stype[reserved]=" $Back_Yellow$Font_White$Font_B Reserved $Font_Suffix "
|
||
stype[other]=" $Back_Yellow$Font_White$Font_B Other $Font_Suffix "
|
||
stype[title]="2. IP Type"
|
||
stype[db]="Database: "
|
||
stype[usetype]="Usage: "
|
||
stype[comtype]="Company: "
|
||
sscore[verylow]="$Font_Green${Font_B}VeryLow$Font_Suffix"
|
||
sscore[low]="$Font_Green${Font_B}Low$Font_Suffix"
|
||
sscore[medium]="$Font_Yellow${Font_B}Medium$Font_Suffix"
|
||
sscore[high]="$Font_Red${Font_B}High$Font_Suffix"
|
||
sscore[veryhigh]="$Font_Red${Font_B}VeryHigh$Font_Suffix"
|
||
sscore[elevated]="$Font_Yellow${Font_B}Elevated$Font_Suffix"
|
||
sscore[suspicious]="$Font_Yellow${Font_B}Suspicious$Font_Suffix"
|
||
sscore[risky]="$Font_Red${Font_B}Risky$Font_Suffix"
|
||
sscore[highrisk]="$Font_Red${Font_B}HighRisk$Font_Suffix"
|
||
sscore[dos]="$Font_Red${Font_B}DoS$Font_Suffix"
|
||
sscore[colon]=": "
|
||
sscore[title]="3. Risk Score"
|
||
sscore[range]="${Font_Cyan}Levels: $Font_I$Font_White${Back_Green}VeryLow Low $Back_Yellow Medium $Back_Red High VeryHigh$Font_Suffix"
|
||
sfactor[title]="4. Risk Factors"
|
||
sfactor[factor]="DB: "
|
||
sfactor[countrycode]="Region: "
|
||
sfactor[proxy]="Proxy: "
|
||
sfactor[tor]="Tor: "
|
||
sfactor[vpn]="VPN: "
|
||
sfactor[server]="Server: "
|
||
sfactor[abuser]="Abuser: "
|
||
sfactor[robot]="Robot: "
|
||
sfactor[yes]="$Font_Red$Font_B Yes$Font_Suffix"
|
||
sfactor[no]="$Font_Green$Font_B No $Font_Suffix"
|
||
sfactor[na]="$Font_Green$Font_B N/A$Font_Suffix"
|
||
smedia[yes]=" $Back_Green$Font_White Yes $Font_Suffix "
|
||
smedia[no]=" $Back_Red$Font_White Block $Font_Suffix "
|
||
smedia[bad]="$Back_Red$Font_White Failed $Font_Suffix "
|
||
smedia[pending]="$Back_Yellow$Font_White Pending $Font_Suffix"
|
||
smedia[cn]=" $Back_Red$Font_White China $Font_Suffix "
|
||
smedia[noprem]="$Back_Red$Font_White NoPrem. $Font_Suffix"
|
||
smedia[org]="$Back_Yellow$Font_White NF.Only $Font_Suffix"
|
||
smedia[web]="$Back_Yellow$Font_White WebOnly $Font_Suffix"
|
||
smedia[app]="$Back_Yellow$Font_White APPOnly $Font_Suffix"
|
||
smedia[idc]=" $Back_Yellow$Font_White IDC $Font_Suffix "
|
||
smedia[native]="$Back_Green$Font_White Native $Font_Suffix "
|
||
smedia[dns]="$Back_Yellow$Font_White ViaDNS $Font_Suffix "
|
||
smedia[nodata]=" "
|
||
smedia[title]="5. Accessibility check for media and AI services"
|
||
smedia[meida]="Service: "
|
||
smedia[status]="Status: "
|
||
smedia[region]="Region: "
|
||
smedia[type]="Type: "
|
||
smail[title]="6. Email service availability and blacklist detection"
|
||
smail[port]="Local Port 25 Outbound: "
|
||
smail[yes]="${Font_Green}Available$Font_Suffix"
|
||
smail[no]="${Font_Red}Blocked$Font_Suffix"
|
||
smail[occupied]="${Font_Yellow}Occupied$Font_Suffix"
|
||
smail[blocked]="${Font_Red}Remote Port 25 unreachable$Font_Suffix"
|
||
smail[provider]="Conn: "
|
||
smail[dnsbl]="DNSBL database: "
|
||
smail[available]="$Font_Suffix${Font_Cyan}Active $Font_B"
|
||
smail[clean]="$Font_Suffix${Font_Green}Clean $Font_B"
|
||
smail[marked]="$Font_Suffix${Font_Yellow}Marked $Font_B"
|
||
smail[blacklisted]="$Font_Suffix${Font_Red}Blacklisted $Font_B"
|
||
stail[stoday]="IP Checks Today: "
|
||
stail[stotal]="; Total: "
|
||
stail[thanks]=". Thanks for running xy scripts!"
|
||
stail[link]="${Font_I}Report Link: $Font_U"
|
||
;;
|
||
"cn")swarn[1]="错误:不支持的参数!"
|
||
swarn[2]="错误:IP地址格式错误!"
|
||
swarn[3]="错误:未安装依赖程序,请以root执行此脚本,或者安装sudo命令!"
|
||
swarn[4]="错误:参数-4与-i/-6冲突!"
|
||
swarn[6]="错误:参数-6与-i/-4冲突!"
|
||
swarn[7]="错误:指定的网卡或出口IP不存在!"
|
||
swarn[8]="错误:指定的代理服务器不可用!"
|
||
swarn[10]="错误:输出文件已存在!"
|
||
swarn[11]="错误:输出文件不可写!"
|
||
swarn[40]="错误:IPV4不可用!"
|
||
swarn[60]="错误:IPV6不可用!"
|
||
sinfo[database]="正在检测IP数据库 "
|
||
sinfo[media]="正在检测流媒体服务商 "
|
||
sinfo[ai]="正在检测AI服务商 "
|
||
sinfo[mail]="正在连接邮件服务商 "
|
||
sinfo[dnsbl]="正在检测黑名单数据库 "
|
||
sinfo[ldatabase]=17
|
||
sinfo[lmedia]=21
|
||
sinfo[lai]=17
|
||
sinfo[lmail]=19
|
||
sinfo[ldnsbl]=21
|
||
shead[title]="IP质量体检报告:"
|
||
shead[title_lite]="IP质量体检报告(Lite):"
|
||
shead[ver]="脚本版本:$script_version"
|
||
shead[bash]="bash <(curl -sL https://Check.Place) -I"
|
||
shead[git]="https://github.com/xykt/IPQuality"
|
||
shead[time_raw]=$(TZ="Asia/Shanghai" date +"%Y-%m-%d %H:%M:%S CST")
|
||
shead[time]="报告时间:${shead[time_raw]}"
|
||
shead[ltitle]=16
|
||
shead[ltitle_lite]=22
|
||
shead[ptime]=$(printf '%8s' '')
|
||
sbasic[title]="一、基础信息(${Font_I}Maxmind 数据库$Font_Suffix)"
|
||
sbasic[title_lite]="一、基础信息(${Font_I}IPinfo 数据库$Font_Suffix)"
|
||
sbasic[asn]="自治系统号: "
|
||
sbasic[noasn]="未分配"
|
||
sbasic[org]="组织: "
|
||
sbasic[location]="坐标: "
|
||
sbasic[map]="地图: "
|
||
sbasic[city]="城市: "
|
||
sbasic[country]="使用地: "
|
||
sbasic[regcountry]="注册地: "
|
||
sbasic[continent]="洲际: "
|
||
sbasic[timezone]="时区: "
|
||
sbasic[type]="IP类型: "
|
||
sbasic[type0]=" 原生IP "
|
||
sbasic[type1]=" 广播IP "
|
||
stype[business]=" $Back_Yellow$Font_White$Font_B 商业 $Font_Suffix "
|
||
stype[isp]=" $Back_Green$Font_White$Font_B 家宽 $Font_Suffix "
|
||
stype[hosting]=" $Back_Red$Font_White$Font_B 机房 $Font_Suffix "
|
||
stype[education]=" $Back_Yellow$Font_White$Font_B 教育 $Font_Suffix "
|
||
stype[government]=" $Back_Yellow$Font_White$Font_B 政府 $Font_Suffix "
|
||
stype[banking]=" $Back_Yellow$Font_White$Font_B 银行 $Font_Suffix "
|
||
stype[organization]=" $Back_Yellow$Font_White$Font_B 组织 $Font_Suffix "
|
||
stype[military]=" $Back_Yellow$Font_White$Font_B 军队 $Font_Suffix "
|
||
stype[library]=" $Back_Yellow$Font_White$Font_B 图书馆 $Font_Suffix "
|
||
stype[cdn]=" $Back_Red$Font_White$Font_B CDN $Font_Suffix "
|
||
stype[lineisp]=" $Back_Green$Font_White$Font_B 家宽 $Font_Suffix "
|
||
stype[mobile]=" $Back_Green$Font_White$Font_B 手机 $Font_Suffix "
|
||
stype[spider]=" $Back_Red$Font_White$Font_B 蜘蛛 $Font_Suffix "
|
||
stype[reserved]=" $Back_Yellow$Font_White$Font_B 保留 $Font_Suffix "
|
||
stype[other]=" $Back_Yellow$Font_White$Font_B 其他 $Font_Suffix "
|
||
stype[title]="二、IP类型属性"
|
||
stype[db]="数据库: "
|
||
stype[usetype]="使用类型: "
|
||
stype[comtype]="公司类型: "
|
||
sscore[verylow]="$Font_Green$Font_B极低风险$Font_Suffix"
|
||
sscore[low]="$Font_Green$Font_B低风险$Font_Suffix"
|
||
sscore[medium]="$Font_Yellow$Font_B中风险$Font_Suffix"
|
||
sscore[high]="$Font_Red$Font_B高风险$Font_Suffix"
|
||
sscore[veryhigh]="$Font_Red$Font_B极高风险$Font_Suffix"
|
||
sscore[elevated]="$Font_Yellow$Font_B较高风险$Font_Suffix"
|
||
sscore[suspicious]="$Font_Yellow$Font_B可疑IP$Font_Suffix"
|
||
sscore[risky]="$Font_Red$Font_B存在风险$Font_Suffix"
|
||
sscore[highrisk]="$Font_Red$Font_B高风险$Font_Suffix"
|
||
sscore[dos]="$Font_Red$Font_B建议封禁$Font_Suffix"
|
||
sscore[colon]=":"
|
||
sscore[title]="三、风险评分"
|
||
sscore[range]="$Font_Cyan风险等级: $Font_I$Font_White$Back_Green极低 低 $Back_Yellow 中等 $Back_Red 高 极高$Font_Suffix"
|
||
sfactor[title]="四、风险因子"
|
||
sfactor[factor]="库: "
|
||
sfactor[countrycode]="地区: "
|
||
sfactor[proxy]="代理: "
|
||
sfactor[tor]="Tor: "
|
||
sfactor[vpn]="VPN: "
|
||
sfactor[server]="服务器:"
|
||
sfactor[abuser]="滥用: "
|
||
sfactor[robot]="机器人:"
|
||
sfactor[yes]="$Font_Red$Font_B 是 $Font_Suffix"
|
||
sfactor[no]="$Font_Green$Font_B 否 $Font_Suffix"
|
||
sfactor[na]="$Font_Green$Font_B 无 $Font_Suffix"
|
||
smedia[yes]=" $Back_Green$Font_White 解锁 $Font_Suffix "
|
||
smedia[no]=" $Back_Red$Font_White 屏蔽 $Font_Suffix "
|
||
smedia[bad]=" $Back_Red$Font_White 失败 $Font_Suffix "
|
||
smedia[pending]="$Back_Yellow$Font_White 待支持 $Font_Suffix "
|
||
smedia[cn]=" $Back_Red$Font_White 中国 $Font_Suffix "
|
||
smedia[noprem]="$Back_Red$Font_White 禁会员 $Font_Suffix "
|
||
smedia[org]="$Back_Yellow$Font_White 仅自制 $Font_Suffix "
|
||
smedia[web]="$Back_Yellow$Font_White 仅网页 $Font_Suffix "
|
||
smedia[app]=" $Back_Yellow$Font_White 仅APP $Font_Suffix "
|
||
smedia[idc]=" $Back_Yellow$Font_White 机房 $Font_Suffix "
|
||
smedia[native]=" $Back_Green$Font_White 原生 $Font_Suffix "
|
||
smedia[dns]=" $Back_Yellow$Font_White DNS $Font_Suffix "
|
||
smedia[nodata]=" "
|
||
smedia[title]="五、流媒体及AI服务解锁检测"
|
||
smedia[meida]="服务商: "
|
||
smedia[status]="状态: "
|
||
smedia[region]="地区: "
|
||
smedia[type]="方式: "
|
||
smail[title]="六、邮局连通性及黑名单检测"
|
||
smail[port]="本地25端口出站:"
|
||
smail[yes]="$Font_Green可用$Font_Suffix"
|
||
smail[no]="$Font_Red阻断$Font_Suffix"
|
||
smail[occupied]="$Font_Yellow占用$Font_Suffix"
|
||
smail[blocked]="$Font_Red远端25端口不可达$Font_Suffix"
|
||
smail[provider]="通信:"
|
||
smail[dnsbl]="IP地址黑名单数据库:"
|
||
smail[available]="$Font_Suffix$Font_Cyan有效 $Font_B"
|
||
smail[clean]="$Font_Suffix$Font_Green正常 $Font_B"
|
||
smail[marked]="$Font_Suffix$Font_Yellow已标记 $Font_B"
|
||
smail[blacklisted]="$Font_Suffix$Font_Red黑名单 $Font_B"
|
||
stail[stoday]="今日IP检测量:"
|
||
stail[stotal]=";总检测量:"
|
||
stail[thanks]="。感谢使用xy系列脚本!"
|
||
stail[link]="$Font_I报告链接:$Font_U"
|
||
;;
|
||
*)echo -ne "ERROR: Language not supported!"
|
||
esac
|
||
}
|
||
countRunTimes(){
|
||
local RunTimes=$(curl $CurlARG -s --max-time 10 "https://hits.xykt.de/ip?action=hit" 2>&1)
|
||
stail[today]=$(echo "$RunTimes"|jq '.daily')
|
||
stail[total]=$(echo "$RunTimes"|jq '.total')
|
||
}
|
||
show_progress_bar(){
|
||
show_progress_bar_ "$@" 1>&2
|
||
}
|
||
show_progress_bar_(){
|
||
local bar="\u280B\u2819\u2839\u2838\u283C\u2834\u2826\u2827\u2807\u280F"
|
||
local n=${#bar}
|
||
while sleep 0.1;do
|
||
if ! kill -0 $main_pid 2>/dev/null;then
|
||
echo -ne ""
|
||
exit
|
||
fi
|
||
echo -ne "\r$Font_Cyan$Font_B[$IP]# $1$Font_Cyan$Font_B$(printf '%*s' "$2" ''|tr ' ' '.') ${bar:ibar++*6%n:6} $(printf '%02d%%' $ibar_step) $Font_Suffix"
|
||
done
|
||
}
|
||
kill_progress_bar(){
|
||
kill "$bar_pid" 2>/dev/null&&echo -ne "\r"
|
||
}
|
||
install_dependencies(){
|
||
if ! jq --version >/dev/null 2>&1||! curl --version >/dev/null 2>&1||! bc --version >/dev/null 2>&1||! nc -h >/dev/null 2>&1||! dig -v >/dev/null 2>&1;then
|
||
echo "Detecting operating system..."
|
||
if [ "$(uname)" == "Darwin" ];then
|
||
install_packages "brew" "brew install" "no_sudo"
|
||
elif [ -f /etc/os-release ];then
|
||
. /etc/os-release
|
||
if [ $(id -u) -ne 0 ]&&! sudo -v >/dev/null 2>&1;then
|
||
ERRORcode=3
|
||
fi
|
||
case $ID in
|
||
ubuntu|debian|linuxmint)install_packages "apt" "apt-get install -y"
|
||
;;
|
||
rhel|centos|almalinux|rocky|anolis)if
|
||
[ "$(echo $VERSION_ID|cut -d '.' -f1)" -ge 8 ]
|
||
then
|
||
install_packages "dnf" "dnf install -y"
|
||
else
|
||
install_packages "yum" "yum install -y"
|
||
fi
|
||
;;
|
||
arch|manjaro)install_packages "pacman" "pacman -S --noconfirm"
|
||
;;
|
||
alpine)install_packages "apk" "apk add"
|
||
;;
|
||
fedora)install_packages "dnf" "dnf install -y"
|
||
;;
|
||
alinux)install_packages "yum" "yum install -y"
|
||
;;
|
||
suse|opensuse*)install_packages "zypper" "zypper install -y"
|
||
;;
|
||
void)install_packages "xbps" "xbps-install -Sy"
|
||
;;
|
||
*)echo "Unsupported distribution: $ID"
|
||
exit 1
|
||
esac
|
||
elif [ -n "$PREFIX" ];then
|
||
install_packages "pkg" "pkg install"
|
||
else
|
||
echo "Cannot detect distribution because /etc/os-release is missing."
|
||
exit 1
|
||
fi
|
||
fi
|
||
}
|
||
install_packages(){
|
||
local package_manager=$1
|
||
local install_command=$2
|
||
local no_sudo=$3
|
||
echo "Using package manager: $package_manager"
|
||
echo -e "Lacking necessary dependencies, $Font_I${Font_Cyan}jq curl bc netcat dnsutils iproute$Font_Suffix will be installed using $Font_I$Font_Cyan$package_manager$Font_Suffix."
|
||
if [[ $mode_yes -eq 0 ]];then
|
||
prompt=$(printf "Continue? (${Font_Green}y$Font_Suffix/${Font_Red}n$Font_Suffix): ")
|
||
read -p "$prompt" choice
|
||
case "$choice" in
|
||
y|Y|yes|Yes|YES)echo "Continue to execute script..."
|
||
;;
|
||
n|N|no|No|NO)echo "Script exited."
|
||
exit 0
|
||
;;
|
||
*)echo "Invalid input, script exited."
|
||
exit 1
|
||
esac
|
||
else
|
||
echo -e "Detected parameter $Font_Green-y$Font_Suffix. Continue installation..."
|
||
fi
|
||
if [ "$no_sudo" == "no_sudo" ]||[ $(id -u) -eq 0 ];then
|
||
local usesudo=""
|
||
else
|
||
local usesudo="sudo"
|
||
fi
|
||
case $package_manager in
|
||
apt)$usesudo apt update
|
||
$usesudo $install_command jq curl bc netcat-openbsd dnsutils iproute2
|
||
;;
|
||
dnf|yum)$usesudo $install_command epel-release
|
||
$usesudo $package_manager makecache
|
||
$usesudo $install_command jq curl bc nmap-ncat bind-utils iproute
|
||
;;
|
||
pacman)$usesudo pacman -Sy
|
||
$usesudo $install_command jq curl bc gnu-netcat bind-tools iproute2
|
||
;;
|
||
apk)$usesudo apk update
|
||
$usesudo $install_command jq curl bc netcat-openbsd grep bind-tools iproute2
|
||
;;
|
||
pkg)$usesudo $package_manager update
|
||
$usesudo $package_manager $install_command jq curl bc netcat dnsutils iproute
|
||
;;
|
||
brew)eval "$(/opt/homebrew/bin/brew shellenv)"
|
||
$install_command jq curl bc netcat bind
|
||
;;
|
||
zypper)$usesudo zypper refresh
|
||
$usesudo $install_command jq curl bc netcat bind-utils iproute2
|
||
;;
|
||
xbps)$usesudo xbps-install -Sy
|
||
$usesudo $install_command jq curl bc netcat bind-utils iproute2
|
||
esac
|
||
}
|
||
declare -A browsers=(
|
||
[Chrome]="145.0.0.0 144.0.0.0 143.0.0.0 142.0.0.0 141.0.0.0 140.0.0.0"
|
||
[Firefox]="147.0 146.0 145.0 144.0 143.0 142.0 141.0 140.0")
|
||
generate_random_user_agent(){
|
||
local browsers_keys=(${!browsers[@]})
|
||
local random_browser_index=$((RANDOM%${#browsers_keys[@]}))
|
||
local browser=${browsers_keys[random_browser_index]}
|
||
case $browser in
|
||
Chrome)local versions=(${browsers[Chrome]})
|
||
local version=${versions[RANDOM%${#versions[@]}]}
|
||
UA_Browser="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/$version Safari/537.36"
|
||
;;
|
||
Firefox)local versions=(${browsers[Firefox]})
|
||
local version=${versions[RANDOM%${#versions[@]}]}
|
||
UA_Browser="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:$version) Gecko/20100101 Firefox/$version"
|
||
esac
|
||
}
|
||
adapt_locale(){
|
||
local ifunicode=$(printf '\u2800')
|
||
[[ ${#ifunicode} -gt 3 ]]&&export LC_CTYPE=en_US.UTF-8 2>/dev/null
|
||
}
|
||
check_connectivity(){
|
||
local url="https://www.google.com/generate_204"
|
||
local timeout=2
|
||
local http_code
|
||
http_code=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout "$timeout" "$url" 2>/dev/null)
|
||
if [[ $http_code == "204" ]];then
|
||
rawgithub="https://github.com/xykt/IPQuality/raw/"
|
||
return 0
|
||
else
|
||
rawgithub="https://testingcf.jsdelivr.net/gh/xykt/IPQuality@"
|
||
return 1
|
||
fi
|
||
}
|
||
is_valid_ipv4(){
|
||
local ip=$1
|
||
if [[ $ip =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]];then
|
||
IFS='.' read -r -a octets <<<"$ip"
|
||
for octet in "${octets[@]}";do
|
||
if ((octet<0||octet>255));then
|
||
IPV4work=0
|
||
return 1
|
||
fi
|
||
done
|
||
IPV4work=1
|
||
return 0
|
||
else
|
||
IPV4work=0
|
||
return 1
|
||
fi
|
||
}
|
||
is_private_ipv4(){
|
||
local ip_address=$1
|
||
if [[ -z $ip_address ]];then
|
||
return 0
|
||
fi
|
||
if [[ $ip_address =~ ^10\. ]]||[[ $ip_address =~ ^172\.(1[6-9]|2[0-9]|3[0-1])\. ]]||[[ $ip_address =~ ^192\.168\. ]]||[[ $ip_address =~ ^127\. ]]||[[ $ip_address =~ ^0\. ]]||[[ $ip_address =~ ^22[4-9]\. ]]||[[ $ip_address =~ ^23[0-9]\. ]];then
|
||
return 0
|
||
fi
|
||
return 1
|
||
}
|
||
get_ipv4(){
|
||
local response
|
||
IPV4=""
|
||
local API_NET=("ipinfo.io/ip" "myip.check.place" "ip.sb" "ping0.cc" "icanhazip.com" "api64.ipify.org" "ifconfig.co" "ident.me")
|
||
for p in "${API_NET[@]}";do
|
||
response=$(curl $CurlARG -s4 --max-time 2 "$p")
|
||
if [[ $? -eq 0 && $response =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]];then
|
||
IPV4="$response"
|
||
break
|
||
fi
|
||
done
|
||
}
|
||
hide_ipv4(){
|
||
if [[ -n $1 ]];then
|
||
IFS='.' read -r -a ip_parts <<<"$1"
|
||
IPhide="${ip_parts[0]}.${ip_parts[1]}.*.*"
|
||
else
|
||
IPhide=""
|
||
fi
|
||
}
|
||
is_valid_ipv6(){
|
||
local ip=$1
|
||
if [[ $ip =~ ^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$ || $ip =~ ^([0-9a-fA-F]{1,4}:){1,7}:$ || $ip =~ ^:([0-9a-fA-F]{1,4}:){1,7}$ || $ip =~ ^([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}$ || $ip =~ ^([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}$ || $ip =~ ^([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}$ || $ip =~ ^([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}$ || $ip =~ ^([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}$ || $ip =~ ^[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})$ || $ip =~ ^:((:[0-9a-fA-F]{1,4}){1,7}|:)$ || $ip =~ ^fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}$ || $ip =~ ^::(ffff(:0{1,4}){0,1}:){0,1}(([0-9]{1,3}\.){3}[0-9]{1,3})$ || $ip =~ ^([0-9a-fA-F]{1,4}:){1,4}:(([0-9]{1,3}\.){3}[0-9]{1,3})$ ]];then
|
||
IPV6work=1
|
||
return 0
|
||
else
|
||
IPV6work=0
|
||
return 1
|
||
fi
|
||
}
|
||
is_private_ipv6(){
|
||
local address=$1
|
||
if [[ -z $address ]];then
|
||
return 0
|
||
fi
|
||
if [[ $address =~ ^fe80: ]]||[[ $address =~ ^fc00: ]]||[[ $address =~ ^fd00: ]]||[[ $address =~ ^2001:db8: ]]||[[ $address == ::1 ]]||[[ $address =~ ^::ffff: ]]||[[ $address =~ ^2002: ]]||[[ $address =~ ^2001: ]];then
|
||
return 0
|
||
fi
|
||
return 1
|
||
}
|
||
get_ipv6(){
|
||
local response
|
||
IPV6=""
|
||
local API_NET=("myip.check.place" "ip.sb" "ping0.cc" "icanhazip.com" "api64.ipify.org" "ifconfig.co" "ident.me")
|
||
for p in "${API_NET[@]}";do
|
||
response=$(curl $CurlARG -s6k --max-time 2 "$p")
|
||
response="${response%$'\n'}"
|
||
if [[ $? -eq 0 && $response =~ ^[0-9a-fA-F:]+$ && $response == *:* ]];then
|
||
IPV6="$response"
|
||
break
|
||
fi
|
||
done
|
||
}
|
||
hide_ipv6(){
|
||
if [[ -n $1 ]];then
|
||
local expanded_ip=$(echo "$1"|sed 's/::/:0000:0000:0000:0000:0000:0000:0000:0000:/g'|cut -d ':' -f1-8)
|
||
IFS=':' read -r -a ip_parts <<<"$expanded_ip"
|
||
while [ ${#ip_parts[@]} -lt 8 ];do
|
||
ip_parts+=(0000)
|
||
done
|
||
IPhide="${ip_parts[0]:-0}:${ip_parts[1]:-0}:${ip_parts[2]:-0}:*:*:*:*:*"
|
||
IPhide=$(echo "$IPhide"|sed 's/:0\{1,\}/:/g'|sed 's/::\+/:/g')
|
||
else
|
||
IPhide=""
|
||
fi
|
||
}
|
||
calculate_display_width(){
|
||
local string="$1"
|
||
local length=0
|
||
local char
|
||
for ((i=0; i<${#string}; i++));do
|
||
char=$(echo "$string"|od -An -N1 -tx1 -j $((i))|tr -d ' ')
|
||
if [ "$(printf '%d\n' 0x$char)" -gt 127 ];then
|
||
length=$((length+2))
|
||
i=$((i+1))
|
||
else
|
||
length=$((length+1))
|
||
fi
|
||
done
|
||
echo "$length"
|
||
}
|
||
calc_padding(){
|
||
local input_text="$1"
|
||
local total_width=$2
|
||
local title_length=$(calculate_display_width "$input_text")
|
||
local left_padding=$(((total_width-title_length)/2))
|
||
if [[ $left_padding -gt 0 ]];then
|
||
PADDING=$(printf '%*s' $left_padding)
|
||
else
|
||
PADDING=""
|
||
fi
|
||
}
|
||
generate_dms(){
|
||
local lat=$1
|
||
local lon=$2
|
||
if [[ -z $lat || $lat == "null" || -z $lon || $lon == "null" ]];then
|
||
echo ""
|
||
return
|
||
fi
|
||
convert_single(){
|
||
local coord=$1
|
||
local direction=$2
|
||
local fixed_coord=$(echo "$coord"|sed 's/\.$/.0/')
|
||
local degrees=$(echo "$fixed_coord"|cut -d'.' -f1)
|
||
local fractional="0.$(echo "$fixed_coord"|cut -d'.' -f2)"
|
||
local minutes=$(echo "$fractional * 60"|bc -l|cut -d'.' -f1)
|
||
local seconds_fractional="0.$(echo "$fractional * 60"|bc -l|cut -d'.' -f2)"
|
||
local seconds=$(echo "$seconds_fractional * 60"|bc -l|awk '{printf "%.0f", $1}')
|
||
echo "$degrees°$minutes′$seconds″$direction"
|
||
}
|
||
local lat_dir='N'
|
||
if [[ $(echo "$lat < 0"|bc -l) -eq 1 ]];then
|
||
lat_dir='S'
|
||
lat=$(echo "$lat * -1"|bc -l)
|
||
fi
|
||
local lon_dir='E'
|
||
if [[ $(echo "$lon < 0"|bc -l) -eq 1 ]];then
|
||
lon_dir='W'
|
||
lon=$(echo "$lon * -1"|bc -l)
|
||
fi
|
||
local lat_dms=$(convert_single $lat $lat_dir)
|
||
local lon_dms=$(convert_single $lon $lon_dir)
|
||
echo "$lon_dms, $lat_dms"
|
||
}
|
||
generate_googlemap_url(){
|
||
local lat=$1
|
||
local lon=$2
|
||
local radius=$3
|
||
if [[ -z $lat || $lat == "null" || -z $lon || $lon == "null" || -z $radius || $radius == "null" ]];then
|
||
echo ""
|
||
return
|
||
fi
|
||
local zoom_level=15
|
||
if [[ $radius -gt 1000 ]];then
|
||
zoom_level=12
|
||
elif [[ $radius -gt 500 ]];then
|
||
zoom_level=13
|
||
elif [[ $radius -gt 250 ]];then
|
||
zoom_level=14
|
||
fi
|
||
echo "https://check.place/$lat,$lon,$zoom_level,$YY"
|
||
}
|
||
db_maxmind(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[database]}${Font_I}Maxmind $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-8-${sinfo[ldatabase]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
maxmind=()
|
||
local RESPONSE=$(curl $CurlARG -Ls -$1 -m 10 "https://ipinfo.check.place/$IP?lang=$YY")
|
||
echo "$RESPONSE"|jq . >/dev/null 2>&1||RESPONSE=""
|
||
if [[ -z $RESPONSE ]];then
|
||
mode_lite=1
|
||
else
|
||
mode_lite=0
|
||
fi
|
||
maxmind[asn]=$(echo "$RESPONSE"|jq -r '.ASN.AutonomousSystemNumber')
|
||
maxmind[org]=$(echo "$RESPONSE"|jq -r '.ASN.AutonomousSystemOrganization')
|
||
maxmind[city]=$(echo "$RESPONSE"|jq -r '.City.Name')
|
||
maxmind[post]=$(echo "$RESPONSE"|jq -r '.City.PostalCode')
|
||
maxmind[lat]=$(echo "$RESPONSE"|jq -r '.City.Latitude')
|
||
maxmind[lon]=$(echo "$RESPONSE"|jq -r '.City.Longitude')
|
||
maxmind[rad]=$(echo "$RESPONSE"|jq -r '.City.AccuracyRadius')
|
||
maxmind[continentcode]=$(echo "$RESPONSE"|jq -r '.City.Continent.Code')
|
||
maxmind[continent]=$(echo "$RESPONSE"|jq -r '.City.Continent.Name')
|
||
maxmind[citycountrycode]=$(echo "$RESPONSE"|jq -r '.City.Country.IsoCode')
|
||
maxmind[citycountry]=$(echo "$RESPONSE"|jq -r '.City.Country.Name')
|
||
maxmind[timezone]=$(echo "$RESPONSE"|jq -r '.City.Location.TimeZone')
|
||
maxmind[subcode]=$(echo "$RESPONSE"|jq -r 'if .City.Subdivisions | length > 0 then .City.Subdivisions[0].IsoCode else "N/A" end')
|
||
maxmind[sub]=$(echo "$RESPONSE"|jq -r 'if .City.Subdivisions | length > 0 then .City.Subdivisions[0].Name else "N/A" end')
|
||
maxmind[countrycode]=$(echo "$RESPONSE"|jq -r '.Country.IsoCode')
|
||
maxmind[country]=$(echo "$RESPONSE"|jq -r '.Country.Name')
|
||
maxmind[regcountrycode]=$(echo "$RESPONSE"|jq -r '.Country.RegisteredCountry.IsoCode')
|
||
maxmind[regcountry]=$(echo "$RESPONSE"|jq -r '.Country.RegisteredCountry.Name')
|
||
if [[ $YY != "en" ]];then
|
||
local backup_response=$(curl $CurlARG -s -$1 -m 10 "https://ipinfo.check.place/$IP?lang=en")
|
||
[[ ${maxmind[asn]} == "null" ]]&&maxmind[asn]=$(echo "$backup_response"|jq -r '.ASN.AutonomousSystemNumber')
|
||
[[ ${maxmind[org]} == "null" ]]&&maxmind[org]=$(echo "$backup_response"|jq -r '.ASN.AutonomousSystemOrganization')
|
||
[[ ${maxmind[city]} == "null" ]]&&maxmind[city]=$(echo "$backup_response"|jq -r '.City.Name')
|
||
[[ ${maxmind[post]} == "null" ]]&&maxmind[post]=$(echo "$backup_response"|jq -r '.City.PostalCode')
|
||
[[ ${maxmind[lat]} == "null" ]]&&maxmind[lat]=$(echo "$backup_response"|jq -r '.City.Latitude')
|
||
[[ ${maxmind[lon]} == "null" ]]&&maxmind[lon]=$(echo "$backup_response"|jq -r '.City.Longitude')
|
||
[[ ${maxmind[rad]} == "null" ]]&&maxmind[rad]=$(echo "$backup_response"|jq -r '.City.AccuracyRadius')
|
||
[[ ${maxmind[continentcode]} == "null" ]]&&maxmind[continentcode]=$(echo "$backup_response"|jq -r '.City.Continent.Code')
|
||
[[ ${maxmind[continent]} == "null" ]]&&maxmind[continent]=$(echo "$backup_response"|jq -r '.City.Continent.Name')
|
||
[[ ${maxmind[citycountrycode]} == "null" ]]&&maxmind[citycountrycode]=$(echo "$backup_response"|jq -r '.City.Country.IsoCode')
|
||
[[ ${maxmind[citycountry]} == "null" ]]&&maxmind[citycountry]=$(echo "$backup_response"|jq -r '.City.Country.Name')
|
||
[[ ${maxmind[timezone]} == "null" ]]&&maxmind[timezone]=$(echo "$backup_response"|jq -r '.City.Location.TimeZone')
|
||
[[ ${maxmind[subcode]} == "null" ]]&&maxmind[subcode]=$(echo "$backup_response"|jq -r 'if .City.Subdivisions | length > 0 then .City.Subdivisions[0].IsoCode else "N/A" end')
|
||
[[ ${maxmind[sub]} == "null" ]]&&maxmind[sub]=$(echo "$backup_response"|jq -r 'if .City.Subdivisions | length > 0 then .City.Subdivisions[0].Name else "N/A" end')
|
||
[[ ${maxmind[countrycode]} == "null" ]]&&maxmind[countrycode]=$(echo "$backup_response"|jq -r '.Country.IsoCode')
|
||
[[ ${maxmind[country]} == "null" ]]&&maxmind[country]=$(echo "$backup_response"|jq -r '.Country.Name')
|
||
[[ ${maxmind[regcountrycode]} == "null" ]]&&maxmind[regcountrycode]=$(echo "$backup_response"|jq -r '.Country.RegisteredCountry.IsoCode')
|
||
[[ ${maxmind[regcountry]} == "null" ]]&&maxmind[regcountry]=$(echo "$backup_response"|jq -r '.Country.RegisteredCountry.Name')
|
||
fi
|
||
if [[ ${maxmind[lat]} != "null" && ${maxmind[lon]} != "null" ]];then
|
||
maxmind[dms]=$(generate_dms "${maxmind[lat]}" "${maxmind[lon]}")
|
||
maxmind[map]=$(generate_googlemap_url "${maxmind[lat]}" "${maxmind[lon]}" "${maxmind[rad]}")
|
||
else
|
||
maxmind[dms]="null"
|
||
maxmind[map]="null"
|
||
fi
|
||
}
|
||
db_ipinfo(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[database]}${Font_I}IPinfo $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-7-${sinfo[ldatabase]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
ipinfo=()
|
||
if [[ $IP == *:* ]];then
|
||
local RESPONSE=$(curl -Ls -m 10 "https://ipinfo.io/widget/demo/$IP")
|
||
else
|
||
local RESPONSE=$(curl $CurlARG -Ls -m 10 "https://ipinfo.io/widget/demo/$IP")
|
||
fi
|
||
echo "$RESPONSE"|jq . >/dev/null 2>&1||RESPONSE=""
|
||
ipinfo[usetype]=$(echo "$RESPONSE"|jq -r '.data.asn.type')
|
||
ipinfo[comtype]=$(echo "$RESPONSE"|jq -r '.data.company.type')
|
||
shopt -s nocasematch
|
||
case ${ipinfo[usetype]} in
|
||
"business")ipinfo[susetype]="${stype[business]}"
|
||
;;
|
||
"isp")ipinfo[susetype]="${stype[isp]}"
|
||
;;
|
||
"hosting")ipinfo[susetype]="${stype[hosting]}"
|
||
;;
|
||
"education")ipinfo[susetype]="${stype[education]}"
|
||
;;
|
||
*)ipinfo[susetype]="${stype[other]}"
|
||
esac
|
||
case ${ipinfo[comtype]} in
|
||
"business")ipinfo[scomtype]="${stype[business]}"
|
||
;;
|
||
"isp")ipinfo[scomtype]="${stype[isp]}"
|
||
;;
|
||
"hosting")ipinfo[scomtype]="${stype[hosting]}"
|
||
;;
|
||
"education")ipinfo[scomtype]="${stype[education]}"
|
||
;;
|
||
*)ipinfo[scomtype]="${stype[other]}"
|
||
esac
|
||
shopt -u nocasematch
|
||
ipinfo[countrycode]=$(echo "$RESPONSE"|jq -r '.data.country')
|
||
ipinfo[proxy]=$(echo "$RESPONSE"|jq -r '.data.privacy.proxy')
|
||
ipinfo[tor]=$(echo "$RESPONSE"|jq -r '.data.privacy.tor')
|
||
ipinfo[vpn]=$(echo "$RESPONSE"|jq -r '.data.privacy.vpn')
|
||
ipinfo[server]=$(echo "$RESPONSE"|jq -r '.data.privacy.hosting')
|
||
local ISO3166=$(curl -sL -m 10 "${rawgithub}main/ref/iso3166.json")
|
||
ipinfo[asn]=$(echo "$RESPONSE"|jq -r '.data.asn.asn'|sed 's/^AS//')
|
||
ipinfo[org]=$(echo "$RESPONSE"|jq -r '.data.asn.name')
|
||
ipinfo[city]=$(echo "$RESPONSE"|jq -r '.data.city')
|
||
ipinfo[post]=$(echo "$RESPONSE"|jq -r '.data.postal')
|
||
ipinfo[timezone]=$(echo "$RESPONSE"|jq -r '.data.timezone')
|
||
local tmp_str=$(echo "$RESPONSE"|jq -r '.data.loc')
|
||
ipinfo[lat]=$(echo "$tmp_str"|cut -d',' -f1)
|
||
ipinfo[lon]=$(echo "$tmp_str"|cut -d',' -f2)
|
||
ipinfo[countrycode]=$(echo "$RESPONSE"|jq -r '.data.country')
|
||
ipinfo[country]=$(echo "$ISO3166"|jq --arg code "${ipinfo[countrycode]}" -r '.[] | select(.["alpha-2"] == $code) | .name')
|
||
ipinfo[continent]=$(echo "$ISO3166"|jq --arg code "${ipinfo[countrycode]}" -r '.[] | select(.["alpha-2"] == $code) | .region')
|
||
ipinfo[regcountrycode]=$(echo "$RESPONSE"|jq -r '.data.abuse.country')
|
||
ipinfo[regcountry]=$(echo "$ISO3166"|jq --arg code "${ipinfo[regcountrycode]}" -r '.[] | select(.["alpha-2"] == $code) | .name')
|
||
if [[ ${ipinfo[lat]} != "null" && ${ipinfo[lon]} != "null" ]];then
|
||
ipinfo[dms]=$(generate_dms "${ipinfo[lat]}" "${ipinfo[lon]}")
|
||
ipinfo[map]=$(generate_googlemap_url "${ipinfo[lat]}" "${ipinfo[lon]}" "1001")
|
||
else
|
||
ipinfo[dms]="null"
|
||
ipinfo[map]="null"
|
||
fi
|
||
}
|
||
db_scamalytics(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[database]}${Font_I}Scamalytics $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-12-${sinfo[ldatabase]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
scamalytics=()
|
||
local RESPONSE=$(curl $CurlARG -sL -$1 -m 10 "https://ipinfo.check.place/$IP?db=scamalytics")
|
||
echo "$RESPONSE"|jq . >/dev/null 2>&1||RESPONSE=""
|
||
scamalytics[countrycode]=$(echo "$RESPONSE"|jq -r '.external_datasources.maxmind_geolite2.ip_country_code')
|
||
scamalytics[proxy]=$(echo "$RESPONSE"|jq -r '.external_datasources.firehol.is_proxy')
|
||
scamalytics[tor]=$(echo "$RESPONSE"|jq -r '.external_datasources.x4bnet.is_tor')
|
||
scamalytics[vpn]=$(echo "$RESPONSE"|jq -r '.scamalytics.scamalytics_proxy.is_vpn')
|
||
scamalytics[server]=$(echo "$RESPONSE"|jq -r '.scamalytics.scamalytics_proxy.is_datacenter')
|
||
scamalytics[abuser]=$(echo "$RESPONSE"|jq -r '.scamalytics.is_blacklisted_external')
|
||
scamalytics[robot1]=$(echo "$RESPONSE"|jq -r '.external_datasources.x4bnet.is_blacklisted_spambot')
|
||
scamalytics[robot2]=$(echo "$RESPONSE"|jq -r '.external_datasources.x4bnet.is_bot_operamini')
|
||
scamalytics[robot3]=$(echo "$RESPONSE"|jq -r '.external_datasources.x4bnet.is_bot_semrush')
|
||
[[ ${scamalytics[robot1]} == "true" || ${scamalytics[robot2]} == "true" || ${scamalytics[robot3]} == "true" ]]&&scamalytics[robot]="true"
|
||
[[ ${scamalytics[robot1]} == "false" && ${scamalytics[robot2]} == "false" && ${scamalytics[robot3]} == "false" ]]&&scamalytics[robot]="false"
|
||
scamalytics[score]=$(echo "$RESPONSE"|jq -r '.scamalytics.scamalytics_score')
|
||
if [[ ${scamalytics[score]} -lt 20 ]];then
|
||
scamalytics[risk]="${sscore[low]}"
|
||
elif [[ ${scamalytics[score]} -lt 60 ]];then
|
||
scamalytics[risk]="${sscore[medium]}"
|
||
elif [[ ${scamalytics[score]} -lt 90 ]];then
|
||
scamalytics[risk]="${sscore[high]}"
|
||
elif [[ ${scamalytics[score]} -ge 90 ]];then
|
||
scamalytics[risk]="${sscore[veryhigh]}"
|
||
fi
|
||
}
|
||
db_ipregistry(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[database]}${Font_I}ipregistry $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-11-${sinfo[ldatabase]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
ipregistry=()
|
||
local tmpgo="sb69ksjcajfs4c"
|
||
local REGISTRY_HTML
|
||
REGISTRY_HTML=$(curl $CurlARG -sL -$1 -m 10 -H "User-Agent: $UA_Browser" "https://ipregistry.co")
|
||
if [[ -n $REGISTRY_HTML ]];then
|
||
if [[ $REGISTRY_HTML =~ apiKey=\"([a-zA-Z0-9]+)\" ]];then
|
||
tmpgo="${BASH_REMATCH[1]}"
|
||
fi
|
||
fi
|
||
local RESPONSE
|
||
RESPONSE=$(curl $CurlARG -sS -$1 --compressed -m 10 \
|
||
-H "authority: api.ipregistry.co" \
|
||
-H "origin: https://ipregistry.co" \
|
||
-H "referer: https://ipregistry.co/" \
|
||
-H "User-Agent: $UA_Browser" \
|
||
"https://api.ipregistry.co/$IP?hostname=true&key=$tmpgo")
|
||
echo "$RESPONSE"|jq . >/dev/null 2>&1||RESPONSE=""
|
||
ipregistry[usetype]=$(echo "$RESPONSE"|jq -r '.connection.type')
|
||
ipregistry[comtype]=$(echo "$RESPONSE"|jq -r '.company.type')
|
||
shopt -s nocasematch
|
||
case ${ipregistry[usetype]} in
|
||
"business")ipregistry[susetype]="${stype[business]}"
|
||
;;
|
||
"isp")ipregistry[susetype]="${stype[isp]}"
|
||
;;
|
||
"hosting")ipregistry[susetype]="${stype[hosting]}"
|
||
;;
|
||
"education")ipregistry[susetype]="${stype[education]}"
|
||
;;
|
||
"government")ipregistry[susetype]="${stype[government]}"
|
||
;;
|
||
*)ipregistry[susetype]="${stype[other]}"
|
||
esac
|
||
case ${ipregistry[comtype]} in
|
||
"business")ipregistry[scomtype]="${stype[business]}"
|
||
;;
|
||
"isp")ipregistry[scomtype]="${stype[isp]}"
|
||
;;
|
||
"hosting")ipregistry[scomtype]="${stype[hosting]}"
|
||
;;
|
||
"education")ipregistry[scomtype]="${stype[education]}"
|
||
;;
|
||
"government")ipregistry[scomtype]="${stype[government]}"
|
||
;;
|
||
*)ipregistry[scomtype]="${stype[other]}"
|
||
esac
|
||
shopt -u nocasematch
|
||
ipregistry[countrycode]=$(echo "$RESPONSE"|jq -r '.location.country.code')
|
||
ipregistry[proxy]=$(echo "$RESPONSE"|jq -r '.security.is_proxy')
|
||
ipregistry[tor1]=$(echo "$RESPONSE"|jq -r '.security.is_tor')
|
||
ipregistry[tor2]=$(echo "$RESPONSE"|jq -r '.security.is_tor_exit')
|
||
[[ ${ipregistry[tor1]} == "true" || ${ipregistry[tor2]} == "true" ]]&&ipregistry[tor]="true"
|
||
[[ ${ipregistry[tor1]} == "false" && ${ipregistry[tor2]} == "false" ]]&&ipregistry[tor]="false"
|
||
ipregistry[vpn]=$(echo "$RESPONSE"|jq -r '.security.is_vpn')
|
||
ipregistry[server]=$(echo "$RESPONSE"|jq -r '.security.is_cloud_provider')
|
||
ipregistry[abuser]=$(echo "$RESPONSE"|jq -r '.security.is_abuser')
|
||
}
|
||
db_ipapi(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[database]}${Font_I}ipapi $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-6-${sinfo[ldatabase]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
ipapi=()
|
||
if [[ $IP == *:* ]];then
|
||
local RESPONSE=$(curl -Ls -m 10 "https://api.ipapi.is/?q=$IP")
|
||
else
|
||
local RESPONSE=$(curl $CurlARG -sL -m 10 "https://api.ipapi.is/?q=$IP")
|
||
fi
|
||
echo "$RESPONSE"|jq . >/dev/null 2>&1||RESPONSE=""
|
||
ipapi[usetype]=$(echo "$RESPONSE"|jq -r '.asn.type')
|
||
ipapi[comtype]=$(echo "$RESPONSE"|jq -r '.company.type')
|
||
shopt -s nocasematch
|
||
case ${ipapi[usetype]} in
|
||
"business")ipapi[susetype]="${stype[business]}"
|
||
;;
|
||
"isp")ipapi[susetype]="${stype[isp]}"
|
||
;;
|
||
"hosting")ipapi[susetype]="${stype[hosting]}"
|
||
;;
|
||
"education")ipapi[susetype]="${stype[education]}"
|
||
;;
|
||
"government")ipapi[susetype]="${stype[government]}"
|
||
;;
|
||
"banking")ipapi[susetype]="${stype[banking]}"
|
||
;;
|
||
*)ipapi[susetype]="${stype[other]}"
|
||
esac
|
||
case ${ipapi[comtype]} in
|
||
"business")ipapi[scomtype]="${stype[business]}"
|
||
;;
|
||
"isp")ipapi[scomtype]="${stype[isp]}"
|
||
;;
|
||
"hosting")ipapi[scomtype]="${stype[hosting]}"
|
||
;;
|
||
"education")ipapi[scomtype]="${stype[education]}"
|
||
;;
|
||
"government")ipapi[scomtype]="${stype[government]}"
|
||
;;
|
||
"banking")ipapi[scomtype]="${stype[banking]}"
|
||
;;
|
||
*)ipapi[scomtype]="${stype[other]}"
|
||
esac
|
||
[[ -z $RESPONSE ]]&&return 1
|
||
ipapi[scoretext]=$(echo "$RESPONSE"|jq -r '.company.abuser_score')
|
||
ipapi[scorenum]=$(echo "${ipapi[scoretext]}"|awk '{print $1}')
|
||
ipapi[risktext]=$(echo "${ipapi[scoretext]}"|awk -F'[()]' '{print $2}')
|
||
ipapi[score]=$(awk "BEGIN {printf \"%.2f%%\", ${ipapi[scorenum]} * 100}")
|
||
case ${ipapi[risktext]} in
|
||
"Very Low")ipapi[risk]="${sscore[verylow]}"
|
||
;;
|
||
"Low")ipapi[risk]="${sscore[low]}"
|
||
;;
|
||
"Elevated")ipapi[risk]="${sscore[elevated]}"
|
||
;;
|
||
"High")ipapi[risk]="${sscore[high]}"
|
||
;;
|
||
"Very High")ipapi[risk]="${sscore[veryhigh]}"
|
||
esac
|
||
shopt -u nocasematch
|
||
ipapi[countrycode]=$(echo "$RESPONSE"|jq -r '.location.country_code')
|
||
ipapi[proxy]=$(echo "$RESPONSE"|jq -r '.is_proxy')
|
||
ipapi[tor]=$(echo "$RESPONSE"|jq -r '.is_tor')
|
||
ipapi[vpn]=$(echo "$RESPONSE"|jq -r '.is_vpn')
|
||
ipapi[server]=$(echo "$RESPONSE"|jq -r '.is_datacenter')
|
||
ipapi[abuser]=$(echo "$RESPONSE"|jq -r '.is_abuser')
|
||
ipapi[robot]=$(echo "$RESPONSE"|jq -r '.is_crawler')
|
||
}
|
||
db_abuseipdb(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[database]}${Font_I}AbuseIPDB $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-10-${sinfo[ldatabase]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
abuseipdb=()
|
||
local RESPONSE=$(curl $CurlARG -sL -$1 -m 10 "https://ipinfo.check.place/$IP?db=abuseipdb")
|
||
echo "$RESPONSE"|jq . >/dev/null 2>&1||RESPONSE=""
|
||
abuseipdb[usetype]=$(echo "$RESPONSE"|jq -r '.data.usageType')
|
||
shopt -s nocasematch
|
||
case ${abuseipdb[usetype]} in
|
||
"Commercial")abuseipdb[susetype]="${stype[business]}"
|
||
;;
|
||
"Data Center/Web Hosting/Transit")abuseipdb[susetype]="${stype[hosting]}"
|
||
;;
|
||
"University/College/School")abuseipdb[susetype]="${stype[education]}"
|
||
;;
|
||
"Government")abuseipdb[susetype]="${stype[government]}"
|
||
;;
|
||
"banking")abuseipdb[susetype]="${stype[banking]}"
|
||
;;
|
||
"Organization")abuseipdb[susetype]="${stype[organization]}"
|
||
;;
|
||
"Military")abuseipdb[susetype]="${stype[military]}"
|
||
;;
|
||
"Library")abuseipdb[susetype]="${stype[library]}"
|
||
;;
|
||
"Content Delivery Network")abuseipdb[susetype]="${stype[cdn]}"
|
||
;;
|
||
"Fixed Line ISP")abuseipdb[susetype]="${stype[lineisp]}"
|
||
;;
|
||
"Mobile ISP")abuseipdb[susetype]="${stype[mobile]}"
|
||
;;
|
||
"Search Engine Spider")abuseipdb[susetype]="${stype[spider]}"
|
||
;;
|
||
"Reserved")abuseipdb[susetype]="${stype[reserved]}"
|
||
;;
|
||
*)abuseipdb[susetype]="${stype[other]}"
|
||
esac
|
||
shopt -u nocasematch
|
||
abuseipdb[score]=$(echo "$RESPONSE"|jq -r '.data.abuseConfidenceScore')
|
||
if [[ ${abuseipdb[score]} -lt 25 ]];then
|
||
abuseipdb[risk]="${sscore[low]}"
|
||
elif [[ ${abuseipdb[score]} -lt 75 ]];then
|
||
abuseipdb[risk]="${sscore[high]}"
|
||
elif [[ ${abuseipdb[score]} -ge 75 ]];then
|
||
abuseipdb[risk]="${sscore[dos]}"
|
||
fi
|
||
}
|
||
db_ip2location(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[database]}${Font_I}IP2LOCATION $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-12-${sinfo[ldatabase]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
ip2location=()
|
||
local RESPONSE=$(curl $CurlARG -sL -$1 -m 10 "https://ipinfo.check.place/$IP?db=ip2location")
|
||
echo "$RESPONSE"|jq . >/dev/null 2>&1||RESPONSE=""
|
||
ip2location[usetype]=$(echo "$RESPONSE"|jq -r '.usage_type')
|
||
ip2location[comtype]=$(echo "$RESPONSE"|jq -r '.as_info.as_usage_type')
|
||
shopt -s nocasematch
|
||
local first_use="${ip2location[usetype]%%/*}"
|
||
case $first_use in
|
||
"COM")ip2location[susetype]="${stype[business]}"
|
||
;;
|
||
"DCH")ip2location[susetype]="${stype[hosting]}"
|
||
;;
|
||
"EDU")ip2location[susetype]="${stype[education]}"
|
||
;;
|
||
"GOV")ip2location[susetype]="${stype[government]}"
|
||
;;
|
||
"ORG")ip2location[susetype]="${stype[organization]}"
|
||
;;
|
||
"MIL")ip2location[susetype]="${stype[military]}"
|
||
;;
|
||
"LIB")ip2location[susetype]="${stype[library]}"
|
||
;;
|
||
"CDN")ip2location[susetype]="${stype[cdn]}"
|
||
;;
|
||
"ISP")ip2location[susetype]="${stype[lineisp]}"
|
||
;;
|
||
"MOB")ip2location[susetype]="${stype[mobile]}"
|
||
;;
|
||
"SES")ip2location[susetype]="${stype[spider]}"
|
||
;;
|
||
"RSV")ip2location[susetype]="${stype[reserved]}"
|
||
;;
|
||
*)ip2location[susetype]="${stype[other]}"
|
||
esac
|
||
first_use="${ip2location[comtype]%%/*}"
|
||
case $first_use in
|
||
"COM")ip2location[scomtype]="${stype[business]}"
|
||
;;
|
||
"DCH")ip2location[scomtype]="${stype[hosting]}"
|
||
;;
|
||
"EDU")ip2location[scomtype]="${stype[education]}"
|
||
;;
|
||
"GOV")ip2location[scomtype]="${stype[government]}"
|
||
;;
|
||
"ORG")ip2location[scomtype]="${stype[organization]}"
|
||
;;
|
||
"MIL")ip2location[scomtype]="${stype[military]}"
|
||
;;
|
||
"LIB")ip2location[scomtype]="${stype[library]}"
|
||
;;
|
||
"CDN")ip2location[scomtype]="${stype[cdn]}"
|
||
;;
|
||
"ISP")ip2location[scomtype]="${stype[lineisp]}"
|
||
;;
|
||
"MOB")ip2location[scomtype]="${stype[mobile]}"
|
||
;;
|
||
"SES")ip2location[scomtype]="${stype[spider]}"
|
||
;;
|
||
"RSV")ip2location[scomtype]="${stype[reserved]}"
|
||
;;
|
||
*)ip2location[scomtype]="${stype[other]}"
|
||
esac
|
||
shopt -u nocasematch
|
||
ip2location[countrycode]=$(echo "$RESPONSE"|jq -r '.country_code')
|
||
ip2location[proxy0]=$(echo "$RESPONSE"|jq -r '.is_proxy')
|
||
ip2location[proxy1]=$(echo "$RESPONSE"|jq -r '.proxy.is_public_proxy')
|
||
ip2location[proxy2]=$(echo "$RESPONSE"|jq -r '.proxy.is_web_proxy')
|
||
[[ ${ip2location[proxy0]} == "true" || ${ip2location[proxy1]} == "true" || ${ip2location[proxy2]} == "true" ]]&&ip2location[proxy]="true"
|
||
[[ ${ip2location[proxy0]} == "false" && ${ip2location[proxy1]} == "false" && ${ip2location[proxy2]} == "false" ]]&&ip2location[proxy]="false"
|
||
ip2location[tor]=$(echo "$RESPONSE"|jq -r '.proxy.is_tor')
|
||
ip2location[vpn]=$(echo "$RESPONSE"|jq -r '.proxy.is_vpn')
|
||
ip2location[server]=$(echo "$RESPONSE"|jq -r '.proxy.is_data_center')
|
||
ip2location[abuser]=$(echo "$RESPONSE"|jq -r '.proxy.is_spammer')
|
||
ip2location[robot1]=$(echo "$RESPONSE"|jq -r '.proxy.is_web_crawler')
|
||
ip2location[robot2]=$(echo "$RESPONSE"|jq -r '.proxy.is_scanner')
|
||
ip2location[robot3]=$(echo "$RESPONSE"|jq -r '.proxy.is_botnet')
|
||
[[ ${ip2location[robot1]} == "true" || ${ip2location[robot2]} == "true" || ${ip2location[robot3]} == "true" ]]&&ip2location[robot]="true"
|
||
[[ ${ip2location[robot1]} == "false" && ${ip2location[robot2]} == "false" && ${ip2location[robot3]} == "false" ]]&&ip2location[robot]="false"
|
||
ip2location[score]=$(echo "$RESPONSE"|jq -r '.fraud_score')
|
||
if [[ ${ip2location[score]} -lt 33 ]];then
|
||
ip2location[risk]="${sscore[low]}"
|
||
elif [[ ${ip2location[score]} -lt 66 ]];then
|
||
ip2location[risk]="${sscore[medium]}"
|
||
elif [[ ${ip2location[score]} -ge 66 ]];then
|
||
ip2location[risk]="${sscore[high]}"
|
||
fi
|
||
}
|
||
db_dbip(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[database]}${Font_I}DB-IP $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-6-${sinfo[ldatabase]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
dbip=()
|
||
if [[ $IP == *:* ]];then
|
||
local RESPONSE=$(curl -sL -m 10 "https://db-ip.com/$IP")
|
||
else
|
||
local RESPONSE=$(curl $CurlARG -sL -m 10 "https://db-ip.com/$IP")
|
||
fi
|
||
mapfile -t results < <(echo "$RESPONSE"|awk '/<th class='\''text-center'\''>Crawler/ {flag=1; next}
|
||
flag && /<span class="sr-only">/ {
|
||
if ($0 ~ /Yes/) print "true";
|
||
else if ($0 ~ /No/) print "false";
|
||
}
|
||
/<\/tr>/ && flag {flag=0}')
|
||
dbip[robot]="${results[0]}"
|
||
dbip[proxy]="${results[1]}"
|
||
dbip[abuser]="${results[2]}"
|
||
dbip[risktext]=$(echo "$RESPONSE"|sed -n 's/.*Estimated threat level for this IP address is[[:space:]]*<span[^>]*>\([^<]*\)<.*/\1/p')
|
||
dbip[countrycode]=$(echo "$RESPONSE"|sed -n '/<code class="language-json">/,/<\/code>/p'|sed -n 's/.*"countryCode"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p')
|
||
shopt -s nocasematch
|
||
case ${dbip[risktext]} in
|
||
"low")dbip[risk]="${sscore[low]}"
|
||
dbip[score]=0
|
||
;;
|
||
"medium")dbip[risk]="${sscore[medium]}"
|
||
dbip[score]=50
|
||
;;
|
||
"high")dbip[risk]="${sscore[high]}"
|
||
dbip[score]=100
|
||
esac
|
||
shopt -u nocasematch
|
||
}
|
||
db_ipdata(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[database]}${Font_I}ipdata $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-7-${sinfo[ldatabase]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
ipdata=()
|
||
local RESPONSE=$(curl $CurlARG -sL -$1 -m 10 "https://ipinfo.check.place/$IP?db=ipdata")
|
||
echo "$RESPONSE"|jq . >/dev/null 2>&1||RESPONSE=""
|
||
ipdata[countrycode]=$(echo "$RESPONSE"|jq -r '.country_code')
|
||
ipdata[proxy]=$(echo "$RESPONSE"|jq -r '.threat.is_proxy')
|
||
ipdata[tor]=$(echo "$RESPONSE"|jq -r '.threat.is_tor')
|
||
ipdata[server]=$(echo "$RESPONSE"|jq -r '.threat.is_datacenter')
|
||
ipdata[abuser1]=$(echo "$RESPONSE"|jq -r '.threat.is_threat')
|
||
ipdata[abuser2]=$(echo "$RESPONSE"|jq -r '.threat.is_known_abuser')
|
||
ipdata[abuser3]=$(echo "$RESPONSE"|jq -r '.threat.is_known_attacker')
|
||
[[ ${ipdata[abuser1]} == "true" || ${ipdata[abuser2]} == "true" || ${ipdata[abuser3]} == "true" ]]&&ipdata[abuser]="true"
|
||
[[ ${ipdata[abuser1]} == "false" && ${ipdata[abuser2]} == "false" && ${ipdata[abuser3]} == "false" ]]&&ipdata[abuser]="false"
|
||
}
|
||
db_ipqs(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[database]}${Font_I}IPQS $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-5-${sinfo[ldatabase]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
ipqs=()
|
||
local RESPONSE=$(curl $CurlARG -sL -$1 -m 10 "https://ipinfo.check.place/$IP?db=ipqualityscore")
|
||
echo "$RESPONSE"|jq . >/dev/null 2>&1||RESPONSE=""
|
||
ipqs[score]=$(echo "$RESPONSE"|jq -r '.fraud_score')
|
||
if [[ ${ipqs[score]} -lt 75 ]];then
|
||
ipqs[risk]="${sscore[low]}"
|
||
elif [[ ${ipqs[score]} -lt 85 ]];then
|
||
ipqs[risk]="${sscore[suspicious]}"
|
||
elif [[ ${ipqs[score]} -lt 90 ]];then
|
||
ipqs[risk]="${sscore[risky]}"
|
||
elif [[ ${ipqs[score]} -ge 90 ]];then
|
||
ipqs[risk]="${sscore[highrisk]}"
|
||
fi
|
||
ipqs[countrycode]=$(echo "$RESPONSE"|jq -r '.country_code')
|
||
ipqs[proxy]=$(echo "$RESPONSE"|jq -r '.proxy')
|
||
ipqs[tor]=$(echo "$RESPONSE"|jq -r '.tor')
|
||
ipqs[vpn]=$(echo "$RESPONSE"|jq -r '.vpn')
|
||
ipqs[abuser]=$(echo "$RESPONSE"|jq -r '.recent_abuse')
|
||
ipqs[robot]=$(echo "$RESPONSE"|jq -r '.bot_status')
|
||
}
|
||
function check_ip_valide(){
|
||
local IPPattern='^(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>$'
|
||
IP="$1"
|
||
if [[ $IP =~ $IPPattern ]];then
|
||
return 0
|
||
else
|
||
return 1
|
||
fi
|
||
}
|
||
function calc_ip_net(){
|
||
sip="$1"
|
||
snetmask="$2"
|
||
check_ip_valide "$sip"
|
||
if [ $? -ne 0 ];then
|
||
echo ""
|
||
return 1
|
||
fi
|
||
local ipFIELD1=$(echo "$sip"|cut -d. -f1)
|
||
local ipFIELD2=$(echo "$sip"|cut -d. -f2)
|
||
local ipFIELD3=$(echo "$sip"|cut -d. -f3)
|
||
local ipFIELD4=$(echo "$sip"|cut -d. -f4)
|
||
local netmaskFIELD1=$(echo "$snetmask"|cut -d. -f1)
|
||
local netmaskFIELD2=$(echo "$snetmask"|cut -d. -f2)
|
||
local netmaskFIELD3=$(echo "$snetmask"|cut -d. -f3)
|
||
local netmaskFIELD4=$(echo "$snetmask"|cut -d. -f4)
|
||
local tmpret1=$((ipFIELD1&netmaskFIELD1))
|
||
local tmpret2=$((ipFIELD2&netmaskFIELD2))
|
||
local tmpret3=$((ipFIELD3&netmaskFIELD3))
|
||
local tmpret4=$((ipFIELD4&netmaskFIELD4))
|
||
echo "$tmpret1.$tmpret2.$tmpret3.$tmpret4"
|
||
}
|
||
function Check_DNS_IP(){
|
||
if [ "$1" != "${1#*[0-9].[0-9]}" ];then
|
||
if [ "$(calc_ip_net "$1" 255.0.0.0)" == "10.0.0.0" ];then
|
||
echo 0
|
||
elif [ "$(calc_ip_net "$1" 255.240.0.0)" == "172.16.0.0" ];then
|
||
echo 0
|
||
elif [ "$(calc_ip_net "$1" 255.255.0.0)" == "169.254.0.0" ];then
|
||
echo 0
|
||
elif [ "$(calc_ip_net "$1" 255.255.0.0)" == "192.168.0.0" ];then
|
||
echo 0
|
||
elif [ "$(calc_ip_net "$1" 255.255.255.0)" == "$(calc_ip_net "$2" 255.255.255.0)" ];then
|
||
echo 0
|
||
else
|
||
echo 1
|
||
fi
|
||
elif [ "$1" != "${1#*[0-9a-fA-F]:*}" ];then
|
||
if [ "${1:0:3}" == "fe8" ];then
|
||
echo 0
|
||
elif [ "${1:0:3}" == "FE8" ];then
|
||
echo 0
|
||
elif [ "${1:0:2}" == "fc" ];then
|
||
echo 0
|
||
elif [ "${1:0:2}" == "FC" ];then
|
||
echo 0
|
||
elif [ "${1:0:2}" == "fd" ];then
|
||
echo 0
|
||
elif [ "${1:0:2}" == "FD" ];then
|
||
echo 0
|
||
elif [ "${1:0:2}" == "ff" ];then
|
||
echo 0
|
||
elif [ "${1:0:2}" == "FF" ];then
|
||
echo 0
|
||
else
|
||
echo 1
|
||
fi
|
||
else
|
||
echo 0
|
||
fi
|
||
}
|
||
function Check_DNS_1(){
|
||
local resultdns=$(nslookup $1)
|
||
local resultinlines=(${resultdns//$'\n'/ })
|
||
for i in ${resultinlines[*]};do
|
||
if [[ $i == "Name:" ]];then
|
||
local resultdnsindex=$((resultindex+3))
|
||
break
|
||
fi
|
||
local resultindex=$((resultindex+1))
|
||
done
|
||
echo $(Check_DNS_IP ${resultinlines[$resultdnsindex]} ${resultinlines[1]})
|
||
}
|
||
function Check_DNS_2(){
|
||
local resultdnstext=$(dig $1|grep "ANSWER:")
|
||
local resultdnstext=${resultdnstext#*"ANSWER: "}
|
||
local resultdnstext=${resultdnstext%", AUTHORITY:"*}
|
||
if [ "$resultdnstext" == "0" ]||[ "$resultdnstext" == "1" ]||[ "$resultdnstext" == "2" ];then
|
||
echo 0
|
||
else
|
||
echo 1
|
||
fi
|
||
}
|
||
function Check_DNS_3(){
|
||
local resultdnstext=$(dig "test$RANDOM$RANDOM.$1"|grep "ANSWER:")
|
||
local resultdnstext=${resultdnstext#*"ANSWER: "}
|
||
local resultdnstext=${resultdnstext%", AUTHORITY:"*}
|
||
if [ "$resultdnstext" == "0" ];then
|
||
echo 1
|
||
else
|
||
echo 0
|
||
fi
|
||
}
|
||
function Get_Unlock_Type(){
|
||
while [ $# -ne 0 ];do
|
||
if [ "$1" = "0" ];then
|
||
echo "${smedia[dns]}"
|
||
return
|
||
fi
|
||
shift
|
||
done
|
||
echo "${smedia[native]}"
|
||
}
|
||
function MediaUnlockTest_TikTok(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[media]}${Font_I}TikTok $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-7-${sinfo[lmedia]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
tiktok=()
|
||
local checkunlockurl="tiktok.com"
|
||
local result1=$(Check_DNS_1 $checkunlockurl)
|
||
local result3=$(Check_DNS_3 $checkunlockurl)
|
||
local resultunlocktype=$(Get_Unlock_Type $result1 $result3)
|
||
local Ftmpresult=$(curl $CurlARG -$1 --user-agent "$UA_Browser" -sL -m 10 "https://www.tiktok.com/")
|
||
[[ $Ftmpresult == *"Please wait..."* ]]&&Ftmpresult=$(curl $useNIC $usePROXY $xForward --user-agent "$UA_Browser" -sL -m 10 "https://www.tiktok.com/explore")
|
||
if [[ $Ftmpresult == "curl"* ]];then
|
||
tiktok[ustatus]="${smedia[no]}"
|
||
tiktok[uregion]="${smedia[nodata]}"
|
||
tiktok[utype]="${smedia[nodata]}"
|
||
return
|
||
fi
|
||
local FRegion=$(echo $Ftmpresult|grep '"region":'|sed 's/.*"region"//'|cut -f2 -d'"')
|
||
if [ -n "$FRegion" ];then
|
||
tiktok[ustatus]="${smedia[yes]}"
|
||
local ttpadding=$((7-${#FRegion}))
|
||
local ttleft=$((ttpadding/2))
|
||
local ttright=$((ttpadding-ttleft))
|
||
tiktok[uregion]="$(printf "%*s%s%*s" "$ttleft" "" "[$FRegion]" "$ttright" "")"
|
||
tiktok[utype]="$resultunlocktype"
|
||
return
|
||
fi
|
||
local STmpresult=$(curl $CurlARG -$1 --user-agent "$UA_Browser" -sL -m 10 -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" -H "Accept-Encoding: gzip" -H "Accept-Language: en" "https://www.tiktok.com"|gunzip 2>/dev/null)
|
||
[[ $Ftmpresult == *"Please wait..."* ]]&&STmpresult=$(curl $useNIC $usePROXY $xForward --user-agent "$UA_Browser" -sL -m 10 -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" -H "Accept-Encoding: gzip" -H "Accept-Language: en" "https://www.tiktok.com/explore"|gunzip 2>/dev/null)
|
||
local SRegion=$(echo $STmpresult|grep '"region":'|sed 's/.*"region"//'|cut -f2 -d'"')
|
||
if [ -n "$SRegion" ];then
|
||
tiktok[ustatus]="${smedia[idc]}"
|
||
local ttWidth=7
|
||
local ttpadding=$((7-${#SRegion}))
|
||
local ttleft=$((ttpadding/2))
|
||
local ttright=$((ttpadding-ttleft))
|
||
tiktok[uregion]="$(printf "%*s%s%*s" "$ttleft" "" "[$SRegion]" "$ttright" "")"
|
||
tiktok[utype]="$resultunlocktype"
|
||
return
|
||
else
|
||
tiktok[ustatus]="${smedia[bad]}"
|
||
tiktok[uregion]="${smedia[nodata]}"
|
||
tiktok[utype]="${smedia[nodata]}"
|
||
return
|
||
fi
|
||
}
|
||
function MediaUnlockTest_DisneyPlus(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[media]}${Font_I}Disney+ $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-8-${sinfo[lmedia]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
disney=()
|
||
local checkunlockurl="disneyplus.com"
|
||
local result1=$(Check_DNS_1 $checkunlockurl)
|
||
local result3=$(Check_DNS_3 $checkunlockurl)
|
||
local resultunlocktype=$(Get_Unlock_Type $result1 $result3)
|
||
local PreAssertion=$(curl $CurlARG -$1 --user-agent "$UA_Browser" -s --max-time 10 -X POST "https://disney.api.edge.bamgrid.com/devices" -H "authorization: Bearer ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -H "content-type: application/json; charset=UTF-8" -d '{"deviceFamily":"browser","applicationRuntime":"chrome","deviceProfile":"windows","attributes":{}}' 2>&1)
|
||
if [[ $PreAssertion == "curl"* ]]&&[[ $1 == "6" ]];then
|
||
disney[ustatus]="${smedia[bad]}"
|
||
disney[uregion]="${smedia[nodata]}"
|
||
disney[utype]="${smedia[nodata]}"
|
||
return
|
||
elif [[ $PreAssertion == "curl"* ]];then
|
||
disney[ustatus]="${smedia[bad]}"
|
||
disney[uregion]="${smedia[nodata]}"
|
||
disney[utype]="${smedia[nodata]}"
|
||
return
|
||
fi
|
||
if ! (echo "$PreAssertion"|jq . >/dev/null 2>&1&&echo "$TokenContent"|jq . >/dev/null 2>&1);then
|
||
disney[ustatus]="${smedia[bad]}"
|
||
disney[uregion]="${smedia[nodata]}"
|
||
disney[utype]="${smedia[nodata]}"
|
||
return
|
||
fi
|
||
local assertion=$(echo $PreAssertion|jq -r '.assertion')
|
||
local PreDisneyCookie=$(echo "$Media_Cookie"|sed -n '1p')
|
||
local disneycookie=$(echo $PreDisneyCookie|sed "s/DISNEYASSERTION/$assertion/g")
|
||
local TokenContent=$(curl $CurlARG -$1 --user-agent "$UA_Browser" -s --max-time 10 -X POST "https://disney.api.edge.bamgrid.com/token" -H "authorization: Bearer ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -d "$disneycookie" 2>&1)
|
||
local isBanned=$(echo $TokenContent|jq -r 'select(.error_description == "forbidden-location") | .error_description')
|
||
local is403=$(echo $TokenContent|grep '403 ERROR')
|
||
if [ -n "$isBanned" ]||[ -n "$is403" ];then
|
||
disney[ustatus]="${smedia[no]}"
|
||
disney[uregion]="${smedia[nodata]}"
|
||
disney[utype]="${smedia[nodata]}"
|
||
return
|
||
fi
|
||
local fakecontent=$(echo "$Media_Cookie"|sed -n '8p')
|
||
local refreshToken=$(echo $TokenContent|jq -r '.refresh_token')
|
||
local disneycontent=$(echo $fakecontent|sed "s/ILOVEDISNEY/$refreshToken/g")
|
||
local tmpresult=$(curl $CurlARG -$1 --user-agent "$UA_Browser" -X POST -sSL --max-time 10 "https://disney.api.edge.bamgrid.com/graph/v1/device/graphql" -H "authorization: ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -d "$disneycontent" 2>&1)
|
||
if ! (echo "$tmpresult"|jq . >/dev/null 2>&1);then
|
||
disney[ustatus]="${smedia[bad]}"
|
||
disney[uregion]="${smedia[nodata]}"
|
||
disney[utype]="${smedia[nodata]}"
|
||
return
|
||
fi
|
||
local previewcheck=$(curl $CurlARG -$1 -s -o /dev/null -L --max-time 10 -w '%{url_effective}\n' "https://disneyplus.com"|grep preview)
|
||
local isUnavailable=$(echo $previewcheck|grep 'unavailable')
|
||
local region=$(echo $tmpresult|jq -r '.extensions.sdk.session.location.countryCode')
|
||
local inSupportedLocation=$(echo $tmpresult|jq -r '.extensions.sdk.session.inSupportedLocation')
|
||
if [[ $region == "JP" ]];then
|
||
disney[ustatus]="${smedia[yes]}"
|
||
disney[uregion]=" [JP] "
|
||
disney[utype]="$resultunlocktype"
|
||
return
|
||
elif [ -n "$region" ]&&[[ $inSupportedLocation == "false" ]]&&[ -z "$isUnavailable" ];then
|
||
disney[ustatus]="${smedia[pending]}"
|
||
disney[uregion]=" [$region] "
|
||
disney[utype]="$resultunlocktype"
|
||
return
|
||
elif [ -n "$region" ]&&[ -n "$isUnavailable" ];then
|
||
disney[ustatus]="${smedia[no]}"
|
||
disney[uregion]="${smedia[nodata]}"
|
||
disney[utype]="${smedia[nodata]}"
|
||
return
|
||
elif [ -n "$region" ]&&[[ $inSupportedLocation == "true" ]];then
|
||
disney[ustatus]="${smedia[yes]}"
|
||
disney[uregion]=" [$region] "
|
||
disney[utype]="$resultunlocktype"
|
||
return
|
||
elif [ -z "$region" ];then
|
||
disney[ustatus]="${smedia[no]}"
|
||
disney[uregion]="${smedia[nodata]}"
|
||
disney[utype]="${smedia[nodata]}"
|
||
return
|
||
else
|
||
disney[ustatus]="${smedia[bad]}"
|
||
disney[uregion]="${smedia[nodata]}"
|
||
disney[utype]="${smedia[nodata]}"
|
||
return
|
||
fi
|
||
}
|
||
function MediaUnlockTest_Netflix(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[media]}${Font_I}Netflix $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-8-${sinfo[lmedia]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
netflix=()
|
||
local checkunlockurl="netflix.com"
|
||
local result1=$(Check_DNS_1 $checkunlockurl)
|
||
local result2=$(Check_DNS_2 $checkunlockurl)
|
||
local result3=$(Check_DNS_3 $checkunlockurl)
|
||
local resultunlocktype=$(Get_Unlock_Type $result1 $result2 $result3)
|
||
local result1=$(curl $CurlARG -$1 --user-agent "$UA_Browser" -fsL -X GET --max-time 10 --tlsv1.3 "https://www.netflix.com/title/81280792" 2>&1)
|
||
local result2=$(curl $CurlARG -$1 --user-agent "$UA_Browser" -fsL -X GET --max-time 10 --tlsv1.3 "https://www.netflix.com/title/70143836" 2>&1)
|
||
if [ -z "$result1" ]||[ -z "$result2" ];then
|
||
netflix[ustatus]="${smedia[bad]}"
|
||
netflix[uregion]="${smedia[nodata]}"
|
||
netflix[utype]="${smedia[nodata]}"
|
||
return
|
||
fi
|
||
region=$(echo "$result1"|sed -n 's/.*"id":"\([^"]*\)".*"countryName":"[^"]*".*/\1/p'|head -n1)
|
||
[[ -n $region ]]&®ion=$(echo "$result2"|sed -n 's/.*"id":"\([^"]*\)".*"countryName":"[^"]*".*/\1/p'|head -n1)
|
||
result1=$(echo $result1|grep 'Oh no!')
|
||
result2=$(echo $result2|grep 'Oh no!')
|
||
if [ -n "$result1" ]&&[ -n "$result2" ];then
|
||
netflix[ustatus]="${smedia[org]}"
|
||
netflix[uregion]=" [$region] "
|
||
netflix[utype]="$resultunlocktype"
|
||
return
|
||
fi
|
||
if [ -z "$result1" ]||[ -z "$result2" ];then
|
||
netflix[ustatus]="${smedia[yes]}"
|
||
netflix[uregion]=" [$region] "
|
||
netflix[utype]="$resultunlocktype"
|
||
return
|
||
fi
|
||
netflix[ustatus]="${smedia[no]}"
|
||
netflix[uregion]="${smedia[nodata]}"
|
||
netflix[utype]="${smedia[nodata]}"
|
||
}
|
||
function MediaUnlockTest_YouTube_Premium(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[media]}${Font_I}Youtube $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-8-${sinfo[lmedia]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
youtube=()
|
||
local checkunlockurl="www.youtube.com"
|
||
local result1=$(Check_DNS_1 $checkunlockurl)
|
||
local result3=$(Check_DNS_3 $checkunlockurl)
|
||
local resultunlocktype=$(Get_Unlock_Type $result1 $result3)
|
||
local tmpresult=$(curl $CurlARG -$1 --max-time 10 -sSL -H "Accept-Language: en" -b "YSC=BiCUU3-5Gdk; CONSENT=YES+cb.20220301-11-p0.en+FX+700; GPS=1; VISITOR_INFO1_LIVE=4VwPMkB7W5A; PREF=tz=Asia.Shanghai; _gcl_au=1.1.1809531354.1646633279" "https://www.youtube.com/premium" 2>&1)
|
||
if [[ $tmpresult == "curl"* ]];then
|
||
youtube[ustatus]="${smedia[bad]}"
|
||
youtube[uregion]="${smedia[nodata]}"
|
||
youtube[utype]="${smedia[nodata]}"
|
||
return
|
||
fi
|
||
local isCN=$(echo $tmpresult|grep 'www.google.cn')
|
||
if [ -n "$isCN" ];then
|
||
youtube[ustatus]="${smedia[cn]}"
|
||
youtube[uregion]=" $Font_Red[CN]$Font_Green "
|
||
youtube[utype]="${smedia[nodata]}"
|
||
return
|
||
fi
|
||
local isNotAvailable=$(echo $tmpresult|grep 'Premium is not available in your country')
|
||
local region=$(echo $tmpresult|sed -n 's/.*"contentRegion":"\([^"]*\)".*/\1/p')
|
||
local isAvailable=$(echo $tmpresult|grep 'ad-free')
|
||
if [ -n "$isNotAvailable" ];then
|
||
youtube[ustatus]="${smedia[noprem]}"
|
||
youtube[uregion]="${smedia[nodata]}"
|
||
youtube[utype]="${smedia[nodata]}"
|
||
return
|
||
elif [ -n "$isAvailable" ]&&[ -n "$region" ];then
|
||
youtube[ustatus]="${smedia[yes]}"
|
||
youtube[uregion]=" [$region] "
|
||
youtube[utype]="$resultunlocktype"
|
||
return
|
||
elif [ -z "$region" ]&&[ -n "$isAvailable" ];then
|
||
youtube[ustatus]="${smedia[yes]}"
|
||
youtube[uregion]="${smedia[nodata]}"
|
||
youtube[utype]="$resultunlocktype"
|
||
return
|
||
else
|
||
youtube[ustatus]="${smedia[bad]}"
|
||
youtube[uregion]="${smedia[nodata]}"
|
||
youtube[utype]="${smedia[nodata]}"
|
||
fi
|
||
}
|
||
function MediaUnlockTest_PrimeVideo_Region(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[media]}${Font_I}Amazon $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-7-${sinfo[lmedia]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
amazon=()
|
||
local checkunlockurl="www.primevideo.com"
|
||
local result1=$(Check_DNS_1 $checkunlockurl)
|
||
local result3=$(Check_DNS_3 $checkunlockurl)
|
||
local resultunlocktype=$(Get_Unlock_Type $result1 $result3)
|
||
local tmpresult=$(curl $CurlARG -$1 --user-agent "$UA_Browser" -sL --max-time 10 "https://www.primevideo.com" 2>&1)
|
||
if [[ $tmpresult == "curl"* ]];then
|
||
amazon[ustatus]="${smedia[bad]}"
|
||
amazon[uregion]="${smedia[nodata]}"
|
||
amazon[utype]="${smedia[nodata]}"
|
||
return
|
||
fi
|
||
local result=$(echo $tmpresult|grep '"currentTerritory":'|sed 's/.*currentTerritory//'|cut -f3 -d'"'|head -n 1)
|
||
if [ -n "$result" ];then
|
||
amazon[ustatus]="${smedia[yes]}"
|
||
amazon[uregion]=" [$result] "
|
||
amazon[utype]="$resultunlocktype"
|
||
return
|
||
else
|
||
amazon[ustatus]="${smedia[no]}"
|
||
amazon[uregion]="${smedia[nodata]}"
|
||
amazon[utype]="${smedia[nodata]}"
|
||
return
|
||
fi
|
||
}
|
||
function MediaUnlockTest_Reddit(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[media]}${Font_I}Reddit $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-7-${sinfo[lmedia]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
reddit=()
|
||
local checkunlockurl="reddit.com"
|
||
local result1=$(Check_DNS_1 $checkunlockurl)
|
||
local result2=$(Check_DNS_2 $checkunlockurl)
|
||
local resultunlocktype=$(Get_Unlock_Type $result1 $result2)
|
||
local resp http_code html region
|
||
local resolve_opt=""
|
||
if [ "$1" = "6" ];then
|
||
local dual_ipv6
|
||
dual_ipv6=$(dig AAAA reddit.com +short|head -n 1)
|
||
[[ -z $dual_ipv6 ]]&&dual_ipv6=$(dig AAAA dualstack.reddit.map.fastly.net +short|head -n 1)
|
||
if [ -n "$dual_ipv6" ];then
|
||
resolve_opt="--resolve www.reddit.com:443:[$dual_ipv6]"
|
||
else
|
||
reddit[ustatus]="${smedia[bad]}"
|
||
reddit[uregion]="${smedia[nodata]}"
|
||
reddit[utype]="${smedia[nodata]}"
|
||
return
|
||
fi
|
||
fi
|
||
resp=$(curl $useNIC $usePROXY $xForward -$1 $ssll -fsL --user-agent "$UA_Browser" --max-time 10 $resolve_opt --write-out '\n%{http_code}' "https://www.reddit.com/")
|
||
http_code=$(printf '%s' "$resp"|tail -n 1|tr -d '\r')
|
||
html=$(printf '%s' "$resp"|sed '$d')
|
||
if [ "$http_code" = "200" ];then
|
||
region=$(printf '%s' "$html"|tr '\n' ' '|sed -n 's/.*country="\([^"]*\)".*/\1/p'|head -n 1)
|
||
fi
|
||
case "$http_code" in
|
||
000)reddit[ustatus]="${smedia[bad]}"
|
||
reddit[uregion]="${smedia[nodata]}"
|
||
reddit[utype]="${smedia[nodata]}"
|
||
;;
|
||
403)reddit[ustatus]="${smedia[no]}"
|
||
reddit[uregion]="${smedia[nodata]}"
|
||
reddit[utype]="${smedia[nodata]}"
|
||
;;
|
||
200)reddit[ustatus]="${smedia[yes]}"
|
||
reddit[uregion]=" [$region] "
|
||
reddit[utype]="$resultunlocktype"
|
||
;;
|
||
*)reddit[ustatus]="${smedia[bad]}"
|
||
reddit[uregion]="${smedia[nodata]}"
|
||
reddit[utype]="${smedia[nodata]}"
|
||
esac
|
||
}
|
||
function OpenAITest(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[ai]}${Font_I}ChatGPT $Font_Suffix"
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-8-${sinfo[lai]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
chatgpt=()
|
||
local checkunlockurl="chat.openai.com"
|
||
local result1=$(Check_DNS_1 $checkunlockurl)
|
||
local result2=$(Check_DNS_2 $checkunlockurl)
|
||
local result3=$(Check_DNS_3 $checkunlockurl)
|
||
local checkunlockurl="ios.chat.openai.com"
|
||
local result4=$(Check_DNS_1 $checkunlockurl)
|
||
local result5=$(Check_DNS_2 $checkunlockurl)
|
||
local result6=$(Check_DNS_3 $checkunlockurl)
|
||
local checkunlockurl="api.openai.com"
|
||
local result7=$(Check_DNS_1 $checkunlockurl)
|
||
local result8=$(Check_DNS_3 $checkunlockurl)
|
||
local resultunlocktype=$(Get_Unlock_Type $result1 $result2 $result3 $result4 $result5 $result6 $result7 $result8)
|
||
local tmpresult1=$(curl $CurlARG -$1 -sS --max-time 10 'https://api.openai.com/compliance/cookie_requirements' -H 'authority: api.openai.com' -H 'accept: */*' -H 'accept-language: zh-CN,zh;q=0.9' -H 'authorization: Bearer null' -H 'content-type: application/json' -H 'origin: https://platform.openai.com' -H 'referer: https://platform.openai.com/' -H 'sec-ch-ua: "Microsoft Edge";v="119", "Chromium";v="119", "Not?A_Brand";v="24"' -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: empty' -H 'sec-fetch-mode: cors' -H 'sec-fetch-site: same-site' -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0' 2>&1)
|
||
local tmpresult2=$(curl $CurlARG -$1 -sS --max-time 10 'https://ios.chat.openai.com/' -H 'authority: ios.chat.openai.com' -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' -H 'accept-language: zh-CN,zh;q=0.9' -H 'sec-ch-ua: "Microsoft Edge";v="119", "Chromium";v="119", "Not?A_Brand";v="24"' -H 'sec-ch-ua-mobile: ?0' -H 'sec-ch-ua-platform: "Windows"' -H 'sec-fetch-dest: document' -H 'sec-fetch-mode: navigate' -H 'sec-fetch-site: none' -H 'sec-fetch-user: ?1' -H 'upgrade-insecure-requests: 1' -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0' 2>&1)
|
||
local result1=$(echo $tmpresult1|grep unsupported_country)
|
||
local result2=$(echo $tmpresult2|grep VPN)
|
||
if [ -n "$result1" ];then
|
||
code=$(curl $CurlARG -$1 -o /dev/null -sS --max-time 10 \
|
||
'https://chatgpt.com/favicon.ico' \
|
||
-H 'accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8' \
|
||
-H 'authority: chatgpt.com' \
|
||
-H 'accept: */*' \
|
||
-H 'accept-language: zh-CN,zh;q=0.9' \
|
||
-H 'authorization: Bearer null' \
|
||
-H 'content-type: application/json' \
|
||
-H 'origin: https://chatgpt.com' \
|
||
-H 'referer: https://chatgpt.com/' \
|
||
-H 'sec-ch-ua: "Microsoft Edge";v="119", "Chromium";v="119", "Not?A_Brand";v="24"' \
|
||
-H 'sec-ch-ua-mobile: ?0' \
|
||
-H 'sec-ch-ua-platform: "Windows"' \
|
||
-H 'sec-fetch-dest: empty' \
|
||
-H 'sec-fetch-mode: cors' \
|
||
-H 'sec-fetch-site: same-site' \
|
||
-H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0' \
|
||
-w "%{http_code}" 2>&1)
|
||
[[ $code != "403" ]]&&result1=""
|
||
fi
|
||
local countryCode="$(curl $CurlARG --max-time 10 -sS https://chat.openai.com/cdn-cgi/trace 2>&1|grep "loc="|awk -F= '{print $2}')"
|
||
if [ -z "$result2" ]&&[ -z "$result1" ]&&[[ $tmpresult1 != "curl"* ]]&&[[ $tmpresult2 != "curl"* ]];then
|
||
chatgpt[ustatus]="${smedia[yes]}"
|
||
chatgpt[uregion]=" [$countryCode] "
|
||
chatgpt[utype]="$resultunlocktype"
|
||
elif [ -n "$result2" ]&&[ -n "$result1" ];then
|
||
chatgpt[ustatus]="${smedia[no]}"
|
||
chatgpt[uregion]="${smedia[nodata]}"
|
||
chatgpt[utype]="${smedia[nodata]}"
|
||
elif [ -z "$result1" ]&&[ -n "$result2" ]&&[[ $tmpresult1 != "curl"* ]];then
|
||
chatgpt[ustatus]="${smedia[web]}"
|
||
chatgpt[uregion]=" [$countryCode] "
|
||
chatgpt[utype]="$resultunlocktype"
|
||
elif [ -n "$result1" ]&&[ -z "$result2" ];then
|
||
chatgpt[ustatus]="${smedia[app]}"
|
||
chatgpt[uregion]=" [$countryCode] "
|
||
chatgpt[utype]="$resultunlocktype"
|
||
elif [[ $tmpresult1 == "curl"* ]]&&[ -n "$result2" ];then
|
||
chatgpt[ustatus]="${smedia[no]}"
|
||
chatgpt[uregion]="${smedia[nodata]}"
|
||
chatgpt[utype]="${smedia[nodata]}"
|
||
elif [[ $1 -eq 6 ]]&&[ -z "$result2" ]&&[[ $tmpresult2 != "curl"* ]];then
|
||
chatgpt[ustatus]="${smedia[yes]}"
|
||
chatgpt[uregion]=" [$countryCode] "
|
||
chatgpt[utype]="$resultunlocktype"
|
||
else
|
||
chatgpt[ustatus]="${smedia[bad]}"
|
||
chatgpt[uregion]="${smedia[nodata]}"
|
||
chatgpt[utype]="${smedia[nodata]}"
|
||
fi
|
||
}
|
||
get_sorted_mx_records(){
|
||
local domain=$1
|
||
dig +short MX $domain|sort -n|head -1|awk '{print $2}'
|
||
}
|
||
check_email_service(){
|
||
local service=$1
|
||
local port=25
|
||
local expected_response="220"
|
||
local domain=""
|
||
local host=""
|
||
local response=""
|
||
local success="false"
|
||
case $service in
|
||
"Gmail")domain="gmail.com";;
|
||
"Outlook")domain="outlook.com";;
|
||
"Yahoo")domain="yahoo.com";;
|
||
"Apple")domain="me.com";;
|
||
"MailRU")domain="mail.ru";;
|
||
"AOL")domain="aol.com";;
|
||
"GMX")domain="gmx.com";;
|
||
"MailCOM")domain="mail.com";;
|
||
"163")domain="163.com";;
|
||
"Sohu")domain="sohu.com";;
|
||
"Sina")domain="sina.com";;
|
||
"QQ")domain="qq.com";;
|
||
*)return
|
||
esac
|
||
if [[ -z $host ]];then
|
||
local mx_hosts=($(get_sorted_mx_records $domain))
|
||
for host in "${mx_hosts[@]}";do
|
||
response=$(timeout 5 bash -c "echo -e 'QUIT\r\n' | nc -s $IP -w4 $host $port 2>&1")
|
||
smail_response[$service]=$response
|
||
if [[ $response == *"$expected_response"* ]];then
|
||
success="true"
|
||
smail[$service]="$Font_Black+$Font_Suffix$Back_Green$Font_White$Font_B$service$Font_Suffix"
|
||
smailstatus[$service]="true"
|
||
smail[remote]=1
|
||
break
|
||
fi
|
||
done
|
||
else
|
||
response=$(timeout 5 bash -c "echo -e 'QUIT\r\n' | nc -s $IP -w4 $host $port 2>&1")
|
||
if [[ $response == *"$expected_response"* ]];then
|
||
success="true"
|
||
smail[$service]="$Font_Black+$Font_Suffix$Back_Green$Font_White$Font_B$service$Font_Suffix"
|
||
smailstatus[$service]="true"
|
||
smail[remote]=1
|
||
fi
|
||
fi
|
||
if [[ $success == "false" ]];then
|
||
smail[$service]="$Font_Black-$Font_Suffix$Back_Red$Font_White$Font_B$service$Font_Suffix"
|
||
smailstatus[$service]="false"
|
||
fi
|
||
}
|
||
check_mail(){
|
||
ss -tano|grep -q ":25\b"&&smail[local]=2||smail[local]=0
|
||
if [[ smail[local] -ne 2 && -z $usePROXY ]];then
|
||
local response=$(timeout 10 bash -c "echo -e 'QUIT\r\n' | nc -s $IP -p25 -w9 smtp.mailgun.org 25 2>&1")
|
||
[[ $response == *"220"* ]]&&smail[local]=1
|
||
fi
|
||
[[ -n $usePROXY ]]&&smail[local]=0
|
||
smail[remote]=0
|
||
services=("Gmail" "Outlook" "Yahoo" "Apple" "QQ" "MailRU" "AOL" "GMX" "MailCOM" "163" "Sohu" "Sina")
|
||
for service in "${services[@]}";do
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[mail]}$Font_I$service$Font_Suffix "
|
||
((ibar_step+=3))
|
||
show_progress_bar "$temp_info" $((40-1-${#service}-${sinfo[lmail]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
check_email_service $service
|
||
kill_progress_bar
|
||
done
|
||
}
|
||
check_dnsbl_parallel(){
|
||
ip_to_check=$1
|
||
parallel_jobs=$2
|
||
smail[t]=0
|
||
smail[c]=0
|
||
smail[m]=0
|
||
smail[b]=0
|
||
reversed_ip=$(echo "$ip_to_check"|awk -F. '{print $4"."$3"."$2"."$1}')
|
||
local total=0
|
||
local clean=0
|
||
local blacklisted=0
|
||
local other=0
|
||
curl $CurlARG -sL "${rawgithub}main/ref/dnsbl.list"|sort -u|xargs -P "$parallel_jobs" -I {} bash -c "result=\$(dig +short \"$reversed_ip.{}\" A); if [[ -z \"\$result\" ]]; then echo 'Clean'; elif [[ \"\$result\" == '127.0.0.2' ]]; then echo 'Blacklisted'; else echo 'Other'; fi"|{
|
||
while IFS= read -r line;do
|
||
((total++))
|
||
case "$line" in
|
||
"Clean")((clean++));;
|
||
"Blacklisted")((blacklisted++));;
|
||
*)((other++))
|
||
esac
|
||
done
|
||
smail[t]="$total"
|
||
smail[c]="$clean"
|
||
smail[m]="$other"
|
||
smail[b]="$blacklisted"
|
||
echo "${smail[t]} ${smail[c]} ${smail[m]} ${smail[b]}"
|
||
}
|
||
}
|
||
check_dnsbl(){
|
||
local temp_info="$Font_Cyan$Font_B${sinfo[dnsbl]} $Font_Suffix"
|
||
((ibar_step=95))
|
||
show_progress_bar "$temp_info" $((40-1-${sinfo[ldnsbl]}))&
|
||
bar_pid="$!"&&disown "$bar_pid"
|
||
trap "kill_progress_bar" RETURN
|
||
local num_array=($(check_dnsbl_parallel "$IP" 50))
|
||
smail[t]=${num_array[0]:-0}
|
||
smail[c]=${num_array[1]:-0}
|
||
smail[m]=${num_array[2]:-0}
|
||
smail[b]=${num_array[3]:-0}
|
||
smail[sdnsbl]="$Font_Cyan${smail[dnsbl]} ${smail[available]}${smail[t]} ${smail[clean]}${smail[c]} ${smail[marked]}${smail[m]} ${smail[blacklisted]}${smail[b]}$Font_Suffix"
|
||
}
|
||
show_head(){
|
||
echo -ne "\r$(printf '%72s'|tr ' ' '#')\n"
|
||
if [[ $mode_lite -eq 0 ]];then
|
||
if [ $fullIP -eq 1 ];then
|
||
calc_padding "$(printf '%*s' "${shead[ltitle]}" '')$IP" 72
|
||
echo -ne "\r$PADDING$Font_B${shead[title]}$Font_Cyan$IP$Font_Suffix\n"
|
||
else
|
||
calc_padding "$(printf '%*s' "${shead[ltitle]}" '')$IPhide" 72
|
||
echo -ne "\r$PADDING$Font_B${shead[title]}$Font_Cyan$IPhide$Font_Suffix\n"
|
||
fi
|
||
else
|
||
if [ $fullIP -eq 1 ];then
|
||
calc_padding "$(printf '%*s' "${shead[ltitle_lite]}" '')$IP" 72
|
||
echo -ne "\r$PADDING$Font_B${shead[title_lite]}$Font_Cyan$IP$Font_Suffix\n"
|
||
else
|
||
calc_padding "$(printf '%*s' "${shead[ltitle_lite]}" '')$IPhide" 72
|
||
echo -ne "\r$PADDING$Font_B${shead[title_lite]}$Font_Cyan$IPhide$Font_Suffix\n"
|
||
fi
|
||
fi
|
||
calc_padding "${shead[git]}" 72
|
||
echo -ne "\r$PADDING$Font_U${shead[git]}$Font_Suffix\n"
|
||
calc_padding "${shead[bash]}" 72
|
||
echo -ne "\r$PADDING${shead[bash]}\n"
|
||
echo -ne "\r${shead[ptime]}${shead[time]} ${shead[ver]}\n"
|
||
echo -ne "\r$(printf '%72s'|tr ' ' '#')\n"
|
||
}
|
||
show_basic(){
|
||
echo -ne "\r${sbasic[title]}\n"
|
||
if [[ -n ${maxmind[asn]} && ${maxmind[asn]} != "null" ]];then
|
||
echo -ne "\r$Font_Cyan${sbasic[asn]}${Font_Green}AS${maxmind[asn]}$Font_Suffix\n"
|
||
echo -ne "\r$Font_Cyan${sbasic[org]}$Font_Green${maxmind[org]}$Font_Suffix\n"
|
||
else
|
||
echo -ne "\r$Font_Cyan${sbasic[asn]}${sbasic[noasn]}$Font_Suffix\n"
|
||
fi
|
||
if [[ ${maxmind[dms]} != "null" && ${maxmind[map]} != "null" ]];then
|
||
echo -ne "\r$Font_Cyan${sbasic[location]}$Font_Green${maxmind[dms]}$Font_Suffix\n"
|
||
echo -ne "\r$Font_Cyan${sbasic[map]}$Font_U$Font_Green${maxmind[map]}$Font_Suffix\n"
|
||
fi
|
||
local city_info=""
|
||
if [[ -n ${maxmind[sub]} && ${maxmind[sub]} != "null" ]];then
|
||
city_info+="${maxmind[sub]}"
|
||
fi
|
||
if [[ -n ${maxmind[city]} && ${maxmind[city]} != "null" ]];then
|
||
[[ -n $city_info ]]&&city_info+=", "
|
||
city_info+="${maxmind[city]}"
|
||
fi
|
||
if [[ -n ${maxmind[post]} && ${maxmind[post]} != "null" ]];then
|
||
[[ -n $city_info ]]&&city_info+=", "
|
||
city_info+="${maxmind[post]}"
|
||
fi
|
||
if [[ -n $city_info ]];then
|
||
echo -ne "\r$Font_Cyan${sbasic[city]}$Font_Green$city_info$Font_Suffix\n"
|
||
fi
|
||
if [[ -n ${maxmind[countrycode]} && ${maxmind[countrycode]} != "null" ]];then
|
||
echo -ne "\r$Font_Cyan${sbasic[country]}$Font_Green[${maxmind[countrycode]}]${maxmind[country]}$Font_Suffix"
|
||
if [[ -n ${maxmind[continentcode]} && ${maxmind[continentcode]} != "null" ]];then
|
||
echo -ne "$Font_Green, [${maxmind[continentcode]}]${maxmind[continent]}$Font_Suffix\n"
|
||
else
|
||
echo -ne "\n"
|
||
fi
|
||
elif [[ -n ${maxmind[continentcode]} && ${maxmind[continentcode]} != "null" ]];then
|
||
echo -ne "\r$Font_Cyan${sbasic[continent]}$Font_Green[${maxmind[continentcode]}]${maxmind[continent]}$Font_Suffix\n"
|
||
fi
|
||
if [[ -n ${maxmind[regcountrycode]} && ${maxmind[regcountrycode]} != "null" ]];then
|
||
echo -ne "\r$Font_Cyan${sbasic[regcountry]}$Font_Green[${maxmind[regcountrycode]}]${maxmind[regcountry]}$Font_Suffix\n"
|
||
fi
|
||
if [[ -n ${maxmind[timezone]} && ${maxmind[timezone]} != "null" ]];then
|
||
echo -ne "\r$Font_Cyan${sbasic[timezone]}$Font_Green${maxmind[timezone]}$Font_Suffix\n"
|
||
fi
|
||
if [[ -n ${maxmind[countrycode]} && ${maxmind[countrycode]} != "null" ]];then
|
||
if [ "${maxmind[countrycode]}" == "${maxmind[regcountrycode]}" ];then
|
||
echo -ne "\r$Font_Cyan${sbasic[type]}$Back_Green$Font_B$Font_White${sbasic[type0]}$Font_Suffix\n"
|
||
else
|
||
echo -ne "\r$Font_Cyan${sbasic[type]}$Back_Red$Font_B$Font_White${sbasic[type1]}$Font_Suffix\n"
|
||
fi
|
||
fi
|
||
}
|
||
show_basic_lite(){
|
||
echo -ne "\r${sbasic[title_lite]}\n"
|
||
if [[ -n ${ipinfo[asn]} && ${ipinfo[asn]} != "null" ]];then
|
||
echo -ne "\r$Font_Cyan${sbasic[asn]}${Font_Green}AS${ipinfo[asn]}$Font_Suffix\n"
|
||
echo -ne "\r$Font_Cyan${sbasic[org]}$Font_Green${ipinfo[org]}$Font_Suffix\n"
|
||
else
|
||
echo -ne "\r$Font_Cyan${sbasic[asn]}${sbasic[noasn]}$Font_Suffix\n"
|
||
fi
|
||
if [[ ${ipinfo[dms]} != "null" && ${ipinfo[map]} != "null" ]];then
|
||
echo -ne "\r$Font_Cyan${sbasic[location]}$Font_Green${ipinfo[dms]}$Font_Suffix\n"
|
||
echo -ne "\r$Font_Cyan${sbasic[map]}$Font_U$Font_Green${ipinfo[map]}$Font_Suffix\n"
|
||
fi
|
||
local city_info=""
|
||
if [[ -n ${ipinfo[sub]} && ${ipinfo[sub]} != "null" ]];then
|
||
city_info+="${ipinfo[sub]}"
|
||
fi
|
||
if [[ -n ${ipinfo[city]} && ${ipinfo[city]} != "null" ]];then
|
||
[[ -n $city_info ]]&&city_info+=", "
|
||
city_info+="${ipinfo[city]}"
|
||
fi
|
||
if [[ -n ${ipinfo[post]} && ${ipinfo[post]} != "null" ]];then
|
||
[[ -n $city_info ]]&&city_info+=", "
|
||
city_info+="${ipinfo[post]}"
|
||
fi
|
||
if [[ -n $city_info ]];then
|
||
echo -ne "\r$Font_Cyan${sbasic[city]}$Font_Green$city_info$Font_Suffix\n"
|
||
fi
|
||
if [[ -n ${ipinfo[countrycode]} && ${ipinfo[countrycode]} != "null" ]];then
|
||
echo -ne "\r$Font_Cyan${sbasic[country]}$Font_Green[${ipinfo[countrycode]}]${ipinfo[country]}$Font_Suffix"
|
||
if [[ -n ${ipinfo[continent]} && ${ipinfo[continent]} != "null" ]];then
|
||
echo -ne "$Font_Green, ${ipinfo[continent]}$Font_Suffix\n"
|
||
else
|
||
echo -ne "\n"
|
||
fi
|
||
elif [[ -n ${ipinfo[continent]} && ${ipinfo[continent]} != "null" ]];then
|
||
echo -ne "\r$Font_Cyan${sbasic[continent]}$Font_Green${ipinfo[continent]}$Font_Suffix\n"
|
||
fi
|
||
if [[ -n ${ipinfo[regcountrycode]} && ${ipinfo[regcountrycode]} != "null" ]];then
|
||
echo -ne "\r$Font_Cyan${sbasic[regcountry]}$Font_Green[${ipinfo[regcountrycode]}]${ipinfo[regcountry]}$Font_Suffix\n"
|
||
fi
|
||
if [[ -n ${ipinfo[timezone]} && ${ipinfo[timezone]} != "null" ]];then
|
||
echo -ne "\r$Font_Cyan${sbasic[timezone]}$Font_Green${ipinfo[timezone]}$Font_Suffix\n"
|
||
fi
|
||
if [[ -n ${ipinfo[countrycode]} && ${ipinfo[countrycode]} != "null" ]];then
|
||
if [ "${ipinfo[countrycode]}" == "${ipinfo[regcountrycode]}" ];then
|
||
echo -ne "\r$Font_Cyan${sbasic[type]}$Back_Green$Font_B$Font_White${sbasic[type0]}$Font_Suffix\n"
|
||
else
|
||
echo -ne "\r$Font_Cyan${sbasic[type]}$Back_Red$Font_B$Font_White${sbasic[type1]}$Font_Suffix\n"
|
||
fi
|
||
fi
|
||
}
|
||
show_type(){
|
||
echo -ne "\r${stype[title]}\n"
|
||
echo -ne "\r$Font_Cyan${stype[db]}$Font_I IPinfo ipregistry ipapi IP2Location AbuseIPDB $Font_Suffix\n"
|
||
echo -ne "\r$Font_Cyan${stype[usetype]}$Font_Suffix${ipinfo[susetype]}${ipregistry[susetype]}${ipapi[susetype]}${ip2location[susetype]}${abuseipdb[susetype]}\n"
|
||
echo -ne "\r$Font_Cyan${stype[comtype]}$Font_Suffix${ipinfo[scomtype]}${ipregistry[scomtype]}${ipapi[scomtype]}${ip2location[scomtype]}\n"
|
||
}
|
||
show_type_lite(){
|
||
echo -ne "\r${stype[title]}\n"
|
||
echo -ne "\r$Font_Cyan${stype[db]}$Font_I IPinfo ipregistry ipapi $Font_Suffix\n"
|
||
echo -ne "\r$Font_Cyan${stype[usetype]}$Font_Suffix${ipinfo[susetype]}${ipregistry[susetype]}${ipapi[susetype]}\n"
|
||
echo -ne "\r$Font_Cyan${stype[comtype]}$Font_Suffix${ipinfo[scomtype]}${ipregistry[scomtype]}${ipapi[scomtype]}\n"
|
||
}
|
||
sscore_text(){
|
||
local text="$1"
|
||
local p2=$2
|
||
local p3=$3
|
||
local p4=$4
|
||
local p5=$5
|
||
local p6=$6
|
||
local tmplen
|
||
local tmp
|
||
if ((p2>=p4));then
|
||
tmplen=$((49+15*(p2-p4)/(p5-p4)-p6))
|
||
elif ((p2>=p3));then
|
||
tmplen=$((33+16*(p2-p3)/(p4-p3)-p6))
|
||
elif ((p2>=0));then
|
||
tmplen=$((17+16*p2/p3-p6))
|
||
else
|
||
tmplen=0
|
||
fi
|
||
tmp=$(printf '%*s' $tmplen '')
|
||
local total_length=${#tmp}
|
||
local text_length=${#text}
|
||
local tmp1="${tmp:1:total_length-text_length}$text|"
|
||
sscore[text1]="${tmp1:1:16-p6}"
|
||
sscore[text2]="${tmp1:17-p6:16}"
|
||
sscore[text3]="${tmp1:33-p6:16}"
|
||
sscore[text4]="${tmp1:49-p6}"
|
||
}
|
||
show_score(){
|
||
echo -ne "\r${sscore[title]}\n"
|
||
echo -ne "\r${sscore[range]}\n"
|
||
if [[ -n ${ip2location[score]} && $mode_lite -eq 0 ]];then
|
||
sscore_text "${ip2location[score]}" ${ip2location[score]} 33 66 99 13
|
||
echo -ne "\r${Font_Cyan}IP2Location${sscore[colon]}$Font_White$Font_B${sscore[text1]}$Back_Green${sscore[text2]}$Back_Yellow${sscore[text3]}$Back_Red${sscore[text4]}$Font_Suffix${ip2location[risk]}\n"
|
||
fi
|
||
if [[ -n ${scamalytics[score]} ]];then
|
||
sscore_text "${scamalytics[score]}" ${scamalytics[score]} 20 60 100 13
|
||
echo -ne "\r${Font_Cyan}Scamalytics${sscore[colon]}$Font_White$Font_B${sscore[text1]}$Back_Green${sscore[text2]}$Back_Yellow${sscore[text3]}$Back_Red${sscore[text4]}$Font_Suffix${scamalytics[risk]}\n"
|
||
fi
|
||
if [[ -n ${ipapi[score]} ]];then
|
||
local tmp_score=$(echo "${ipapi[scorenum]} * 10000 / 1"|bc)
|
||
sscore_text "${ipapi[score]}" $tmp_score 85 300 10000 7
|
||
echo -ne "\r${Font_Cyan}ipapi${sscore[colon]}$Font_White$Font_B${sscore[text1]}$Back_Green${sscore[text2]}$Back_Yellow${sscore[text3]}$Back_Red${sscore[text4]}$Font_Suffix${ipapi[risk]}\n"
|
||
fi
|
||
if [[ $mode_lite -eq 0 ]];then
|
||
sscore_text "${abuseipdb[score]}" ${abuseipdb[score]} 25 25 100 11
|
||
[[ -n ${abuseipdb[score]} ]]&&echo -ne "\r${Font_Cyan}AbuseIPDB${sscore[colon]}$Font_White$Font_B${sscore[text1]}$Back_Green${sscore[text2]}$Back_Yellow${sscore[text3]}$Back_Red${sscore[text4]}$Font_Suffix${abuseipdb[risk]}\n"
|
||
if [ -n "${ipqs[score]}" ]&&[ "${ipqs[score]}" != "null" ];then
|
||
sscore_text "${ipqs[score]}" ${ipqs[score]} 75 85 100 6
|
||
echo -ne "\r${Font_Cyan}IPQS${sscore[colon]}$Font_White$Font_B${sscore[text1]}$Back_Green${sscore[text2]}$Back_Yellow${sscore[text3]}$Back_Red${sscore[text4]}$Font_Suffix${ipqs[risk]}\n"
|
||
fi
|
||
fi
|
||
sscore_text " " ${dbip[score]} 33 66 100 7
|
||
[[ -n ${dbip[risk]} ]]&&echo -ne "\r${Font_Cyan}DB-IP${sscore[colon]}$Font_White$Font_B${sscore[text1]}$Back_Green${sscore[text2]}$Back_Yellow${sscore[text3]}$Back_Red${sscore[text4]}$Font_Suffix${dbip[risk]}\n"
|
||
}
|
||
format_factor(){
|
||
local tmp_txt=" "
|
||
if [[ $1 == "true" ]];then
|
||
tmp_txt+="${sfactor[yes]}"
|
||
elif [[ $1 == "false" ]];then
|
||
tmp_txt+="${sfactor[no]}"
|
||
elif [ ${#1} -eq 2 ];then
|
||
tmp_txt+="$Font_Green[$1]$Font_Suffix"
|
||
else
|
||
tmp_txt+="${sfactor[na]}"
|
||
fi
|
||
tmp_txt+=" "
|
||
if [[ $2 == "true" ]];then
|
||
tmp_txt+="${sfactor[yes]}"
|
||
elif [[ $2 == "false" ]];then
|
||
tmp_txt+="${sfactor[no]}"
|
||
elif [ ${#2} -eq 2 ];then
|
||
tmp_txt+="$Font_Green[$2]$Font_Suffix"
|
||
else
|
||
tmp_txt+="${sfactor[na]}"
|
||
fi
|
||
tmp_txt+=" "
|
||
if [[ $3 == "true" ]];then
|
||
tmp_txt+="${sfactor[yes]}"
|
||
elif [[ $3 == "false" ]];then
|
||
tmp_txt+="${sfactor[no]}"
|
||
elif [ ${#3} -eq 2 ];then
|
||
tmp_txt+="$Font_Green[$3]$Font_Suffix"
|
||
else
|
||
tmp_txt+="${sfactor[na]}"
|
||
fi
|
||
tmp_txt+=" "
|
||
if [[ $4 == "true" ]];then
|
||
tmp_txt+="${sfactor[yes]}"
|
||
elif [[ $4 == "false" ]];then
|
||
tmp_txt+="${sfactor[no]}"
|
||
elif [ ${#4} -eq 2 ];then
|
||
tmp_txt+="$Font_Green[$4]$Font_Suffix"
|
||
else
|
||
tmp_txt+="${sfactor[na]}"
|
||
fi
|
||
if [[ $mode_lite -eq 0 ]];then
|
||
tmp_txt+=" "
|
||
if [[ $5 == "true" ]];then
|
||
tmp_txt+="${sfactor[yes]}"
|
||
elif [[ $5 == "false" ]];then
|
||
tmp_txt+="${sfactor[no]}"
|
||
elif [ ${#5} -eq 2 ];then
|
||
tmp_txt+="$Font_Green[$5]$Font_Suffix"
|
||
else
|
||
tmp_txt+="${sfactor[na]}"
|
||
fi
|
||
tmp_txt+=" "
|
||
if [[ $6 == "true" ]];then
|
||
tmp_txt+="${sfactor[yes]}"
|
||
elif [[ $6 == "false" ]];then
|
||
tmp_txt+="${sfactor[no]}"
|
||
elif [ ${#6} -eq 2 ];then
|
||
tmp_txt+="$Font_Green[$6]$Font_Suffix"
|
||
else
|
||
tmp_txt+="${sfactor[na]}"
|
||
fi
|
||
tmp_txt+=" "
|
||
if [[ $7 == "true" ]];then
|
||
tmp_txt+="${sfactor[yes]}"
|
||
elif [[ $7 == "false" ]];then
|
||
tmp_txt+="${sfactor[no]}"
|
||
elif [ ${#7} -eq 2 ];then
|
||
tmp_txt+="$Font_Green[$7]$Font_Suffix"
|
||
else
|
||
tmp_txt+="${sfactor[na]}"
|
||
fi
|
||
tmp_txt+=" "
|
||
if [[ $8 == "true" ]];then
|
||
tmp_txt+="${sfactor[yes]}"
|
||
elif [[ $8 == "false" ]];then
|
||
tmp_txt+="${sfactor[no]}"
|
||
elif [ ${#8} -eq 2 ];then
|
||
tmp_txt+="$Font_Green[$8]$Font_Suffix"
|
||
else
|
||
tmp_txt+="${sfactor[na]}"
|
||
fi
|
||
fi
|
||
echo "$tmp_txt"
|
||
}
|
||
show_factor(){
|
||
local tmp_factor=""
|
||
echo -ne "\r${sfactor[title]}\n"
|
||
echo -ne "\r$Font_Cyan${sfactor[factor]}${Font_I}IP2Location ipapi ipregistry IPQS Scamalytics ipdata IPinfo DB-IP$Font_Suffix\n"
|
||
tmp_factor=$(format_factor "${ip2location[countrycode]}" "${ipapi[countrycode]}" "${ipregistry[countrycode]}" "${ipqs[countrycode]}" "${scamalytics[countrycode]}" "${ipdata[countrycode]}" "${ipinfo[countrycode]}" "${dbip[countrycode]}")
|
||
echo -ne "\r$Font_Cyan${sfactor[countrycode]}$Font_Suffix$tmp_factor\n"
|
||
tmp_factor=$(format_factor "${ip2location[proxy]}" "${ipapi[proxy]}" "${ipregistry[proxy]}" "${ipqs[proxy]}" "${scamalytics[proxy]}" "${ipdata[proxy]}" "${ipinfo[proxy]}" "${dbip[proxy]}")
|
||
echo -ne "\r$Font_Cyan${sfactor[proxy]}$Font_Suffix$tmp_factor\n"
|
||
tmp_factor=$(format_factor "${ip2location[tor]}" "${ipapi[tor]}" "${ipregistry[tor]}" "${ipqs[tor]}" "${scamalytics[tor]}" "${ipdata[tor]}" "${ipinfo[tor]}" "${dbip[tor]}")
|
||
echo -ne "\r$Font_Cyan${sfactor[tor]}$Font_Suffix$tmp_factor\n"
|
||
tmp_factor=$(format_factor "${ip2location[vpn]}" "${ipapi[vpn]}" "${ipregistry[vpn]}" "${ipqs[vpn]}" "${scamalytics[vpn]}" "${ipdata[vpn]}" "${ipinfo[vpn]}" "${dbip[vpn]}")
|
||
echo -ne "\r$Font_Cyan${sfactor[vpn]}$Font_Suffix$tmp_factor\n"
|
||
tmp_factor=$(format_factor "${ip2location[server]}" "${ipapi[server]}" "${ipregistry[server]}" "${ipqs[server]}" "${scamalytics[server]}" "${ipdata[server]}" "${ipinfo[server]}" "${dbip[server]}")
|
||
echo -ne "\r$Font_Cyan${sfactor[server]}$Font_Suffix$tmp_factor\n"
|
||
tmp_factor=$(format_factor "${ip2location[abuser]}" "${ipapi[abuser]}" "${ipregistry[abuser]}" "${ipqs[abuser]}" "${scamalytics[abuser]}" "${ipdata[abuser]}" "${ipinfo[abuser]}" "${dbip[abuser]}")
|
||
echo -ne "\r$Font_Cyan${sfactor[abuser]}$Font_Suffix$tmp_factor\n"
|
||
tmp_factor=$(format_factor "${ip2location[robot]}" "${ipapi[robot]}" "${ipregistry[robot]}" "${ipqs[robot]}" "${scamalytics[robot]}" "${ipdata[robot]}" "${ipinfo[robot]}" "${dbip[robot]}")
|
||
echo -ne "\r$Font_Cyan${sfactor[robot]}$Font_Suffix$tmp_factor\n"
|
||
}
|
||
show_factor_lite(){
|
||
local tmp_factor=""
|
||
echo -ne "\r${sfactor[title]}\n"
|
||
echo -ne "\r$Font_Cyan${sfactor[factor]}$Font_I ipapi ipregistry IPinfo DB-IP$Font_Suffix\n"
|
||
tmp_factor=$(format_factor "${ipapi[countrycode]}" "${ipregistry[countrycode]}" "${ipinfo[countrycode]}" "${dbip[countrycode]}")
|
||
echo -ne "\r$Font_Cyan${sfactor[countrycode]}$Font_Suffix$tmp_factor\n"
|
||
tmp_factor=$(format_factor "${ipapi[proxy]}" "${ipregistry[proxy]}" "${ipinfo[proxy]}" "${dbip[proxy]}")
|
||
echo -ne "\r$Font_Cyan${sfactor[proxy]}$Font_Suffix$tmp_factor\n"
|
||
tmp_factor=$(format_factor "${ipapi[tor]}" "${ipregistry[tor]}" "${ipinfo[tor]}" "${dbip[tor]}")
|
||
echo -ne "\r$Font_Cyan${sfactor[tor]}$Font_Suffix$tmp_factor\n"
|
||
tmp_factor=$(format_factor "${ipapi[vpn]}" "${ipregistry[vpn]}" "${ipinfo[vpn]}" "${dbip[vpn]}")
|
||
echo -ne "\r$Font_Cyan${sfactor[vpn]}$Font_Suffix$tmp_factor\n"
|
||
tmp_factor=$(format_factor "${ipapi[server]}" "${ipregistry[server]}" "${ipinfo[server]}" "${dbip[server]}")
|
||
echo -ne "\r$Font_Cyan${sfactor[server]}$Font_Suffix$tmp_factor\n"
|
||
tmp_factor=$(format_factor "${ipapi[abuser]}" "${ipregistry[abuser]}" "${ipinfo[abuser]}" "${dbip[abuser]}")
|
||
echo -ne "\r$Font_Cyan${sfactor[abuser]}$Font_Suffix$tmp_factor\n"
|
||
tmp_factor=$(format_factor "${ipapi[robot]}" "${ipregistry[robot]}" "${ipinfo[robot]}" "${dbip[robot]}")
|
||
echo -ne "\r$Font_Cyan${sfactor[robot]}$Font_Suffix$tmp_factor\n"
|
||
}
|
||
show_media(){
|
||
echo -ne "\r${smedia[title]}\n"
|
||
echo -ne "\r$Font_Cyan${smedia[meida]}$Font_I TikTok Disney+ Netflix Youtube AmazonPV Reddit ChatGPT $Font_Suffix\n"
|
||
echo -ne "\r$Font_Cyan${smedia[status]}${tiktok[ustatus]}${disney[ustatus]}${netflix[ustatus]}${youtube[ustatus]}${amazon[ustatus]}${reddit[ustatus]}${chatgpt[ustatus]}$Font_Suffix\n"
|
||
echo -ne "\r$Font_Cyan${smedia[region]}$Font_Green${tiktok[uregion]}${disney[uregion]}${netflix[uregion]}${youtube[uregion]}${amazon[uregion]}${reddit[uregion]}${chatgpt[uregion]}$Font_Suffix\n"
|
||
echo -ne "\r$Font_Cyan${smedia[type]}${tiktok[utype]}${disney[utype]}${netflix[utype]}${youtube[utype]}${amazon[utype]}${reddit[utype]}${chatgpt[utype]}$Font_Suffix\n"
|
||
}
|
||
show_mail(){
|
||
echo -ne "\r${smail[title]}\n"
|
||
if [ ${smail[local]} -eq 1 ];then
|
||
echo -ne "\r$Font_Cyan${smail[port]}$Font_Suffix${smail[yes]}\n"
|
||
elif [ ${smail[local]} -eq 2 ];then
|
||
echo -ne "\r$Font_Cyan${smail[port]}$Font_Suffix${smail[occupied]}\n"
|
||
else
|
||
echo -ne "\r$Font_Cyan${smail[port]}$Font_Suffix${smail[no]}\n"
|
||
fi
|
||
if [ ${smail[remote]} -eq 1 ];then
|
||
echo -ne "\r$Font_Cyan${smail[provider]}$Font_Suffix"
|
||
for service in "${services[@]}";do
|
||
echo -ne "${smail[$service]}"
|
||
done
|
||
echo ""
|
||
else
|
||
echo -ne "\r$Font_Cyan${smail[provider]}${smail[blocked]}$Font_Suffix\n"
|
||
fi
|
||
[[ $1 -eq 4 ]]&&echo -ne "\r${smail[sdnsbl]}\n"
|
||
}
|
||
show_tail(){
|
||
echo -ne "\r$(printf '%72s'|tr ' ' '=')\n"
|
||
echo -ne "\r$Font_I${stail[stoday]}${stail[today]}${stail[stotal]}${stail[total]}${stail[thanks]} $Font_Suffix\n"
|
||
echo -e ""
|
||
}
|
||
get_opts(){
|
||
while getopts "i:l:o:x:fhjnpyEM46" opt;do
|
||
case $opt in
|
||
4)if
|
||
[[ IPV4check -ne 0 ]]
|
||
then
|
||
IPV6check=0
|
||
else
|
||
ERRORcode=4
|
||
fi
|
||
;;
|
||
6)if
|
||
[[ IPV6check -ne 0 ]]
|
||
then
|
||
IPV4check=0
|
||
else
|
||
ERRORcode=6
|
||
fi
|
||
;;
|
||
f)fullIP=1
|
||
;;
|
||
h)show_help
|
||
;;
|
||
i)iface="$OPTARG"
|
||
useNIC=" --interface $iface"
|
||
CurlARG+="$useNIC"
|
||
get_ipv4
|
||
get_ipv6
|
||
is_valid_ipv4 $IPV4
|
||
is_valid_ipv6 $IPV6
|
||
[[ $IPV4work -eq 0 && $IPV6work -eq 0 ]]&&ERRORcode=7
|
||
;;
|
||
j)mode_json=1
|
||
;;
|
||
l)YY=$(echo "$OPTARG"|tr '[:upper:]' '[:lower:]')
|
||
;;
|
||
n)mode_no=1
|
||
;;
|
||
o)mode_output=1
|
||
outputfile="$OPTARG"
|
||
[[ -z $outputfile ]]&&{
|
||
ERRORcode=1
|
||
break
|
||
}
|
||
[[ -e $outputfile ]]&&{
|
||
ERRORcode=10
|
||
break
|
||
}
|
||
touch "$outputfile" 2>/dev/null||{
|
||
ERRORcode=11
|
||
break
|
||
}
|
||
;;
|
||
p)mode_privacy=1
|
||
;;
|
||
x)xproxy="$OPTARG"
|
||
usePROXY=" -x $xproxy"
|
||
CurlARG+="$usePROXY"
|
||
get_ipv4
|
||
get_ipv6
|
||
is_valid_ipv4 $IPV4
|
||
is_valid_ipv6 $IPV6
|
||
[[ $IPV4work -eq 0 && $IPV6work -eq 0 ]]&&ERRORcode=8
|
||
;;
|
||
y)mode_yes=1
|
||
;;
|
||
E)YY="en"
|
||
;;
|
||
M)mode_menu=1
|
||
;;
|
||
\?)ERRORcode=1
|
||
esac
|
||
done
|
||
if [[ $mode_menu -eq 1 ]];then
|
||
if [[ $YY == "cn" ]];then
|
||
eval "bash <(curl -sL https://Check.Place) -I"
|
||
else
|
||
eval "bash <(curl -sL https://Check.Place) -EI"
|
||
fi
|
||
exit 0
|
||
fi
|
||
[[ $IPV4check -eq 1 && $IPV6check -eq 0 && $IPV4work -eq 0 ]]&&ERRORcode=40
|
||
[[ $IPV4check -eq 0 && $IPV6check -eq 1 && $IPV6work -eq 0 ]]&&ERRORcode=60
|
||
CurlARG="$useNIC$usePROXY"
|
||
}
|
||
show_help(){
|
||
echo -ne "\r$shelp\n"
|
||
exit 0
|
||
}
|
||
show_ad(){
|
||
RANDOM=$(date +%s)
|
||
local -a ads=()
|
||
local i=1
|
||
while :;do
|
||
local content
|
||
content=$(curl -fsL --max-time 5 "${rawgithub}main/ref/ad$i.ans")||break
|
||
ads+=("$content")
|
||
((i++))
|
||
done
|
||
ADLines=0
|
||
local adCount=${#ads[@]}
|
||
[[ $adCount -eq 0 ]]&&return
|
||
local -a indices=()
|
||
for ((i=1; i<=adCount; i++));do indices+=("$i");done
|
||
for ((i=adCount-1; i>0; i--));do
|
||
local j=$((RANDOM%(i+1)))
|
||
local tmp=${indices[i]}
|
||
indices[i]=${indices[j]}
|
||
indices[j]=$tmp
|
||
done
|
||
local -a aad
|
||
aad[0]=$(curl -sL --max-time 5 "${rawgithub}main/ref/sponsor.ans")
|
||
for ((i=0; i<adCount; i++));do
|
||
aad[${indices[i]}]="${ads[i]}"
|
||
done
|
||
local rows cols
|
||
if ! read rows cols < <(stty size 2>/dev/null);then cols=0;fi
|
||
print_pair(){
|
||
local left="$1" right="$2"
|
||
local -a L R
|
||
mapfile -t L <<<"$left"
|
||
mapfile -t R <<<"$right"
|
||
local i
|
||
for ((i=0; i<12; i++));do
|
||
printf "%-72s$Font_Suffix %-72s\n" "${L[i]}" "${R[i]}" 1>&2
|
||
done
|
||
ADLines=$((ADLines+12))
|
||
}
|
||
print_block(){
|
||
echo "$1" 1>&2
|
||
ADLines=$((ADLines+12))
|
||
}
|
||
if [[ $cols -ge 150 ]];then
|
||
if ((adCount==0));then
|
||
print_block "${aad[0]}"
|
||
elif ((adCount%2==1));then
|
||
print_pair "${aad[0]}" "${aad[1]}"
|
||
local k
|
||
for ((k=2; k<=adCount; k+=2));do
|
||
print_pair "${aad[$k]}" "${aad[$((k+1))]}"
|
||
done
|
||
else
|
||
print_block "${aad[0]}"
|
||
local k
|
||
for ((k=1; k<=adCount; k+=2));do
|
||
print_pair "${aad[$k]}" "${aad[$((k+1))]}"
|
||
done
|
||
fi
|
||
else
|
||
echo "${aad[0]}" 1>&2
|
||
for ((i=1; i<=adCount; i++));do
|
||
echo "${aad[$i]}" 1>&2
|
||
done
|
||
ADLines=$(((adCount+1)*12))
|
||
fi
|
||
}
|
||
read_ref(){
|
||
Media_Cookie=$(curl $CurlARG -sL --retry 3 --max-time 10 "${rawgithub}main/ref/cookies.txt")
|
||
IATA_Database="${rawgithub}main/ref/iata-icao.csv"
|
||
}
|
||
clean_ansi(){
|
||
local input="$1"
|
||
input=$(echo "$input"|sed 's/\\033/\x1b/g')
|
||
input=$(echo "$input"|sed 's/\x1b\[[0-9;]*m//g')
|
||
input=$(echo "$input"|sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
|
||
echo -n "$input"
|
||
}
|
||
factor_bool(){
|
||
local tmp_txt=""
|
||
if [[ $1 == "true" ]];then
|
||
tmp_txt+=".Factor |= . * { $3: { $2: true } } | "
|
||
elif [[ $1 == "false" ]];then
|
||
tmp_txt+=".Factor |= . * { $3: { $2: false } } | "
|
||
elif [ ${#1} -eq 2 ];then
|
||
tmp_txt+=".Factor |= . * { $3: { $2: \"$1\" } } | "
|
||
else
|
||
tmp_txt+=".Factor |= . * { $3: { $2: null } } | "
|
||
fi
|
||
[[ -z $tmp_txt ]]&&tmp_txt="null"
|
||
echo "$tmp_txt"
|
||
}
|
||
save_json(){
|
||
local head_updates=""
|
||
local basic_updates=""
|
||
local type_updates=""
|
||
local score_updates=""
|
||
local factor_updates=""
|
||
local media_updates=""
|
||
local mail_updates=""
|
||
if [ $fullIP -eq 1 ];then
|
||
head_updates+=".Head |= . + { IP: \"${IP:-null}\" } | "
|
||
else
|
||
head_updates+=".Head |= . + { IP: \"${IPhide:-null}\" } | "
|
||
fi
|
||
head_updates+=".Head |= . + { Command: \"${shead[bash]:-null}\" } | "
|
||
head_updates+=".Head |= . + { GitHub: \"${shead[git]:-null}\" } | "
|
||
head_updates+=".Head |= . + { Time: \"${shead[time_raw]:-null}\" } | "
|
||
head_updates+=".Head |= . + { Version: \"${script_version:-null}\" } | "
|
||
if [ $mode_lite -eq 0 ];then
|
||
basic_updates+=".Info |= . + { ASN: \"${maxmind[asn]:-null}\" } | "
|
||
basic_updates+=".Info |= . + { Organization: \"${maxmind[org]:-null}\" } | "
|
||
basic_updates+=".Info |= . + { Latitude: \"${maxmind[lat]:-null}\" } | "
|
||
basic_updates+=".Info |= . + { Longitude: \"${maxmind[lon]:-null}\" } | "
|
||
basic_updates+=".Info |= . + { DMS: \"${maxmind[dms]:-null}\" } | "
|
||
basic_updates+=".Info |= . + { Map: \"${maxmind[map]:-null}\" } | "
|
||
basic_updates+=".Info |= . + { TimeZone: \"${maxmind[timezone]:-null}\" } | "
|
||
basic_updates+=".Info |= . * { City: { Name: \"${maxmind[city]:-null}\" } } | "
|
||
basic_updates+=".Info |= . * { City: { PostalCode: \"${maxmind[post]:-null}\" } } | "
|
||
basic_updates+=".Info |= . * { City: { SubCode: \"${maxmind[subcode]:-null}\" } } | "
|
||
basic_updates+=".Info |= . * { City: { Subdivisions: \"${maxmind[sub]:-null}\" } } | "
|
||
basic_updates+=".Info |= . * { Region: { Code: \"${maxmind[countrycode]:-null}\" } } | "
|
||
basic_updates+=".Info |= . * { Region: { Name: \"${maxmind[country]:-null}\" } } | "
|
||
basic_updates+=".Info |= . * { Continent: { Code: \"${maxmind[continentcode]:-null}\" } } | "
|
||
basic_updates+=".Info |= . * { Continent: { Name: \"${maxmind[continent]:-null}\" } } | "
|
||
basic_updates+=".Info |= . * { RegisteredRegion: { Code: \"${maxmind[regcountrycode]:-null}\" } } | "
|
||
basic_updates+=".Info |= . * { RegisteredRegion: { Name: \"${maxmind[regcountry]:-null}\" } } | "
|
||
if [[ -n ${maxmind[countrycode]} && ${maxmind[countrycode]} != "null" ]];then
|
||
if [ "${maxmind[countrycode]}" == "${maxmind[regcountrycode]}" ];then
|
||
basic_updates+=".Info |= . + { Type: \"$(clean_ansi "${sbasic[type0]:-null}")\" } | "
|
||
else
|
||
basic_updates+=".Info |= . + { Type: \"$(clean_ansi "${sbasic[type1]:-null}")\" } | "
|
||
fi
|
||
else
|
||
basic_updates+='.Info |= . + { Type: "null" } | '
|
||
fi
|
||
else
|
||
basic_updates+=".Info |= . + { ASN: \"${ipinfo[asn]:-null}\" } | "
|
||
basic_updates+=".Info |= . + { Organization: \"${ipinfo[org]:-null}\" } | "
|
||
basic_updates+=".Info |= . + { Latitude: \"${ipinfo[lat]:-null}\" } | "
|
||
basic_updates+=".Info |= . + { Longitude: \"${ipinfo[lon]:-null}\" } | "
|
||
basic_updates+=".Info |= . + { DMS: \"${ipinfo[dms]:-null}\" } | "
|
||
basic_updates+=".Info |= . + { Map: \"${ipinfo[map]:-null}\" } | "
|
||
basic_updates+=".Info |= . + { TimeZone: \"${ipinfo[timezone]:-null}\" } | "
|
||
basic_updates+=".Info |= . * { City: { Name: \"${ipinfo[city]:-null}\" } } | "
|
||
basic_updates+=".Info |= . * { City: { PostalCode: \"${ipinfo[post]:-null}\" } } | "
|
||
basic_updates+='.Info |= . * { City: { SubCode: "null" } } | '
|
||
basic_updates+='.Info |= . * { City: { Subdivisions: "null" } } | '
|
||
basic_updates+=".Info |= . * { Region: { Code: \"${ipinfo[countrycode]:-null}\" } } | "
|
||
basic_updates+=".Info |= . * { Region: { Name: \"${ipinfo[country]:-null}\" } } | "
|
||
basic_updates+='.Info |= . * { Continent: { Code: "null" } } | '
|
||
basic_updates+=".Info |= . * { Continent: { Name: \"${ipinfo[continent]:-null}\" } } | "
|
||
basic_updates+=".Info |= . * { RegisteredRegion: { Code: \"${ipinfo[regcountrycode]:-null}\" } } | "
|
||
basic_updates+=".Info |= . * { RegisteredRegion: { Name: \"${ipinfo[regcountry]:-null}\" } } | "
|
||
if [[ -n ${ipinfo[countrycode]} && ${ipinfo[countrycode]} != "null" ]];then
|
||
if [ "${ipinfo[countrycode]}" == "${ipinfo[regcountrycode]}" ];then
|
||
basic_updates+=".Info |= . + { Type: \"$(clean_ansi "${sbasic[type0]:-null}")\" } | "
|
||
else
|
||
basic_updates+=".Info |= . + { Type: \"$(clean_ansi "${sbasic[type1]:-null}")\" } | "
|
||
fi
|
||
else
|
||
basic_updates+='.Info |= . + { Type: "null" } | '
|
||
fi
|
||
fi
|
||
type_updates+=".Type |= . * { Usage: { IPinfo: \"$(clean_ansi "${ipinfo[susetype]:-null}")\" } } | "
|
||
type_updates+=".Type |= . * { Usage: { ipregistry: \"$(clean_ansi "${ipregistry[susetype]:-null}")\" } } | "
|
||
type_updates+=".Type |= . * { Usage: { ipapi: \"$(clean_ansi "${ipapi[susetype]:-null}")\" } } | "
|
||
type_updates+=".Type |= . * { Usage: { AbuseIPDB: \"$(clean_ansi "${abuseipdb[susetype]:-null}")\" } } | "
|
||
type_updates+=".Type |= . * { Usage: { IP2LOCATION: \"$(clean_ansi "${ip2location[susetype]:-null}")\" } } | "
|
||
type_updates+=".Type |= . * { Company: { IPinfo: \"$(clean_ansi "${ipinfo[scomtype]:-null}")\" } } | "
|
||
type_updates+=".Type |= . * { Company: { ipregistry: \"$(clean_ansi "${ipregistry[scomtype]:-null}")\" } } | "
|
||
type_updates+=".Type |= . * { Company: { ipapi: \"$(clean_ansi "${ipapi[scomtype]:-null}")\" } } | "
|
||
score_updates+=".Score |= . + { IP2LOCATION: \"${ip2location[score]:-null}\" } | "
|
||
score_updates+=".Score |= . + { SCAMALYTICS: \"${scamalytics[score]:-null}\" } | "
|
||
score_updates+=".Score |= . + { ipapi: \"${ipapi[score]:-null}\" } | "
|
||
score_updates+=".Score |= . + { AbuseIPDB: \"${abuseipdb[score]:-null}\" } | "
|
||
score_updates+=".Score |= . + { IPQS: \"${ipapi[ipqs]:-null}\" } | "
|
||
score_updates+=".Score |= . + { DBIP: \"${dbip[score]:-null}\" } | "
|
||
factor_updates+=$(factor_bool "${ip2location[countrycode]}" "IP2LOCATION" "CountryCode")
|
||
factor_updates+=$(factor_bool "${ipapi[countrycode]}" "ipapi" "CountryCode")
|
||
factor_updates+=$(factor_bool "${ipregistry[countrycode]}" "ipregistry" "CountryCode")
|
||
factor_updates+=$(factor_bool "${ipqs[countrycode]}" "IPQS" "CountryCode")
|
||
factor_updates+=$(factor_bool "${scamalytics[countrycode]}" "SCAMALYTICS" "CountryCode")
|
||
factor_updates+=$(factor_bool "${ipdata[countrycode]}" "ipdata" "CountryCode")
|
||
factor_updates+=$(factor_bool "${ipinfo[countrycode]}" "IPinfo" "CountryCode")
|
||
factor_updates+=$(factor_bool "${ipwhois[countrycode]}" "IPWHOIS" "CountryCode")
|
||
factor_updates+=$(factor_bool "${dbip[countrycode]}" "DBIP" "CountryCode")
|
||
factor_updates+=$(factor_bool "${ip2location[proxy]}" "IP2LOCATION" "Proxy")
|
||
factor_updates+=$(factor_bool "${ipapi[proxy]}" "ipapi" "Proxy")
|
||
factor_updates+=$(factor_bool "${ipregistry[proxy]}" "ipregistry" "Proxy")
|
||
factor_updates+=$(factor_bool "${ipqs[proxy]}" "IPQS" "Proxy")
|
||
factor_updates+=$(factor_bool "${scamalytics[proxy]}" "SCAMALYTICS" "Proxy")
|
||
factor_updates+=$(factor_bool "${ipdata[proxy]}" "ipdata" "Proxy")
|
||
factor_updates+=$(factor_bool "${ipinfo[proxy]}" "IPinfo" "Proxy")
|
||
factor_updates+=$(factor_bool "${ipwhois[proxy]}" "IPWHOIS" "Proxy")
|
||
factor_updates+=$(factor_bool "${dbip[proxy]}" "DBIP" "Proxy")
|
||
factor_updates+=$(factor_bool "${ip2location[tor]}" "IP2LOCATION" "Tor")
|
||
factor_updates+=$(factor_bool "${ipapi[tor]}" "ipapi" "Tor")
|
||
factor_updates+=$(factor_bool "${ipregistry[tor]}" "ipregistry" "Tor")
|
||
factor_updates+=$(factor_bool "${ipqs[tor]}" "IPQS" "Tor")
|
||
factor_updates+=$(factor_bool "${scamalytics[tor]}" "SCAMALYTICS" "Tor")
|
||
factor_updates+=$(factor_bool "${ipdata[tor]}" "ipdata" "Tor")
|
||
factor_updates+=$(factor_bool "${ipinfo[tor]}" "IPinfo" "Tor")
|
||
factor_updates+=$(factor_bool "${ipwhois[tor]}" "IPWHOIS" "Tor")
|
||
factor_updates+=$(factor_bool "${dbip[tor]}" "DBIP" "Tor")
|
||
factor_updates+=$(factor_bool "${ip2location[vpn]}" "IP2LOCATION" "VPN")
|
||
factor_updates+=$(factor_bool "${ipapi[vpn]}" "ipapi" "VPN")
|
||
factor_updates+=$(factor_bool "${ipregistry[vpn]}" "ipregistry" "VPN")
|
||
factor_updates+=$(factor_bool "${ipqs[vpn]}" "IPQS" "VPN")
|
||
factor_updates+=$(factor_bool "${scamalytics[vpn]}" "SCAMALYTICS" "VPN")
|
||
factor_updates+=$(factor_bool "${ipdata[vpn]}" "ipdata" "VPN")
|
||
factor_updates+=$(factor_bool "${ipinfo[vpn]}" "IPinfo" "VPN")
|
||
factor_updates+=$(factor_bool "${ipwhois[vpn]}" "IPWHOIS" "VPN")
|
||
factor_updates+=$(factor_bool "${dbip[vpn]}" "DBIP" "VPN")
|
||
factor_updates+=$(factor_bool "${ip2location[server]}" "IP2LOCATION" "Server")
|
||
factor_updates+=$(factor_bool "${ipapi[server]}" "ipapi" "Server")
|
||
factor_updates+=$(factor_bool "${ipregistry[server]}" "ipregistry" "Server")
|
||
factor_updates+=$(factor_bool "${ipqs[server]}" "IPQS" "Server")
|
||
factor_updates+=$(factor_bool "${scamalytics[server]}" "SCAMALYTICS" "Server")
|
||
factor_updates+=$(factor_bool "${ipdata[server]}" "ipdata" "Server")
|
||
factor_updates+=$(factor_bool "${ipinfo[server]}" "IPinfo" "Server")
|
||
factor_updates+=$(factor_bool "${ipwhois[server]}" "IPWHOIS" "Server")
|
||
factor_updates+=$(factor_bool "${dbip[server]}" "DBIP" "Server")
|
||
factor_updates+=$(factor_bool "${ip2location[abuser]}" "IP2LOCATION" "Abuser")
|
||
factor_updates+=$(factor_bool "${ipapi[abuser]}" "ipapi" "Abuser")
|
||
factor_updates+=$(factor_bool "${ipregistry[abuser]}" "ipregistry" "Abuser")
|
||
factor_updates+=$(factor_bool "${ipqs[abuser]}" "IPQS" "Abuser")
|
||
factor_updates+=$(factor_bool "${scamalytics[abuser]}" "SCAMALYTICS" "Abuser")
|
||
factor_updates+=$(factor_bool "${ipdata[abuser]}" "ipdata" "Abuser")
|
||
factor_updates+=$(factor_bool "${ipinfo[abuser]}" "IPinfo" "Abuser")
|
||
factor_updates+=$(factor_bool "${ipwhois[abuser]}" "IPWHOIS" "Abuser")
|
||
factor_updates+=$(factor_bool "${dbip[abuser]}" "DBIP" "Abuser")
|
||
factor_updates+=$(factor_bool "${ip2location[robot]}" "IP2LOCATION" "Robot")
|
||
factor_updates+=$(factor_bool "${ipapi[robot]}" "ipapi" "Robot")
|
||
factor_updates+=$(factor_bool "${ipregistry[robot]}" "ipregistry" "Robot")
|
||
factor_updates+=$(factor_bool "${ipqs[robot]}" "IPQS" "Robot")
|
||
factor_updates+=$(factor_bool "${scamalytics[robot]}" "SCAMALYTICS" "Robot")
|
||
factor_updates+=$(factor_bool "${ipdata[robot]}" "ipdata" "Robot")
|
||
factor_updates+=$(factor_bool "${ipinfo[robot]}" "IPinfo" "Robot")
|
||
factor_updates+=$(factor_bool "${ipwhois[robot]}" "IPWHOIS" "Robot")
|
||
factor_updates+=$(factor_bool "${dbip[robot]}" "DBIP" "Robot")
|
||
media_updates+=".Media |= . * { TikTok: { Status: \"$(clean_ansi "${tiktok[ustatus]:-null}")\" } } | "
|
||
media_updates+=".Media |= . * { DisneyPlus: { Status: \"$(clean_ansi "${disney[ustatus]:-null}")\" } } | "
|
||
media_updates+=".Media |= . * { Netflix: { Status: \"$(clean_ansi "${netflix[ustatus]:-null}")\" } } | "
|
||
media_updates+=".Media |= . * { Youtube: { Status: \"$(clean_ansi "${youtube[ustatus]:-null}")\" } } | "
|
||
media_updates+=".Media |= . * { AmazonPrimeVideo: { Status: \"$(clean_ansi "${amazon[ustatus]:-null}")\" } } | "
|
||
media_updates+=".Media |= . * { Reddit: { Status: \"$(clean_ansi "${reddit[ustatus]:-null}")\" } } | "
|
||
media_updates+=".Media |= . * { ChatGPT: { Status: \"$(clean_ansi "${chatgpt[ustatus]:-null}")\" } } | "
|
||
media_updates+=".Media |= . * { TikTok: { Region: \"$(clean_ansi "${tiktok[uregion]//[][]/}")\" } } | "
|
||
media_updates+=".Media |= . * { DisneyPlus: { Region: \"$(clean_ansi "${disney[uregion]//[][]/}")\" } } | "
|
||
media_updates+=".Media |= . * { Netflix: { Region: \"$(clean_ansi "${netflix[uregion]//[][]/}")\" } } | "
|
||
media_updates+=".Media |= . * { Youtube: { Region: \"$(clean_ansi "${youtube[uregion]//[][]/}")\" } } | "
|
||
media_updates+=".Media |= . * { AmazonPrimeVideo: { Region: \"$(clean_ansi "${amazon[uregion]//[][]/}")\" } } | "
|
||
media_updates+=".Media |= . * { Reddit: { Region: \"$(clean_ansi "${reddit[uregion]//[][]/}")\" } } | "
|
||
media_updates+=".Media |= . * { ChatGPT: { Region: \"$(clean_ansi "${chatgpt[uregion]//[][]/}")\" } } | "
|
||
media_updates+=".Media |= . * { TikTok: { Type: \"$(clean_ansi "${tiktok[utype]:-null}")\" } } | "
|
||
media_updates+=".Media |= . * { DisneyPlus: { Type: \"$(clean_ansi "${disney[utype]:-null}")\" } } | "
|
||
media_updates+=".Media |= . * { Netflix: { Type: \"$(clean_ansi "${netflix[utype]:-null}")\" } } | "
|
||
media_updates+=".Media |= . * { Youtube: { Type: \"$(clean_ansi "${youtube[utype]:-null}")\" } } | "
|
||
media_updates+=".Media |= . * { AmazonPrimeVideo: { Type: \"$(clean_ansi "${amazon[utype]:-null}")\" } } | "
|
||
media_updates+=".Media |= . * { Reddit: { Type: \"$(clean_ansi "${reddit[utype]:-null}")\" } } | "
|
||
media_updates+=".Media |= . * { ChatGPT: { Type: \"$(clean_ansi "${chatgpt[utype]:-null}")\" } } | "
|
||
if [[ ${smail[local]} -eq 1 ]];then
|
||
mail_updates+=".Mail |= . + { Port25: true } | "
|
||
for service in "${services[@]}";do
|
||
if [[ ${smailstatus[$service]} == "true" ]];then
|
||
mail_updates+=".Mail |= . + { \"$service\": true } | "
|
||
else
|
||
mail_updates+=".Mail |= . + { \"$service\": false } | "
|
||
fi
|
||
done
|
||
elif [[ ${smail[local]} -eq 2 ]];then
|
||
mail_updates+=".Mail |= . + { Port25: null } | "
|
||
for service in "${services[@]}";do
|
||
mail_updates+=".Mail |= . + { \"$service\": null } | "
|
||
done
|
||
else
|
||
mail_updates+=".Mail |= . + { Port25: false } | "
|
||
for service in "${services[@]}";do
|
||
mail_updates+=".Mail |= . + { \"$service\": false } | "
|
||
done
|
||
fi
|
||
mail_updates+=".Mail |= . * { DNSBlacklist: { Total: ${smail[t]:-null} } } | "
|
||
mail_updates+=".Mail |= . * { DNSBlacklist: { Clean: ${smail[c]:-null} } } | "
|
||
mail_updates+=".Mail |= . * { DNSBlacklist: { Marked: ${smail[m]:-null} } } | "
|
||
mail_updates+=".Mail |= . * { DNSBlacklist: { Blacklisted: ${smail[b]:-null} } } | "
|
||
ipjson=$(echo "$ipjson"|jq "$head_updates$basic_updates$type_updates$score_updates$factor_updates$media_updates$mail_updates.")
|
||
}
|
||
check_IP(){
|
||
IP=$1
|
||
ibar_step=0
|
||
ipjson='{
|
||
"Head": {},
|
||
"Info": {},
|
||
"Type": {},
|
||
"Score": {},
|
||
"Factor": {},
|
||
"Media": {},
|
||
"Mail": {}
|
||
}'
|
||
[[ $2 -eq 4 ]]&&hide_ipv4 $IP
|
||
[[ $2 -eq 6 ]]&&hide_ipv6 $IP
|
||
countRunTimes
|
||
db_maxmind $2
|
||
db_ipinfo
|
||
[[ $mode_lite -eq 0 ]]&&db_scamalytics $2||scamalytics=()
|
||
db_ipregistry $2
|
||
db_ipapi $2
|
||
[[ $mode_lite -eq 0 ]]&&db_abuseipdb $2||abuseipdb=()
|
||
[[ $mode_lite -eq 0 ]]&&db_ip2location $2||ip2location=()
|
||
db_dbip
|
||
[[ $mode_lite -eq 0 ]]&&db_ipdata $2||ipdata=()
|
||
[[ $mode_lite -eq 0 ]]&&db_ipqs $2||ipqs=()
|
||
MediaUnlockTest_TikTok $2
|
||
MediaUnlockTest_DisneyPlus $2
|
||
MediaUnlockTest_Netflix $2
|
||
MediaUnlockTest_YouTube_Premium $2
|
||
MediaUnlockTest_PrimeVideo_Region $2
|
||
MediaUnlockTest_Reddit $2
|
||
OpenAITest $2
|
||
check_mail
|
||
[[ $2 -eq 4 ]]&&check_dnsbl "$IP" 50
|
||
echo -ne "$Font_LineClear" 1>&2
|
||
if [ $2 -eq 4 ]||[[ $IPV4work -eq 0 || $IPV4check -eq 0 ]];then
|
||
for ((i=0; i<ADLines; i++));do
|
||
echo -ne "$Font_LineUp" 1>&2
|
||
echo -ne "$Font_LineClear" 1>&2
|
||
done
|
||
fi
|
||
if [[ $mode_lite -eq 0 ]];then
|
||
local ip_report=$(show_head
|
||
show_basic
|
||
show_type
|
||
show_score
|
||
show_factor
|
||
show_media
|
||
show_mail $2
|
||
show_tail)
|
||
else
|
||
local ip_report=$(show_head
|
||
show_basic_lite
|
||
show_type_lite
|
||
show_score
|
||
show_factor_lite
|
||
show_media
|
||
show_mail $2
|
||
show_tail)
|
||
fi
|
||
local report_link=""
|
||
[[ mode_json -eq 1 || mode_output -eq 1 || mode_privacy -eq 0 ]]&&save_json
|
||
[[ $mode_lite -eq 0 && mode_privacy -eq 0 ]]&&report_link=$(curl -$2 -s -X POST https://upload.check.place -d "type=ip" --data-urlencode "json=$ipjson" --data-urlencode "content=$ip_report")
|
||
[[ mode_json -eq 0 ]]&&echo -ne "\r$ip_report\n"
|
||
[[ mode_json -eq 0 && mode_privacy -eq 0 && $report_link == *"https://Report.Check.Place/"* ]]&&echo -ne "\r${stail[link]}$report_link$Font_Suffix\n"
|
||
[[ mode_json -eq 1 ]]&&echo -ne "\r$ipjson\n"
|
||
echo -ne "\r\n"
|
||
if [[ mode_output -eq 1 ]];then
|
||
case "$outputfile" in
|
||
*.[aA][nN][sS][iI])echo "$ip_report" >>"$outputfile" 2>/dev/null
|
||
;;
|
||
*.[jJ][sS][oO][nN])echo "$ipjson" >>"$outputfile" 2>/dev/null
|
||
;;
|
||
*)echo -e "$ip_report"|sed 's/\x1b\[[0-9;]*[mGKHF]//g' >>"$outputfile" 2>/dev/null
|
||
esac
|
||
fi
|
||
}
|
||
generate_random_user_agent
|
||
adapt_locale
|
||
check_connectivity
|
||
read_ref
|
||
get_ipv4
|
||
get_ipv6
|
||
is_valid_ipv4 $IPV4
|
||
is_valid_ipv6 $IPV6
|
||
get_opts "$@"
|
||
[[ mode_no -eq 0 ]]&&install_dependencies 1>&2
|
||
set_language
|
||
if [[ $ERRORcode -ne 0 ]];then
|
||
echo -ne "\r$Font_B$Font_Red${swarn[$ERRORcode]}$Font_Suffix\n"
|
||
exit $ERRORcode
|
||
fi
|
||
clear
|
||
show_ad
|
||
[[ $IPV4work -ne 0 && $IPV4check -ne 0 ]]&&check_IP "$IPV4" 4
|
||
[[ $IPV6work -ne 0 && $IPV6check -ne 0 ]]&&check_IP "$IPV6" 6
|