156 lines
5.7 KiB
Python
156 lines
5.7 KiB
Python
|
import requests
|
||
|
from django.conf import settings
|
||
|
|
||
|
from apps.system.choices import ActivityType, AuthorizationPlatformType, QuickCodeCreateMethodType, QuickCodeType, \
|
||
|
DbEnum
|
||
|
from django.core.files.storage import default_storage
|
||
|
from datetime import date, datetime
|
||
|
from apps.system.models import Authorization, Activity, QuickCode
|
||
|
from libs.kz import KZ
|
||
|
from libs.topsdk.top import TopUtils
|
||
|
from utils.exceptions import CustomProjectException
|
||
|
from utils.tools import InviteCode
|
||
|
from yzk.settings.constant import MiddlePageConstant
|
||
|
|
||
|
|
||
|
def get_alipay_link_by_bid(bid):
|
||
|
return settings.ALIPAY_ACTIVITY_LINK.format(bid)
|
||
|
|
||
|
|
||
|
def get_response_json_by_activity(activity):
|
||
|
activity_type = activity.activity_type
|
||
|
request_json = activity.request_json
|
||
|
data = None
|
||
|
if activity_type == ActivityType.ELM:
|
||
|
authorization_id = request_json.get('authorization_id')
|
||
|
authorization = Authorization.objects.get(
|
||
|
pk=authorization_id, platform_type=AuthorizationPlatformType.ELM)
|
||
|
app_key_secret_info = authorization.app_key_secret_info
|
||
|
appkey = app_key_secret_info.get('appkey')
|
||
|
secret = app_key_secret_info.get('secret')
|
||
|
pid = request_json.get('pid')
|
||
|
sid = request_json.get('sid')
|
||
|
activity_id = request_json.get(
|
||
|
'activity_id', MiddlePageConstant.ELM_ACTIVITY_ID)
|
||
|
top_utils = TopUtils(appkey, secret)
|
||
|
response_json = top_utils.get_official_activity(
|
||
|
pid, activity_id, sid=sid)
|
||
|
activity.response_json = response_json
|
||
|
activity.save()
|
||
|
data = {
|
||
|
'kl': response_json.get('link').get('eleme_word'),
|
||
|
'l': response_json.get('link').get('h5_url'),
|
||
|
'r': activity.title,
|
||
|
}
|
||
|
elif activity_type == ActivityType.ALIPAY:
|
||
|
bid = request_json.get('bid')
|
||
|
data = {
|
||
|
'link': get_alipay_link_by_bid(bid)
|
||
|
}
|
||
|
activity.response_json = data
|
||
|
activity.save()
|
||
|
return data
|
||
|
|
||
|
|
||
|
def get_activity_by_short_chain_key(short_chain_key, select_user=False):
|
||
|
activity_id = InviteCode.decode(short_chain_key)
|
||
|
queryset = Activity.objects.filter(id=activity_id, is_delete=False)
|
||
|
if select_user:
|
||
|
queryset = queryset.select_related('user')
|
||
|
activity = queryset.first()
|
||
|
return activity
|
||
|
|
||
|
|
||
|
def create_quick_code(instance, link, domain=None, create_method=QuickCodeCreateMethodType.PROGRAM):
|
||
|
domain = domain or instance.domain
|
||
|
if domain is None:
|
||
|
return None, None
|
||
|
app_key = domain.app_key
|
||
|
secret = domain.secret
|
||
|
success, quick_code_link = KZ(
|
||
|
appkey=app_key, secret=secret).gen_short_link(link, domain=domain)
|
||
|
if not success:
|
||
|
raise CustomProjectException(detail=quick_code_link)
|
||
|
quick_code = None
|
||
|
if quick_code_link:
|
||
|
quick_code = QuickCode.objects.create(
|
||
|
user=instance.user,
|
||
|
activity=instance,
|
||
|
quick_code_url=quick_code_link,
|
||
|
converted_url=link,
|
||
|
create_method=create_method,
|
||
|
quick_code_type=QuickCodeType.PRIVATE if domain.user_id > 0 else QuickCodeType.OFFICIAL
|
||
|
)
|
||
|
return quick_code_link, quick_code
|
||
|
|
||
|
|
||
|
def save_files(files, business=None, return_path=False, user_id=0):
|
||
|
data = []
|
||
|
folder = business or DbEnum.HDY
|
||
|
for file in files:
|
||
|
fs = default_storage
|
||
|
timestamp = datetime.now().strftime('%Y%m%d%H%M%S')
|
||
|
file_name = f'{folder}/{user_id}/{timestamp}_{file.name}'
|
||
|
fs.save(file_name, file)
|
||
|
file_url = fs.url(file_name)
|
||
|
if return_path:
|
||
|
data.append({
|
||
|
'path': file_name,
|
||
|
'url': file_url,
|
||
|
})
|
||
|
else:
|
||
|
data.append(f'{file_url}')
|
||
|
return data
|
||
|
|
||
|
|
||
|
def test_authorization(instance: Authorization, field):
|
||
|
field_info = getattr(instance, field)
|
||
|
if not field_info:
|
||
|
return False
|
||
|
platform_type = instance.platform_type
|
||
|
success = False
|
||
|
if platform_type == AuthorizationPlatformType.ELM:
|
||
|
if field == 'cookie_info':
|
||
|
cookies = []
|
||
|
xsrf_token = ''
|
||
|
for info in field_info:
|
||
|
cookie = f'{info.get("name")}={info.get("value")}'
|
||
|
cookies.append(cookie)
|
||
|
if info.get('name') == 'XSRF-TOKEN':
|
||
|
xsrf_token = info.get('value')
|
||
|
cookie = ';'.join(cookies)
|
||
|
url = f'https://union.ele.me/user/userinfo?_csrf={xsrf_token}'
|
||
|
headers = {
|
||
|
'Cookie': cookie,
|
||
|
'X-Csrf-Token': xsrf_token,
|
||
|
'X-Xsrf-Token': xsrf_token,
|
||
|
}
|
||
|
res = requests.get(url, headers=headers).json()
|
||
|
success = res.get('success') and str(res.get('result', {}).get('userId')) == instance.uid
|
||
|
if field == 'app_key_secret_info':
|
||
|
appkey = field_info.get('appkey')
|
||
|
secret = field_info.get('secret')
|
||
|
top_util = TopUtils(appkey=appkey, secret=secret)
|
||
|
res = top_util.get_zone_list()
|
||
|
success = res is not None
|
||
|
elif platform_type == AuthorizationPlatformType.MT:
|
||
|
if field == 'cookie_info':
|
||
|
cookies = []
|
||
|
for info in field_info:
|
||
|
cookie = f'{info.get("name")}={info.get("value")}'
|
||
|
cookies.append(cookie)
|
||
|
cookie = ';'.join(cookies)
|
||
|
headers = {
|
||
|
'Cookie': cookie,
|
||
|
}
|
||
|
url = f'https://union.meituan.com/api/account/info'
|
||
|
res = requests.get(url, headers=headers)
|
||
|
if res.status_code < 400:
|
||
|
res = res.json()
|
||
|
success = res.get('status') == 0 and str(res.get('data', {}).get('uid')) == instance.uid
|
||
|
if field == 'cookie_info':
|
||
|
instance.cookie_check_result = int(success)
|
||
|
instance.cookie_check_time = datetime.now()
|
||
|
instance.save()
|
||
|
return success
|