Categorizes the thing it gets passed into one of the items VT supports
        Returns a sting representation of the type of parameter passed in. \n
        :param thing: a parameter to identify. this can be a list of string or a string
        :return: a string representing the identified type of the input thing. If the input thing is a list the
         first element of the list is used to identify.

def _whatis(self, thing):
        """
        Categorizes the thing it gets passed into one of the items VT supports
        Returns a sting representation of the type of parameter passed in. \n
        :param thing: a parameter to identify. this can be a list of string or a string
        :return: a string representing the identified type of the input thing. If the input thing is a list the
         first element of the list is used to identify.
        """
        # per the API, bulk requests must be of the same type
        # ignore that you can intersperse scan IDs and hashes for now
        # ...although, does that actually matter given the API semantics?
        if isinstance(thing, list):
            thing = thing[0]

        # implied failure case, thing is neither a list or a file, so we assume string
        if not isinstance(thing, str):
            return "%s" % API_Constants.UNKNOWN

        if os.path.isfile(thing):
            if thing.endswith(".base64"):
                    return API_Constants.BASE64
            else:
                return API_Constants.FILE_NAME

        elif API_Constants.HASH_RE.match(thing):
            return API_Constants.HASH

        elif API_Constants.IP_RE.match(thing):
            return API_Constants.IP

        elif API_Constants.DOMAIN_RE.match(thing):
            return API_Constants.DOMAIN

        elif API_Constants.SCAN_ID_RE.match(thing):
            return API_Constants.SCANID

        elif urllib.parse.urlparse(thing).scheme:
            return API_Constants.URL

        else:
            return API_Constants.UNKNOWN