21xrx.com
2024-11-05 20:36:00 Tuesday
登录
文章检索 我的文章 写文章
Node.js:登录京东
2023-07-14 20:12:13 深夜i     --     --
Node js 登录 京东 Web应用程序 API接口

在当今社会,越来越多的人选择网购。而京东作为中国最大的综合性在线商城,成为了人们日常购物的首选之一。如果想要在京东购物,就需要先进行登录。本文将介绍如何使用Node.js登录京东。

1. 准备工作

在开始之前,我们需要在电脑上安装Node.js和npm,以及使用npm安装必要的依赖库。

2. 获取cookie

首先,我们需要获取京东的cookie。打开Chrome浏览器,在登录京东之后,在浏览器的Console中输入以下指令:


document.cookie

然后会输出一个类似以下的内容:


"thor=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

其中的“thor”的值就是我们所需要的cookie。

3. 编写代码

在电脑上创建一个空文件夹,然后在命令行中进入该文件夹,运行以下指令,初始化npm:


npm init

接着,运行以下指令,安装需要的依赖库:


npm install superagent charset node-encotyption --save

在文件夹中,创建一个“index.js”文件,并打开,在其中输入以下代码:


const superagent = require('superagent') //发送网络请求获取页面内容

const charset = require('superagent-charset') //解决乱码问题:

const encrypt = require('node-encryption') //加密用

const CRYPTO = require('crypto')

const passEncrpyt = function(passwd) {

  const md5 = CRYPTO.createHash('md5')

  md5.update(passwd)

  return md5.digest('hex').toUpperCase()

}//密码加密

charset(superagent)//使用superagent-charset插件

const JD_LOGIN_URL='https://passport.jd.com/new/login.aspx'

const jd_auth_url = 'https://passport.jd.com/uc/showAuthCode?r='

let cookie='';

let headers_base = {

  'User-Agent': 'Mozilla / 5.0(Macintosh;IntelMacOSX10_15_4) AppleWebKit /537.36 (KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36',

  'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',

  'Referer': JD_LOGIN_URL,

  'Accept': 'text/javascript, text/html, application/xml, text/xml, */*',

  'Accept-Encoding': 'gzip, deflate, br',

  'Accept-Language': 'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4',

  'Connection': 'keep-alive',

}

let get_auth_code_headers = function(){

  let headers = headers_base

  headers['Referer'] = jd_auth_url + new Date().getTime()

  return headers

}

let submit_headers = function(){

  let headers = headers_base

  headers['Referer'] = JD_LOGIN_URL

  return headers

}//请求头和获取authcode的请求头不一样,所以写成function

/**

* 获取authcode地址

* @param {string} uuid 从服务器返回的地址中摘取出来的uuid参数

* @returns authcode地址

*/

let getAuthCodeUrl = function(uuid) {

  let url = 'https://authcode.jd.com/verify/image?' + new Date().getTime()

  return url+'&uuid='+uuid+'&r='+Math.ceil(Math.random()*100)

}

/**

* 获取authcode(改编至weblogin.js内代码)

* @param {string} uuid 从服务器返回的地址中摘取出来的uuid参数

* @returns Promise对象,成功后返回authcode地址

*/

let fetchAuthCode = function(uuid){

  return new Promise(function(resolve,reject){

    superagent.get(getAuthCodeUrl(uuid))

      .set(get_auth_code_headers())

      .end(function(err,res){

        if(err){

          console.log(err);

          reject(err);

        }

        else{

          let cookies = res.header['set-cookie']

          cookie = processCookie(cookies)

          resolve('https:'+res.header.location)

        }

      })

  })

}

/**

* 处理cookie,摘取第一段cookie内容

* @param {array} cookies 从网络返回的cookie

* @returns {string} 摘取后的cookie段

*/

let processCookie=function(cookies){

  let cookiesStr=[]

  cookies.forEach(function(item,index){

    cookiesStr.push(item.substring(0,item.indexOf(';')))

  })

  return cookiesStr.join(';')

}

/**

* 登录

* @param {string} username 用户名

* @param {string} password 密码

* @param {*} authcode 验证码,若不需要则此参数为空

*/

let login = function(username, password, authcode) {

  let data = {

    'loginname': '此处填写账户名' + username,

    'nloginpwd': passEncrpyt(password),

    'rememberme': 'on',

    'authcode': authcode

  } //你的账户名

  if(authcode==''){

    data['chkRememberMe'] = 'on'

  }

  return new Promise(function(resolve,reject){

    superagent.post('https://passport.jd.com/uc/loginService')

      .set(submit_headers())

      .send(data)

      .type('form')

      .end(function(err,res){

        if(err){

          console.log(err)

          reject(err)

        }

        let cookies = res.header['set-cookie']

        cookies.forEach(function(item,index){

          cookie += item.substring(0,item.indexOf(';'))+';'

        })

        resolve(cookie)

      })

  })

}

/**

* 获取uuid

* @returns Promise对象,成功后返回uuid

*/

let fetchLoginHtml = function(){

  return new Promise(function(resolve,reject){

    superagent.get(JD_LOGIN_URL)

      .set(headers_base)

      .end(function(err,res){

        if(err){

          console.log(err);

          reject(err);

        }

        let cookies = res.header['set-cookie']

        cookie = processCookie(cookies)

        let body = res.text

        let sa_login_js = body.substring(body.indexOf('src=')+5,body.indexOf('skin/public/2014/login/js/login')).replace(/\"/g,"")

        //处理后不能加https:,否则获取不到uuid

        let login_Process_js = 'https:'+ body.substring(body.indexOf('src=','https:'+body.indexOf('/js?v='))+5,body.indexOf('passport/js/2014',body.indexOf('/js?v='))).replace(/\"/g,"")

        superagent.get(sa_login_js)

          .set(headers_base).end(function (err, res) {

          superagent.get(login_Process_js)

            .set(headers_base)

            .end(function (err, res) {

              let cookies = res.header['set-cookie']

              cookie = processCookie(cookies)

              let text = res.text.toString()

              let rex=/^setCrossDominCookie\(\'(.*?)\',\s*\'(.*?)\'\)\s*$/;

              let match=rex.exec(text);

              let uuid='',eid='';

              if (match) {

                uuid=match[1];

                eid=match[2];

              }

              resolve({

                'loginjs':login_Process_js,

                'uuid':uuid,

                'cookies':cookie

              });

            });

        })

      })

  })

}

/**

* 运行主程序

*/

let run=function(){

  fetchLoginHtml().then(function(jd_data){

    let uuid=jd_data.uuid;

    fetchAuthCode(uuid).then(function(authcode_url){

      console.log('请在浏览器中输入验证码,并将获取到的cookie值填入下面的cookie中:\n'+cookie);

      console.log('验证码地址:'+authcode_url);

      let readline = require('readline');

      let r1=readline.createInterface({

        input:process.stdin,

        output:process.stdout

      });

      r1.on('line',function(data){

        login('username','password',data.trim()).then(function(cookie){

          console.log('登录成功!\n' + cookie);

          r1.close()

        }).catch(function(err){

          console.log(err);

        })

      });

    }).catch(function(err){

      console.log(err);

    })

  }).catch(function(err){

    console.log(err);

  })

}

run()

在代码中,我们使用了三个插件:superagent、superagent-charset和node-encryption。这些插件可以帮助我们发送HTTP请求、解决中文乱码问题以及密码加密。在代码中,我们定义了几个函数来获取authcode和UUID,并在最后运行主程序。

4. 运行程序

在命令行中输入以下指令:


node index.js

然后按照提示,在浏览器中输入验证码,并将得到的cookie值填入命令行。成功登录后,将会显示cookie。

以上就是使用Node.js登录京东的方法。当然,京东可能会定期更改登录方式和系统,但我们可以根据代码中的原理,对代码进行相应调整,实现登录的功能。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复