583 lines
31 KiB
Python
583 lines
31 KiB
Python
#!/bin/python
|
||
#coding: utf-8
|
||
# +-------------------------------------------------------------------
|
||
# | django-vue-lyadmin
|
||
# +-------------------------------------------------------------------
|
||
# | Author: lybbn
|
||
# +-------------------------------------------------------------------
|
||
# | QQ: 1042594286
|
||
# +-------------------------------------------------------------------
|
||
# | Date: 2023-07-20
|
||
# +-------------------------------------------------------------------
|
||
# 抖音商品同步
|
||
# ------------------------------
|
||
from utils.douyin.douyin_utils import douyin
|
||
from utils.douyin.doudian_utils import doudian
|
||
from utils.douyin.douyinUnion_utils import douyinUnion
|
||
from utils.common import formatdatetime_convert,formatdatetime
|
||
from apps.lyTiktokUnion.models import DYSystemAccount,DyProductSaleData,DyAwardTaskManage,DyColonelActivityManage,DyProductManage,DyShopManage,DyProductCategoryManage
|
||
import datetime
|
||
from config import DOUYIN_OPENAPI_CLIENT_KEY,DOUYIN_OPENAPI_CLIENT_SECRET,DOMAIN_HOST,DOUDIAN_TUANZHUANG_ZIYAN_APPKEY,DOUDIAN_TUANZHUANG_ZIYAN_APPSECRET,DOUDIAN_DKLIVE_ZIYAN_APPKEY,DOUDIAN_DKLIVE_ZIYAN_APPSECRET,DOUDIAN_DKFX_TOOL_APPKEY,DOUDIAN_DKFX_TOOL_APPSECRET
|
||
import logging
|
||
logger = logging.getLogger(__name__)
|
||
|
||
newdoudian_tz_yz = doudian(app_key=DOUDIAN_TUANZHUANG_ZIYAN_APPKEY,app_secret=DOUDIAN_TUANZHUANG_ZIYAN_APPSECRET,app_type="tool",code="test")
|
||
newdouyin = douyin(client_key=DOUYIN_OPENAPI_CLIENT_KEY,client_secret=DOUYIN_OPENAPI_CLIENT_SECRET)
|
||
newdouyinUnion = douyinUnion(client_key=DOUYIN_OPENAPI_CLIENT_KEY,client_secret=DOUYIN_OPENAPI_CLIENT_SECRET)
|
||
newdoudian_dklive_yz = doudian(app_key=DOUDIAN_DKLIVE_ZIYAN_APPKEY,app_secret=DOUDIAN_DKLIVE_ZIYAN_APPSECRET,app_type="tool",code="test")
|
||
newdoudian_dkfx_gj = doudian(app_key=DOUDIAN_DKFX_TOOL_APPKEY,app_secret=DOUDIAN_DKFX_TOOL_APPSECRET,app_type="tool",code="test")
|
||
|
||
def lyFloat(string):
|
||
try:
|
||
if string:
|
||
return float(string)
|
||
return 0
|
||
except:
|
||
return 0
|
||
|
||
def get_page_count(total, per_page):
|
||
"""
|
||
计算分页总数
|
||
:param total: 记录总数
|
||
:param per_page: 每页记录数
|
||
:return: 分页总数
|
||
"""
|
||
page_count = total // per_page
|
||
if total % per_page != 0:
|
||
page_count += 1
|
||
return page_count
|
||
|
||
def get_product_detail_brief(data):
|
||
"""
|
||
处理商品详情中的商品装修图,改为数组
|
||
"""
|
||
new_data = []
|
||
if not data:
|
||
return new_data
|
||
for i in data:
|
||
new_data.append(i.get('image').get('pic_url'))
|
||
return new_data
|
||
|
||
# 检查达人账号授权是否过期
|
||
def checkDouyinAccountExpire(instance):
|
||
"""
|
||
instance 为用户抖音达人授权数据对象
|
||
return : 返回用户access_token和是否过期,为True表示已过期,前面access_token内容为报错消息内容
|
||
"""
|
||
now = datetime.datetime.now()
|
||
if instance.access_token_expire >= now:
|
||
return instance.access_token,False
|
||
if instance.refresh_token_expire >=now:
|
||
res = newdouyin.refresh_access_token(instance.refresh_token)
|
||
if not res:
|
||
return "刷新token错误",True
|
||
if "error_code" in res["data"] and not res["data"]["error_code"] == 0:
|
||
return "获取刷新access_token失败,错误码:%s,描述:%s"%(res["data"]["error_code"],res["data"]["description"]),True
|
||
res = res['data']
|
||
access_token = res.get("access_token")
|
||
instance.access_token = access_token
|
||
expires_in = res.get("expires_in")
|
||
access_token_expire = now + datetime.timedelta(seconds=int(expires_in))
|
||
instance.access_token_expire = access_token_expire
|
||
instance.save()
|
||
return access_token,False
|
||
return "该抖音账号已过期,请重新授权",True
|
||
|
||
#获取精选联盟商品分类
|
||
#https://buyin.jinritemai.com/dashboard/service-provider/doc-center?docId=637
|
||
def getAllianceGoodsCategory(parent_id=0):
|
||
path = '/alliance/materialsProductCategory'
|
||
params = {"parent_id":parent_id}
|
||
result = newdoudian_tz_yz.request(path=path, params=params)
|
||
return result
|
||
|
||
#精选联盟商品同步(未完成)
|
||
def allianceGoodsSync():
|
||
"""
|
||
return:False失败,True成功
|
||
"""
|
||
instance = DYSystemAccount.objects.filter(is_delete=False).first()
|
||
msgData,isexpire = checkDouyinAccountExpire(instance)
|
||
if isexpire:
|
||
logger.error("同步精选联盟商品-请求商品列表,检查token已过期,内容:%s"%msgData)
|
||
return False
|
||
params = {"search_type":0,"sort_type":0,"page":1,"page_size":20}
|
||
result = newdouyinUnion.product_list_search(access_token=msgData,open_id=instance.open_id,params=params)
|
||
return True
|
||
|
||
#获取精选联盟商品分类(行业类目)
|
||
#https://buyin.jinritemai.com/dashboard/service-provider/doc-center?docId=1882
|
||
def getActivityProductCategoryList():
|
||
path = '/alliance/activityProductCategoryList'
|
||
params = {}
|
||
result = newdoudian_tz_yz.request(path=path, params=params)
|
||
return result
|
||
|
||
# 同步商品行业类目
|
||
def activityProductCategoryListSync():
|
||
"""
|
||
return:False失败,True成功
|
||
"""
|
||
result = getActivityProductCategoryList()
|
||
if result and result.get("code") == 10000:
|
||
data = result.get("data").get("category_list")
|
||
for i in data:
|
||
DyProductCategoryManage.objects.get_or_create(category_id=i.get("category_id"),defaults={'name':i.get("name")})
|
||
return True
|
||
return False
|
||
#获取团长活动列表
|
||
#https://buyin.jinritemai.com/dashboard/service-provider/doc-center?docId=1330
|
||
def getAllianceColonelActivityList(status=0,search_type=0,sort_type=0,page=1,page_size=20):
|
||
"""
|
||
status : 活动状态。0:任意状态; 1:未上线; 2:报名未开始; 3:报名中; 4:推广未开始; 5:推广中; 7:报名结束
|
||
search_type: 排序选项,0:创建时间; 1:活动报名开始时间排序;2:活动报名结束时间排序
|
||
"""
|
||
path = '/alliance/instituteColonelActivityList'
|
||
params ={"status":status,"search_type":search_type,"sort_type":sort_type,"page":page,"page_size":page_size}
|
||
result = newdoudian_tz_yz.request(path=path, params=params)
|
||
return result
|
||
|
||
# 同步团长活动列表
|
||
def allianceColonelActivityListSync(status=0,search_type=0,sort_type=0,page=1,page_size=20):
|
||
"""
|
||
return:False失败,True成功
|
||
"""
|
||
result = getAllianceColonelActivityList(status=status,search_type=search_type,sort_type=sort_type,page=page,page_size=page_size)
|
||
logger.info("同步团长活动列表,第%s页,返回内容:%s"%(page,result))
|
||
if result and result.get("code") == 10000:
|
||
total = int(result.get("data").get("total"))
|
||
total_page = get_page_count(total,page_size)
|
||
data = result.get("data").get("activity_list")
|
||
colonel_buyin_id = result.get("data").get("colonel_buyin_id")
|
||
institution_id = result.get("data").get("institution_id")
|
||
for i in data:
|
||
instance,created = DyColonelActivityManage.objects.get_or_create(activity_id=i.get("activity_id"),defaults={"activity_name":i.get("activity_name"),"activity_start_time":i.get("activity_start_time"),"activity_end_time":i.get("activity_end_time"),"status":i.get("status"),"colonel_buyin_id":colonel_buyin_id,"institution_id":institution_id})
|
||
if not created:
|
||
instance.activity_name = i.get("activity_name")
|
||
instance.activity_start_time = i.get("activity_start_time")
|
||
instance.activity_end_time = i.get("activity_end_time")
|
||
instance.status = i.get("status")
|
||
instance.colonel_buyin_id = colonel_buyin_id
|
||
instance.institution_id = institution_id
|
||
instance.update_datetime = datetime.datetime.now()
|
||
instance.save()
|
||
if page<total_page:
|
||
#递归处理下一页数据
|
||
next_page = page+1
|
||
allianceColonelActivityListSync(status=status,search_type=search_type,sort_type=sort_type,page=next_page,page_size=page_size)
|
||
return True
|
||
elif result and result.get('code') == 40003 and result.get('err_no') == 30005:
|
||
raise ValueError(result.get('团长授权已过期,请重新授权!!!'))
|
||
return False
|
||
|
||
#获取团长活动商品列表
|
||
#https://buyin.jinritemai.com/dashboard/service-provider/doc-center?docId=968
|
||
def getColonelActivityProductList(activity_id="",search_type=4,sort_type=0,page=1,count=20,status=1):
|
||
"""
|
||
status : 活动商品状态,status = "all"查所有状态。0:待审核;1:推广中;2:申请未通过;3:合作已终止;6:合作已到期
|
||
search_type: 召回结果排序条件,[推荐按更新时间倒序查]。0:报名时间;1:活动价格排序;2:活动佣金比例排序;4:更新时间排序
|
||
"""
|
||
path = '/alliance/colonelActivityProduct'
|
||
params ={"activity_id":activity_id,"search_type":search_type,"sort_type":sort_type,"page":page,"count":count,"status":status}
|
||
if status == "all":
|
||
params.pop("status",None)
|
||
result = newdoudian_tz_yz.request(path=path, params=params)
|
||
return result
|
||
|
||
#批量获取商品详情
|
||
#https://buyin.jinritemai.com/dashboard/service-provider/doc-center?docId=2867
|
||
def getProductsDetail(product_ids=[],fields="detail_brief,base_info,promotion_info,share_info,comment_info,tags,rights_info,logistics_info,qualification_info,shop_info,coupon_info,month_sale_data"):
|
||
"""
|
||
product_ids:商品 ID 列表(最多20个)
|
||
fields: 字段(需要返回的字段,多个用英文逗号隔开。不传只返回商品基础信息)
|
||
"""
|
||
path = '/buyin/productsDetail'
|
||
params ={"product_ids":product_ids,"fields":fields}
|
||
result = newdoudian_tz_yz.request(path=path, params=params)
|
||
return result
|
||
|
||
#批量获取商品近30天推广详情
|
||
#https://buyin.jinritemai.com/dashboard/service-provider/doc-center?docId=2867
|
||
def getProductsMonthSale(product_ids=[],fields="base_info,month_sale_data"):
|
||
"""
|
||
product_ids:商品 ID 列表(最多20个)
|
||
fields: 字段(需要返回的字段,多个用英文逗号隔开。不传只返回商品基础信息)
|
||
"""
|
||
path = '/buyin/productsDetail'
|
||
params ={"product_ids":product_ids,"fields":fields}
|
||
result = newdoudian_tz_yz.request(path=path, params=params)
|
||
return result
|
||
|
||
#批量获取商品优惠券列表
|
||
#https://buyin.jinritemai.com/dashboard/service-provider/doc-center?docId=2867
|
||
def getProductsCouponInfo(product_ids=[],fields="base_info,coupon_info"):
|
||
"""
|
||
product_ids:商品 ID 列表(最多20个)
|
||
fields: 字段(需要返回的字段,多个用英文逗号隔开。不传只返回商品基础信息)
|
||
"""
|
||
path = '/buyin/productsDetail'
|
||
params ={"product_ids":product_ids,"fields":fields}
|
||
result = newdoudian_tz_yz.request(path=path, params=params)
|
||
return result
|
||
# 团长活动商品列表递归同步到数据库
|
||
def colonelActivityProductListSync(activity_id="",activity_start_time=None,activity_end_time=None,search_type=4,sort_type=0,page=1,count=20,status="all"):
|
||
"""
|
||
return:False失败,True成功
|
||
"""
|
||
result = getColonelActivityProductList(activity_id=activity_id,search_type=search_type,sort_type=sort_type,page=page,count=count,status=status)
|
||
logger.info("团长活动商品列表递归同步到数据库,活动ID:%s,第%s页,返回内容:%s"%(activity_id,page,result))
|
||
if result and result.get("code") == 10000:
|
||
total = int(result.get("data").get("total",0))
|
||
if total > 0:
|
||
total_page = get_page_count(total,count)
|
||
data = result.get("data").get("data")
|
||
institution_id = result.get("data").get("institution_id")
|
||
product_ids = []
|
||
product_ids_delete = []
|
||
for i in data:
|
||
status = i.get("status")#活动商品状态:0:待审核;1:推广中;2:申请未通过;3:合作已终止;6:合作已到期
|
||
product_id = i.get("product_id")
|
||
if status == 1:
|
||
shop_score = lyFloat(i.get("shop_score"))
|
||
p_data = {'title':i.get("title"),'shop_score':shop_score,'activity_id':activity_id,'detail_url':i.get("detail_url"),'category_id':i.get("category_id"),'category_name':i.get("category_name"),'price':i.get("price"),'sales':i.get("sales"),'cover':i.get("cover"),'cos_ratio':i.get('cos_ratio'),'cos_fee':i.get('cos_fee'),'special_cos_ratio':int(i.get('activity_cos_ratio'))/100,'shop_id':i.get('shop_id'),'is_calc_award':True,'begin_time':activity_start_time,'end_time':activity_end_time}
|
||
|
||
product_ids.append(product_id)
|
||
instance,created = DyProductManage.objects.get_or_create(product_id=product_id,source=1,defaults=p_data)
|
||
if not created:
|
||
p_data['update_datetime'] = datetime.datetime.now()
|
||
p_data.pop('is_calc_award')
|
||
p_data.pop('begin_time')
|
||
p_data.pop('end_time')
|
||
p_data['is_delete'] = False
|
||
DyProductManage.objects.filter(product_id=product_id,source=1).update(**p_data)
|
||
else:#团长下架商品或者商品到期,则平台删除(逻辑)此商品展示
|
||
product_ids_delete.append(product_id)
|
||
#清除失效商品
|
||
if product_ids_delete:
|
||
DyProductManage.objects.filter(product_id__in=product_ids_delete).update(status=False,is_delete=True)
|
||
#更新商品详情
|
||
if product_ids:
|
||
res_details = getProductsDetail(product_ids=product_ids)
|
||
logger.info("团长活动商品列表递归同步到数据库(商品详情),product_ids=%s,返回内容:%s"%(product_ids,res_details))
|
||
if res_details and res_details.get("code") == 10000:
|
||
logger.info("更新商品详情到数据库")
|
||
d_data = res_details.get("data").get("products",[])
|
||
if d_data:
|
||
for i in d_data:
|
||
#店铺数据更新
|
||
shop_info = i.get('shop_info')
|
||
shop_id = shop_info.get('shop_id')
|
||
shop_total_score = shop_info.get('shop_total_score')
|
||
if shop_total_score:
|
||
shop_info_dic = {'shop_name':shop_info.get('shop_name'),'shop_total_score':shop_total_score,'shop_score':shop_total_score.get('shop_score').get('score'),'shop_score_level':shop_total_score.get('shop_score').get('level')}
|
||
else:
|
||
shop_info_dic = {'shop_name':shop_info.get('shop_name'),'shop_total_score':shop_total_score}
|
||
logger.info("正在更新店铺信息:%s"%shop_info_dic)
|
||
s_instance,s_created = DyShopManage.objects.get_or_create(shop_id=shop_id,defaults=shop_info_dic)
|
||
if not s_created:
|
||
shop_info_dic['update_datetime'] = datetime.datetime.now()
|
||
DyShopManage.objects.filter(shop_id=shop_id).update(**shop_info_dic)
|
||
#商品更新
|
||
product_id = i.get("base_info").get('product_id')
|
||
imgs = i.get("base_info").get('imgs')
|
||
logistics_info = i.get('logistics_info').get('text')
|
||
has_sxt = i.get('qualification_info').get('has_sxt')
|
||
detail_brief = get_product_detail_brief(i.get('detail_brief').get('component_info'))
|
||
comment_score = i.get('comment_info').get('comment_score')
|
||
is_assured = i.get('rights_info').get('is_assured')
|
||
sharable = i.get('share_info').get('sharable')
|
||
has_subsidy_tag = i.get('tags').get('has_subsidy_tag')
|
||
has_douin_goods_tag = i.get('tags').get('has_douin_goods_tag')
|
||
has_shop_brand_tag = i.get('tags').get('has_shop_brand_tag')
|
||
has_supermarket_tag = i.get('tags').get('has_supermarket_tag')
|
||
coupon_price = i.get('coupon_info').get('coupon_price')
|
||
coupon = len(i.get('coupon_info').get('available_coupons',[]))
|
||
order_num_30 = i.get('month_sale_data').get('order_num',0)
|
||
view_num_30 = i.get('month_sale_data').get('view_num', 0)
|
||
kol_num_30 = i.get('month_sale_data').get('kol_num', 0)
|
||
daily_statistics = i.get('month_sale_data').get('daily_statistics', [])
|
||
product_queryset = DyProductManage.objects.filter(product_id=product_id)
|
||
product_queryset.update(view_num=view_num_30,order_num = order_num_30,kol_num = kol_num_30,dyshop=s_instance,coupon_price=coupon_price,coupon=coupon,imgs=imgs,logistics_info=logistics_info,has_sxt=has_sxt,detail_brief=detail_brief,comment_score=comment_score,is_assured=is_assured,has_subsidy_tag=has_subsidy_tag,has_douin_goods_tag=has_douin_goods_tag,has_shop_brand_tag=has_shop_brand_tag,has_supermarket_tag=has_supermarket_tag,sharable=sharable,update_datetime = datetime.datetime.now())
|
||
ds_obj_list = []
|
||
product_instance = product_queryset.first()
|
||
for ds in daily_statistics:
|
||
d_statics_date = datetime.datetime.strptime(ds.get('date'), '%Y%m%d')
|
||
if not DyProductSaleData.objects.filter(product_id=product_id,date=d_statics_date).exists():
|
||
ds_obj_list.append(DyProductSaleData(inner_product_id_id=product_instance.id,product_id=product_id,date=d_statics_date,order_num=ds.get('order_num'),view_num=ds.get('view_num'),kol_num=ds.get('kol_num')))
|
||
if ds_obj_list:
|
||
DyProductSaleData.objects.bulk_create(ds_obj_list)
|
||
if page<total_page:
|
||
#递归处理下一页数据
|
||
next_page = page+1
|
||
colonelActivityProductListSync(activity_id=activity_id,activity_start_time=activity_start_time,activity_end_time=activity_end_time,search_type=search_type,sort_type=sort_type,page=next_page,count=count,status=status)
|
||
return True
|
||
return True
|
||
return False
|
||
|
||
#精选联盟团长活动商品同步
|
||
def allianceColonelGoodsSync():
|
||
"""
|
||
return:False失败,True成功
|
||
"""
|
||
if allianceColonelActivityListSync():
|
||
queryset = DyColonelActivityManage.objects.all()
|
||
if queryset:
|
||
for i in queryset:
|
||
activity_start_time = formatdatetime_convert(i.activity_start_time)
|
||
activity_end_time = formatdatetime_convert(i.activity_end_time)
|
||
colonelActivityProductListSync(activity_id=i.activity_id,activity_start_time=activity_start_time,activity_end_time=activity_end_time)
|
||
return True
|
||
return False
|
||
|
||
|
||
|
||
#精选联盟 团长赏金任务列表查询
|
||
#https://buyin.jinritemai.com/dashboard/service-provider/doc-center?docId=3573
|
||
def getColonelAwardTaskList(task_info="",status=0,page=1,page_size=20):
|
||
"""
|
||
task_info:任务id或名称
|
||
status:状态 0:不限,1:未发布,2:审核中,3:审核未通过,4:未开始,5:进行中,6:已结束, 默认0
|
||
page: 页数
|
||
page_size: 每页条数,最大20。默认20
|
||
"""
|
||
path = '/buyin/colonelAwardTaskList'
|
||
params ={"task_info":task_info,"status":status,"page":page,"page_size":page_size}
|
||
result = newdoudian_tz_yz.request(path=path, params=params)
|
||
return result
|
||
|
||
# 同步团长赏金任务列表
|
||
def allianceColonelAwardTaskListSync(status=0,page=1,page_size=20):
|
||
"""
|
||
return:False失败,True成功
|
||
"""
|
||
result = getColonelAwardTaskList(status=status,page=page,page_size=page_size)
|
||
logger.info("同步团长赏金任务列表,第%s页,返回内容:%s"%(page,result))
|
||
if result and result.get("code") == 10000:
|
||
total = int(result.get("data").get("total"))
|
||
total_page = get_page_count(total,page_size)
|
||
data = result.get('data').get('results')
|
||
for i in data:
|
||
instance,created = DyAwardTaskManage.objects.get_or_create(task_id=i.get("task_id"),defaults={"task_name":i.get("task_name"),"task_start_time":i.get("task_start_time"),"task_end_time":i.get("task_end_time"),"task_status":i.get("status"),"apply_cnt":i.get("apply_cnt"),"promote_cnt":i.get("promote_cnt"),"gmv":i.get("gmv"),"order_cnt":i.get("order_cnt"),"can_apply":i.get("can_apply")})
|
||
if not created:
|
||
instance.task_name = i.get("task_name")
|
||
instance.task_start_time = i.get("task_start_time")
|
||
instance.task_end_time = i.get("task_end_time")
|
||
instance.task_status = i.get("status")
|
||
instance.apply_cnt = i.get("apply_cnt")
|
||
instance.promote_cnt = i.get("promote_cnt")
|
||
instance.gmv = i.get("gmv")
|
||
instance.order_cnt = i.get("order_cnt")
|
||
instance.can_apply = i.get("can_apply")
|
||
instance.update_datetime = datetime.datetime.now()
|
||
instance.save()
|
||
if int(i.get("status")) not in [5]:
|
||
instance.can_apply = False
|
||
instance.save()
|
||
if page<total_page:
|
||
#递归处理下一页数据
|
||
next_page = page+1
|
||
allianceColonelAwardTaskListSync(status=status,page=next_page,page_size=page_size)
|
||
return True
|
||
elif result and result.get('code') == 40003 and result.get('err_no') == 30005:
|
||
raise ValueError('团长授权已过期,请重新授权!!!')
|
||
return False
|
||
|
||
#精选联盟赏金任务同步
|
||
def colonelAwardTaskSync():
|
||
"""
|
||
return:False失败,True成功
|
||
"""
|
||
result = allianceColonelAwardTaskListSync()
|
||
return result
|
||
|
||
#达人赏金任务报名
|
||
def darenApplyAwardTask(access_token="",task_id=""):
|
||
return newdouyinUnion.daren_award_task_apply(access_token=access_token,task_id=task_id)
|
||
|
||
# 处理抖音对数量的中文处理,获取真实数字
|
||
def getDouyinNums(data):
|
||
if data == '暂无数据':
|
||
return 0
|
||
if "已售" in data:
|
||
data = data.replace("已售","").replace(" ","")
|
||
if '万+' in data:
|
||
tp = data.split("万+")
|
||
return tp[0]*10000
|
||
elif '万' in data:
|
||
tp = data.split("万")
|
||
return tp[0] * 10000
|
||
return data
|
||
|
||
# 获取达人橱窗近30天销量
|
||
def getDaren30daysSales(access_token="",open_id=""):
|
||
res = newdouyinUnion.daren_reputation(access_token=access_token,open_id=open_id)
|
||
if not res:
|
||
return None
|
||
return getDouyinNums(res['last_month_sales'])
|
||
|
||
# 获取达人橱窗近30天gmv
|
||
def getDaren30daysGmv(access_token="",open_id="",cursor=0):
|
||
end_time = datetime.datetime.now()
|
||
start_time = end_time - datetime.timedelta(days=30)
|
||
end_time = formatdatetime(end_time)
|
||
start_time = formatdatetime(start_time)
|
||
day30gmv = 0
|
||
res = newdouyinUnion.daren_orders(access_token=access_token,open_id=open_id,params={'size':20,'cursor':cursor,'start_time':start_time,'end_time':end_time})
|
||
if res:
|
||
for i in res.get('orders'):
|
||
day30gmv = day30gmv + round((i.get('total_pay_amount'))/100,1)
|
||
cursor = i.get('cursor')
|
||
if cursor:
|
||
day30gmv = day30gmv + getDaren30daysGmv(access_token=access_token,open_id=open_id,cursor=cursor)
|
||
return day30gmv
|
||
|
||
# 抖客商品分销转链 写入PID把商品链接转为自己专属的商品抖口令、抖音码、deeplink和zlink
|
||
# https://op.jinritemai.com/docs/api-docs/61/1464
|
||
def buyinKolProductShare(access_token=None,product_url="",pid="",external_info="",other_params={}):
|
||
"""
|
||
product_url:商品URL/口令/短链接
|
||
pid: 抖客PID
|
||
external_info:自定义字段(跟单用),只允许 数字、字母和_,限制长度为40
|
||
"""
|
||
path = '/buyin/kolProductShare'
|
||
params = {"product_url": product_url, "pid": pid,"external_info":external_info,"need_qr_code":False,"platform":0,"use_coupon":True,"need_share_link":True,"ins_activity_param":"","need_zlink":True}
|
||
if other_params:
|
||
params = dict(params,**other_params)
|
||
result = newdoudian_dkfx_gj.request(path=path, params=params,access_token=access_token)
|
||
return result
|
||
|
||
# 达人PID查询接口(达人查询自己的PID列表,需要达人百应授权)
|
||
# https://buyin.jinritemai.com/dashboard/service-provider/doc-center?docId=1461
|
||
def buyinKolPidList(access_token=None):
|
||
"""
|
||
access_token:用户侧的access_token
|
||
"""
|
||
path = '/buyin/kolPidList'
|
||
params = {}
|
||
result = newdoudian_dklive_yz.request(path=path, params=params,access_token=access_token)
|
||
return result
|
||
|
||
# 达人PID创建,需要达人授权
|
||
# https://buyin.jinritemai.com/dashboard/service-provider/doc-center?docId=1460
|
||
def buyinKolPidCreate(access_token=None,media_type=4,site_name="DY商品分享",media_name="DY商品分享"):
|
||
"""
|
||
access_token:用户侧的access_token
|
||
media_type:推广媒体类型,0:其他, 1:微信, 2:QQ, 3:微博, 4:抖音, 5:头条
|
||
site_name:推广位名称(最长10个字符)
|
||
media_name:渠道名称,没有media_id时自动创建渠道;存在media_id时无效
|
||
"""
|
||
path = '/buyin/kolPidCreate'
|
||
params = {'media_type':media_type,'site_name':site_name,'media_name':media_name}
|
||
if access_token:
|
||
result = newdoudian_dklive_yz.request(path=path, params=params,access_token=access_token)
|
||
else:
|
||
result = newdoudian_dklive_yz.request(path=path, params=params)
|
||
pid = None
|
||
logger.info("创建达人PID返回信息:%s" % result)
|
||
if result and result.get('code') == 10000 and result.get('data'):
|
||
pid = result.get('data').get('pid')
|
||
return pid
|
||
|
||
# 抖客PID创建,需要抖客授权
|
||
# https://buyin.jinritemai.com/dashboard/service-provider/doc-center?docId=1273
|
||
def buyinInstitutePidCreate(access_token=None,media_type=4,site_name="DY商品分享",media_name="DY商品分享"):
|
||
"""
|
||
access_token:用户侧的access_token
|
||
media_type:推广媒体类型,0:其他, 1:微信, 2:QQ, 3:微博, 4:抖音, 5:头条
|
||
site_name:推广位名称(最长10个字符)
|
||
media_name:渠道名称,没有media_id时自动创建渠道;存在media_id时无效
|
||
"""
|
||
path = '/buyin/institutePidCreate'
|
||
params = {'media_type':media_type,'site_name':site_name,'media_name':media_name}
|
||
if access_token:
|
||
result = newdoudian_dklive_yz.request(path=path, params=params,access_token=access_token)
|
||
else:
|
||
result = newdoudian_dklive_yz.request(path=path, params=params)
|
||
pid = None
|
||
logger.info("创建抖客PID返回信息:%s"%result)
|
||
if result and result.get('code') == 10000 and result.get('data'):
|
||
pid = result.get('data').get('pid')
|
||
return pid
|
||
|
||
# 独立抖客PID创建(需获取 抖客授权)-需【联盟抖客分销】工具型应用
|
||
# https://op.jinritemai.com/docs/api-docs/61/3081
|
||
def buyinDoukePidCreate(access_token=None,media_type=4,site_name="DY商品分享",media_name="DY商品分享"):
|
||
"""
|
||
access_token:用户侧的access_token
|
||
media_type:推广媒体类型,0:其他, 1:微信, 2:QQ, 3:微博, 4:抖音, 5:头条
|
||
site_name:推广位名称(最长10个字符)
|
||
media_name:渠道名称,没有media_id时自动创建渠道;存在media_id时无效
|
||
"""
|
||
path = '/buyin/doukePidCreate'
|
||
params = {'media_type':media_type,'site_name':site_name,'media_name':media_name}
|
||
result = newdoudian_dkfx_gj.request(path=path, params=params,access_token=access_token)
|
||
pid = None
|
||
logger.info("buyinDoukePidCreate创建独立抖客PID返回信息:%s"%result)
|
||
if result and result.get('code') == 10000 and result.get('data'):
|
||
pid = result.get('data').get('pid')
|
||
return pid
|
||
|
||
# 查询团长抖音、火山、头条和西瓜订单,需要团长百应授权
|
||
# https://buyin.jinritemai.com/dashboard/service-provider/doc-center?docId=1603
|
||
def buyinInstituteOrderColonel(start_time="",end_time="",size=200,cursor=0,time_type="pay"):
|
||
"""
|
||
size:每页订单数目,取值区间: [1, 200]
|
||
cursor: 下一页索引(第一页传“0”)
|
||
start_time: 支付时间开始,最早支持90天前 2006-01-02 15:04:05
|
||
end_time: 支付时间结束
|
||
time_type: 查询时间类型。pay: 支付时间(默认); update:联盟侧更新时间,非订单状态更新时间
|
||
"""
|
||
path = '/buyin/instituteOrderColonel'
|
||
params = {"start_time": start_time, "end_time": end_time,"size":size,"cursor":cursor,"time_type":time_type}
|
||
result = newdoudian_tz_yz.request(path=path, params=params)
|
||
return result
|
||
|
||
# 同步 查询团长订单
|
||
def buyinInstituteOrderColonelSync(start_time="",end_time="",size=200,cursor=0,time_type="pay"):
|
||
"""
|
||
return:获取的订单数据列表
|
||
"""
|
||
order_data = []
|
||
result = buyinInstituteOrderColonel(start_time=start_time,end_time=end_time,size=size,cursor=cursor,time_type=time_type)
|
||
if result and result.get("code") == 10000:
|
||
data = result.get("data",{})
|
||
orders = data.get('orders',[])
|
||
order_data.extend(orders)
|
||
thecursor = data.get('cursor')
|
||
if thecursor:
|
||
n_data = buyinInstituteOrderColonelSync(start_time=start_time, end_time=end_time, size=size, cursor=thecursor,time_type=time_type)
|
||
order_data.extend(n_data)
|
||
return order_data
|
||
|
||
# 同步 达人的订单(最早90天)-按时间同步
|
||
def allianceKolOrdersSync(access_token=None,openid=None,size=20,cursor=0,start_time=None,end_time=None,time_type='pay'):
|
||
"""
|
||
return:获取的订单数据列表
|
||
"""
|
||
order_data = []
|
||
params = {'size':size,'cursor':cursor,'start_time':start_time,'end_time':end_time,'time_type':time_type}
|
||
result = newdouyinUnion.daren_orders(access_token=access_token,open_id=openid,params=params)
|
||
if result and "err_no" in result["data"] and result["data"]["err_no"] == 0:
|
||
data = result.get("data",{})
|
||
orders = data.get('orders',[])
|
||
order_data.extend(orders)
|
||
thecursor = data.get('cursor')
|
||
if thecursor:
|
||
n_data = allianceKolOrdersSync(access_token=access_token,openid=openid,size=size,cursor=thecursor,start_time=start_time,end_time=end_time,time_type='pay')
|
||
order_data.extend(n_data)
|
||
return order_data
|
||
|
||
# 批量根据订单号查询 达人的订单清下(最多支持10个订单号)
|
||
def batchAllianceKolOrdersByIds(access_token=None,openid=None,size=20,cursor=0,order_ids=""):
|
||
"""
|
||
order_ids:订单号。多个订单号用英文,分隔,最多支持10个订单号
|
||
return:获取的订单数据列表
|
||
"""
|
||
order_data = []
|
||
params = {'size':size,'cursor':cursor,'order_ids':order_ids}
|
||
result = newdouyinUnion.daren_orders(access_token=access_token,open_id=openid,params=params)
|
||
if result and "err_no" in result["data"] and result["data"]["err_no"] == 0:
|
||
data = result.get("data",{})
|
||
orders = data.get('orders',[])
|
||
order_data.extend(orders)
|
||
return order_data |