2017-08-24 1 views
0

Salut je voulais créer une application avec rapide 3 qui permet à l'utilisateur d'entrer leur nom d'utilisateur et mot de passe dans les champs de texte et appuyez sur un bouton de connexion qui va se connecter à ce site: https://login.utexas.edu/login/UI/Loginconnexion sur le site en rapide utilisant alamofire

Je veux qu'il authentifie l'utilisateur et stocke un token afin que je puisse rediriger vers: https://utdirect.utexas.edu/registration/classlist.WBX afin d'obtenir le code HTML et gratter la page Web pour les cours.

@IBOutlet weak var uteid: UITextField! 
@IBOutlet weak var password: UITextField! 


    var parameter: Parameters = [:] 
    var requestID: String = "" 
    var sunQueryParamsString: String = "" 
    var hiddenFields: String = "" 

@IBAction func postRequest(_ sender: Any) { 

     let urlString = "https://utdirect.utexas.edu/registration/classlist.WBX" 
     Alamofire.request(urlString).responseString { response in 
      print("\(response.result.isSuccess)") 
      if let html = response.result.value { 
       if let doc = Kanna.HTML(html: html, encoding: String.Encoding.utf8) { 
        // Search for nodes by CSS selector 

        print("\nrequestID") 
        for show in doc.css("input[name='login_param_RequestID']") { 
         self.requestID=show["value"]! 
         print(show["value"] as Any) 
        } 

        print("\nsunQueryParamsString") 
        for show in doc.css("input[name='SunQueryParamsString']") { 
         self.sunQueryParamsString=show["value"]! 
         print(show["value"] as Any) 
        } 

        print("\nhiddenFields") 
        for show in doc.css("input[type='hidden']") { 
         self.hiddenFields=show["value"]! 
         print(show["value"] as Any) 
        } 
       } 
      } 

      //creating dictionary for parameters 
      self.parameter = [ 
       "login_uri":"/login/cdcservlet", 
       "login_param_RequestID":self.requestID, 
       "login_param_ProviderID":"https://utdirect.utexas.edu:443/amagent?Realm=/admin/utdirect-realm", 
       "goto":"https://utdirect.utexas.edu:443/registration/classlist.WBX", 
       "SunQueryParamsString":self.sunQueryParamsString, 
       "IDToken1": self.uteid.text!, 
       "IDToken2": self.password.text!, 
       "IDButton": "Submit" 
      ] 

      //Wait for the GET request to complete, and then send the POST request: <<== 
      Alamofire.request (urlString,method: .post, parameters: self.parameter).responseString { response in 
       print("\(response.result.isSuccess)") 
       print(response) 
      } 

     } 
} 
+1

Ceci n'est pas un site de livraison de logiciel. Lisez [ici] (https: // stackoverflow.com/help/how-to-ask) comment demander correctement –

+0

@JoaoVitorino mais je ne sais pas comment utiliser alamofire pour vous connecter et authentifier l'utilisateur et je ne trouve rien pour m'aider –

+0

D'abord poster votre code, ce que vous avez fait pour résoudre le problème, quelle est la sortie que vous attendez et dites ce qui ne va pas. Jusqu'à présent, vous nous demandez simplement d'écrire le code pour votre –

Répondre

-1

Inutile de dire, assurez-vous de vérifier les conditions de service de votre site Web pour vous assurer qu'ils n'interdisent pas gratter autant de sites font. Je contacterais également le propriétaire du site Web pour voir s'il dispose d'un service Web avec lequel vous pouvez interagir, car le raclage est inefficace, fragile et prend du temps. Interagir avec un service Web serait beaucoup plus facile.

L'écriture d'un grattoir est plus facile si vous utilisez un outil de reniflage externe tel que Charles ou WireShark, et regardez ce qui se passe lorsque vous vous connectez à un navigateur. Ensuite, écrivez votre application pour la reproduire, comparez soigneusement vos demandes d'applications et vos réponses à celles générées par le site Web. Il vous permet également d'identifier s'ils utilisent AJAX, et encore une fois, à quoi ils ressemblent.

Vous pouvez également obtenir un analyseur HTML, tel que TFHpple ou NDHpple. Lorsque vous demandez une page (par exemple la page de connexion), vous devrez peut-être analyser les champs hidden à partir du formulaire HTML et les inclure dans votre demande POST suivante. Cela peut être un modèle que vous allez probablement faire beaucoup, donc être à l'aise avec l'analyse du HTML pour les champs cachés est susceptible d'être utile.

Ligne de fond, le processus de raclage nécessite généralement de demander une page, de l'analyser et de créer votre prochaine demande et de la répéter. Gardez un œil sur AJAX, car il peut y avoir des demandes allant et venant au-delà de ce que vous voyez dans la barre d'adresse de votre navigateur Web.


Lorsque vous racler site web, il est facile de regarder la page de connexion et dire « OK, j'ai juste besoin POST avec code d'utilisateur et mot de passe et je suis d'or ».

La chose est, c'est souvent plus compliqué que cela. Vous ne pensez peut-être pas que vous devez vous soucier de récupérer le code HTML pour la page de connexion, mais vous le faites souvent. Parfois, il y a des champs cachés sur ce formulaire de connexion (que vous devez analyser). Parfois, il met des cookies. Ça dépend.

Dans votre cas, votre page de connexion fait les deux. Ainsi, en utilisant TFHpple, vous pourriez faire quelque chose comme:

func retrieveLoginPageParameters(completion: @escaping ([String: String]?, Error?) -> Void) { 
    Alamofire.request("https://login.utexas.edu/login/UI/Login") 
     .responseData { response in 
      guard let data = response.data, response.error == nil else { 
       completion(nil, response.error) 
       return 
      } 

      let doc = TFHpple(htmlData: data) 
      guard let elements = doc?.search(withXPathQuery: "//input[@type='hidden']") as? [TFHppleElement] else { 
       fatalError("bad xpath") 
      } 

      var parameters = ["IDToken1": self.username, "IDToken2": self.password] 
      elements.forEach { element in 
        if let name = element.attributes["name"] as? String, 
         let value = element.attributes["value"] as? String { 
         parameters[name] = value 
        } 
      } 
      completion(parameters, nil) 
    } 
} 

qui récupère la page de connexion et les champs parse cachés. Vous pouvez ensuite utiliser pour connexion:

retrieveLoginPageParameters { parameters, error in 
    guard let parameters = parameters, error == nil else { 
     print(error?.localizedDescription ?? "Unknown error") 
     return 
    } 

    self.login(with: parameters) { success in 
     print(success ? "successful login" : "login failed") 
    } 
} 

func login(with parameters: [String: String], completion: @escaping (Bool) -> Void) { 
    Alamofire.request("https://login.utexas.edu/openam/UI/Login", method: .post, parameters: parameters) 
     .responseData { response in 
      guard let data = response.data, response.error == nil else { 
       print(response.error?.localizedDescription ?? "Unknown error") 
       return 
      } 

      // you can now parse the html to make sure login was successful 

      // when done, call completion handler indicating whether login 
      // was successful or not; given I don't know what a successful 
      // login looks like, I cannot go any further here 

      completion(true) 
    } 
} 

Remarque, je vous envoie la demande de connexion à openam/UI/Login, parce que c'est action le <form> dans le code HTML utilisé. Peut-être après une connexion réussie, il redirige vers une autre page, mais vous devez envoyer la demande de connexion à la même page référencée le login <form> HTML.

+0

Merci pour l'entrée! la première étape que je dois effectuer avant de gratter est de me connecter au site Web et d'authentifier l'utilisateur car pour accéder à la liste des cours, je dois d'abord me connecter. Je vais utiliser l'un des analyseurs HTML, mais suis-je sur la bonne voie? Ou devrais-je me connecter d'une manière différente? –

+0

Vous sautez une étape. Vous envoyez la demande de connexion sans avoir demandé la page HTML de connexion. Je sais, c'est bizarre de demander cette page HTML de connexion quand on a l'impression de montrer un formulaire de connexion, mais il y a vraiment des champs cachés et des cookies que vous devez souvent capturer et inclure lorsque vous envoyez la connexion avec des informations d'identification. Les cookies doivent être capturés automatiquement, mais vous devez capturer vous-même les champs cachés manuellement (c'est pourquoi nous utilisons des analyseurs HTML). – Rob

+0

Je vois. Je comprends un peu plus après avoir lu ceci: https://brennan.io/2016/03/02/logging-in-with-requests/ –