Browse Source

Merge pull request #13 from majewskim/master

Fix a login issue
Manoël Trapier 7 years ago
parent
commit
7833fbe292
1 changed files with 32 additions and 53 deletions
  1. 32 53
      src/request.ts

+ 32 - 53
src/request.ts

@@ -6,9 +6,9 @@ var isAuthenticated = false;
 var isPremium = false;
 
 var defaultHeaders:request.Headers = {
-        'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0',
-        'Connection': 'keep-alive'
-      };
+  'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0',
+  'Connection': 'keep-alive'
+};
 
 /**
  * Performs a GET request for the resource.
@@ -41,69 +41,48 @@ export function post(config: IConfig, options: request.Options, done: (err: Erro
  */
 function authenticate(config: IConfig, done: (err: Error) => void) {
   if (isAuthenticated || !config.pass || !config.user) return done(null);
-  /* First just request the login page */
-  var options = {
+
+  /* Bypass the login page and send a login request directly */
+  var options =
+  {
     headers: defaultHeaders,
     jar: true,
-    url: 'https://www.crunchyroll.com/login'
-  }
-  
-  request(options, (err: Error, rep: any, body: any) => 
+    gzip: false,
+    url: 'https://www.crunchyroll.com/?a=formhandler&formname=RpcApiUser_Login&name=' + config.user + '&password=' + config.pass
+  };
+
+  request(options, (err: Error, rep: string, body: string) =>
   {
     if (err) return done(err);
-    var $ = cheerio.load(body);
-    
-    /* Get the token from the login page */
-    var token = $('input[name="login_form[_token]"]').attr("value");
-    if (token == "") return done(new Error("Can't find token!"));
-
+    /* The page return with a meta based redirection, as we wan't to check that everything is fine, reload
+     * the main page. A bit convoluted, but more sure.
+     */
     var options =
     {
       headers: defaultHeaders,
-      form:
-      {
-        'login_form[redirect_url]': '/',
-        'login_form[name]': config.user,
-        'login_form[password]': config.pass,
-        'login_form[_token]': token,
-      },
       jar: true,
-      gzip: false,
-      url: 'https://www.crunchyroll.com/login'
-    };
-    request.post(options, (err: Error, rep: string, body: string) =>
+      url: 'http://www.crunchyroll.com/'
+    }
+    request(options, (err: Error, rep: string, body: string) =>
     {
       if (err) return done(err);
-      /* The page return with a meta based redirection, as we wan't to check that everything is fine, reload
-       * the main page. A bit convoluted, but more sure.
-       */
-      var options =
+      var $ = cheerio.load(body);
+      /* Check if auth worked */
+      var regexps = /ga\(\'set\', \'dimension[5-8]\', \'([^']*)\'\);/g
+      var dims = regexps.exec($('script').text())
+      for(var i = 1; i < 5; i++)
       {
-        headers: defaultHeaders,
-        jar: true,
-        url: 'http://www.crunchyroll.com/'
+        if ((dims[i] != undefined) && (dims[i] != "") && (dims[i] != "not-registered")) { isAuthenticated = true; }
+        if ((dims[i] == "premium") || (dims[i] == "premiumplus")) { isPremium = true; }
       }
-      request(options, (err: Error, rep: string, body: string) =>
+      if (isAuthenticated == false)
       {
-        if (err) return done(err);
-        var $ = cheerio.load(body);
-        /* Check if auth worked */
-        var regexps = /ga\(\'set\', \'dimension[5-8]\', \'([^']*)\'\);/g
-        var dims = regexps.exec($('script').text())
-        for(var i = 1; i < 5; i++)
-        {
-          if ((dims[i] != undefined) && (dims[i] != "") && (dims[i] != "not-registered")) { isAuthenticated = true; }
-          if ((dims[i] == "premium") || (dims[i] == "premiumplus")) { isPremium = true; }
-        }
-        if (isAuthenticated == false)
-        {
-          var error = $('ul.message, li.error').text();
-          return done(new Error("Authentication failed: " + error));
-        }
-        if (isPremium == false) { console.info("Do not use this app without a premium account."); }
-        else { console.info("You have a premium account! Good!"); }
-        done(null);
-      })
+        var error = $('ul.message, li.error').text();
+        return done(new Error("Authentication failed: " + error));
+      }
+      if (isPremium == false) { console.info("Do not use this app without a premium account."); }
+      else { console.info("You have a premium account! Good!"); }
+      done(null);
     })
   })
 }