#!/bin/bash script_version="v2026-01-15" 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 ipwhois declare -A ipdata declare -A ipqs declare -A tiktok declare -A disney declare -A netflix declare -A youtube declare -A amazon declare -A spotify 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]="139.0.7258.128 139.0.7258.67 138.0.7204.185 138.0.7204.170 138.0.7204.159 138.0.7204.102 138.0.7204.100 138.0.7204.51 138.0.7204.49 137.0.7151.122 138.0.7204.35 137.0.7151.121 137.0.7151.105 137.0.7151.104 137.0.7151.57 137.0.7151.55 136.0.7103.116 137.0.7151.40 136.0.7103.113 136.0.7103.92 135.0.7049.117 136.0.7103.48 135.0.7049.114 135.0.7049.86 135.0.7049.42 135.0.7049.41 134.0.6998.167 134.0.6998.119 134.0.6998.117 134.0.6998.37 134.0.6998.35 133.0.6943.128 133.0.6943.100 133.0.6943.59 133.0.6943.53 132.0.6834.162 133.0.6943.35 132.0.6834.160 132.0.6834.112 132.0.6834.110 131.0.6778.267 132.0.6834.83 131.0.6778.264 131.0.6778.204 131.0.6778.139 131.0.6778.109 131.0.6778.71 131.0.6778.69 130.0.6723.119 131.0.6778.33 130.0.6723.116 130.0.6723.71 130.0.6723.60 130.0.6723.58 129.0.6668.103 130.0.6723.44 129.0.6668.100 129.0.6668.72 129.0.6668.60 129.0.6668.42 128.0.6613.122 128.0.6613.121 128.0.6613.115 128.0.6613.113 127.0.6533.122 128.0.6613.36 127.0.6533.119 127.0.6533.100 127.0.6533.74 127.0.6533.72 126.0.6478.185 127.0.6533.57 126.0.6478.183 126.0.6478.128 126.0.6478.116 126.0.6478.114 126.0.6478.61 125.0.6422.176 126.0.6478.56 125.0.6422.144 126.0.6478.36 125.0.6422.142 125.0.6422.114 125.0.6422.77 125.0.6422.76 124.0.6367.210 125.0.6422.60 124.0.6367.208 124.0.6367.201 124.0.6367.156 125.0.6422.41 124.0.6367.155 124.0.6367.119 124.0.6367.92 124.0.6367.63 124.0.6367.61 123.0.6312.124 124.0.6367.60 123.0.6312.122 123.0.6312.106 123.0.6312.105 123.0.6312.60 123.0.6312.58 122.0.6261.131 123.0.6312.46 122.0.6261.129 122.0.6261.128 122.0.6261.112 122.0.6261.111 122.0.6261.71 122.0.6261.69 121.0.6167.189 122.0.6261.57 121.0.6167.187 121.0.6167.186 121.0.6167.162 121.0.6167.160 121.0.6167.140 121.0.6167.86 121.0.6167.85 120.0.6099.227 120.0.6099.225 121.0.6167.75 120.0.6099.224 120.0.6099.218 120.0.6099.216 120.0.6099.200 120.0.6099.199 120.0.6099.129 120.0.6099.110 120.0.6099.109 120.0.6099.62 120.0.6099.56" [Firefox]="132.0 131.0 130.0 129.0 128.0 127.0 126.0 125.0 124.0 123.0 122.0 121.0 120.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=("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 =~ error && -n $response ]];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") if [[ $? -eq 0 && ! $response =~ error && -n $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 -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 --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 '/
/,/<\/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_ipwhois(){
local temp_info="$Font_Cyan$Font_B${sinfo[database]}${Font_I}IPWHOIS $Font_Suffix"
((ibar_step+=3))
show_progress_bar "$temp_info" $((40-8-${sinfo[ldatabase]}))&
bar_pid="$!"&&disown "$bar_pid"
trap "kill_progress_bar" RETURN
ipwhois=()
local html=$(curl -s https://ipwhois.io/ -H "User-Agent: $UA_Browser" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" -H "Accept-Language: en-US,en;q=0.9")
local js_path=$(printf '%s\n' "$html"|grep -oE '