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使用Socket(Https)Post登录百度的实现代码
May 18 Python
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
结合Python的SimpleHTTPServer源码来解析socket通信
Jun 27 Python
python实现12306火车票查询器
Apr 20 Python
Python将图片转换为字符画的方法
Jun 16 Python
Python基础教程之异常详解
Jan 10 Python
python实现从本地摄像头和网络摄像头截取图片功能
Jul 11 Python
python的debug实用工具 pdb详解
Jul 12 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
Aug 27 Python
python中open函数的基本用法示例
Sep 07 Python
opencv python Canny边缘提取实现过程解析
Feb 03 Python
Python约瑟夫生者死者小游戏实例讲解
Jan 04 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
打造计数器DIY三步曲(上)
2006/10/09 PHP
利用PHP实现与ASP Banner组件相似的类
2006/10/09 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
PHP实现小程序批量通知推送
2018/11/27 PHP
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
又一款js时钟!transform实现时钟效果
2016/08/15 Javascript
js HTML5手机刮刮乐代码
2020/09/29 Javascript
vue数据双向绑定原理解析(get & set)
2017/03/08 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
js实现web调用摄像头 js截取视频画面
2019/04/21 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
[01:00:30]TFT vs VGJ.T Supermajor 败者组 BO3 第一场 6.5
2018/06/06 DOTA
[02:12]打造更好的电竞完美世界:完美盛典回顾篇
2018/12/19 DOTA
python正常时间和unix时间戳相互转换的方法
2015/04/23 Python
Python遍历目录并批量更换文件名和目录名的方法
2016/09/19 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
Python使用OpenCV进行标定
2018/05/08 Python
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
将python图片转为二进制文本的实例
2019/01/24 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
python-numpy-指数分布实例详解
2019/12/07 Python
浅谈tensorflow 中tf.concat()的使用
2020/02/07 Python
tensorflow之tf.record实现存浮点数数组
2020/02/17 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
Python字典实现伪切片功能
2020/10/28 Python
实现CSS3中的border-radius(边框圆角)示例代码
2013/07/19 HTML / CSS
中职生自荐信
2013/10/13 职场文书
家长给孩子的评语
2014/01/30 职场文书
数字化校园建设方案
2014/05/03 职场文书
2016年优秀党员教师先进事迹材料
2016/02/29 职场文书
python基础之函数的定义和调用
2021/10/24 Python