2025-03-17 18:06:54 +08:00

583 lines
31 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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