diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cf5352..51c244b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,19 @@ # IPInfo Changelog +## 4.4.0 + +- Added `CountryFlag` to the details object. +- Added `CountryCurrency` to the details object. +- Added `Continent` to the details object. +- Handled timeour error properly. + ## 4.3.1 - Patch fix to include `eu.json` in manifest for release. ## 4.3.0 -- Add `isEU` to the details object to check whether the IP geolocates to a +- Added `isEU` to the details object to check whether the IP geolocates to a European Union (EU) country. ## 4.2.1 diff --git a/MANIFEST.in b/MANIFEST.in index a30e344..73acc2a 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,2 +1,5 @@ include ipinfo/countries.json include ipinfo/eu.json +include ipinfo/flags.json +include ipinfo/currency.json +include ipinfo/continent.json diff --git a/README.md b/README.md index 16601b0..f743e53 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ This is the official Python client library for the IPinfo.io IP address API, allowing you to lookup your own IP address, or get any of the following details for an IP: - - [IP geolocation / geoIP data](https://ipinfo.io/ip-geolocation-api) (city, region, country, postal code, latitude and longitude) + - [IP geolocation](https://ipinfo.io/ip-geolocation-api) (city, region, country, postal code, latitude and longitude) - [ASN details](https://ipinfo.io/asn-api) (ISP or network operator, associated domain name, and type, such as business, hosting or company) - [Firmographics data](https://ipinfo.io/ip-company-api) (the name and domain of the business that uses the IP address) - [Carrier information](https://ipinfo.io/ip-carrier-api) (the name of the mobile carrier and MNC and MCC for that carrier if the IP is used exclusively for mobile traffic) @@ -232,7 +232,7 @@ Request behavior can be modified by setting the `request_options` keyword argume ### Internationalization -When looking up an IP address, the response object includes a `details.country_name` and `details.isEU` attributes which includes the country based on American English. It is possible to return the country name in other languages by setting the `countries_file` and remove or add EU countries by setting `eu_countries_file` keyword argument when creating the `IPinfo` object. +When looking up an IP address, the response object includes a `details.country_name`, `details.isEU`, `details.country_flag` and `details.country_currency` attributes which includes the country based on American English. It is possible to return the country name in other languages by setting the `countries_file`, remove or add EU countries by setting the keyword argument `eu_countries_file`, change the country flag emoji or unicode by setting the keyword argument `countries_flags_file` or change country's currency code or currency symbol by setting the `countries_currencies` when creating the `IPinfo` object. Moreover the response object includes a `details.continent` which includes continent code and name of IP. The default file can be changed by setting the `continent_file` while creating the `IPinfo` object. The file must be a `.json` file with the following structure: diff --git a/ipinfo/continent.json b/ipinfo/continent.json new file mode 100644 index 0000000..9baa1f2 --- /dev/null +++ b/ipinfo/continent.json @@ -0,0 +1,253 @@ +{ + "BD": {"code": "AS", "name": "Asia"}, + "BE": {"code": "EU", "name": "Europe"}, + "BF": {"code": "AF", "name": "Africa"}, + "BG": {"code": "EU", "name": "Europe"}, + "BA": {"code": "EU", "name": "Europe"}, + "BB": {"code": "NA", "name": "North America"}, + "WF": {"code": "OC", "name": "Oceania"}, + "BL": {"code": "NA", "name": "North America"}, + "BM": {"code": "NA", "name": "North America"}, + "BN": {"code": "AS", "name": "Asia"}, + "BO": {"code": "SA", "name": "South America"}, + "BH": {"code": "AS", "name": "Asia"}, + "BI": {"code": "AF", "name": "Africa"}, + "BJ": {"code": "AF", "name": "Africa"}, + "BT": {"code": "AS", "name": "Asia"}, + "JM": {"code": "NA", "name": "North America"}, + "BV": {"code": "AN", "name": "Antarctica"}, + "BW": {"code": "AF", "name": "Africa"}, + "WS": {"code": "OC", "name": "Oceania"}, + "BQ": {"code": "NA", "name": "North America"}, + "BR": {"code": "SA", "name": "South America"}, + "BS": {"code": "NA", "name": "North America"}, + "JE": {"code": "EU", "name": "Europe"}, + "BY": {"code": "EU", "name": "Europe"}, + "BZ": {"code": "NA", "name": "North America"}, + "RU": {"code": "EU", "name": "Europe"}, + "RW": {"code": "AF", "name": "Africa"}, + "RS": {"code": "EU", "name": "Europe"}, + "TL": {"code": "OC", "name": "Oceania"}, + "RE": {"code": "AF", "name": "Africa"}, + "TM": {"code": "AS", "name": "Asia"}, + "TJ": {"code": "AS", "name": "Asia"}, + "RO": {"code": "EU", "name": "Europe"}, + "TK": {"code": "OC", "name": "Oceania"}, + "GW": {"code": "AF", "name": "Africa"}, + "GU": {"code": "OC", "name": "Oceania"}, + "GT": {"code": "NA", "name": "North America"}, + "GS": {"code": "AN", "name": "Antarctica"}, + "GR": {"code": "EU", "name": "Europe"}, + "GQ": {"code": "AF", "name": "Africa"}, + "GP": {"code": "NA", "name": "North America"}, + "JP": {"code": "AS", "name": "Asia"}, + "GY": {"code": "SA", "name": "South America"}, + "GG": {"code": "EU", "name": "Europe"}, + "GF": {"code": "SA", "name": "South America"}, + "GE": {"code": "AS", "name": "Asia"}, + "GD": {"code": "NA", "name": "North America"}, + "GB": {"code": "EU", "name": "Europe"}, + "GA": {"code": "AF", "name": "Africa"}, + "SV": {"code": "NA", "name": "North America"}, + "GN": {"code": "AF", "name": "Africa"}, + "GM": {"code": "AF", "name": "Africa"}, + "GL": {"code": "NA", "name": "North America"}, + "GI": {"code": "EU", "name": "Europe"}, + "GH": {"code": "AF", "name": "Africa"}, + "OM": {"code": "AS", "name": "Asia"}, + "TN": {"code": "AF", "name": "Africa"}, + "JO": {"code": "AS", "name": "Asia"}, + "HR": {"code": "EU", "name": "Europe"}, + "HT": {"code": "NA", "name": "North America"}, + "HU": {"code": "EU", "name": "Europe"}, + "HK": {"code": "AS", "name": "Asia"}, + "HN": {"code": "NA", "name": "North America"}, + "HM": {"code": "AN", "name": "Antarctica"}, + "VE": {"code": "SA", "name": "South America"}, + "PR": {"code": "NA", "name": "North America"}, + "PS": {"code": "AS", "name": "Asia"}, + "PW": {"code": "OC", "name": "Oceania"}, + "PT": {"code": "EU", "name": "Europe"}, + "SJ": {"code": "EU", "name": "Europe"}, + "PY": {"code": "SA", "name": "South America"}, + "IQ": {"code": "AS", "name": "Asia"}, + "PA": {"code": "NA", "name": "North America"}, + "PF": {"code": "OC", "name": "Oceania"}, + "PG": {"code": "OC", "name": "Oceania"}, + "PE": {"code": "SA", "name": "South America"}, + "PK": {"code": "AS", "name": "Asia"}, + "PH": {"code": "AS", "name": "Asia"}, + "PN": {"code": "OC", "name": "Oceania"}, + "PL": {"code": "EU", "name": "Europe"}, + "PM": {"code": "NA", "name": "North America"}, + "ZM": {"code": "AF", "name": "Africa"}, + "EH": {"code": "AF", "name": "Africa"}, + "EE": {"code": "EU", "name": "Europe"}, + "EG": {"code": "AF", "name": "Africa"}, + "ZA": {"code": "AF", "name": "Africa"}, + "EC": {"code": "SA", "name": "South America"}, + "IT": {"code": "EU", "name": "Europe"}, + "VN": {"code": "AS", "name": "Asia"}, + "SB": {"code": "OC", "name": "Oceania"}, + "ET": {"code": "AF", "name": "Africa"}, + "SO": {"code": "AF", "name": "Africa"}, + "ZW": {"code": "AF", "name": "Africa"}, + "SA": {"code": "AS", "name": "Asia"}, + "ES": {"code": "EU", "name": "Europe"}, + "ER": {"code": "AF", "name": "Africa"}, + "ME": {"code": "EU", "name": "Europe"}, + "MD": {"code": "EU", "name": "Europe"}, + "MG": {"code": "AF", "name": "Africa"}, + "MF": {"code": "NA", "name": "North America"}, + "MA": {"code": "AF", "name": "Africa"}, + "MC": {"code": "EU", "name": "Europe"}, + "UZ": {"code": "AS", "name": "Asia"}, + "MM": {"code": "AS", "name": "Asia"}, + "ML": {"code": "AF", "name": "Africa"}, + "MO": {"code": "AS", "name": "Asia"}, + "MN": {"code": "AS", "name": "Asia"}, + "MH": {"code": "OC", "name": "Oceania"}, + "MK": {"code": "EU", "name": "Europe"}, + "MU": {"code": "AF", "name": "Africa"}, + "MT": {"code": "EU", "name": "Europe"}, + "MW": {"code": "AF", "name": "Africa"}, + "MV": {"code": "AS", "name": "Asia"}, + "MQ": {"code": "NA", "name": "North America"}, + "MP": {"code": "OC", "name": "Oceania"}, + "MS": {"code": "NA", "name": "North America"}, + "MR": {"code": "AF", "name": "Africa"}, + "IM": {"code": "EU", "name": "Europe"}, + "UG": {"code": "AF", "name": "Africa"}, + "TZ": {"code": "AF", "name": "Africa"}, + "MY": {"code": "AS", "name": "Asia"}, + "MX": {"code": "NA", "name": "North America"}, + "IL": {"code": "AS", "name": "Asia"}, + "FR": {"code": "EU", "name": "Europe"}, + "IO": {"code": "AS", "name": "Asia"}, + "SH": {"code": "AF", "name": "Africa"}, + "FI": {"code": "EU", "name": "Europe"}, + "FJ": {"code": "OC", "name": "Oceania"}, + "FK": {"code": "SA", "name": "South America"}, + "FM": {"code": "OC", "name": "Oceania"}, + "FO": {"code": "EU", "name": "Europe"}, + "NI": {"code": "NA", "name": "North America"}, + "NL": {"code": "EU", "name": "Europe"}, + "NO": {"code": "EU", "name": "Europe"}, + "NA": {"code": "AF", "name": "Africa"}, + "VU": {"code": "OC", "name": "Oceania"}, + "NC": {"code": "OC", "name": "Oceania"}, + "NE": {"code": "AF", "name": "Africa"}, + "NF": {"code": "OC", "name": "Oceania"}, + "NG": {"code": "AF", "name": "Africa"}, + "NZ": {"code": "OC", "name": "Oceania"}, + "NP": {"code": "AS", "name": "Asia"}, + "NR": {"code": "OC", "name": "Oceania"}, + "NU": {"code": "OC", "name": "Oceania"}, + "CK": {"code": "OC", "name": "Oceania"}, + "XK": {"code": "EU", "name": "Europe"}, + "CI": {"code": "AF", "name": "Africa"}, + "CH": {"code": "EU", "name": "Europe"}, + "CO": {"code": "SA", "name": "South America"}, + "CN": {"code": "AS", "name": "Asia"}, + "CM": {"code": "AF", "name": "Africa"}, + "CL": {"code": "SA", "name": "South America"}, + "CC": {"code": "AS", "name": "Asia"}, + "CA": {"code": "NA", "name": "North America"}, + "CG": {"code": "AF", "name": "Africa"}, + "CF": {"code": "AF", "name": "Africa"}, + "CD": {"code": "AF", "name": "Africa"}, + "CZ": {"code": "EU", "name": "Europe"}, + "CY": {"code": "EU", "name": "Europe"}, + "CX": {"code": "AS", "name": "Asia"}, + "CR": {"code": "NA", "name": "North America"}, + "CW": {"code": "NA", "name": "North America"}, + "CV": {"code": "AF", "name": "Africa"}, + "CU": {"code": "NA", "name": "North America"}, + "SZ": {"code": "AF", "name": "Africa"}, + "SY": {"code": "AS", "name": "Asia"}, + "SX": {"code": "NA", "name": "North America"}, + "KG": {"code": "AS", "name": "Asia"}, + "KE": {"code": "AF", "name": "Africa"}, + "SS": {"code": "AF", "name": "Africa"}, + "SR": {"code": "SA", "name": "South America"}, + "KI": {"code": "OC", "name": "Oceania"}, + "KH": {"code": "AS", "name": "Asia"}, + "KN": {"code": "NA", "name": "North America"}, + "KM": {"code": "AF", "name": "Africa"}, + "ST": {"code": "AF", "name": "Africa"}, + "SK": {"code": "EU", "name": "Europe"}, + "KR": {"code": "AS", "name": "Asia"}, + "SI": {"code": "EU", "name": "Europe"}, + "KP": {"code": "AS", "name": "Asia"}, + "KW": {"code": "AS", "name": "Asia"}, + "SN": {"code": "AF", "name": "Africa"}, + "SM": {"code": "EU", "name": "Europe"}, + "SL": {"code": "AF", "name": "Africa"}, + "SC": {"code": "AF", "name": "Africa"}, + "KZ": {"code": "AS", "name": "Asia"}, + "KY": {"code": "NA", "name": "North America"}, + "SG": {"code": "AS", "name": "Asia"}, + "SE": {"code": "EU", "name": "Europe"}, + "SD": {"code": "AF", "name": "Africa"}, + "DO": {"code": "NA", "name": "North America"}, + "DM": {"code": "NA", "name": "North America"}, + "DJ": {"code": "AF", "name": "Africa"}, + "DK": {"code": "EU", "name": "Europe"}, + "VG": {"code": "NA", "name": "North America"}, + "DE": {"code": "EU", "name": "Europe"}, + "YE": {"code": "AS", "name": "Asia"}, + "DZ": {"code": "AF", "name": "Africa"}, + "US": {"code": "NA", "name": "North America"}, + "UY": {"code": "SA", "name": "South America"}, + "YT": {"code": "AF", "name": "Africa"}, + "UM": {"code": "OC", "name": "Oceania"}, + "LB": {"code": "AS", "name": "Asia"}, + "LC": {"code": "NA", "name": "North America"}, + "LA": {"code": "AS", "name": "Asia"}, + "TV": {"code": "OC", "name": "Oceania"}, + "TW": {"code": "AS", "name": "Asia"}, + "TT": {"code": "NA", "name": "North America"}, + "TR": {"code": "AS", "name": "Asia"}, + "LK": {"code": "AS", "name": "Asia"}, + "LI": {"code": "EU", "name": "Europe"}, + "LV": {"code": "EU", "name": "Europe"}, + "TO": {"code": "OC", "name": "Oceania"}, + "LT": {"code": "EU", "name": "Europe"}, + "LU": {"code": "EU", "name": "Europe"}, + "LR": {"code": "AF", "name": "Africa"}, + "LS": {"code": "AF", "name": "Africa"}, + "TH": {"code": "AS", "name": "Asia"}, + "TF": {"code": "AN", "name": "Antarctica"}, + "TG": {"code": "AF", "name": "Africa"}, + "TD": {"code": "AF", "name": "Africa"}, + "TC": {"code": "NA", "name": "North America"}, + "LY": {"code": "AF", "name": "Africa"}, + "VA": {"code": "EU", "name": "Europe"}, + "VC": {"code": "NA", "name": "North America"}, + "AE": {"code": "AS", "name": "Asia"}, + "AD": {"code": "EU", "name": "Europe"}, + "AG": {"code": "NA", "name": "North America"}, + "AF": {"code": "AS", "name": "Asia"}, + "AI": {"code": "NA", "name": "North America"}, + "VI": {"code": "NA", "name": "North America"}, + "IS": {"code": "EU", "name": "Europe"}, + "IR": {"code": "AS", "name": "Asia"}, + "AM": {"code": "AS", "name": "Asia"}, + "AL": {"code": "EU", "name": "Europe"}, + "AO": {"code": "AF", "name": "Africa"}, + "AQ": {"code": "AN", "name": "Antarctica"}, + "AS": {"code": "OC", "name": "Oceania"}, + "AR": {"code": "SA", "name": "South America"}, + "AU": {"code": "OC", "name": "Oceania"}, + "AT": {"code": "EU", "name": "Europe"}, + "AW": {"code": "NA", "name": "North America"}, + "IN": {"code": "AS", "name": "Asia"}, + "AX": {"code": "EU", "name": "Europe"}, + "AZ": {"code": "AS", "name": "Asia"}, + "IE": {"code": "EU", "name": "Europe"}, + "ID": {"code": "AS", "name": "Asia"}, + "UA": {"code": "EU", "name": "Europe"}, + "QA": {"code": "AS", "name": "Asia"}, + "MZ": {"code": "AF", "name": "Africa"} + } + \ No newline at end of file diff --git a/ipinfo/currency.json b/ipinfo/currency.json new file mode 100644 index 0000000..67198b5 --- /dev/null +++ b/ipinfo/currency.json @@ -0,0 +1,252 @@ +{ + "AD" : { "code": "EUR" ,"symbol": "€"}, + "AE" : { "code": "AED" ,"symbol": "د.إ"}, + "AF" : { "code": "AFN" ,"symbol": "؋"}, + "AG" : { "code": "XCD" ,"symbol": "$"}, + "AI" : { "code": "XCD" ,"symbol": "$"}, + "AL" : { "code": "ALL" ,"symbol": "L"}, + "AM" : { "code": "AMD" ,"symbol": "֏"}, + "AO" : { "code": "AOA" ,"symbol": "Kz"}, + "AQ" : { "code": "" ,"symbol": "$"}, + "AR" : { "code": "ARS" ,"symbol": "$"}, + "AS" : { "code": "USD" ,"symbol": "$"}, + "AT" : { "code": "EUR" ,"symbol": "€"}, + "AU" : { "code": "AUD" ,"symbol": "$"}, + "AW" : { "code": "AWG" ,"symbol": "ƒ"}, + "AX" : { "code": "EUR" ,"symbol": "€"}, + "AZ" : { "code": "AZN" ,"symbol": "₼"}, + "BA" : { "code": "BAM" ,"symbol": "KM"}, + "BB" : { "code": "BBD" ,"symbol": "$"}, + "BD" : { "code": "BDT" ,"symbol": "৳"}, + "BE" : { "code": "EUR" ,"symbol": "€"}, + "BF" : { "code": "XOF" ,"symbol": "CFA"}, + "BG" : { "code": "BGN" ,"symbol": "лв"}, + "BH" : { "code": "BHD" ,"symbol": ".د.ب"}, + "BI" : { "code": "BIF" ,"symbol": "FBu"}, + "BJ" : { "code": "XOF" ,"symbol": "CFA"}, + "BL" : { "code": "EUR" ,"symbol": "€"}, + "BM" : { "code": "BMD" ,"symbol": "$"}, + "BN" : { "code": "BND" ,"symbol": "$"}, + "BO" : { "code": "BOB" ,"symbol": "$b"}, + "BQ" : { "code": "USD" ,"symbol": "$"}, + "BR" : { "code": "BRL" ,"symbol": "R$"}, + "BS" : { "code": "BSD" ,"symbol": "$"}, + "BT" : { "code": "BTN" ,"symbol": "Nu."}, + "BV" : { "code": "NOK" ,"symbol": "kr"}, + "BW" : { "code": "BWP" ,"symbol": "P"}, + "BY" : { "code": "BYR" ,"symbol": "Br"}, + "BZ" : { "code": "BZD" ,"symbol": "BZ$"}, + "CA" : { "code": "CAD" ,"symbol": "$"}, + "CC" : { "code": "AUD" ,"symbol": "$"}, + "CD" : { "code": "CDF" ,"symbol": "FC"}, + "CF" : { "code": "XAF" ,"symbol": "FCFA"}, + "CG" : { "code": "XAF" ,"symbol": "FCFA"}, + "CH" : { "code": "CHF" ,"symbol": "CHF"}, + "CI" : { "code": "XOF" ,"symbol": "CFA"}, + "CK" : { "code": "NZD" ,"symbol": "$"}, + "CL" : { "code": "CLP" ,"symbol": "$"}, + "CM" : { "code": "XAF" ,"symbol": "FCFA"}, + "CN" : { "code": "CNY" ,"symbol": "¥"}, + "CO" : { "code": "COP" ,"symbol": "$"}, + "CR" : { "code": "CRC" ,"symbol": "₡"}, + "CU" : { "code": "CUP" ,"symbol": "₱"}, + "CV" : { "code": "CVE" ,"symbol": "$"}, + "CW" : { "code": "ANG" ,"symbol": "ƒ"}, + "CX" : { "code": "AUD" ,"symbol": "$"}, + "CY" : { "code": "EUR" ,"symbol": "€"}, + "CZ" : { "code": "CZK" ,"symbol": "Kč"}, + "DE" : { "code": "EUR" ,"symbol": "€"}, + "DJ" : { "code": "DJF" ,"symbol": "Fdj"}, + "DK" : { "code": "DKK" ,"symbol": "kr"}, + "DM" : { "code": "XCD" ,"symbol": "$"}, + "DO" : { "code": "DOP" ,"symbol": "RD$"}, + "DZ" : { "code": "DZD" ,"symbol": "دج"}, + "EC" : { "code": "USD" ,"symbol": "$"}, + "EE" : { "code": "EUR" ,"symbol": "€"}, + "EG" : { "code": "EGP" ,"symbol": "£"}, + "EH" : { "code": "MAD" ,"symbol": "MAD"}, + "ER" : { "code": "ERN" ,"symbol": "Nfk"}, + "ES" : { "code": "EUR" ,"symbol": "€"}, + "ET" : { "code": "ETB" ,"symbol": "Br"}, + "FI" : { "code": "EUR" ,"symbol": "€"}, + "FJ" : { "code": "FJD" ,"symbol": "$"}, + "FK" : { "code": "FKP" ,"symbol": "£"}, + "FM" : { "code": "USD" ,"symbol": "$"}, + "FO" : { "code": "DKK" ,"symbol": "kr"}, + "FR" : { "code": "EUR" ,"symbol": "€"}, + "GA" : { "code": "XAF" ,"symbol": "FCFA"}, + "GB" : { "code": "GBP" ,"symbol": "£"}, + "GD" : { "code": "XCD" ,"symbol": "$"}, + "GE" : { "code": "GEL" ,"symbol": "ლ"}, + "GF" : { "code": "EUR" ,"symbol": "€"}, + "GG" : { "code": "GBP" ,"symbol": "£"}, + "GH" : { "code": "GHS" ,"symbol": "GH₵"}, + "GI" : { "code": "GIP" ,"symbol": "£"}, + "GL" : { "code": "DKK" ,"symbol": "kr"}, + "GM" : { "code": "GMD" ,"symbol": "D"}, + "GN" : { "code": "GNF" ,"symbol": "FG"}, + "GP" : { "code": "EUR" ,"symbol": "€"}, + "GQ" : { "code": "XAF" ,"symbol": "FCFA"}, + "GR" : { "code": "EUR" ,"symbol": "€"}, + "GS" : { "code": "GBP" ,"symbol": "£"}, + "GT" : { "code": "GTQ" ,"symbol": "Q"}, + "GU" : { "code": "USD" ,"symbol": "$"}, + "GW" : { "code": "XOF" ,"symbol": "CFA"}, + "GY" : { "code": "GYD" ,"symbol": "$"}, + "HK" : { "code": "HKD" ,"symbol": "$"}, + "HM" : { "code": "AUD" ,"symbol": "$"}, + "HN" : { "code": "HNL" ,"symbol": "L"}, + "HR" : { "code": "HRK" ,"symbol": "kn"}, + "HT" : { "code": "HTG" ,"symbol": "G"}, + "HU" : { "code": "HUF" ,"symbol": "Ft"}, + "ID" : { "code": "IDR" ,"symbol": "Rp"}, + "IE" : { "code": "EUR" ,"symbol": "€"}, + "IL" : { "code": "ILS" ,"symbol": "₪"}, + "IM" : { "code": "GBP" ,"symbol": "£"}, + "IN" : { "code": "INR" ,"symbol": "₹"}, + "IO" : { "code": "USD" ,"symbol": "$"}, + "IQ" : { "code": "IQD" ,"symbol": "ع.د"}, + "IR" : { "code": "IRR" ,"symbol": "﷼"}, + "IS" : { "code": "ISK" ,"symbol": "kr"}, + "IT" : { "code": "EUR" ,"symbol": "€"}, + "JE" : { "code": "GBP" ,"symbol": "£"}, + "JM" : { "code": "JMD" ,"symbol": "J$"}, + "JO" : { "code": "JOD" ,"symbol": "JD"}, + "JP" : { "code": "JPY" ,"symbol": "¥"}, + "KE" : { "code": "KES" ,"symbol": "KSh"}, + "KG" : { "code": "KGS" ,"symbol": "лв"}, + "KH" : { "code": "KHR" ,"symbol": "៛"}, + "KI" : { "code": "AUD" ,"symbol": "$"}, + "KM" : { "code": "KMF" ,"symbol": "CF"}, + "KN" : { "code": "XCD" ,"symbol": "$"}, + "KP" : { "code": "KPW" ,"symbol": "₩"}, + "KR" : { "code": "KRW" ,"symbol": "₩"}, + "KW" : { "code": "KWD" ,"symbol": "KD"}, + "KY" : { "code": "KYD" ,"symbol": "$"}, + "KZ" : { "code": "KZT" ,"symbol": "₸"}, + "LA" : { "code": "LAK" ,"symbol": "₭"}, + "LB" : { "code": "LBP" ,"symbol": "£"}, + "LC" : { "code": "XCD" ,"symbol": "$"}, + "LI" : { "code": "CHF" ,"symbol": "CHF"}, + "LK" : { "code": "LKR" ,"symbol": "₨"}, + "LR" : { "code": "LRD" ,"symbol": "$"}, + "LS" : { "code": "LSL" ,"symbol": "M"}, + "LT" : { "code": "LTL" ,"symbol": "Lt"}, + "LU" : { "code": "EUR" ,"symbol": "€"}, + "LV" : { "code": "EUR" ,"symbol": "€"}, + "LY" : { "code": "LYD" ,"symbol": "LD"}, + "MA" : { "code": "MAD" ,"symbol": "MAD"}, + "MC" : { "code": "EUR" ,"symbol": "€"}, + "MD" : { "code": "MDL" ,"symbol": "lei"}, + "ME" : { "code": "EUR" ,"symbol": "€"}, + "MF" : { "code": "EUR" ,"symbol": "€"}, + "MG" : { "code": "MGA" ,"symbol": "Ar"}, + "MH" : { "code": "USD" ,"symbol": "$"}, + "MK" : { "code": "MKD" ,"symbol": "ден"}, + "ML" : { "code": "XOF" ,"symbol": "CFA"}, + "MM" : { "code": "MMK" ,"symbol": "K"}, + "MN" : { "code": "MNT" ,"symbol": "₮"}, + "MO" : { "code": "MOP" ,"symbol": "MOP$"}, + "MP" : { "code": "USD" ,"symbol": "$"}, + "MQ" : { "code": "EUR" ,"symbol": "€"}, + "MR" : { "code": "MRO" ,"symbol": "UM"}, + "MS" : { "code": "XCD" ,"symbol": "$"}, + "MT" : { "code": "EUR" ,"symbol": "€"}, + "MU" : { "code": "MUR" ,"symbol": "₨"}, + "MV" : { "code": "MVR" ,"symbol": "Rf"}, + "MW" : { "code": "MWK" ,"symbol": "MK"}, + "MX" : { "code": "MXN" ,"symbol": "$"}, + "MY" : { "code": "MYR" ,"symbol": "RM"}, + "MZ" : { "code": "MZN" ,"symbol": "MT"}, + "NA" : { "code": "NAD" ,"symbol": "$"}, + "NC" : { "code": "XPF" ,"symbol": "₣"}, + "NE" : { "code": "XOF" ,"symbol": "CFA"}, + "NF" : { "code": "AUD" ,"symbol": "$"}, + "NG" : { "code": "NGN" ,"symbol": "₦"}, + "NI" : { "code": "NIO" ,"symbol": "C$"}, + "NL" : { "code": "EUR" ,"symbol": "€"}, + "NO" : { "code": "NOK" ,"symbol": "kr"}, + "NP" : { "code": "NPR" ,"symbol": "₨"}, + "NR" : { "code": "AUD" ,"symbol": "$"}, + "NU" : { "code": "NZD" ,"symbol": "$"}, + "NZ" : { "code": "NZD" ,"symbol": "$"}, + "OM" : { "code": "OMR" ,"symbol": "﷼"}, + "PA" : { "code": "PAB" ,"symbol": "B/."}, + "PE" : { "code": "PEN" ,"symbol": "S/."}, + "PF" : { "code": "XPF" ,"symbol": "₣"}, + "PG" : { "code": "PGK" ,"symbol": "K"}, + "PH" : { "code": "PHP" ,"symbol": "₱"}, + "PK" : { "code": "PKR" ,"symbol": "₨"}, + "PL" : { "code": "PLN" ,"symbol": "zł"}, + "PM" : { "code": "EUR" ,"symbol": "€"}, + "PN" : { "code": "NZD" ,"symbol": "$"}, + "PR" : { "code": "USD" ,"symbol": "$"}, + "PS" : { "code": "ILS" ,"symbol": "₪"}, + "PT" : { "code": "EUR" ,"symbol": "€"}, + "PW" : { "code": "USD" ,"symbol": "$"}, + "PY" : { "code": "PYG" ,"symbol": "Gs"}, + "QA" : { "code": "QAR" ,"symbol": "﷼"}, + "RE" : { "code": "EUR" ,"symbol": "€"}, + "RO" : { "code": "RON" ,"symbol": "lei"}, + "RS" : { "code": "RSD" ,"symbol": "Дин."}, + "RU" : { "code": "RUB" ,"symbol": "₽"}, + "RW" : { "code": "RWF" ,"symbol": "R₣"}, + "SA" : { "code": "SAR" ,"symbol": "﷼"}, + "SB" : { "code": "SBD" ,"symbol": "$"}, + "SC" : { "code": "SCR" ,"symbol": "₨"}, + "SD" : { "code": "SDG" ,"symbol": "ج.س."}, + "SE" : { "code": "SEK" ,"symbol": "kr"}, + "SG" : { "code": "SGD" ,"symbol": "S$"}, + "SH" : { "code": "SHP" ,"symbol": "£"}, + "SI" : { "code": "EUR" ,"symbol": "€"}, + "SJ" : { "code": "NOK" ,"symbol": "kr"}, + "SK" : { "code": "EUR" ,"symbol": "€"}, + "SL" : { "code": "SLL" ,"symbol": "Le"}, + "SM" : { "code": "EUR" ,"symbol": "€"}, + "SN" : { "code": "XOF" ,"symbol": "CFA"}, + "SO" : { "code": "SOS" ,"symbol": "S"}, + "SR" : { "code": "SRD" ,"symbol": "$"}, + "SS" : { "code": "SSP" ,"symbol": "£"}, + "ST" : { "code": "STD" ,"symbol": "Db"}, + "SV" : { "code": "USD" ,"symbol": "$"}, + "SX" : { "code": "ANG" ,"symbol": "ƒ"}, + "SY" : { "code": "SYP" ,"symbol": "£"}, + "SZ" : { "code": "SZL" ,"symbol": "E"}, + "TC" : { "code": "USD" ,"symbol": "$"}, + "TD" : { "code": "XAF" ,"symbol": "FCFA"}, + "TF" : { "code": "EUR" ,"symbol": "€"}, + "TG" : { "code": "XOF" ,"symbol": "CFA"}, + "TH" : { "code": "THB" ,"symbol": "฿"}, + "TJ" : { "code": "TJS" ,"symbol": "SM"}, + "TK" : { "code": "NZD" ,"symbol": "$"}, + "TL" : { "code": "USD" ,"symbol": "$"}, + "TM" : { "code": "TMT" ,"symbol": "T"}, + "TN" : { "code": "TND" ,"symbol": "د.ت"}, + "TO" : { "code": "TOP" ,"symbol": "T$"}, + "TR" : { "code": "TRY" ,"symbol": "₺"}, + "TT" : { "code": "TTD" ,"symbol": "TT$"}, + "TV" : { "code": "AUD" ,"symbol": "$"}, + "TW" : { "code": "TWD" ,"symbol": "NT$"}, + "TZ" : { "code": "TZS" ,"symbol": "TSh"}, + "UA" : { "code": "UAH" ,"symbol": "₴"}, + "UG" : { "code": "UGX" ,"symbol": "USh"}, + "UM" : { "code": "USD" ,"symbol": "$"}, + "US" : { "code": "USD" ,"symbol": "$"}, + "UY" : { "code": "UYU" ,"symbol": "$U"}, + "UZ" : { "code": "UZS" ,"symbol": "лв"}, + "VA" : { "code": "EUR" ,"symbol": "€"}, + "VC" : { "code": "XCD" ,"symbol": "$"}, + "VE" : { "code": "VEF" ,"symbol": "Bs"}, + "VG" : { "code": "USD" ,"symbol": "$"}, + "VI" : { "code": "USD" ,"symbol": "$"}, + "VN" : { "code": "VND" ,"symbol": "₫"}, + "VU" : { "code": "VUV" ,"symbol": "VT"}, + "WF" : { "code": "XPF" ,"symbol": "₣"}, + "WS" : { "code": "WST" ,"symbol": "WS$"}, + "XK" : { "code": "EUR" ,"symbol": "€"}, + "YE" : { "code": "YER" ,"symbol": "﷼"}, + "YT" : { "code": "EUR" ,"symbol": "€"}, + "ZA" : { "code": "ZAR" ,"symbol": "R"}, + "ZM" : { "code": "ZMK" ,"symbol": "ZK"}, + "ZW" : { "code": "ZWL" ,"symbol": "$"} +} diff --git a/ipinfo/flags.json b/ipinfo/flags.json new file mode 100644 index 0000000..3ec4619 --- /dev/null +++ b/ipinfo/flags.json @@ -0,0 +1,252 @@ +{ + "AD": {"emoji": "🇦🇩","unicode": "U+1F1E6 U+1F1E9"}, + "AE": {"emoji": "🇦🇪","unicode": "U+1F1E6 U+1F1EA"}, + "AF": {"emoji": "🇦🇫","unicode": "U+1F1E6 U+1F1EB"}, + "AG": {"emoji": "🇦🇬","unicode": "U+1F1E6 U+1F1EC"}, + "AI": {"emoji": "🇦🇮","unicode": "U+1F1E6 U+1F1EE"}, + "AL": {"emoji": "🇦🇱","unicode": "U+1F1E6 U+1F1F1"}, + "AM": {"emoji": "🇦🇲","unicode": "U+1F1E6 U+1F1F2"}, + "AO": {"emoji": "🇦🇴","unicode": "U+1F1E6 U+1F1F4"}, + "AQ": {"emoji": "🇦🇶","unicode": "U+1F1E6 U+1F1F6"}, + "AR": {"emoji": "🇦🇷","unicode": "U+1F1E6 U+1F1F7"}, + "AS": {"emoji": "🇦🇸","unicode": "U+1F1E6 U+1F1F8"}, + "AT": {"emoji": "🇦🇹","unicode": "U+1F1E6 U+1F1F9"}, + "AU": {"emoji": "🇦🇺","unicode": "U+1F1E6 U+1F1FA"}, + "AW": {"emoji": "🇦🇼","unicode": "U+1F1E6 U+1F1FC"}, + "AX": {"emoji": "🇦🇽","unicode": "U+1F1E6 U+1F1FD"}, + "AZ": {"emoji": "🇦🇿","unicode": "U+1F1E6 U+1F1FF"}, + "BA": {"emoji": "🇧🇦","unicode": "U+1F1E7 U+1F1E6"}, + "BB": {"emoji": "🇧🇧","unicode": "U+1F1E7 U+1F1E7"}, + "BD": {"emoji": "🇧🇩","unicode": "U+1F1E7 U+1F1E9"}, + "BE": {"emoji": "🇧🇪","unicode": "U+1F1E7 U+1F1EA"}, + "BF": {"emoji": "🇧🇫","unicode": "U+1F1E7 U+1F1EB"}, + "BG": {"emoji": "🇧🇬","unicode": "U+1F1E7 U+1F1EC"}, + "BH": {"emoji": "🇧🇭","unicode": "U+1F1E7 U+1F1ED"}, + "BI": {"emoji": "🇧🇮","unicode": "U+1F1E7 U+1F1EE"}, + "BJ": {"emoji": "🇧🇯","unicode": "U+1F1E7 U+1F1EF"}, + "BL": {"emoji": "🇧🇱","unicode": "U+1F1E7 U+1F1F1"}, + "BM": {"emoji": "🇧🇲","unicode": "U+1F1E7 U+1F1F2"}, + "BN": {"emoji": "🇧🇳","unicode": "U+1F1E7 U+1F1F3"}, + "BO": {"emoji": "🇧🇴","unicode": "U+1F1E7 U+1F1F4"}, + "BQ": {"emoji": "🇧🇶","unicode": "U+1F1E7 U+1F1F6"}, + "BR": {"emoji": "🇧🇷","unicode": "U+1F1E7 U+1F1F7"}, + "BS": {"emoji": "🇧🇸","unicode": "U+1F1E7 U+1F1F8"}, + "BT": {"emoji": "🇧🇹","unicode": "U+1F1E7 U+1F1F9"}, + "BV": {"emoji": "🇧🇻","unicode": "U+1F1E7 U+1F1FB"}, + "BW": {"emoji": "🇧🇼","unicode": "U+1F1E7 U+1F1FC"}, + "BY": {"emoji": "🇧🇾","unicode": "U+1F1E7 U+1F1FE"}, + "BZ": {"emoji": "🇧🇿","unicode": "U+1F1E7 U+1F1FF"}, + "CA": {"emoji": "🇨🇦","unicode": "U+1F1E8 U+1F1E6"}, + "CC": {"emoji": "🇨🇨","unicode": "U+1F1E8 U+1F1E8"}, + "CD": {"emoji": "🇨🇩","unicode": "U+1F1E8 U+1F1E9"}, + "CF": {"emoji": "🇨🇫","unicode": "U+1F1E8 U+1F1EB"}, + "CG": {"emoji": "🇨🇬","unicode": "U+1F1E8 U+1F1EC"}, + "CH": {"emoji": "🇨🇭","unicode": "U+1F1E8 U+1F1ED"}, + "CI": {"emoji": "🇨🇮","unicode": "U+1F1E8 U+1F1EE"}, + "CK": {"emoji": "🇨🇰","unicode": "U+1F1E8 U+1F1F0"}, + "CL": {"emoji": "🇨🇱","unicode": "U+1F1E8 U+1F1F1"}, + "CM": {"emoji": "🇨🇲","unicode": "U+1F1E8 U+1F1F2"}, + "CN": {"emoji": "🇨🇳","unicode": "U+1F1E8 U+1F1F3"}, + "CO": {"emoji": "🇨🇴","unicode": "U+1F1E8 U+1F1F4"}, + "CR": {"emoji": "🇨🇷","unicode": "U+1F1E8 U+1F1F7"}, + "CU": {"emoji": "🇨🇺","unicode": "U+1F1E8 U+1F1FA"}, + "CV": {"emoji": "🇨🇻","unicode": "U+1F1E8 U+1F1FB"}, + "CW": {"emoji": "🇨🇼","unicode": "U+1F1E8 U+1F1FC"}, + "CX": {"emoji": "🇨🇽","unicode": "U+1F1E8 U+1F1FD"}, + "CY": {"emoji": "🇨🇾","unicode": "U+1F1E8 U+1F1FE"}, + "CZ": {"emoji": "🇨🇿","unicode": "U+1F1E8 U+1F1FF"}, + "DE": {"emoji": "🇩🇪","unicode": "U+1F1E9 U+1F1EA"}, + "DJ": {"emoji": "🇩🇯","unicode": "U+1F1E9 U+1F1EF"}, + "DK": {"emoji": "🇩🇰","unicode": "U+1F1E9 U+1F1F0"}, + "DM": {"emoji": "🇩🇲","unicode": "U+1F1E9 U+1F1F2"}, + "DO": {"emoji": "🇩🇴","unicode": "U+1F1E9 U+1F1F4"}, + "DZ": {"emoji": "🇩🇿","unicode": "U+1F1E9 U+1F1FF"}, + "EC": {"emoji": "🇪🇨","unicode": "U+1F1EA U+1F1E8"}, + "EE": {"emoji": "🇪🇪","unicode": "U+1F1EA U+1F1EA"}, + "EG": {"emoji": "🇪🇬","unicode": "U+1F1EA U+1F1EC"}, + "EH": {"emoji": "🇪🇭","unicode": "U+1F1EA U+1F1ED"}, + "ER": {"emoji": "🇪🇷","unicode": "U+1F1EA U+1F1F7"}, + "ES": {"emoji": "🇪🇸","unicode": "U+1F1EA U+1F1F8"}, + "ET": {"emoji": "🇪🇹","unicode": "U+1F1EA U+1F1F9"}, + "FI": {"emoji": "🇫🇮","unicode": "U+1F1EB U+1F1EE"}, + "FJ": {"emoji": "🇫🇯","unicode": "U+1F1EB U+1F1EF"}, + "FK": {"emoji": "🇫🇰","unicode": "U+1F1EB U+1F1F0"}, + "FM": {"emoji": "🇫🇲","unicode": "U+1F1EB U+1F1F2"}, + "FO": {"emoji": "🇫🇴","unicode": "U+1F1EB U+1F1F4"}, + "FR": {"emoji": "🇫🇷","unicode": "U+1F1EB U+1F1F7"}, + "GA": {"emoji": "🇬🇦","unicode": "U+1F1EC U+1F1E6"}, + "GB": {"emoji": "🇬🇧","unicode": "U+1F1EC U+1F1E7"}, + "GD": {"emoji": "🇬🇩","unicode": "U+1F1EC U+1F1E9"}, + "GE": {"emoji": "🇬🇪","unicode": "U+1F1EC U+1F1EA"}, + "GF": {"emoji": "🇬🇫","unicode": "U+1F1EC U+1F1EB"}, + "GG": {"emoji": "🇬🇬","unicode": "U+1F1EC U+1F1EC"}, + "GH": {"emoji": "🇬🇭","unicode": "U+1F1EC U+1F1ED"}, + "GI": {"emoji": "🇬🇮","unicode": "U+1F1EC U+1F1EE"}, + "GL": {"emoji": "🇬🇱","unicode": "U+1F1EC U+1F1F1"}, + "GM": {"emoji": "🇬🇲","unicode": "U+1F1EC U+1F1F2"}, + "GN": {"emoji": "🇬🇳","unicode": "U+1F1EC U+1F1F3"}, + "GP": {"emoji": "🇬🇵","unicode": "U+1F1EC U+1F1F5"}, + "GQ": {"emoji": "🇬🇶","unicode": "U+1F1EC U+1F1F6"}, + "GR": {"emoji": "🇬🇷","unicode": "U+1F1EC U+1F1F7"}, + "GS": {"emoji": "🇬🇸","unicode": "U+1F1EC U+1F1F8"}, + "GT": {"emoji": "🇬🇹","unicode": "U+1F1EC U+1F1F9"}, + "GU": {"emoji": "🇬🇺","unicode": "U+1F1EC U+1F1FA"}, + "GW": {"emoji": "🇬🇼","unicode": "U+1F1EC U+1F1FC"}, + "GY": {"emoji": "🇬🇾","unicode": "U+1F1EC U+1F1FE"}, + "HK": {"emoji": "🇭🇰","unicode": "U+1F1ED U+1F1F0"}, + "HM": {"emoji": "🇭🇲","unicode": "U+1F1ED U+1F1F2"}, + "HN": {"emoji": "🇭🇳","unicode": "U+1F1ED U+1F1F3"}, + "HR": {"emoji": "🇭🇷","unicode": "U+1F1ED U+1F1F7"}, + "HT": {"emoji": "🇭🇹","unicode": "U+1F1ED U+1F1F9"}, + "HU": {"emoji": "🇭🇺","unicode": "U+1F1ED U+1F1FA"}, + "ID": {"emoji": "🇮🇩","unicode": "U+1F1EE U+1F1E9"}, + "IE": {"emoji": "🇮🇪","unicode": "U+1F1EE U+1F1EA"}, + "IL": {"emoji": "🇮🇱","unicode": "U+1F1EE U+1F1F1"}, + "IM": {"emoji": "🇮🇲","unicode": "U+1F1EE U+1F1F2"}, + "IN": {"emoji": "🇮🇳","unicode": "U+1F1EE U+1F1F3"}, + "IO": {"emoji": "🇮🇴","unicode": "U+1F1EE U+1F1F4"}, + "IQ": {"emoji": "🇮🇶","unicode": "U+1F1EE U+1F1F6"}, + "IR": {"emoji": "🇮🇷","unicode": "U+1F1EE U+1F1F7"}, + "IS": {"emoji": "🇮🇸","unicode": "U+1F1EE U+1F1F8"}, + "IT": {"emoji": "🇮🇹","unicode": "U+1F1EE U+1F1F9"}, + "JE": {"emoji": "🇯🇪","unicode": "U+1F1EF U+1F1EA"}, + "JM": {"emoji": "🇯🇲","unicode": "U+1F1EF U+1F1F2"}, + "JO": {"emoji": "🇯🇴","unicode": "U+1F1EF U+1F1F4"}, + "JP": {"emoji": "🇯🇵","unicode": "U+1F1EF U+1F1F5"}, + "KE": {"emoji": "🇰🇪","unicode": "U+1F1F0 U+1F1EA"}, + "KG": {"emoji": "🇰🇬","unicode": "U+1F1F0 U+1F1EC"}, + "KH": {"emoji": "🇰🇭","unicode": "U+1F1F0 U+1F1ED"}, + "KI": {"emoji": "🇰🇮","unicode": "U+1F1F0 U+1F1EE"}, + "KM": {"emoji": "🇰🇲","unicode": "U+1F1F0 U+1F1F2"}, + "KN": {"emoji": "🇰🇳","unicode": "U+1F1F0 U+1F1F3"}, + "KP": {"emoji": "🇰🇵","unicode": "U+1F1F0 U+1F1F5"}, + "KR": {"emoji": "🇰🇷","unicode": "U+1F1F0 U+1F1F7"}, + "KW": {"emoji": "🇰🇼","unicode": "U+1F1F0 U+1F1FC"}, + "KY": {"emoji": "🇰🇾","unicode": "U+1F1F0 U+1F1FE"}, + "KZ": {"emoji": "🇰🇿","unicode": "U+1F1F0 U+1F1FF"}, + "LA": {"emoji": "🇱🇦","unicode": "U+1F1F1 U+1F1E6"}, + "LB": {"emoji": "🇱🇧","unicode": "U+1F1F1 U+1F1E7"}, + "LC": {"emoji": "🇱🇨","unicode": "U+1F1F1 U+1F1E8"}, + "LI": {"emoji": "🇱🇮","unicode": "U+1F1F1 U+1F1EE"}, + "LK": {"emoji": "🇱🇰","unicode": "U+1F1F1 U+1F1F0"}, + "LR": {"emoji": "🇱🇷","unicode": "U+1F1F1 U+1F1F7"}, + "LS": {"emoji": "🇱🇸","unicode": "U+1F1F1 U+1F1F8"}, + "LT": {"emoji": "🇱🇹","unicode": "U+1F1F1 U+1F1F9"}, + "LU": {"emoji": "🇱🇺","unicode": "U+1F1F1 U+1F1FA"}, + "LV": {"emoji": "🇱🇻","unicode": "U+1F1F1 U+1F1FB"}, + "LY": {"emoji": "🇱🇾","unicode": "U+1F1F1 U+1F1FE"}, + "MA": {"emoji": "🇲🇦","unicode": "U+1F1F2 U+1F1E6"}, + "MC": {"emoji": "🇲🇨","unicode": "U+1F1F2 U+1F1E8"}, + "MD": {"emoji": "🇲🇩","unicode": "U+1F1F2 U+1F1E9"}, + "ME": {"emoji": "🇲🇪","unicode": "U+1F1F2 U+1F1EA"}, + "MF": {"emoji": "🇲🇫","unicode": "U+1F1F2 U+1F1EB"}, + "MG": {"emoji": "🇲🇬","unicode": "U+1F1F2 U+1F1EC"}, + "MH": {"emoji": "🇲🇭","unicode": "U+1F1F2 U+1F1ED"}, + "MK": {"emoji": "🇲🇰","unicode": "U+1F1F2 U+1F1F0"}, + "ML": {"emoji": "🇲🇱","unicode": "U+1F1F2 U+1F1F1"}, + "MM": {"emoji": "🇲🇲","unicode": "U+1F1F2 U+1F1F2"}, + "MN": {"emoji": "🇲🇳","unicode": "U+1F1F2 U+1F1F3"}, + "MO": {"emoji": "🇲🇴","unicode": "U+1F1F2 U+1F1F4"}, + "MP": {"emoji": "🇲🇵","unicode": "U+1F1F2 U+1F1F5"}, + "MQ": {"emoji": "🇲🇶","unicode": "U+1F1F2 U+1F1F6"}, + "MR": {"emoji": "🇲🇷","unicode": "U+1F1F2 U+1F1F7"}, + "MS": {"emoji": "🇲🇸","unicode": "U+1F1F2 U+1F1F8"}, + "MT": {"emoji": "🇲🇹","unicode": "U+1F1F2 U+1F1F9"}, + "MU": {"emoji": "🇲🇺","unicode": "U+1F1F2 U+1F1FA"}, + "MV": {"emoji": "🇲🇻","unicode": "U+1F1F2 U+1F1FB"}, + "MW": {"emoji": "🇲🇼","unicode": "U+1F1F2 U+1F1FC"}, + "MX": {"emoji": "🇲🇽","unicode": "U+1F1F2 U+1F1FD"}, + "MY": {"emoji": "🇲🇾","unicode": "U+1F1F2 U+1F1FE"}, + "MZ": {"emoji": "🇲🇿","unicode": "U+1F1F2 U+1F1FF"}, + "NA": {"emoji": "🇳🇦","unicode": "U+1F1F3 U+1F1E6"}, + "NC": {"emoji": "🇳🇨","unicode": "U+1F1F3 U+1F1E8"}, + "NE": {"emoji": "🇳🇪","unicode": "U+1F1F3 U+1F1EA"}, + "NF": {"emoji": "🇳🇫","unicode": "U+1F1F3 U+1F1EB"}, + "NG": {"emoji": "🇳🇬","unicode": "U+1F1F3 U+1F1EC"}, + "NI": {"emoji": "🇳🇮","unicode": "U+1F1F3 U+1F1EE"}, + "NL": {"emoji": "🇳🇱","unicode": "U+1F1F3 U+1F1F1"}, + "NO": {"emoji": "🇳🇴","unicode": "U+1F1F3 U+1F1F4"}, + "NP": {"emoji": "🇳🇵","unicode": "U+1F1F3 U+1F1F5"}, + "NR": {"emoji": "🇳🇷","unicode": "U+1F1F3 U+1F1F7"}, + "NU": {"emoji": "🇳🇺","unicode": "U+1F1F3 U+1F1FA"}, + "NZ": {"emoji": "🇳🇿","unicode": "U+1F1F3 U+1F1FF"}, + "OM": {"emoji": "🇴🇲","unicode": "U+1F1F4 U+1F1F2"}, + "PA": {"emoji": "🇵🇦","unicode": "U+1F1F5 U+1F1E6"}, + "PE": {"emoji": "🇵🇪","unicode": "U+1F1F5 U+1F1EA"}, + "PF": {"emoji": "🇵🇫","unicode": "U+1F1F5 U+1F1EB"}, + "PG": {"emoji": "🇵🇬","unicode": "U+1F1F5 U+1F1EC"}, + "PH": {"emoji": "🇵🇭","unicode": "U+1F1F5 U+1F1ED"}, + "PK": {"emoji": "🇵🇰","unicode": "U+1F1F5 U+1F1F0"}, + "PL": {"emoji": "🇵🇱","unicode": "U+1F1F5 U+1F1F1"}, + "PM": {"emoji": "🇵🇲","unicode": "U+1F1F5 U+1F1F2"}, + "PN": {"emoji": "🇵🇳","unicode": "U+1F1F5 U+1F1F3"}, + "PR": {"emoji": "🇵🇷","unicode": "U+1F1F5 U+1F1F7"}, + "PS": {"emoji": "🇵🇸","unicode": "U+1F1F5 U+1F1F8"}, + "PT": {"emoji": "🇵🇹","unicode": "U+1F1F5 U+1F1F9"}, + "PW": {"emoji": "🇵🇼","unicode": "U+1F1F5 U+1F1FC"}, + "PY": {"emoji": "🇵🇾","unicode": "U+1F1F5 U+1F1FE"}, + "QA": {"emoji": "🇶🇦","unicode": "U+1F1F6 U+1F1E6"}, + "RE": {"emoji": "🇷🇪","unicode": "U+1F1F7 U+1F1EA"}, + "RO": {"emoji": "🇷🇴","unicode": "U+1F1F7 U+1F1F4"}, + "RS": {"emoji": "🇷🇸","unicode": "U+1F1F7 U+1F1F8"}, + "RU": {"emoji": "🇷🇺","unicode": "U+1F1F7 U+1F1FA"}, + "RW": {"emoji": "🇷🇼","unicode": "U+1F1F7 U+1F1FC"}, + "SA": {"emoji": "🇸🇦","unicode": "U+1F1F8 U+1F1E6"}, + "SB": {"emoji": "🇸🇧","unicode": "U+1F1F8 U+1F1E7"}, + "SC": {"emoji": "🇸🇨","unicode": "U+1F1F8 U+1F1E8"}, + "SD": {"emoji": "🇸🇩","unicode": "U+1F1F8 U+1F1E9"}, + "SE": {"emoji": "🇸🇪","unicode": "U+1F1F8 U+1F1EA"}, + "SG": {"emoji": "🇸🇬","unicode": "U+1F1F8 U+1F1EC"}, + "SH": {"emoji": "🇸🇭","unicode": "U+1F1F8 U+1F1ED"}, + "SI": {"emoji": "🇸🇮","unicode": "U+1F1F8 U+1F1EE"}, + "SJ": {"emoji": "🇸🇯","unicode": "U+1F1F8 U+1F1EF"}, + "SK": {"emoji": "🇸🇰","unicode": "U+1F1F8 U+1F1F0"}, + "SL": {"emoji": "🇸🇱","unicode": "U+1F1F8 U+1F1F1"}, + "SM": {"emoji": "🇸🇲","unicode": "U+1F1F8 U+1F1F2"}, + "SN": {"emoji": "🇸🇳","unicode": "U+1F1F8 U+1F1F3"}, + "SO": {"emoji": "🇸🇴","unicode": "U+1F1F8 U+1F1F4"}, + "SR": {"emoji": "🇸🇷","unicode": "U+1F1F8 U+1F1F7"}, + "SS": {"emoji": "🇸🇸","unicode": "U+1F1F8 U+1F1F8"}, + "ST": {"emoji": "🇸🇹","unicode": "U+1F1F8 U+1F1F9"}, + "SV": {"emoji": "🇸🇻","unicode": "U+1F1F8 U+1F1FB"}, + "SX": {"emoji": "🇸🇽","unicode": "U+1F1F8 U+1F1FD"}, + "SY": {"emoji": "🇸🇾","unicode": "U+1F1F8 U+1F1FE"}, + "SZ": {"emoji": "🇸🇿","unicode": "U+1F1F8 U+1F1FF"}, + "TC": {"emoji": "🇹🇨","unicode": "U+1F1F9 U+1F1E8"}, + "TD": {"emoji": "🇹🇩","unicode": "U+1F1F9 U+1F1E9"}, + "TF": {"emoji": "🇹🇫","unicode": "U+1F1F9 U+1F1EB"}, + "TG": {"emoji": "🇹🇬","unicode": "U+1F1F9 U+1F1EC"}, + "TH": {"emoji": "🇹🇭","unicode": "U+1F1F9 U+1F1ED"}, + "TJ": {"emoji": "🇹🇯","unicode": "U+1F1F9 U+1F1EF"}, + "TK": {"emoji": "🇹🇰","unicode": "U+1F1F9 U+1F1F0"}, + "TL": {"emoji": "🇹🇱","unicode": "U+1F1F9 U+1F1F1"}, + "TM": {"emoji": "🇹🇲","unicode": "U+1F1F9 U+1F1F2"}, + "TN": {"emoji": "🇹🇳","unicode": "U+1F1F9 U+1F1F3"}, + "TO": {"emoji": "🇹🇴","unicode": "U+1F1F9 U+1F1F4"}, + "TR": {"emoji": "🇹🇷","unicode": "U+1F1F9 U+1F1F7"}, + "TT": {"emoji": "🇹🇹","unicode": "U+1F1F9 U+1F1F9"}, + "TV": {"emoji": "🇹🇻","unicode": "U+1F1F9 U+1F1FB"}, + "TW": {"emoji": "🇹🇼","unicode": "U+1F1F9 U+1F1FC"}, + "TZ": {"emoji": "🇹🇿","unicode": "U+1F1F9 U+1F1FF"}, + "UA": {"emoji": "🇺🇦","unicode": "U+1F1FA U+1F1E6"}, + "UG": {"emoji": "🇺🇬","unicode": "U+1F1FA U+1F1EC"}, + "UM": {"emoji": "🇺🇲","unicode": "U+1F1FA U+1F1F2"}, + "US": {"emoji": "🇺🇸","unicode": "U+1F1FA U+1F1F8"}, + "UY": {"emoji": "🇺🇾","unicode": "U+1F1FA U+1F1FE"}, + "UZ": {"emoji": "🇺🇿","unicode": "U+1F1FA U+1F1FF"}, + "VA": {"emoji": "🇻🇦","unicode": "U+1F1FB U+1F1E6"}, + "VC": {"emoji": "🇻🇨","unicode": "U+1F1FB U+1F1E8"}, + "VE": {"emoji": "🇻🇪","unicode": "U+1F1FB U+1F1EA"}, + "VG": {"emoji": "🇻🇬","unicode": "U+1F1FB U+1F1EC"}, + "VI": {"emoji": "🇻🇮","unicode": "U+1F1FB U+1F1EE"}, + "VN": {"emoji": "🇻🇳","unicode": "U+1F1FB U+1F1F3"}, + "VU": {"emoji": "🇻🇺","unicode": "U+1F1FB U+1F1FA"}, + "WF": {"emoji": "🇼🇫","unicode": "U+1F1FC U+1F1EB"}, + "WS": {"emoji": "🇼🇸","unicode": "U+1F1FC U+1F1F8"}, + "XK": {"emoji": "🇽🇰","unicode": "U+1F1FD U+1F1F0"}, + "YE": {"emoji": "🇾🇪","unicode": "U+1F1FE U+1F1EA"}, + "YT": {"emoji": "🇾🇹","unicode": "U+1F1FE U+1F1F9"}, + "ZA": {"emoji": "🇿🇦","unicode": "U+1F1FF U+1F1E6"}, + "ZM": {"emoji": "🇿🇲","unicode": "U+1F1FF U+1F1F2"}, + "ZW": {"emoji": "🇿🇼","unicode": "U+1F1FF U+1F1FC"} +} diff --git a/ipinfo/handler.py b/ipinfo/handler.py index 469cdeb..5948930 100644 --- a/ipinfo/handler.py +++ b/ipinfo/handler.py @@ -17,6 +17,9 @@ API_URL, COUNTRY_FILE_DEFAULT, COUNTRY_EU_FILE_DEFAULT, + COUNTRY_FLAG_FILE_DEFAULT, + COUNTRY_CURRENCY_FILE_DEFAULT, + CONTINENT_FILE_DEFAULT, BATCH_MAX_SIZE, CACHE_MAXSIZE, CACHE_TTL, @@ -41,19 +44,40 @@ def __init__(self, access_token=None, **kwargs): self.access_token = access_token # load countries file - self.countries = handler_utils.read_country_names( + self.countries = handler_utils.read_json_file( kwargs.get("countries_file") if kwargs.get("countries_file") else COUNTRY_FILE_DEFAULT ) # load eu countries file - self.eu_countries = handler_utils.read_country_names( + self.eu_countries = handler_utils.read_json_file( kwargs.get("eu_countries_file") if kwargs.get("eu_countries_file") else COUNTRY_EU_FILE_DEFAULT ) + # load countries flags file + self.countries_flags = handler_utils.read_json_file( + kwargs.get("countries_flags_file") + if kwargs.get("countries_flags_file") + else COUNTRY_FLAG_FILE_DEFAULT + ) + + # load countries currency file + self.countries_currencies = handler_utils.read_json_file( + kwargs.get("countries_currencies_file") + if kwargs.get("countries_currencies_file") + else COUNTRY_CURRENCY_FILE_DEFAULT + ) + + # load continent file + self.continents = handler_utils.read_json_file( + kwargs.get("continent_file") + if kwargs.get("continent_file") + else CONTINENT_FILE_DEFAULT + ) + # setup req opts self.request_options = kwargs.get("request_options", {}) if "timeout" not in self.request_options: @@ -110,7 +134,12 @@ def getDetails(self, ip_address=None, timeout=None): # format & cache handler_utils.format_details( - details, self.countries, self.eu_countries + details, + self.countries, + self.eu_countries, + self.countries_flags, + self.countries_currencies, + self.continents, ) self.cache[cache_key(ip_address)] = details @@ -204,9 +233,12 @@ def getBatchDetails( chunk = lookup_addresses[i : i + batch_size] # lookup - response = requests.post( - url, json=chunk, headers=headers, **req_opts - ) + try: + response = requests.post( + url, json=chunk, headers=headers, **req_opts + ) + except Exception as e: + return handler_utils.return_or_fail(raise_on_fail, e, result) # fail on bad status codes try: @@ -228,7 +260,12 @@ def getBatchDetails( for detail in result.values(): if isinstance(detail, dict): handler_utils.format_details( - detail, self.countries, self.eu_countries + detail, + self.countries, + self.eu_countries, + self.countries_flags, + self.countries_currencies, + self.continents, ) return result diff --git a/ipinfo/handler_async.py b/ipinfo/handler_async.py index 91a8ae9..145cf15 100644 --- a/ipinfo/handler_async.py +++ b/ipinfo/handler_async.py @@ -18,6 +18,9 @@ API_URL, COUNTRY_EU_FILE_DEFAULT, COUNTRY_FILE_DEFAULT, + COUNTRY_FLAG_FILE_DEFAULT, + COUNTRY_CURRENCY_FILE_DEFAULT, + CONTINENT_FILE_DEFAULT, BATCH_MAX_SIZE, CACHE_MAXSIZE, CACHE_TTL, @@ -42,19 +45,40 @@ def __init__(self, access_token=None, **kwargs): self.access_token = access_token # load countries file - self.countries = handler_utils.read_country_names( + self.countries = handler_utils.read_json_file( kwargs.get("countries_file") if kwargs.get("countries_file") else COUNTRY_FILE_DEFAULT ) # load eu countries file - self.eu_countries = handler_utils.read_country_names( + self.eu_countries = handler_utils.read_json_file( kwargs.get("eu_countries_file") if kwargs.get("eu_countries_file") else COUNTRY_EU_FILE_DEFAULT ) + # load countries flags file + self.countries_flags = handler_utils.read_json_file( + kwargs.get("countries_flags_file") + if kwargs.get("countries_flags_file") + else COUNTRY_FLAG_FILE_DEFAULT + ) + + # load countries currency file + self.countries_currencies = handler_utils.read_json_file( + kwargs.get("countries_currencies_file") + if kwargs.get("countries_currencies_file") + else COUNTRY_CURRENCY_FILE_DEFAULT + ) + + # load continent file + self.continents = handler_utils.read_json_file( + kwargs.get("continent_file") + if kwargs.get("continent_file") + else CONTINENT_FILE_DEFAULT + ) + # setup req opts self.request_options = kwargs.get("request_options", {}) if "timeout" not in self.request_options: @@ -133,7 +157,12 @@ async def getDetails(self, ip_address=None, timeout=None): # format & cache handler_utils.format_details( - details, self.countries, self.eu_countries + details, + self.countries, + self.eu_countries, + self.countries_flags, + self.countries_currencies, + self.continents, ) self.cache[cache_key(ip_address)] = details @@ -264,12 +293,15 @@ async def _do_batch_req( """ Coroutine which will do the actual POST request for getBatchDetails. """ - resp = await self.httpsess.post( - url, - data=json.dumps(chunk), - headers=headers, - timeout=timeout_per_batch, - ) + try: + resp = await self.httpsess.post( + url, + data=json.dumps(chunk), + headers=headers, + timeout=timeout_per_batch, + ) + except Exception as e: + return handler_utils.return_or_fail(raise_on_fail, e, None) # gather data try: @@ -285,7 +317,12 @@ async def _do_batch_req( for ip_address, details in json_resp.items(): if isinstance(details, dict): handler_utils.format_details( - details, self.countries, self.eu_countries + details, + self.countries, + self.eu_countries, + self.countries_flags, + self.countries_currencies, + self.continents, ) self.cache[cache_key(ip_address)] = details diff --git a/ipinfo/handler_utils.py b/ipinfo/handler_utils.py index f383f89..b81d1b2 100644 --- a/ipinfo/handler_utils.py +++ b/ipinfo/handler_utils.py @@ -5,6 +5,7 @@ import json import os import sys +import copy from .version import SDK_VERSION @@ -17,6 +18,12 @@ COUNTRY_EU_FILE_DEFAULT = "eu.json" +COUNTRY_FLAG_FILE_DEFAULT = "flags.json" + +COUNTRY_CURRENCY_FILE_DEFAULT = "currency.json" + +CONTINENT_FILE_DEFAULT = "continent.json" + # The max amount of IPs allowed by the API per batch request. BATCH_MAX_SIZE = 1000 @@ -52,14 +59,28 @@ def get_headers(access_token): return headers -def format_details(details, countries, eu_countries): +def format_details( + details, + countries, + eu_countries, + countries_flags, + countries_currencies, + continents, +): """ Format details given a countries object. - - The countries object can be retrieved from read_country_names. """ details["country_name"] = countries.get(details.get("country")) details["isEU"] = details.get("country") in eu_countries + details["country_flag"] = copy.deepcopy( + countries_flags.get(details.get("country")) + ) + details["country_currency"] = copy.deepcopy( + countries_currencies.get(details.get("country")) + ) + details["continent"] = copy.deepcopy( + continents.get(details.get("country")) + ) details["latitude"], details["longitude"] = read_coords(details.get("loc")) @@ -77,13 +98,12 @@ def read_coords(location): return lat, lon -def read_country_names(countries_file): +def read_json_file(json_file): """ - Read list of countries from specified country file or - default file. + Read a list of countries from specified country file or default file. """ - countries_file = os.path.join(os.path.dirname(__file__), countries_file) - with open(countries_file) as f: + json_file = os.path.join(os.path.dirname(__file__), json_file) + with open(json_file) as f: countries_json = f.read() return json.loads(countries_json) diff --git a/ipinfo/version.py b/ipinfo/version.py index 1101b26..8718184 100644 --- a/ipinfo/version.py +++ b/ipinfo/version.py @@ -1 +1 @@ -SDK_VERSION = "4.3.1" +SDK_VERSION = "4.4.0" diff --git a/tests/handler_async_test.py b/tests/handler_async_test.py index 47690ac..a750dff 100644 --- a/tests/handler_async_test.py +++ b/tests/handler_async_test.py @@ -43,6 +43,15 @@ async def test_get_details(): assert details.country == "US" assert details.country_name == "United States" assert details.isEU == False + country_flag = details.country_flag + assert country_flag["emoji"] == "🇺🇸" + assert country_flag["unicode"] == "U+1F1FA U+1F1F8" + country_currency = details.country_currency + assert country_currency["code"] == "USD" + assert country_currency["symbol"] == "$" + continent = details.continent + assert continent["code"] == "NA" + assert continent["name"] == "North America" assert details.loc == "37.4056,-122.0775" assert details.latitude == "37.4056" assert details.longitude == "-122.0775" @@ -54,19 +63,19 @@ async def test_get_details(): assert asn["name"] == "Google LLC" assert asn["domain"] == "google.com" assert asn["route"] == "8.8.8.0/24" - assert asn["type"] == "business" + assert asn["type"] == "hosting" company = details.company assert company["name"] == "Google LLC" assert company["domain"] == "google.com" - assert company["type"] == "business" + assert company["type"] == "hosting" privacy = details.privacy assert privacy["vpn"] == False assert privacy["proxy"] == False assert privacy["tor"] == False assert privacy["relay"] == False - assert privacy["hosting"] == False + assert privacy["hosting"] == True assert privacy["service"] == "" abuse = details.abuse diff --git a/tests/handler_test.py b/tests/handler_test.py index 648c3cd..b82d907 100644 --- a/tests/handler_test.py +++ b/tests/handler_test.py @@ -40,6 +40,15 @@ def test_get_details(): assert details.country == "US" assert details.country_name == "United States" assert details.isEU == False + country_flag = details.country_flag + assert country_flag["emoji"] == "🇺🇸" + assert country_flag["unicode"] == "U+1F1FA U+1F1F8" + country_currency = details.country_currency + assert country_currency["code"] == "USD" + assert country_currency["symbol"] == "$" + continent = details.continent + assert continent["code"] == "NA" + assert continent["name"] == "North America" assert details.loc == "37.4056,-122.0775" assert details.latitude == "37.4056" assert details.longitude == "-122.0775" @@ -51,19 +60,19 @@ def test_get_details(): assert asn["name"] == "Google LLC" assert asn["domain"] == "google.com" assert asn["route"] == "8.8.8.0/24" - assert asn["type"] == "business" + assert asn["type"] == "hosting" company = details.company assert company["name"] == "Google LLC" assert company["domain"] == "google.com" - assert company["type"] == "business" + assert company["type"] == "hosting" privacy = details.privacy assert privacy["vpn"] == False assert privacy["proxy"] == False assert privacy["tor"] == False assert privacy["relay"] == False - assert privacy["hosting"] == False + assert privacy["hosting"] == True assert privacy["service"] == "" abuse = details.abuse