docs: def request_token(self, board):
      '''send a public key to request a token. When we call this function,
         we already have an RSA key at self.key
  
         board: the discourse board to post to
      '''
      nonce = str(uuid.uuid4())
  
      data = {'scopes': 'write',
              'client_id': self.client_id,
              'application_name': 'HelpMe',
              'public_key': self.public_key.replace("'",""),
              'nonce': nonce }
  
      url = (board + "/user-api-key/new?scopes=write&application_name=HelpMe&public_key=" + 
             self.public_key.replace("'", "") + 
             "&client_id=" + self.client_id +
             "&nonce=" + nonce )
  
      bot.newline()
      bot.info('Open browser to:')
      bot.info(url)
      bot.newline()
      
      # the user will open browser, get a token, and then have it saved here.
      bot.info('Copy paste token, press Ctrl-D to save it:')
  
      lines = []
  
      # The message is multiple lines
      while True:
          try:
              line = enter_input()
          except EOFError:
              break
          if line:
              lines.append(line)
  
      message = "\n".join(lines)
  
      # Write to temporary file, we only need to get key
      tmpfile = mktemp()
      with open(tmpfile, 'w') as filey:
          filey.write(message)
  
      # Read in again, and get token **important** is binary
      with open(tmpfile, 'rb') as filey:
          message = filey.read()
  
      # uses pycryptodome (3.7.2)
      cipher = Cipher_PKCS1_v1_5.new(self.key)
      decrypted = json.loads(cipher.decrypt(b64decode(message), None).decode())
  
      # Validate nonce is in response
      if "nonce" not in decrypted:
          bot.exit('Missing nonce field in response for token, invalid.')
  
      # Must return nonce that we sent
      if decrypted['nonce'] != nonce:
          bot.exit('Invalid nonce, exiting.')
  
      return decrypted['key']