参数分析
自动点餐无非就是模拟人的行为,自动请求一些关键接口。于是分析了一下美餐网的web端接口,发现关键接口如下:
1.获取菜单接口:meican.com/preorder/ap…???
2.下单接口:meican.com/preorder/ap…???
有了接口只是第一步,第二步开始分析、尝试接口的哪些参数是静态的,哪些是动态的。
首先通过多个请求,可以得知,上述两个关键接口中的client_id、client_secret是静态的固定不变的,猜测可能是web端的身份。
然后第一个接口中的restaurantUniqueId可以发现多次请求并没发生变化,并且通过命名基本可以得出,应该是类似企业食堂在美餐那边的一个唯一id。
第一个接口中的targetTime,通过数据样例分析,以及对比其他非关键接口数据,可以得知,应该是企业在美餐网设置的点餐截止时间。例如我们公司配置的是早餐6:00截止点餐,那么这个targetTime就是 yyyy-MM-dd +06:00。
最后第一个接口还有一个参数tabUniqueId ,最开始我以为是完全静态的,后面通过踩坑得知,这个应该是代表每一餐的唯一id,早、中、晚均不一样。
响应分析
第一个接口拿到的关键响应如下(忽略了一些):
"dishList": [
{
"dishSectionId": xxxx,
"id": xxxx,
"isSection": true,
"name": "晚餐",
"originalPriceInCent": 0,
"priceInCent": 0,
"priceString": ""
},
{
"dishSectionId": xxxx,
"id": y1,
"isSection": false,
"name": "周五 水饺&花生米拌黄瓜",
"originalPriceInCent": 1100,
"priceInCent": 1100,
"priceString": "11"
},
{
"dishSectionId": xxxx,
"id": y2,
"isSection": false,
"name": "周五 A套餐 小鸡炖蘑菇&干炸小黄鱼&肉沫豆腐&土豆片炒肉",
"originalPriceInCent": 1100,
"priceInCent": 1100,
"priceString": "11"
}
]
这个需要结合第二个接口参数来分析,哪些是有用的信息,第二个接口的请求参数如下:
{
"corpAddressRemark":"","corpAddressUniqueId":"xxxx","order":orderP,"remarks":remarkP,"tabUniqueId":uu['tab'],"targetTime":targetTime,"userAddressUniqueId":"xxxx"}
其中targetTime应该与第一个接口的一致。remarks没懂到底有没有用,tabUniqueId跟上个接口也是一致。最后order是跟第一个接口响应有关的,如下:
[{
"count":1,"dishId":y1}]
其中dishId就是第一个接口dishList中的id。好了关键信息有了,接下来就可以开始编写脚本了。
脚本编写
脚本就不废话了,由于Python不是主力语言,平时写的少,而且由于是摸鱼时间🐟来写的,所以写的比较粗糙和不规范。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import time
import sys
import requests
import json
import datetime
tomorrow = (datetime.datetime.now()+datetime.timedelta(days=1