首页 > 其他分享 >ems

ems

时间:2023-08-01 22:22:59浏览次数:25  
标签:www json sec ems time ticket

【python爬虫】邮政包裹物流查询

  • 目标网站 ems 邮政快递包裹查询:

https://www.ems.com.cn/

  • 截图

image-20230801214420758

  • 接口预览
    image-20230801215145340

    • getPic请求滑动验证码的背景图片和滑块图片,返回的是base64编码的图片

    • getLogisticsTestFlag发送验证码的验证信息

      image-20230801215455640

      • xpos为滑动的距离,本站没有验证轨迹一说,属于验证码简单的一类
      • waybillNoList为需要查询的单号
    • queryTrack为查询物流的api

    • 请求头的加密参数

      image-20230801215918222

      • tickettime必须校验
      • user-sign没有校验
  • 解决思路

    • 滑动验证码采取ddddocr识别
    • 逆向tickettime请求头参数即可
  • js调试

    image-20230801220459596

    • 上图显示了这两个加密参数的加密逻辑

    • h()跟进去看是MD5

    • p.encode()base64

    • 需要注意的是querytrack那个接口的l参数不一样,如下

      image-20230801220725904

    • 另外,请求前需要获取一个服务器时间,穿插在每次请求前,这个是为了让获取的信息更加实时

  • 代码实现

import requests
import base64
import ddddocr
import hashlib
import json
from loguru import logger
logger.info("技术交流qq群:{}",529528142)
det = ddddocr.DdddOcr(det=False, ocr=False, show_ad=False)
headers = {
    'authority': 'www.ems.com.cn',
    'accept': 'application/json, text/plain, */*',
    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
    # 'content-length': '0',
    'origin': 'https://www.ems.com.cn',
    'referer': 'https://www.ems.com.cn/',
    'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-origin',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}


def query_time():
    response = requests.post('https://www.ems.com.cn/ems-web/currentTime/queryTime', headers=headers)
    return response.json()["value"]


def getPic():
    response = requests.post('https://www.ems.com.cn/ems-web/cutPic/getPic', headers=headers).json()
    return response["value"]["capcode"], response["value"]["backImage"], response["value"]["slidingImage"], \
        response["value"]["yHeight"]


def verify(_ticket, _time, _xpos, _capcode):
    __headers = {
        'authority': 'www.ems.com.cn',
        'accept': 'application/json, text/plain, */*',
        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
        'content-type': 'application/json;charset=UTF-8',
        'origin': 'https://www.ems.com.cn',
        'referer': 'https://www.ems.com.cn/',
        'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-origin',
        'ticket': _ticket,
        'time': _time,
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
    }

    json_data = {
        'value': {
            'customerIP': '你的ip',
            'phoneNum': '',
            'waybillNoList': [
                consult_code,
            ],
            'xpos': _xpos,
            'capcode': _capcode,
        },
    }
    response = requests.post('https://www.ems.com.cn/ems-web/trackTestQuery/getLogisticsTestFlag', headers=__headers,
                             json=json_data)
    # print(response.json())
    if response.json()["success"]:
        logger.info("验证成功")
    else:
        logger.error("验证失败")


def ddocr_get_pos(_slide, _bg):
    _slide_bytes = base64.b64decode(_slide)
    _bg_bytes = base64.b64decode(_bg)

    with open('./slide.png', 'wb') as f:
        f.write(_slide_bytes)

    with open('./bg.jpg', 'wb') as f:
        f.write(_bg_bytes)

    _res = det.slide_match(_slide_bytes, _bg_bytes)
    return _res


def get_ticket_(_time, _capcode, _type):
    o = _time
    n = o[0:3]
    r = o[3:]
    l = ""
    if _type == "verify":
        l = "1163FA15CC9A425EA4B65B2A218FF5F8"
    elif _type == "track":
        l = "053B245CB1B74EBBB5FBB4A5889D66B8"
    else:
        pass
    c = _capcode
    u = consult_code + n + l + r + c
    g = hashlib.md5(u.encode('utf-8')).hexdigest().upper()
    d = hashlib.md5(g.encode('utf-8')).hexdigest().upper()
    m = base64.b64encode(d.encode('utf-8')).decode('utf-8')
    return m


def query_track(_ticket, _time, _xpos, _capcode):
    headers_ = {
        'authority': 'www.ems.com.cn',
        'accept': 'application/json, text/plain, */*',
        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
        'content-type': 'application/json;charset=UTF-8',
        'origin': 'https://www.ems.com.cn',
        'referer': 'https://www.ems.com.cn/',
        'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-origin',
        'ticket': _ticket,
        'time': _time,
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
    }

    json_data = {
        'value': [
            {
                'ip': '你的ip',
                'xpos': _xpos,
                'capcode': _capcode,
                'mailStatus': 'a',
                'orderNum': [
                    consult_code,
                ],
                'orderType': '1',
                'noRulesNum': [],
                'appleFlag': None,
            },
        ],
        'list': [
            consult_code,
        ],
    }

    response = requests.post('https://www.ems.com.cn/ems-web/mailTrack/queryTrack', headers=headers_, json=json_data)
    return response.json()


if __name__ == "__main__":
    consult_code = "12121212121"
    capCode, bg, slide, yheight = getPic()
    time_ = query_time()
    xpos_ = ddocr_get_pos(slide, bg)['target'][0] - 3
    logger.info("ddddocr->{}", xpos_)
    ticket_ = get_ticket_(_time=str(time_), _capcode=capCode, _type="verify")
    verify(_ticket=ticket_, _time=str(time_), _xpos=xpos_, _capcode=capCode)
    time_ = query_time()
    ticket_ = get_ticket_(_time=str(time_), _capcode=capCode, _type="track")
    info = query_track(_ticket=ticket_, _time=str(time_), _xpos=xpos_, _capcode=capCode)
    logger.info(info)

  • 运行截图

image-20230801221156097

技术交流群:529528142

标签:www,json,sec,ems,time,ticket
From: https://www.cnblogs.com/steed4ever/p/17599286.html

相关文章

  • 2023-8-1 WPF的ItemsControl容器(DataGrid,ListBox,ListView等)可以实现的隔行样式修改
    实现的隔行样式修改【作者】长生微软官方文档详细介绍实现方式如果需要让你的wpf表格或者间隔样式实现下列效果可以使用AlternationCount首先添加一个DataGrid,并使用AlternatingRowBackground设置奇数行的背景色为紫色<DataGridAlternatingRowBackground="Purple"></Data......
  • groupmems
    groupmems管理用户主要组的成员补充说明groupmems命令允许用户管理他/她自己的组成员列表,而不需要超级用户权限。groupmems实用程序适用于将其用户配置为以他们自己的名义主组(即来宾/来宾)的系统。只有作为管理员的超级用户可以使用groupmems来更改其他组的成员资格。语法......
  • OSI(Open Systems Interconnection)的五层(七层)模型
    OSI(OpenSystemsInterconnection)是一个用于计算机网络通信的参考模型,由国际标准化组织(ISO)于1984年提出。它将计算机网络通信过程划分为七个不同的层次,从物理传输层到应用层,每个层次都有其特定的功能和任务。然而,常见的网络模型实际上是TCP/IP模型,它是OSI模型的一种实际应用。TCP/......
  • 【综述】A Tutorial on Terahertz-Band Localization for 6G Communication Systems
    ATutorialonTerahertz-BandLocalizationfor6GCommunicationSystems6G通信系统中太赫兹频段定位导论cite:H.Chen,H.Sarieddeen,T.Ballal,H.Wymeersch,M.-S.AlouiniandT.Y.Al-Naffouri,"ATutorialonTerahertz-BandLocalizationfor6GCommunicationSy......
  • How to Restore ASM Based OCR After Complete Loss of the CRS Diskgroup on Linux/U
    InthisDocumentGoalSolutionReferencesAPPLIESTO:OracleDatabase-EnterpriseEdition-Version11.2.0.1.0andlaterOracleDatabaseCloudSchemaService-VersionN/AandlaterGen1ExadataCloudatCustomer(OracleExadataDatabaseCloudMachine)......
  • 最新最全的BMS/EMS/PCS六大国产“储能方案”,不信你全都看过!
    作为国内领先的嵌入式产品平台提供商,创龙科技在“能源电力”行业拥有超过1000家客户,接下来就让小编向大家分享创龙科技推出的BMS/EMS/PCS“六大储能方案”吧。  储能产业链框架储能产业链可分为上游“原材料及生产设备”、中游“储能系统”、下游“储能场景应用及后市场服务......
  • AcrelEMS企业微电网数字化系统在电力系统中的应用
    安科瑞虞佳豪壹捌柒陆壹伍玖玖零玖叁1.入夏以来,用电负荷持续攀升。截至7月22日,南方电网电力负荷已4次创新高,最高达2.31亿千瓦。当前正值迎峰度夏的关键时期,记者在广东、浙江等地调查发现,虚拟电厂正在走进现实。聚合充电桩和储能等资源,为电力保供服务。虚拟电厂就是凭借能源互联......
  • Python【13】 字典的 items( ) 方法
    类似于字典转元组的效果,但又不完全是参考:https://www.runoob.com/python3/python3-att-dictionary-items.html......
  • 【优先队列】【堆排序实现优先队列】[1054. 距离相等的条形码](https://leetcode.cn/p
    【优先队列】【堆排序实现优先队列】1054.距离相等的条形码在一个仓库里,有一排条形码,其中第i个条形码为barcodes[i]。请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。你可以返回任何满足该要求的答案,此题保证存在答案。示例1:输入:barcodes=[1,1,1,2,2,2]......
  • docker compose报错environment array items[0,4] must be unique
    DockerCompose报错:environmentarrayitems[0,4]mustbeunique在使用DockerCompose进行容器编排时,有时候会遇到以下错误提示:environmentarrayitems[0,4]mustbeunique。这个错误发生在定义了重复的环境变量时,本文将详细解释这个错误的原因,并提供解决方案。DockerCompose......