@@ -9,7 +9,7 @@ var leetcode_client = {};
99leetcode_client . getProblems = function ( cb ) {
1010 request ( config . PROBLEMS_URL , function ( e , resp , body ) {
1111 if ( e ) return cb ( e ) ;
12- if ( resp . statusCode != 200 ) return cb ( 'Invalid HTTP response: ' + resp . statusCode ) ;
12+ if ( resp . statusCode != 200 ) return cb ( 'HTTP failed: ' + resp . statusCode ) ;
1313
1414 var $ = cheerio . load ( body ) ;
1515 var problems = $ ( '#problemList tbody tr' ) . map ( function ( ) {
@@ -36,7 +36,7 @@ leetcode_client.getProblems = function(cb) {
3636leetcode_client . getProblem = function ( problem , cb ) {
3737 request ( problem . link , function ( e , resp , body ) {
3838 if ( e ) return cb ( e ) ;
39- if ( resp . statusCode != 200 ) return cb ( 'Invalid HTTP response: ' + resp . statusCode ) ;
39+ if ( resp . statusCode != 200 ) return cb ( 'HTTP failed: ' + resp . statusCode ) ;
4040
4141 var $ = cheerio . load ( body ) ;
4242 var info = $ ( 'div[class="question-info text-info"] ul li strong' ) ;
@@ -49,4 +49,49 @@ leetcode_client.getProblem = function(problem, cb) {
4949 } ) ;
5050} ;
5151
52+ function getCookie ( resp , name ) {
53+ var cookies = resp . headers [ 'set-cookie' ] ;
54+ if ( ! cookies ) return null ;
55+ for ( var i = 0 ; i < cookies . length ; ++ i ) {
56+ var sections = cookies [ i ] . split ( ';' ) ;
57+ for ( var j = 0 ; j < sections . length ; ++ j ) {
58+ var kv = sections [ j ] . trim ( ) . split ( '=' ) ;
59+ if ( kv [ 0 ] == name ) return kv [ 1 ] ;
60+ }
61+ }
62+ }
63+
64+ leetcode_client . login = function ( user , cb ) {
65+ request ( config . LOGIN_URL , function ( e , resp , body ) {
66+ if ( e ) return cb ( e ) ;
67+ if ( resp . statusCode != 200 ) return cb ( 'HTTP failed:' + resp . statusCode ) ;
68+
69+ user . csrf = getCookie ( resp , 'csrftoken' ) ;
70+
71+ var opts = {
72+ url : config . LOGIN_URL ,
73+ headers : {
74+ Origin : config . BASE_URL ,
75+ Referer : config . LOGIN_URL ,
76+ Cookie : 'csrftoken=' + user . csrf + ';'
77+ } ,
78+ form : {
79+ csrfmiddlewaretoken : user . csrf ,
80+ login : user . login ,
81+ password : user . pass
82+ }
83+ } ;
84+ request . post ( opts , function ( e , resp , body ) {
85+ if ( e ) return cb ( e ) ;
86+ if ( resp . statusCode != 302 ) return cb ( 'HTTP failed:' + resp . statusCode ) ;
87+
88+ user . session_csrf = getCookie ( resp , 'csrftoken' ) ;
89+ user . session_id = getCookie ( resp , 'PHPSESSID' ) ;
90+ user . name = getCookie ( resp , 'messages' ) . match ( 'Successfully signed in as ([^.]*)' ) [ 1 ] ;
91+
92+ return cb ( null , user ) ;
93+ } ) ;
94+ } ) ;
95+ } ;
96+
5297module . exports = leetcode_client ;
0 commit comments