餐馆点菜系统python程序_Python写一个自动点餐程序
Python写一个自动点餐程序
为什么要写这个
公司现在用meican作为点餐渠道,每天规定的时间是早7:00-9:40点餐,有时候我经常容易忘记,或者是在地铁/公交上没办法点餐,所以总是没饭吃,只有去楼下711买点饭团之类的玩意儿,所以这是促使我写点餐小程序的原因。
点餐的流程
登录 ---> 点餐 ---> 提交
哈哈,是不是很简单,其实这个还好,说白了,就是登录上去,然后拿到cookie,保持一个登录状态,然后再去点餐,点餐就是构造请求,发送到指定的点餐URL上就可以了。
登录
上面要求我们登录,我们这里输入自己的账号密码,登录上去之后可以看见一个请求.
这个请求就是登录的请求,我们看下需要传什么参数,然后我们去完全构造这个请求,也就是参数一致,并且带浏览器头,这里我们也需要去保存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,没有这两个是无法找出菜单的,并且也无法继续点餐流程。
如何获得这两个参数
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
构造获取菜单请求
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编写一个点餐程序_Python写一个自动点餐程序
原博文 2019-08-09 10:45 − # Python写一个自动点餐程序 ## 为什么要写这个 公司现在用meican作为点餐渠道,每天规定的时间是早7:00-9:40点餐,有时候我经常容易忘 ...
- python文件分发_python 写一个文件分发小程序
一.概述 该小程序实现从源端到目标端的文件一键拷贝,源端和目标段都在一台电脑上面,只是目录不同而已 二.参数文件说明 1. settings.txt的说明 a. 通过配置settings.txt,填源 ...
- python 性能测试_python 写一个性能测试工具(一)
国庆重新学习了一下go的gin高性能测试框架. 用JMeter来测试gin与flask接口的性能,差别很大. 为什么我自己不尝试写一个性能工具,性能工具的核心就是 并发 和 请求. 请求可以选择Pyt ...
- java窗口小程序atm_写一个ATM机小程序(JAVA), 目前老师 讲到了 静态工厂
/** * 存款 * @param in * @return */ public int deposit(int in){ creditlimit+=in; System.out.println(&q ...
- python kivy显示图片_python基于Kivy写一个图形桌面时钟程序代码示例
本篇文章小编给大家分享一下python基于Kivy写一个图形桌面时钟程序代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. Kivy 是一个开源的 ...
- python时钟程序的设计总结_python基于Kivy写一个图形桌面时钟程序
kivy 是一个开源的 python 第三方库,可以用来快速开发应用程序. 它有如下三个特点: 跨平台 kivy 编写的程序可在 linux,windows,os x,android,ios 和 ra ...
- python饮料购买_Python实现的一个自动售饮料程序代码分享
写这个程序的时候,我已学习Python将近有一百个小时,在CSDN上看到有人求助使用Python如何写一个自动售饮料的程序,我一想,试试写一个实用的售货程序.当然,只是实现基本功能,欢迎高手指点,新手 ...
- python编写木马攻击_用Python写一个自动木马程序
电脑作为大家日常办公的工具,最怕的一件事情之一就是被偷,当我们的电脑被盗的时候,不仅仅是电脑本身,更重要的是电脑存储的资料都会丢失.如何尽快的找回电脑需要我们想点办法,今天就教大家一个好的技巧,虽说不 ...
- python测试抽奖脚本_使用 Python 写一个简易的抽奖程序
不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...
- 如何用 Python 写一个简易的抽奖程序
不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...
最新文章
- nginx + uwsgi + Django 应用部署
- UEditor在线编辑器使用记录
- 提高代码性能及并发性的方法浅谈
- PL/SQL编程基本概念
- linux系统核心已存储,Linux系统 存储
- 正则表达式学习笔记005--脱字符和美元符的认识与应用
- python一个函数可以有参数也可以没有参数_Python:有和没有关键字参数的lambda函数行为?...
- UML建模之时序图(Sequence Diagram)转
- 【转】UNICODE编程资料
- 单选框_flutter Radio 单选框
- Google工程师多图详解Android架构
- 飞秋在同一局域网内刷新不到好友
- 综述:根际微生物组提高植物耐盐性的研究进展
- 声效表达在游戏沉浸方面的影响力
- 海外英语杂志社海外英语杂志社海外英语编辑部2022年第14期目录
- 计算机各配置性能如何区分,怎么测试电脑性能?判断电脑性能主要看什么?
- 较全的国外学术论文网站与常用的学术搜索引擎
- 禁忌搜索算法TS(学习笔记_04)
- 毕业设计 基于JSP动漫论坛的设计与实现
- SpringBoot+WebSocket+Vue整合实现在线聊天