标签: curl

  • 关于宿舍洗衣机的折腾

    好久没管这个小破网站了,因为实在是太忙也没有什么有意思的东西可以写,刚好无聊折腾一下宿舍楼下的洗衣机


    写在前面

    原因

    宿舍楼下的洗衣机原本是有预约功能的,可能是男生宿舍的洗衣机少(一整栋楼7台),然后就把预约关了,从此只能下到一楼(我住5楼)碰运气看看有没有空的洗衣机。

    描述

    我们宿舍的洗衣机就是级身上有一个二维码,通过APP和二维码付款使用,APP名称叫U净,如果有相同的可以试下。不用多说,方法肯定是抓包。

    解决方法 1.0

    Alt text

    这个方法确实好用,是上个学期我已经在用的,那么就是把洗衣机上的二维码全部拍下来放到宿舍,就能远程预约了。我的大概长这样:

    但是使用中还是有一些问题:

    • 喵喵机打印用的是热敏纸,会掉色
    • 作为一个懒人,睡上铺的怎么会下床做这种事呢

    所以我是不可能就这样罢休的:

    解决方法 2.0(正在使用)

    话不多说,上软件,抓包:

    Alt text
    Alt text

    不难找到,我们需要的就是这一个:

    找一个模拟HTTP请求

    填上地址和header,就得到了下面这玩意:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    {
    “errorCode”: 0,
    “result”: {
    “no”: “63”,
    “sn”: “0000DB11138108443188111110040000”,
    “qrCode”: “http://app.littleswan.com/u_download.html?type=Ujing&uuid=0000000000000A0007604201806230011246”,
    “deviceModel”: “0000.db.27974”,
    “alipayOnly”: 2,
    “registerType”: 0,
    “brand”: 1,
    “readableName”: “校园机MG80-GF03DW 一代”,
    “status”: “1”,
    “online”: true,
    “statusAll”: “{\”switch\”:1,\”wash\”:1,\”wash_mode\”:1,\”time_remaining\”:14,\”fault_warn\”:\”0\”}”,
    “remainTime”: 14,
    “statusUpdateTime”: “2019-09-29T13:15:52.000Z”,
    “virtualId”: “53876069890835”,
    “errorCode”: “E30”,
    “scanSelfClean”: null,
    “errorTime”: “2019-09-24T15:00:15.000Z”,
    “endWorkTime”: null,
    “shutDownTime”: null,
    “offlineTime”: “2019-09-17T10:28:13.000Z”,
    “addTime”: “2018-10-04T09:30:22.000Z”,
    “isRemoved”: false,
    “hasAutoLaunchDevice”: false,
    “autoLaunchDeviceOutOfStock”: null,
    “washTemperatureIsEnable”: false,
    “isSlotMachine”: false,
    “moduleType”: 0,
    “isForceDelete”: null,
    “usedCounts”: null,
    “isBindToAlipay”: true,
    “bindToAlipayTime”: “2018-10-15T09:19:47.000Z”,
    “washCounts”: 0,
    “washCoins”: 0,
    “bleVersion”: null,
    “firstBindTime”: “2018-10-04T09:30:26.000Z”,
    “nbSignal”: null,
    “macAddress”: null,
    “deviceId2G”: null,
    “bleBindStatus”: null,
    “runTimes”: 31,
    “deviceTypeId”: 2,
    “errorCodeId”: null,
    “franchiseeId”: 355,
    “applyFranchiseeId”: null,
    “orderId”: 142085187,
    “serviceSubjectId”: 8880,
    “storeId”: “5bb0c9e85ae9d5634c00000e”,
    “boxTypeId”: null,
    “store”: {
    “id”: “5bb0c9e85ae9d5634c00000e”,
    “mobile”: “4006185141”,
    “enable”: true,
    “isRemoved”: false
    },
    “currentOrder”: {
    “status”: “40”,
    “statusUpdateTime”: “2019-09-29T14:01:47.000Z”,
    “remainTime”: 840,
    “id”: 142085187
    }
    }
    }

    通过换一台机的sn对比发现,没有在使用的机子是没有currentOrder的,所以就比较明了了,至少可以知道哪台机可以直接用了。

    所以,上Python

    Alt text

    发现是可以正常判断的,而且不难看出,currentOrder里面的remainTime就是剩余时间的秒数,所以我们把所有机子都放进去:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    import requests
    import json

    ls = [
    ‘0000000000000A0007604201806230007999’,
    ‘0000000000000A0007604201806230010337’,
    ‘0000000000000A0007604201806230011227’,
    ‘0000000000000A0007604201806230011842’,
    ‘0000000000000A0007604201806230010248’,
    ‘0000000000000A0007604201806230011549’,
    ‘0000000000000A0007604201806230011246’
    ]
    url_f = ‘https://u.zhinengxiyifang.cn/api/LbUsers/3901151/getDeviceByQRCode?qrCode=http:%2F%2Fapp.littleswan.com%2Fu_download.html%3Ftype%3DUjing%26uuid%3D’

    headers = {
    ‘Host’: ‘u.zhinengxiyifang.cn’,
    ‘Accept’: ‘application/json, text/plain, */*’,
    ‘Connection’: ‘keep-alive’,
    ‘Cookie’: ‘acw_tc=76b20fe315672388832663385e351b31cb24d8e23fe7a2cf1765458201c140’,
    ‘User-Agent’: ‘Mozilla/5.0 (iPhone; CPU iPhone OS 13_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 (4321215856)’,
    ‘Authorization’: ‘9CT3qmPW2yhEGNtfmT1cJdy2LKwOOQ87bt7f0J45Lo65plvOJAkYWmPKniMOFvnH’
    }

    for i in ls:
    url = url_f + i
    r = requests.get(url, headers=headers)
    rs = json.loads(r.text)

    if rs[‘result’][‘currentOrder’]:
    print(‘{}号机不可用({}分钟)’.format(rs[‘result’][‘no’],int(int(rs[‘result’][‘currentOrder’][‘remainTime’])/60)))
    else:
    print(‘{}号机可用’.format(rs[‘result’][‘no’]))
    Alt text

    这样就算是在算法上完成了,具体放到网站上可以用PHP之类的,还有一些小的细节我在这里并没有涉及到,比如说0分钟为刚付完款未开始之类的,这里只是大致演示一下原理,然后我也不是特别熟悉Python,若有不足之处欢迎指出。