code: def _whatis(self, thing):
          
          # 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
docs: 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.