Python写一个自动点餐程序
Python写一个自动点餐程序
为什么要写这个
公司现在用meican作为点餐渠道,每天规定的时间是早7:00-9:40点餐,有时候我经常容易忘记,或者是在地铁/公交上没办法点餐,所以总是没饭吃,只有去楼下711买点饭团之类的玩意儿,所以这是促使我写点餐小程序的原因。
点餐的流程
登录 ---> 点餐 ---> 提交
哈哈,是不是很简单,其实这个还好,说白了,就是登录上去,然后拿到cookie,保持一个登录状态,然后再去点餐,点餐就是构造请求,发送到指定的点餐URL上就可以了。
登录
首先我们点开
https://meican.com/

上面要求我们登录,我们这里输入自己的账号密码,登录上去之后可以看见一个请求.

这个请求就是登录的请求,我们看下需要传什么参数,然后我们去完全构造这个请求,也就是参数一致,并且带浏览器头,这里我们也需要去保存cookie,也就是说,我们需要自己的账号时刻保持online状态,所以需要保存cookie,需要时候调用
所以我们需要实现如下功能
- 登录请求构造
- 保持登录状态
- 保存cookies
- 使得后来的访问都带cookie
代码如下
import json
import requests
import http.cookiejar as HC
session = requests.session()
session.cookies = HC.LWPCookieJar(filename='cookies')
def login_meican():
"""
登录美餐,寻找cookie文件,没cookie文件就重新载入
:return:
"""
# 储存cookie作为日后使用,三天clear一次
try:
session.cookies.load(ignore_discard=True)
except:
print('未找到cookies文件')
save_cookie()
def save_cookie():
"""
如果没cookie,登录逻辑
:return:
"""
login_url = 'https://meican.com/account/directlogin'
# Headers
hearsers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
"Referer": "https://meican.com/login",
"Origin": "https://meican.com",
"Host": "meican.com",
"Accept": "*/*"
}
# Login need data
data = {
"username": "xxxxxxxxxxx",
"loginType": "username",
"password": "xxxxxxxxxxx",
"remember": "true"
}
try:
r = session.post(login_url, headers=hearsers, data=data)
r.raise_for_status()
session.cookies.save()
except Exception as e:
print("login error!")
return 0
上面的代码实现了登录。
点餐
找到菜单
这里需要找到菜单,因为截图忘了截,这里就直接公布吧,找到菜单需要两个参数,一个是uuid,另一个是addrid,也就是你登陆的凭证+你所在地区的id,没有这两个是无法找出菜单的,并且也无法继续点餐流程。
如何获得这两个参数
在登录的时候我发现了一个URL,这个URL是 https://meican.com/preorder/api/v2.1/calendaritems/list?withOrderDetail=false&beginDate=2019-09-04&endDate=2019-09-04,
这个URL下的返回有我们要的参数,uuid 和 addrid,所以构造请求去获取这两个参数
def get_for_my_order():
"""
找到usertorken, addrid
:return:
"""
user_dict = {}
Now_date = datetime.date.today()
z = session.get("https://meican.com/preorder/api/v2.1/calendaritems/list?withOrderDetail=false&beginDate={Now}&endDate={Now}".format(Now=Now_date))
x = json.loads(z.text)
user_dict["uuid"] = x["dateList"][0]["calendarItemList"][0]["userTab"]["uniqueId"]
user_dict["addrid"] = x["dateList"][0]["calendarItemList"][0]["userTab"]["corp"]["addressList"][0]["uniqueId"]
return user_dict
构造获取菜单请求
找到获取菜单的URL
https://meican.com/preorder/api/v2.1/recommendations/dishes?tabUniqueId={uuid}&targetTime={Now}+09:40
这里需要一个参数uuid,调取我们获取参数的函数
def get_menu():
"""
获取餐单逻辑
:return:
"""
menu_dict = {}
menu_list = []
Now_date = datetime.date.today()
uuid = get_for_my_order()["uuid"]
z = session.get("https://meican.com/preorder/api/v2.1/recommendations/dishes?tabUniqueId={uuid}&targetTime={Now}+09:40".format(uuid = uuid, Now=Now_date))
menu = json.loads(z.text)["myRegularDishList"]
for i in menu:
menu_dict["id"] = i["id"]
menu_dict["name"] = i["name"]
z = copy.deepcopy(menu_dict)
menu_list.append(z)
return menu_list
输出所有的菜单,以一个list作为输出
提交
构造点餐请求
首先先找到点餐的URL
https://meican.com/preorder/api/v2.1/orders/add
查看点餐需要的参数:
data = {
"corpAddressUniqueId": addrid,
"order": x,
"remarks": y,
"tabUniqueId": uuid,
"targetTime":target_time,
"userAddressUniqueId":addrid
}
构造点餐请求
def order_action():
"""
点餐逻辑
:return:
"""
addrid = get_for_my_order()["addrid"]
uuid = get_for_my_order()["uuid"]
menu_list = get_menu()
menu_id = choice(menu_list)["id"]
target_time = str(datetime.date.today()) + " " + "09:40"
x = str([{"count":1,"dishId":menu_id}])
y = str([{"dishId":menu_id,"remark":""}])
data = {
"corpAddressUniqueId": addrid,
"order": x,
"remarks": y,
"tabUniqueId": uuid,
"targetTime":target_time,
"userAddressUniqueId":addrid
}
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
}
try:
z = session.post("https://meican.com/preorder/api/v2.1/orders/add", headers=headers, data=data)
z.raise_for_status()
except:
return "点餐错误!"
所用的知识点一览
- Python requetst的post,session
- cookie的保存和调用
- json的输出和浏览
- random.choice 的列表元素随机选择
- Python构造请求和登录逻辑
Python写一个自动点餐程序的更多相关文章
- 如何用 Python 写一个简易的抽奖程序
不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...
- 用 python 写一个年会抽奖小程序
使用 pyinstaller 打包工具常用参数指南 pyinstaller -F demo.py 参数 含义 -F 指定打包后只生成一个exe格式的文件 -D –onedir 创建一个目录,包含exe ...
- Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)
这道题是一道爬虫练习题,需要爬链接http://tieba.baidu.com/p/2166231880里的所有妹子图片,点进链接看一下,这位妹子是日本著名性感女演员--杉本由美,^_^好漂亮啊,赶紧 ...
- 十行代码--用python写一个USB病毒 (知乎 DeepWeaver)
昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到.但是,如果我想, ...
- 【Python】如何基于Python写一个TCP反向连接后门
首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...
- (原创)如何使用boost.asio写一个简单的通信程序(一)
boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...
- Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本
Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本 在 mac 或者 linux 系统中,我们的浏览器或者其他下载软件下载的文件全部都下载再 ~/Downloads/ 文 ...
- python写一个能变身电光耗子的贪吃蛇
python写一个不同的贪吃蛇 写这篇文章是因为最近课太多,没有精力去挖洞,记录一下学习中的收获,python那么好玩就写一个大一没有完成的贪吃蛇(主要还是跟课程有关o(╥﹏╥)o,课太多好烦) 第一 ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
随机推荐
- 深度学习之depthwise separable convolution,计算量及参数量
目录: 1.什么是depthwise separable convolution? 2.分析计算量.flops 3.参数量 4.与传统卷积比较 5.reference
- 前端开发HTML&css入门——CSS&选择器练习
CSS 层叠样式表 (Cascading Style Sheets)css可以用来为网页创建样式表,通过样式表可以对网页进行装饰.所谓层叠,可以将整个网页想象成是一层一层的结构,层次高的将会覆盖层次低 ...
- OC中数组排序的3种方法
总结OC中数组排序3种方法:sortedArrayUsingSelector:;sortedArrayUsingComparator:;sortedArrayUsingDescriptors: 大体上 ...
- Cockpit- Linux 服务器管理接口
Cockpit- Linux 服务器管理接口 功能 它包含 systemd 服务管理器. 有一个用于故障排除和日志分析的 Journal 日志查看器. 包括 LVM 在内的存储配置比以前任何时候都要简 ...
- linux capalibities
linux进程能力管理 安装能力查看工具集 yum install libcap-ng-utils 主要包含以下工具 [root@thatsit ~]# rpm -ql libcap-ng-utils ...
- jupyter notebook添加环境
列出当前kernel: jupyter kernelspec list 删除已有环境:jupyter kernelspec remove NAME 安装新kernel ipython kernel i ...
- Ansible笔记(2)--配置清单
一.Ansible Inventory配置及详解 Inventory是ansible管理主机信息的配置文件,默认存放在/etc/ansible/hosts.在使用时通过 -i 或 --inventor ...
- CodeMix使用教程:构建自定义DevStyle主题
[MyEclipse CI 2019.4.0安装包下载] DevStyle主题允许开发人员自定义工作台,无论是喜欢带有明亮图标的浅色背景还是带有柔和色彩的神色背景,开发人员都可以将工作台调整到适合的色 ...
- Django【第28篇】:Django Admin的相关知识
Django Admin的相关知识 一.面向对象复习 1.类的继承 class Base(object): def __init__(self,val): self.val = val def fun ...
- 【05】Python 标准模块:random、os、time、hashlib 第三方模块:excel、数据库 列表生成式
1 模块分类 标准模块,不需要你单独安装,python自带的模块 第三方模块 自己写的python 一个python文件就是一个模块 2 random模块 2.1 随机取元素 import rando ...