python实现比对美团接口返回数据和本地mongo数据是否一致示例


Posted in Python onAugust 09, 2019

本文实例讲述了python实现比对美团接口返回数据和本地mongo数据是否一致。分享给大家供大家参考,具体如下:

应用背景:美团平台商品的上下架状态、库存、售价,和mongo库存储的是否一致。

tools文件内容

# -*- coding: utf-8 -*-
import hashlib
import time
import requests
def get_md5(string):#返回字符串md5加密后的串
  hl = hashlib.md5()
  hl.update(string.encode('utf-8'))
  return hl.hexdigest()
def get_tamp():#获取当前的时间戳
  t = time.time()
  return int(t)
def req_get_result(api_url,api_data):#get方法请求函数
  req_get = requests.get(api_url,api_data)
  result = req_get.json()
  return result
def req_post_result(api_url,api_data):#post方法请求函数
  req_post = requests.post(api_url,data=api_data)
  result = req_post.json()
  return result
def file_edit(file_name,wr_str):#写入txt文件
  f1 = open(r'D:\%s.txt'%file_name,'a')
  f1.write(wr_str+'\n')
  f1.close()
def param_sort(param_dict):#传入字典,返回排序后并且连接好的字符串
  keys_list = sorted(param_dict.keys())
  rb_str = ''
  for k in keys_list:
    key_value = k + '=' + str(param_dict[k])
    rb_str = rb_str + key_value +'&'
  rb_str = rb_str[0:-1] #不保留字符串末尾的&
  return rb_str

下面是主逻辑

# -*- coding: utf-8 -*-
from tools import get_tamp,get_md5,req_get_result,file_edit,param_sort
import conf
import datetime
import time
from pymongo import MongoClient
app_id = conf.appinfo[1]['app_id']
secret = conf.appinfo[1]['secret']
def get_shop_id_list(app_id,secret):#获取门店id的列表
  api_url = 'http://waimaiopen.meituan.com/api/v1/poi/getids'
  timestamp = get_tamp()
  params_str = api_url+'?app_id=%s×tamp=%s'%(app_id,timestamp)
  sig = get_md5(params_str + secret)
  api_data = {
    'app_id':app_id,
    'sig':sig,
    'timestamp':timestamp,
  }
  result = req_get_result(api_url,api_data)
  shop_id_list = result['data']
  del shop_id_list[-1]#去掉最后一个非门店id元素
  return shop_id_list
def get_shop_detail(shop_id):#根据门店id,返回门店名称
  api_url = 'http://waimaiopen.meituan.com/api/v1/poi/mget'
  timestamp = get_tamp()
  app_poi_codes = shop_id
  params_str = api_url+'?app_id=%s&app_poi_codes=%s×tamp=%s'%(app_id,app_poi_codes,timestamp)
  sig = get_md5(params_str + secret)
  api_data = {
  'app_id':app_id,
  'sig':sig,
  'timestamp':timestamp,
  'app_poi_codes':app_poi_codes
  }
  result = req_get_result(api_url,api_data)
  shop_name = result['data'][0]['name']
  return shop_name
def get_goods(shop_id):#根据门店id,查询门店商品,返回列表
  api_url = 'http://waimaiopen.meituan.com/api/v1/retail/list'
  timestamp = get_tamp()
  app_poi_code = shop_id
  params_str = api_url+'?app_id=%s&app_poi_code=%s×tamp=%s'%(app_id,app_poi_code,timestamp)
  sig = get_md5(params_str + secret)
  api_data = {
  'app_id':app_id,
  'sig':sig,
  'timestamp':timestamp,
  'app_poi_code':app_poi_code
  }
  result = req_get_result(api_url,api_data)
  return result['data']
if __name__ == '__main__':
  shop_ids = get_shop_id_list(app_id,secret)
  file_name = datetime.datetime.now().strftime('%Y.%m.%d.%H.%M.%S')
  client = MongoClient(conf.mongo_online,conf.mongo_port)
  db = client['oh-product']
  collection = db.outerShopSku
  for shop_id in shop_ids:
    shop_name = get_shop_detail(shop_id)
    goods_list = get_goods(shop_id)
    wirte_shop_info = shop_id + '--' + shop_name + str(len(goods_list)) +'个商品'
    file_edit(file_name,wirte_shop_info)
    for i in range(0,len(goods_list)):
      skus = eval(goods_list[i]['skus'])[0]
      sku_id = skus['sku_id']
      result = collection.find({'channel':'MeiTuan','outerShopId':shop_id,'outerSkuId':sku_id})
      shopPrice = result[0]['shopPrice'] #int,单位:分
      stock = result[0]['stock']     #float
      is_sold_out = result[0]['status']  #str online/offline
      if round(float(skus['price'])*100) != shopPrice:
        wirte_price = sku_id+"售价不一致,美团:"+skus['price']+',数据库:'+str(shopPrice)
        file_edit(file_name,wirte_price)
      if float(skus['stock']) != stock:
        wirte_stock = sku_id+"库存不一致,美团:"+skus['stock']+',数据库:'+str(stock)
        file_edit(file_name,wirte_stock)
      if goods_list[i]['is_sold_out'] == 0:
        is_sold = 'offline'
      else:
        is_sold = 'online'
      if is_sold != is_sold_out:
        wirte_sold = sku_id+":状态不一致,美团:"+is_sold+',数据库:'+is_sold_out
        file_edit(file_name,wirte_sold)
      print('已完成',sku_id)
  client.close()

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python基础教程之基本内置数据类型介绍
Feb 20 Python
Python生成随机验证码的两种方法
Dec 22 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
Sep 26 Python
Python语言描述随机梯度下降法
Jan 04 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
Apr 28 Python
python smtplib模块自动收发邮件功能(二)
May 22 Python
Python实现查询某个目录下修改时间最新的文件示例
Aug 29 Python
pycharm: 恢复(reset) 误删文件的方法
Oct 22 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
Python全面分析系统的时域特性和频率域特性
Feb 26 Python
Python request使用方法及问题总结
Apr 26 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
Feb 06 Python
对django2.0 关联表的必填on_delete参数的含义解析
Aug 09 #Python
python实现美团订单推送到测试环境,提供便利操作示例
Aug 09 #Python
正则给header的冒号两边参数添加单引号(Python请求用)
Aug 09 #Python
基于django ManyToMany 使用的注意事项详解
Aug 09 #Python
Django在admin后台集成TinyMCE富文本编辑器的例子
Aug 09 #Python
python实现京东订单推送到测试环境,提供便利操作示例
Aug 09 #Python
利用ImageAI库只需几行python代码实现目标检测
Aug 09 #Python
You might like
php面向对象全攻略 (三)特殊的引用“$this”的使用
2009/09/30 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
2017/08/10 PHP
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
深入解析JavaScript中的立即执行函数
2016/05/21 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
js实现百度地图定位于地址逆解析,显示自己当前的地理位置
2016/12/08 Javascript
flexslider.js实现移动端轮播
2017/02/05 Javascript
详解JS中的attribute属性
2017/04/25 Javascript
jquery应用实例分享_实现手风琴特效
2018/02/01 jQuery
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
JavaScript 点击触发复制功能实例详解
2018/11/02 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
学习python (2)
2006/10/31 Python
python3.4用函数操作mysql5.7数据库
2017/06/23 Python
Python+pandas计算数据相关系数的实例
2018/07/03 Python
python实现列表中最大最小值输出的示例
2019/07/09 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
Python视频编辑库MoviePy的使用
2020/04/01 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
canvas如何绘制钟表的方法
2017/12/13 HTML / CSS
澳大利亚家具和家居用品在线:BROSA
2017/11/02 全球购物
加拿大床上用品、家居装饰、厨房和浴室产品购物网站:Linen Chest
2018/06/05 全球购物
size?丹麦官网:英国伦敦的球鞋精品店
2019/04/15 全球购物
汽车销售员如何做职业生涯规划
2014/02/16 职场文书
国际会计专业求职信
2014/08/04 职场文书
安全责任书
2015/01/29 职场文书
关爱留守儿童捐款倡议书
2015/04/27 职场文书
2015年计算机教学工作总结
2015/07/22 职场文书
jquery插件实现代码雨特效
2021/04/24 jQuery
MySQL 重命名表的操作方法及注意事项
2021/05/21 MySQL
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS