const axios = require('axios') const FormData = require('form-data') const qs = require('querystring') const cheerio = require('cheerio') const _ = require('lodash') const Aigle = require('aigle') const moment = require('moment') const sleep = require('atomic-sleep') const iconv = require('iconv-lite') const { delay } = require('lodash') Aigle.mixin(_) // let test = {} // test.deliveryInfo = ['우체국택배', '7865401358906'] // checkPostOffice(test) if (!process.argv[2]) { console.log('사용방법') console.log('node test.js 완료일자 start|check') console.log(moment(new Date()).subtract(1, 'day').format('YYYY-MM-DD')) return false } if (!process.argv[3]) { console.log('사용방법') console.log('node test.js 완료일자 start|check') return false } let data = { username: 'aa509004', password: 'daesik102049@@', } const WRITE_END_DATE = true const END_DATE = process.argv[2] // let loginForm = new FormData() // loginForm.append('app_name',"크롬(chrome)") // loginForm.append('from',"pc") // loginForm.append('nhoj',"home3470") // loginForm.append('mluap',"5aee9b59574a3b9666400f9ea3ee5b4b") let loginObj = { app_name: '크롬(chrome)', from: 'pc', nhoj: 'aa509004', mluap: '5aee9b59574a3b9666400f9ea3ee5b4b', } let cookie = [ 'ds_yn=y; save_id=aa509004; ccn172=84ed141356cb95148bac1afb88b5ddaa663fd58c36ffa2f5ea536285791c754bb938f93336c4c72ac18203fc2ce5bcb004baf34ab6953952a1cb4bbf7be5186f8340853bef8e73ef33bfbdba0d2ce833e5acf7fe074a6d3bb79aa47e4de0dd120ac8821e605e23838cc4d70f65aa4186ed66ee406e0c003514e8a7edb3a7a47f3e5fe9c9ea44467ed469ccfd3fc368da37267711de8f9571b504605793f4c11a32694799eebc8c456ecd7e631a854cbc5cb586ac65a9c1965b0f04fe477e6aec127d7ecb8a0397d811ed70064f5fa09c', 'ds_yn=y; path=/; domain=hyun.bizmax.net; HttpOnly', ] let hanjinCookie = [] async function createCookie() { await axios.get('https://www.hanjin.co.kr').then(response => { console.log(response.headers['set-cookie']) hanjinCookie = response.headers['set-cookie'] }) } let bodyFormData = new URLSearchParams() bodyFormData.set('form', JSON.stringify(loginObj)) function setCookie() { return new Promise(resolve => { axios .post( 'https://hyun.bizmax.net/login_pcs_jr.php', qs.stringify(loginObj), { headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'hyun.bizmax.net', 'Origin': 'https://hyun.bizmax.net', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,la;q=0.6,zh-CN;q=0.5,zh;q=0.4', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Content-Length': '96', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Cookie': 'ds_yn=y; save_id=home3470', 'Host': 'hyun.bizmax.net', 'Origin': 'https://hyun.bizmax.net', 'Pragma': 'no-cache', 'Referer': 'https://hyun.bizmax.net/?from=&dmy=1614347086', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36', 'X-BizMax-Ajax': 1, 'X-Requested-With': 'XMLHttpRequest', 'X-Site-Gubun': 'pc', }, } ) .then(response => { // console.log(response) cookie = response.headers['set-cookie'] resolve(response.headers['set-cookie']) }) }) } async function getLists(page) { let searchDate = { start: moment(new Date()).subtract(1, 'month').format('YYYY-MM-DD'), // start: moment(new Date()).subtract(6, 'day').format('YYYY-MM-DD'), end: moment(new Date()).subtract(2, 'day').format('YYYY-MM-DD'), } console.log(searchDate) let reqObj = { 'state': 8, '_content_only': 'y', '_ihl': 'n', '_ihr': 'n', 'clm': 0, 'use_date_1': 'a.reg_date', 'data_orderby': 'a.reg_date', 'start_date_1': searchDate.start, 'end_date_1': searchDate.end, 'excel_ext': 'csv', 'mode': 'search', 'page': page, 'post_size': 500, 'sale_name_clm_q': '4b40dd075943efaf446b15696ebec5e3', 'site_gubun': 'pc', 'tbs_end_date': '2021-02-26', 'tbs_start_date': '2021-02-26', } let testStr = ` s_customer_group=&s_customer_group_src=&s_customer_group_dsp=-+%EA%B3%A0%EA%B0%9D%EA%B7%B8%EB%A3%B9&s_open_branch_prim=&s_open_branch_prim_src=&s_open_branch_prim_dsp=-+%EA%B0%9C%ED%86%B5%EC%B2%98&s_sale_branch_prim=&s_sale_branch_prim_src=&s_sale_branch_prim_dsp=-+%ED%8C%90%EB%A7%A4%EC%A0%90&s_sale_id=&state=8&state_obc=rgb(255%2C+255%2C+255)&state_otc=rgb(0%2C+0%2C+0)&state_src=&state_dsp=%E2%96%B6%EB%B0%9C%EC%86%A1&open_state=&open_state_obc=%23fff&open_state_otc=%23000&open_state_src=&open_state_dsp=-+%EA%B0%9C%ED%86%B5%EC%83%81%ED%83%9C&pre_model_return=&pre_model_return_obc=%23fff&pre_model_return_otc=%23000&pre_model_return_src=&pre_model_return_dsp=-+%EA%B2%B0%EC%A0%9C%EA%B5%AC%EB%B6%84&excel_ext=csv&conf_self=&conf_self_obc=%23fff&conf_self_otc=%23000&conf_self_src=&conf_self_dsp=-+2%EC%B0%A8%EC%A7%84%ED%96%89%EC%83%81%ED%83%9C&new_model_return=&new_model_return_obc=%23fff&new_model_return_otc=%23000&new_model_return_src=&new_model_return_dsp=-+%EA%B2%B0%EC%A0%9C%ED%98%84%ED%99%A9&post_size=500&data_orderby=a.reg_date&clm=0&search_word=&new_model=&new_model_src=&new_model_dsp=-+1%EC%B0%A8+%EC%83%81%ED%92%88&use_date_1=a.reg_date&start_date_1=${searchDate.start}&end_date_1=${searchDate.end}&age_sch_1=1&age_1=&age_cdn_1=1&age_cdn_join=1&age_sch_2=1&age_2=&age_cdn_2=1&ac_clm=0&ac_sbp=&sale_name_clm_q=eaaebfbf2fe3153006702ee0fda10b16&mode=search&page=${page}&hcv_p2=&list_type=&ol_type=logis&dv_prim=&team_prim=&tdm_prim=&prd_ds=&fav_group_prim=&no_ctm_rd_spd=&no_ctm_md_spd=&smr_vs=&no_sch_hl=&all_memo_sch_clm=&tbs_start_date=2022-10-05&tbs_end_date=2022-10-05&_ihr=n&_ihl=n&_content_only=y&site_gubun=pc ` try { } catch (error) {} return axios .post( // 'http://hyun.bizmax.net/customer/tpl/customer_list.php?list_type=&svc_gubun=0&prd_ds=&dss=', `https://hyun.bizmax.net/customer/tpl/customer_list.php?list_type=&team_prim=&tdm_prim=&svc_gubun=0&prd_ds=&dss=&dv_prim=`, // qs.stringify(reqObj), testStr, { headers: { 'Cookie': cookie[0], // 'Content-Type': 'application/x-www-form-urlencoded', // 'Host': 'hyun.bizmax.net', // 'Origin': 'https://hyun.bizmax.net', // 'Accept-Encoding': 'gzip, deflate', // 'Accept-Language': // 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,la;q=0.6,zh-CN;q=0.5,zh;q=0.4', // 'Cache-Control': 'no-cache', // 'Connection': 'keep-alive', // 'Content-Length': '96', // 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', // 'Host': 'hyun.bizmax.net', // 'Origin': 'https://hyun.bizmax.net', // 'Pragma': 'no-cache', // 'Referer': // 'https://hyun.bizmax.net/customer/tpl/customer_list.php?list_type=&team_prim=&tdm_prim=&svc_gubun=0&prd_ds=&dss=&dv_prim=', // 'User-Agent': // 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36', // 'X-BizMax-Ajax': '1', // 'x-pvsn': 'V1', // 'X-Requested-With': 'XMLHttpRequest', // 'X-Site-Gubun': 'pc', 'accept': '*/*', 'accept-language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,la;q=0.6,zh-CN;q=0.5,zh;q=0.4', 'cache-control': 'no-cache', 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', 'pragma': 'no-cache', 'sec-ch-ua': '"Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'x-bizmax-ajax': '1', 'x-pvsn': 'V1', 'x-requested-with': 'XMLHttpRequest', 'x-site-gubun': 'pc', 'cookie': cookie[0], 'Referer': 'https://hyun.bizmax.net/customer/tpl/customer_list.php?list_type=&team_prim=&tdm_prim=&svc_gubun=0&prd_ds=&dss=&dv_prim=', 'Referrer-Policy': 'strict-origin-when-cross-origin', }, } ) .then(async response => { try { let lists = parseLists(response) // console.log(lists) console.log(lists.length) // return false return lists } catch (error) { console.log(error) } }) function parseLists(response) { let $ = cheerio.load(response.data) let lists = $('.sort_tr') // console.log(lists) lists = _.map(lists, list => { let item = { name: _.get(list, 'children[0].children[0].attribs.name'), uuid: _.get(list, 'children[0].children[1].attribs.value'), receipt_dt: _.get(list, 'children[1].children[0].data'), group: _.get(list, 'children[2].children[0].data'), store: _.get(list, 'children[3].children[0].data'), r_name: _.get(list, 'children[4].children[0].data'), product: _.get(list, 'children[5].children[0].data'), progStatus: _.get(list, 'children[6].children[0].data'), openStatus: _.get(list, 'children[7].children[0].data'), deliveryInfo: parseDelivery( _.get(list, 'children[8].children[0].attribs.onclick') ), deliveryStatus: _.get(list, 'children[11].children[0].data'), } return item }) return lists } } async function checkLogis(lists) { try { let i = 0 await Aigle.eachSeries(lists, async order => { try { // console.log('order in', order) order.deliveryInfo[1] = order.deliveryInfo[1].replace(/-/g, '') // if (i % 30 === 0 || hanjinCookie.length == 0) { // await createCookie() // } // sleep(1000) i += 1 try { console.log(`${i} :`, order.deliveryInfo) if (_.get(order, 'deliveryInfo')[0] == 'CJ택배') { let check = await checkCJ(order) if (check) { order.deliveryEndDate = moment(new Date(check.endDate)).format( 'YYYY-MM-DD' ) order.deliveryEnd = true } } if (_.get(order, 'deliveryInfo')[0] == '우체국택배') { let check = await checkPostOffice(order) if (check) { order.deliveryEndDate = moment(new Date(check.endDate)).format( 'YYYY-MM-DD' ) order.deliveryEnd = true } // sleep(1500) } if (_.get(order, 'deliveryInfo')[0] == '한진택배') { // let check = await checkHanjin(order) let check = await checkNewHanjin(order) if (check) { order.deliveryEndDate = moment(new Date(check.endDate)).format( 'YYYY-MM-DD' ) order.deliveryEnd = true } } } catch (error) { console.log('errorObject', order) console.log(error) } } catch (error) { console.log(error) } }) return lists } catch (error) { console.log(error) } } function parseDelivery(deliveryStr) { if (deliveryStr) { // return deliveryStr // .replace('logisTrace("', '') // .replace('")', '') // .split('", "') return deliveryStr.split('");')[0].replace('logisTrace("', '').split('", "') } else { return undefined } } async function checkCJ(order) { let url = `https://www.doortodoor.co.kr/parcel/doortodoor.do?fsp_action=PARC_ACT_002&fsp_cmd=retrieveInvNoACT&invc_no=${order.deliveryInfo[1]}` try { let body = await axios.get(url) let $ = cheerio.load(body.data) let status = _.trim( $('.cont:eq(1)') .children('.board_area') .find('table > tbody > tr:last-child > td:first-child') .text() ) let endDate = '' if (status == '배달완료') { endDate = _.trim( $('.cont:eq(1)') .children('.board_area') .find('table > tbody > tr:last-child > td:nth-child(2)') .text() ) return { endDate: endDate, } } return false } catch (error) { console.log(error) } } async function checkNewHanjin(order) { try { let url = `https://www.hanjinexpress.hanjin.net/customer/hddcw18.tracking?w_num=${order.deliveryInfo[1]}` let body = await axios.get(url, { responseType: 'arraybuffer', responseEncoding: 'binary', }) body.data = iconv.decode(body.data, 'EUC-KR') let $ = cheerio.load(body.data) let status = _.trim( $('.board-list-table') .eq(1) .find('tbody > tr:last-child > td:last-child') .text() ) let endDate = '' if (status.indexOf('배송완료 되었습니다') !== -1) { endDate = _.trim( $('.board-list-table') .eq(1) .find('tbody > tr:last-child > td:first-child') .text() ) return { endDate: endDate, } } return false } catch (error) { console.log(error) if (error.response.status === 403) { process.exit(0) } } } async function checkHanjin(order) { try { let url = `https://www.hanjin.co.kr/kor/CMS/DeliveryMgr/WaybillResult.do` let formData = { 'mCode': 'MN038', 'wblnum': order.deliveryInfo[1], // 'wblnum': 420095497301, 'schLang': 'KR', 'wblnumText': '', } let body = await axios .post(url, qs.stringify(formData), { headers: { 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,la;q=0.6,zh-CN;q=0.5,zh;q=0.4', 'cache-control': 'no-cache', 'content-type': 'application/x-www-form-urlencoded', 'cookie': hanjinCookie[0], 'origin': 'https://www.hanjin.co.kr', 'pragma': 'no-cache', 'referer': 'https://www.hanjin.co.kr/kor/CMS/DeliveryMgr/WaybillSch.do?mCode=MN038', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'same-origin', 'sec-fetch-user': '?1', 'upgrade-insecure-requests': 1, 'user-agent': 'Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.114 Mobile Safari/537.36', }, }) .then(response => { return response }) let $ = cheerio.load(body.data) let status = _.trim( $('.board-list-table') .eq(1) .find('tbody > tr:last-child > td:last-child') .text() ) let endDate = '' if (status.indexOf('배송완료 되었습니다') !== -1) { endDate = _.trim( $('.board-list-table') .eq(1) .find('tbody > tr:last-child > td:first-child') .text() ) return { endDate: endDate, } } return false } catch (error) { console.log(error) return false } } async function checkPostOffice(order) { let url = `https://service.epost.go.kr/trace.RetrieveDomRigiTraceList.comm?sid1=${order.deliveryInfo[1]}&displayHeader=N` try { let body = await axios.get(url) let $ = cheerio.load(body.data) let status = _.trim( $('#processTable').find('tbody > tr:last-child > td:last-child').text() ) let endDate = '' if (status.indexOf('배달완료') !== -1) { endDate = _.trim( $('#processTable').find('tbody > tr:last-child > td:first-child').text() ) endDate = _.replace(endDate, new RegExp('\\.', 'g'), '-') return { endDate: endDate, } } return false } catch (error) { console.log(error) } } async function hanJinTest() { try { await createCookie() let orderLists = [{ deliveryInfo: ['한진택배', '421714876844'] }] await startCheckLogis(orderLists, false) } catch (error) {} } ;(async () => { try { //한진 테스트용 // await hanJinTest() // return false console.log('run end') console.log(await setCookie()) let orderLists = [] let hanjinLists = [] await Aigle.eachSeries([1, 2, 3, 4, 5], async page => { let result = await getLists(page) orderLists = [...orderLists, ...result] if (process.argv[3] == 'check') { if (result.length < 500) { console.log('총갯수:', orderLists.length) console.log('리스트 끝') process.exit(0) } } }) console.log('orderLists count', orderLists.length) // console.log(orderLists) // return false if (process.argv[3] == 'check') { console.log('check') return false } orderLists = _.filter(orderLists, order => { return order.deliveryInfo !== undefined }) hanjinLists = _.remove(orderLists, order => { // console.log(order) return _.get(order, 'deliveryInfo')[0] == '한진택배' }) if (orderLists.length > 0) { await startCheckLogis(orderLists, false) } if (hanjinLists.length > 0) { await createCookie() await startCheckLogis(hanjinLists, true) } console.log('ttt') } catch (error) { console.log(error) } })() async function startCheckLogis(procLists, loopDelay = undefined) { procLists = _.reverse(procLists) let chunkLists = _.chunk(procLists, 100) // console.log(chunkLists[0]) // return false console.log('배송대기 주문 갯수', procLists.length) console.log(chunkLists[0].length) await Aigle.eachSeries(chunkLists, async lists => { let checkLists = await checkLogis(lists) // orderLists = _.take(orderLists, 5) let finishedLists = _.filter(checkLists, o => { return o.deliveryEnd == true }) // console.log(finishedLists) // return false let unfinishedLists = _.filter(checkLists, o => { return o.deliveryEnd !== true }) if (finishedLists.length > 0) { await beforeChangePopUp(finishedLists) } sleep(3000) if (loopDelay) { console.log('5분 대기중 ...') sleep(300000) } }) } async function beforeChangePopUp(lists) { let prims = {} _.map(lists, (o, idx) => { idx += 1 prims['prim_' + idx] = o.uuid }) let defaultHeader = { 'list_cnt': 20, 'page': 1, 'bde_cnt': 0, 'bde_col_pos': 0, 'svc_gubun': 0, 'force_todo_cnt': 0, '_ihr': 'n', '_ihl': 'n', '_content_only': 'y', 'site_gubun': 'pc', } let reqObj = _.merge(defaultHeader, prims) let popup = await axios .post( 'https://hyun.bizmax.net/customer/tpl/customer_list_logis_work.php', qs.stringify(reqObj), { headers: { 'Cookie': cookie[0], 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'hyun.bizmax.net', 'Origin': 'https://hyun.bizmax.net', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,la;q=0.6,zh-CN;q=0.5,zh;q=0.4', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Host': 'hyun.bizmax.net', 'Origin': 'https://hyun.bizmax.net', 'Pragma': 'no-cache', 'Referer': 'https://hyun.bizmax.net/?from=&dmy=1614347086', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36', 'X-BizMax-Ajax': 1, 'X-Requested-With': 'XMLHttpRequest', 'X-Site-Gubun': 'pc', }, } ) .then(async response => { try { console.log(response) let request = await processChange(response, lists) } catch (error) { console.log(error) } }) } async function processChange(response, lists) { let prims = {} _.map(lists, (o, idx) => { idx += 1 prims['prim_' + idx] = o.name prims['logis_invoice_' + idx] = o.deliveryInfo[1] }) let parseObj = parsePop(response.data) let defaultHeader = { 'a_logis_invoice': 'on', 'a_logis_2_invoice': 'on', 'a_logis_return_invoice': 'on', 'a_open_seq': 'on', 'a_open_number': 'on', 'a_usim_seq': 'on', } let reqObj = _.merge(defaultHeader, parseObj, prims) if (WRITE_END_DATE) { // reqObj.logis_end_date = moment(new Date()).format('YYYY-MM-DD') reqObj.logis_end_date = END_DATE } let result = await axios.post( // 'http://hyun.bizmax.net/customer/mng_customer/customer_list_logis_work_pcs_if.php', // 'http://hyun.bizmax.net/customer/mng_customer/customer_list_logis_work_pcs_if.php', 'https://hyun.bizmax.net/customer/mng_customer/ctm_list_logis_work_pcs_jr.php', qs.stringify(reqObj), { headers: { 'Cookie': cookie[0], 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'hyun.bizmax.net', 'Origin': 'https://hyun.bizmax.net', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7,la;q=0.6,zh-CN;q=0.5,zh;q=0.4', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Host': 'hyun.bizmax.net', 'Origin': 'https://hyun.bizmax.net', 'Pragma': 'no-cache', 'Referer': 'https://hyun.bizmax.net/?from=&dmy=1614347086', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36', 'X-BizMax-Ajax': 1, 'X-Requested-With': 'XMLHttpRequest', 'X-Site-Gubun': 'pc', }, } ) console.log(result) } function parsePop(html) { let $ = cheerio.load(html) let result = {} result.csl = $('input[name=csl]').val() result.list_cnt = parseInt($('input[name=list_cnt]').val()) result.process_time = parseInt($('input[name=process_time]').val()) result.state = 6 return result } // changeTest() // getLists()