当前位置: 首页 > news >正文

用python编写一个点餐程序_Python写一个自动点餐程序

Python写一个自动点餐程序

为什么要写这个

公司现在用meican作为点餐渠道,每天规定的时间是早7:00-9:40点餐,有时候我经常容易忘记,或者是在地铁/公交上没办法点餐,所以总是没饭吃,只有去楼下711买点饭团之类的玩意儿,所以这是促使我写点餐小程序的原因。

点餐的流程

登录 ---> 点餐 ---> 提交

哈哈,是不是很简单,其实这个还好,说白了,就是登录上去,然后拿到cookie,保持一个登录状态,然后再去点餐,点餐就是构造请求,发送到指定的点餐URL上就可以了。

登录

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

1082248-20190809104846744-1053796310.png

这个请求就是登录的请求,我们看下需要传什么参数,然后我们去完全构造这个请求,也就是参数一致,并且带浏览器头,这里我们也需要去保存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作为输出

提交

构造点餐请求

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构造请求和登录逻辑

相关文章:

  • 中国电子商务的历史 --- 中国电子商务的洋务运动
  • 内存分配算法java_java中的内存分配
  • 链接规范必须在全局范围内_Git commit message 规范
  • Wapm 试验安装
  • python end用法_python end用法是什么?
  • ArcIMS问题集中解决精华
  • 新加坡旅游 相关资料
  • python画图程序没有图_解决python中使用plot画图,图不显示的问题
  • 新加坡生活记-3-
  • python中如何创建一个空列表_在python中创建具有特定大小的空列表
  • 802.1X体系介绍
  • python自定义文件名_Django框架文件上传与自定义图片上传路径、上传文件名操作分析...
  • 小小荸荠里的情意
  • 302状态码_计算机网络 HTTP状态码和首部
  • python读conf配置文件_Python 操作配置文件
  • php的引用
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Apache的基本使用
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • JAVA并发编程--1.基础概念
  • Just for fun——迅速写完快速排序
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Tornado学习笔记(1)
  • V4L2视频输入框架概述
  • vue--为什么data属性必须是一个函数
  • vue自定义指令实现v-tap插件
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 多线程 start 和 run 方法到底有什么区别?
  • 简单基于spring的redis配置(单机和集群模式)
  • 警报:线上事故之CountDownLatch的威力
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何合理的规划jvm性能调优
  • 一个SAP顾问在美国的这些年
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #LLM入门|Prompt#3.3_存储_Memory
  • #pragma once与条件编译
  • #考研#计算机文化知识1(局域网及网络互联)
  • (02)Hive SQL编译成MapReduce任务的过程
  • (4)STL算法之比较
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (三)docker:Dockerfile构建容器运行jar包
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET程序员迈向卓越的必由之路
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .NET实现之(自动更新)
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • /boot 内存空间不够