关于宿舍洗衣机的折腾
好久没管这个小破网站了,因为实在是太忙也没有什么有意思的东西可以写,刚好无聊折腾一下宿舍楼下的洗衣机
写在前面
原因
宿舍楼下的洗衣机原本是有预约功能的,可能是男生宿舍的洗衣机少(一整栋楼7台),然后就把预约关了,从此只能下到一楼(我住5楼)碰运气看看有没有空的洗衣机。
描述
我们宿舍的洗衣机就是级身上有一个二维码,通过APP和二维码付款使用,APP名称叫U净
,如果有相同的可以试下。不用多说,方法肯定是抓包。
解决方法 1.0

这个方法确实好用,是上个学期我已经在用的,那么就是把洗衣机上的二维码全部拍下来放到宿舍,就能远程预约了。我的大概长这样:
但是使用中还是有一些问题:
- 喵喵机打印用的是热敏纸,会掉色
- 作为一个懒人,睡上铺的怎么会下床做这种事呢
所以我是不可能就这样罢休的:
解决方法 2.0(正在使用)
话不多说,上软件,抓包:
不难找到,我们需要的就是这一个:
找一个模拟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

发现是可以正常判断的,而且不难看出,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'])) |

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