#!/bin/bash script_version="v2026-02-08" 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 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=("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 -$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 '/
/,/<\/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 '