def clean_content(self): content_objs = self.data.get('content') content = json.loads(content_objs) biji_type = 1 try: if content.get('type') and content.get('type') != 'images': biji_type = 2 except Exception: pass title = content.get('title') return b64encode(title), content_objs, biji_type
def xcx_login(request): response = Response.ResponseObj() if request.method == "POST": js_code = request.POST.get('js_code') appid = request.POST.get('appid') userInfo = request.POST.get('userInfo') # 客户信息 print('userInfo, type(userInfo)------> ', userInfo, type(userInfo)) userInfo = json.loads(userInfo) tripartite_platform_objs = tripartite_platform() # 实例化三方平台 ret_data = tripartite_platform_objs.get_customer_openid( appid, js_code) # 获取客户openid openid = ret_data.get('openid') session_key = ret_data.get('session_key') # 用于加密 objs = models.Customer.objects.filter(openid=openid) nickName = base64_encryption.b64encode(userInfo.get('nickName')) if objs: objs.update( **{ 'head_portrait': userInfo.get('avatarUrl'), 'sex': userInfo.get('gender'), 'country': userInfo.get('country'), 'province': userInfo.get('province'), 'city': userInfo.get('city'), 'name': nickName, 'session_key': session_key, }) obj = objs[0] else: token = account.get_token(account.str_encrypt(openid)) obj = models.Customer.objects.create( **{ 'head_portrait': userInfo.get('avatarUrl'), 'sex': userInfo.get('gender'), 'country': userInfo.get('country'), 'province': userInfo.get('province'), 'city': userInfo.get('city'), 'session_key': session_key, 'name': nickName, 'openid': openid, 'token': token, }) response.code = 200 response.msg = '登录成功' response.data = { 'user_id': obj.id, 'token': obj.token, } return JsonResponse(response.__dict__)
def xiaohongshu_biji_oper(request, oper_type, o_id): response = Response.ResponseObj() user_id = request.GET.get('user_id') # print('request.POST -->', request.POST) if request.method == "POST": # 添加 if oper_type == "add": form_data = { 'xiaohongshu_id': request.POST.get('xiaohongshu_id'), 'content': request.POST.get('content'), 'release_time': request.POST.get('release_time', datetime.datetime.now()) } # 创建 form验证 实例(参数默认转成字典) forms_obj = AddForm(form_data) if forms_obj.is_valid(): print("验证通过") xiaohongshu_id = forms_obj.cleaned_data.get('xiaohongshu_id') title, content, biji_type = forms_obj.cleaned_data.get('content') release_time = forms_obj.cleaned_data.get('release_time') platform = request.POST.get('platform', 1) xiaohongshu_user_objs = models.XiaohongshuUserProfile.objects.filter(xiaohongshu_id=xiaohongshu_id, platform=platform) if xiaohongshu_user_objs: xiaohongshu_user_obj = xiaohongshu_user_objs[0] biji_id = request.POST.get('biji_id') # 如果有 该值 则更新 待审核状态 if biji_id: biji_objs = models.XiaohongshuBiji.objects.filter(id=biji_id) obj = biji_objs[0] biji_objs.update(status=3, content=content, release_time=release_time, title=title, biji_type=biji_type, user_id_id=xiaohongshu_user_obj.id) response.code = 200 response.msg = "更新成功" else: objs = models.XiaohongshuBiji.objects.filter( title=title, user_id_id=xiaohongshu_user_obj.id, user_id__platform=platform ) if objs: response.code = 301 response.msg = '笔记已存在, 请勿重复添加' return JsonResponse(response.__dict__) else: obj = models.XiaohongshuBiji.objects.create( user_id=xiaohongshu_user_obj, content=content, release_time=release_time, title=title, biji_type=biji_type ) response.msg = "添加成功" response.code = 200 response.data = { 'biji_id': obj.id } else: response.code = 0 response.msg = "添加失败, 小红书id不存在" else: print("验证不通过") response.code = 301 response.msg = json.loads(forms_obj.errors.as_json()) create_xhs_admin_response(request, response, 2) # 提交反链 elif oper_type == "upload_url": form_data = { 'task_id': request.POST.get('task_id'), 'url': request.POST.get('url'), } forms_obj = UploadUrlForm(form_data) if forms_obj.is_valid(): print("验证通过") task_id = forms_obj.cleaned_data.get('task_id') url = forms_obj.cleaned_data.get('url') link = get_existing_url(url) # 获取真实链接 completion_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') biji_objs = models.XiaohongshuBiji.objects.filter(id=task_id) biji_objs.update( biji_existing_url=link, biji_url=link, status=2, completion_time=completion_time ) api_url = "https://www.ppxhs.com/api/v1/sync/sync-screen-article" data = { "id": task_id, "link": link, "platform": biji_objs[0].user_id.platform, "pubTime": completion_time, "online_pic": "http://qiniu.bjhzkq.com/xiaohongshu_fabu_1560934704790" } ret = requests.post(url=api_url, data=data) create_xhs_admin_response(request, ret.json(), 1, url=api_url, req_type=2) # 记录请求日志 response.code = 200 response.msg = "提交成功" else: print("验证不通过") response.code = 301 response.msg = json.loads(forms_obj.errors.as_json()) create_xhs_admin_response(request, response, 3) # 发布笔记(后台) elif oper_type == 'published_articles': now = datetime.datetime.today() flag = False hms_date = datetime.datetime.today().strftime('%H:%M:%S') hms_date = datetime.datetime.strptime(hms_date, '%H:%M:%S') if datetime.datetime.strptime('8:30:00', '%H:%M:%S') >= hms_date >= datetime.datetime.strptime('7:30:00', '%H:%M:%S'): flag = True elif datetime.datetime.strptime('13:30:00', '%H:%M:%S') >= hms_date >= datetime.datetime.strptime('12:00:00', '%H:%M:%S'): flag = True elif datetime.datetime.strptime('21:30:00', '%H:%M:%S') >= hms_date >= datetime.datetime.strptime('17:00:00', '%H:%M:%S'): flag = True if flag: id_list = json.loads(request.POST.get('id_list')) objs = models.XiaohongshuBiji.objects.filter(id__in=id_list) for obj in objs: obj.status = 1 obj.save() response.code = 200 response.msg = '发布成功' else: response.code = 301 response.msg = '当前时间不在发布时间段' create_xhs_admin_response(request, response, 3) # 创建请求日志(手机端) # 阅读量更改(后台) elif oper_type == 'update_reding': """ o_id: 笔记ID reading_num: 阅读量 """ form_data = { 'o_id': o_id, 'reading_num': request.POST.get('reading_num') } form_obj = UpdateReding(form_data) if form_obj.is_valid(): o_id = form_obj.cleaned_data.get('o_id') reading_num = int(form_obj.cleaned_data.get('reading_num')) if reading_num > 0: objs = models.XiaohongshuBiji.objects.filter( id=o_id ) objs.update( reading_num=reading_num, update_reding_num_time=datetime.datetime.today() ) form_data['num'] = reading_num form_data['transfer_type'] = 3 form_data['id'] = o_id form_data['platform'] = objs[0].user_id.platform asynchronous_transfer_data.delay(form_data) # 传递到小红书后台 response.code = 200 response.msg = '阅读量更新完成' else: response.code = 301 response.msg = json.loads(form_obj.errors.as_json()) create_xhs_admin_response(request, response, 3) # 发布中的笔记 可以改为发布异常(后台) elif oper_type == 'instead_abnormal_release_notes': form_data = { 'o_id': o_id, 'error_msg': request.POST.get('error_msg') } form_obj = InsteadAbnormalReleaseNotes(form_data) if form_obj.is_valid(): o_id = form_obj.cleaned_data.get('o_id') error_msg = form_obj.cleaned_data.get('error_msg') obj = models.XiaohongshuBiji.objects.get(id=o_id) obj.status = 4 obj.error_msg = error_msg obj.save() response.code = 200 response.msg = '更改发布异常成功' form_data['transfer_type'] = 5 form_data['id'] = o_id form_data['platform'] = obj.user_id.platform form_data['content'] = error_msg asynchronous_transfer_data.delay(form_data) # 传递到小红书后台 else: response.code = 301 response.msg = json.loads(form_obj.errors.as_json()) create_xhs_admin_response(request, response, 2) # 已发布的可修改回链(后台) elif oper_type == 'published_notes_back_chain': form_data = { 'o_id': o_id, 'back_url': request.POST.get('back_url') } form_obj = PublishedNotesBackChain(form_data) if form_obj.is_valid(): o_id = form_obj.cleaned_data.get('o_id') back_url, link = form_obj.cleaned_data.get('back_url') obj = models.XiaohongshuBiji.objects.get(id=o_id) obj.biji_url = back_url obj.biji_existing_url = link obj.save() response.code = 200 response.msg = '修改反链成功' asynchronous_synchronous_trans.delay(o_id) # 异步更改小红书后台回链 else: response.code = 301 response.msg = json.loads(form_obj.errors.as_json()) create_xhs_admin_response(request, response, 1) # 修改笔记是否存在内容的状态 elif oper_type == "update_exist_content": status = request.POST.get('status') form_data = { 'status': request.POST.get('status'), 'o_id': o_id, } print("status -->", status, type(status)) # 创建 form验证 实例(参数默认转成字典) forms_obj = UpdateExistContentForm(form_data) if forms_obj.is_valid(): status = forms_obj.cleaned_data.get('status') models.XiaohongshuBiji.objects.filter(id=o_id).update(exist_content=status) response.code = 200 response.msg = "修改成功" else: print("验证不通过") response.code = 301 response.msg = json.loads(forms_obj.errors.as_json()) # 已发布的笔记 改为重新发布(小红书后台) 404 elif oper_type == 'republish_instead': form_data = { 'o_id':o_id, } form_obj = RepublishInsteadForm(form_data) if form_obj.is_valid(): o_id = form_obj.cleaned_data.get('o_id') models.XiaohongshuBiji.objects.filter(id=o_id).update( status=5, is_delete_old_biji=False ) response.code = 200 response.msg = '修改成功' else: response.code = 301 response.msg = json.loads(form_obj.errors.as_json()) create_xhs_admin_response(request, response, 2) # 重新发布的笔记 改为待审核(后台) elif oper_type == 'change_pending_review': form_data = { 'biji_id_list': request.POST.get('biji_id_list') } form_obj = ChangePendingReview(form_data) if form_obj.is_valid(): biji_id_list = form_obj.cleaned_data.get('biji_id_list') objs = models.XiaohongshuBiji.objects.filter( id__in=biji_id_list ) objs.update( is_delete_old_biji=True ) for obj in objs: url = 'https://www.ppxhs.com/api/v1/sync/screen-notfound' data = { 'id':obj.id, 'platform':obj.user_id.platform } ret = requests.post(url, data=data) models.AskLittleRedBook.objects.create( # 更新日志 request_type=2, # POST请求 request_url=url, get_request_parameter='', post_request_parameter=data, response_data=ret.json(), status=1 ) response.code = 200 response.msg = '删除成功' else: response.code = 301 response.msg = json.loads(form_obj.errors.as_json()) create_xhs_admin_response(request, response, 2) else: response.code = 402 response.msg = "请求异常" else: # 获取发布任务 if oper_type == "get_release_task": form_data = { 'imsi': request.GET.get('imsi'), 'iccid': request.GET.get('iccid'), 'platform': request.GET.get('platform', 1), } forms_obj = GetReleaseTaskForm(form_data) if forms_obj.is_valid(): iccid = forms_obj.cleaned_data['iccid'] imsi = forms_obj.cleaned_data['imsi'] platform = forms_obj.cleaned_data['platform'] objs = models.XiaohongshuBiji.objects.select_related('user_id').filter( user_id__platform=platform, user_id__phone_id__iccid=iccid, user_id__phone_id__imsi=imsi, status=1, release_time__lt=datetime.datetime.now() ) if objs: obj = objs[0] response.data = { "id": obj.id, "content": obj.content, "platform": obj.user_id.platform, } else: response.msg = "当前无任务" response.code = 200 else: # print("forms_obj.errors -->", forms_obj.errors) response.code = 402 response.msg = "请求异常" response.data = json.loads(forms_obj.errors.as_json()) create_xhs_admin_response(request, response, 3) # 查询 小红书笔记(后台) elif oper_type == 'get_xhs_notes': forms_obj = select_form(request.GET) if forms_obj.is_valid(): current_page = forms_obj.cleaned_data['current_page'] length = forms_obj.cleaned_data['length'] order = request.GET.get('order', '-create_datetime') field_dict = { 'id': '', 'uid': '__contains', 'status': '', 'biji_type': '', 'user_id__name': '__contains', 'is_delete_old_biji': '', 'user_id__phone_id__name': '', 'biji_existing_url': '__contains', 'reading_num': '', } q = conditionCom(request, field_dict) content = request.GET.get('content') xhs_user_id = request.GET.get('xhs_user_id') if content: q.add(Q(title__contains=b64encode(content)), Q.AND) if xhs_user_id: q.add(Q(user_id=xhs_user_id), Q.AND) objs = models.XiaohongshuBiji.objects.select_related('user_id').filter( q, ).exclude(user_id_id=5).order_by(order) count = objs.count() if length != 0: start_line = (current_page - 1) * length stop_line = start_line + length objs = objs[start_line: stop_line] ret_data = [] for obj in objs: # biji_type = 'img' # if json.loads(obj.content).get('type') and json.loads(obj.content).get('type') != 'images': # biji_type = 'video' release_time = obj.release_time if release_time: release_time = obj.release_time.strftime('%Y-%m-%d %H:%M:%S') completion_time = obj.completion_time if completion_time: completion_time = obj.completion_time.strftime('%Y-%m-%d %H:%M:%S') update_reding_num_time = '' if obj.update_reding_num_time: update_reding_num_time = obj.update_reding_num_time.strftime('%Y-%m-%d %H:%M:%S') result_data = { 'id': obj.id, 'user_id': obj.user_id_id, 'phone_id': obj.user_id.phone_id_id, 'phone_name': obj.user_id.phone_id.name, 'phone_number': obj.user_id.phone_id.phone_num, 'user_name': obj.user_id.name, 'status_id': obj.status, 'reading_num': obj.reading_num, 'status': obj.get_status_display(), 'release_time': release_time, 'completion_time': completion_time, 'biji_url': obj.biji_url, 'error_msg': obj.error_msg, 'biji_type_id': obj.biji_type, 'biji_type': obj.get_biji_type_display(), 'biji_existing_url': obj.biji_existing_url, 'is_delete_old_biji': obj.is_delete_old_biji, 'update_reding_num_time': update_reding_num_time, 'platform': obj.user_id.platform, 'exist_content': obj.exist_content, 'create_datetime': obj.create_datetime.strftime('%Y-%m-%d %H:%M:%S'), } result_data['content'] = json.loads(obj.content) ret_data.append(result_data) response.code = 200 response.msg = '查询成功' response.data = { 'ret_data': ret_data, 'count': count, 'status_choices': [{'id':i[0], 'name':i[1]} for i in models.XiaohongshuBiji.status_choices], 'biji_type_choices': [{'id':i[0], 'name':i[1]} for i in models.XiaohongshuBiji.biji_type_choices] } else: response.code = 301 response.msg = json.loads(forms_obj.errors.as_json()) # 获取 exist_content 字段为False的笔记链接,请求小红书接口进行获取数据,判断文章内容是否正常 elif oper_type == "exist_content_get_url": objs = models.XiaohongshuBiji.objects.filter(status=2, exist_content=0) if objs: obj = objs[0] response.code = 200 biji_id = obj.biji_existing_url.split('/')[-1] response.data = { 'biji_id': biji_id, 'task_id': obj.id } else: response.code = 0 response.msg = "当前无任务" else: response.code = 402 response.msg = "请求异常" return JsonResponse(response.__dict__)
def team_oper(request, oper_type, o_id): # print('oper_type -->', oper_type) response = Response.ResponseObj() user_id = request.GET.get('user_id') if request.method == "POST": # 添加团队 if oper_type == "add": form_data = { 'create_user_id': user_id, 'name': request.POST.get('name'), } # 创建 form验证 实例(参数默认转成字典) forms_obj = AddForm(form_data) if forms_obj.is_valid(): print("验证通过") # print(forms_obj.cleaned_data) # 添加数据库 # print('forms_obj.cleaned_data-->',forms_obj.cleaned_data) obj = models.Team.objects.create(**forms_obj.cleaned_data) obj.userprofileteam_set.create(user_id=user_id, team_id=obj.id, type=2) response.code = 200 response.msg = "添加成功" response.data = {'id': obj.id} else: response.code = 301 response.msg = json.loads(forms_obj.errors.as_json()) # 修改团队名称 elif oper_type == "update": # 获取需要修改的信息 form_data = { 'o_id': o_id, # 团队id 'user_id': user_id, 'name': request.POST.get('name'), } forms_obj = UpdateForm(form_data) if forms_obj.is_valid(): # print("验证通过") # print(forms_obj.cleaned_data) o_id = forms_obj.cleaned_data['o_id'] name = forms_obj.cleaned_data['name'] # 查询更新 数据 models.Team.objects.filter(id=o_id).update(name=name, ) response.code = 200 response.msg = "修改成功" else: print("验证不通过") # print(forms_obj.errors) response.code = 301 # print(forms_obj.errors.as_json()) # 字符串转换 json 字符串 response.msg = json.loads(forms_obj.errors.as_json()) # 删除团队成员 elif oper_type == "delete_member": delete_user_id = request.POST.get('delete_user_id') # 要移除的成员id form_data = { 'o_id': o_id, # 团队id 'user_id': user_id, 'delete_user_id': delete_user_id, } forms_obj = DeleteMemberForm(form_data) if forms_obj.is_valid(): # print("验证通过") # print(forms_obj.cleaned_data) team_id = forms_obj.cleaned_data['o_id'] delete_user_id_list = forms_obj.cleaned_data['delete_user_id'] print('team_id -->', team_id) print('delete_user_id -->', delete_user_id) # 删除团队中的成员 models.UserprofileTeam.objects.filter( team_id=team_id, type=1, user_id__in=delete_user_id_list).delete() response.code = 200 response.msg = "删除成功" else: print("验证不通过") response.code = 301 response.msg = json.loads(forms_obj.errors.as_json()) # 设置普通成员成为管理员 elif oper_type == "set_management": print('request.POST -->', request.POST) print('request.GET -->', request.GET) set_user_id = request.POST.get('set_user_id') print('set_user_id -->', set_user_id) form_data = { 'o_id': o_id, # 团队id 'user_id': user_id, 'set_user_id': set_user_id, } forms_obj = SetManagementForm(form_data) if forms_obj.is_valid(): set_user_id_list = forms_obj.cleaned_data.get('set_user_id') team_id = forms_obj.cleaned_data.get('o_id') # 先将所有成员改成普通用户 models.UserprofileTeam.objects.filter(team_id=team_id).update( type=1) # 修改成员类型为管理员 models.UserprofileTeam.objects.filter( team_id=team_id, user_id__in=set_user_id_list).update(type=2) response.code = 200 response.msg = "修改成功" else: response.code = 301 response.data = json.loads(forms_obj.errors.as_json()) # 删除团队 elif oper_type == 'delete': member_objs = models.UserprofileTeam.objects.filter(team_id=o_id) user_id_list = [ i.get('user_id') for i in member_objs.filter(type=2).values('user_id') ] user_list = [ i.get('user_id') for i in member_objs.filter(type=1).values('user_id') ] # 普通用户 if int(user_id) in user_id_list: # 该团队管理员列表 models.Article.objects.filter(ownership_team_id=o_id).update( ownership_team_id=None) member_objs.delete() models.Team.objects.filter(id=o_id).delete() response.code = 200 response.msg = '删除团队成功' else: if int(user_id) in user_list: member_objs.filter(user_id=user_id).delete() response.code = 200 response.msg = '退出团队成功' else: response.code = 301 response.msg = '权限不足' else: # 查看团队人员列表 if oper_type == "select_user_list": form_data = { 'team_id': o_id, 'current_page': request.GET.get('current_page', 1), 'length': request.GET.get('length', 10), } forms_obj = SelectUserListForm(form_data) if forms_obj.is_valid(): print('forms_obj.cleaned_data -->', forms_obj.cleaned_data) current_page = forms_obj.cleaned_data['current_page'] length = forms_obj.cleaned_data['length'] team_id = forms_obj.cleaned_data['team_id'] order = request.GET.get('order', 'create_datetime') field_dict = { 'id': '', 'type': '', # 'user__name': '__contains', 'create_datetime': '', } q = conditionCom(request, field_dict) print('q -->', q) objs = models.UserprofileTeam.objects.select_related( 'user').filter(q).filter(team_id=team_id).order_by(order) count = objs.count() if length != 0: start_line = (current_page - 1) * length stop_line = start_line + length objs = objs[start_line:stop_line] # 返回的数据 ret_data = [] for obj in objs: # 将查询出来的数据 加入列表 print('base64_encryption.b64encode(obj.user.name) -->', base64_encryption.b64encode(obj.user.name)) ret_data.append({ 'id': obj.user_id, 'user_type_name': obj.get_type_display(), 'user_type': obj.type, 'name': base64_encryption.b64decode(obj.user.name), 'set_avator': obj.user.set_avator, 'create_datetime': obj.create_datetime.strftime('%Y-%m-%d %H:%M:%S'), }) # 查询成功 返回200 状态码 response.code = 200 response.msg = '查询成功' response.data = { 'ret_data': ret_data, 'data_count': count, } response.note = { 'id': "用户id", 'name': "用户名称", 'user_type': "用户在团队中的类型/角色id, 1 ==> 普通用户 2 ==> 管理员", 'user_type_name': "用户在团队中的类型/角色名称", 'set_avator': "用户头像", 'create_datetime': "用户加入时间", } else: response.code = 301 response.data = json.loads(forms_obj.errors.as_json()) return JsonResponse(response.__dict__)
def share_article(request, oper_type): code = request.GET.get('code') code_objs = models.save_code.objects.filter(save_code=code) if not code_objs: models.save_code.objects.create(save_code=code) state = request.GET.get('state') # 分享文章的用户id data = get_ent_info(state) weichat_api_obj = weixin_gongzhonghao_api.WeChatApi(data) ret_obj = weichat_api_obj.get_openid(code) openid = ret_obj.get('openid') # print('ret_obj-----------> ', ret_obj) encode_username = b64encode(ret_obj['nickname']) user_data = { "sex": ret_obj.get('sex'), "country": ret_obj.get('country'), "province": ret_obj.get('province'), "city": ret_obj.get('city'), 'name': encode_username, 'set_avator': ret_obj.get('headimgurl') } customer_objs = models.Customer.objects.filter(openid=openid) if customer_objs: # 客户已经存在 customer_objs.update(**user_data) customer_obj = customer_objs[0] # 不存在,创建用户 else: subscribe = ret_obj.get('subscribe') user_data['set_avator'] = ret_obj.get('headimgurl') # 如果没有关注,获取个人信息判断是否关注 if not subscribe: ret_obj_subscribe = weichat_api_obj.get_user_info( openid=openid) subscribe = ret_obj_subscribe.get('subscribe') # print('ret_objret_obj--ret_obj---> ', ret_obj) user_data['subscribe'] = subscribe user_data['name'] = encode_username user_data['openid'] = ret_obj.get('openid') user_data['token'] = get_token() print("user_data --->", user_data) customer_obj = models.Customer.objects.create(**user_data) objs = models.Customer.objects.filter(openid=openid) obj = objs[0] _type = oper_type oid = '' if '_' in oper_type: _type = oper_type.split('_')[0] # 类型 oid = oper_type.split('_')[1] # ID # print('o_id---o_id--o_id--> ', oper_type) if _type == 'article': # 此处跳转到文章页面 文章 redirect_url = '{host_url}#/share_article?user_id={user_id}&token={token}&id={article_id}&inviter_user_id={inviter_user_id}'.format( host_url=host_url, article_id=oid, # 分享文章的id user_id=customer_obj.id, token=obj.token, inviter_user_id=state, ) elif _type == 'micro': # 此处跳转到微店宝贝页面 redirect_url = '{host_url}#/share_micro_store?user_id={user_id}&token={token}&id={goods_id}&inviter_user_id={inviter_user_id}'.format( host_url=host_url, goods_id=oid, # 分享商品的id user_id=customer_obj.id, token=obj.token, inviter_user_id=state, ) elif _type == 'card': # 此处跳到我的名片页面 redirect_url = '{host_url}#/Share_Card?user_id={user_id}&token={token}&inviter_user_id={inviter_user_id}'.format( host_url=host_url, user_id=customer_obj.id, token=obj.token, inviter_user_id=state, ) else: redirect_url = '' update_customer_set_avator.delay() # 更新客户头像到七牛云 return redirect(redirect_url)
def updateUserInfo(openid, inviter_user_id, ret_obj, msg=None, enterprise_id=1): # msg访问日志记录 enterprise_id 公司ID """ :param openid: 微信openid :param inviter_user_id: 邀请人id :param ret_obj: 微信数据 :return: """ print('ret_obj -->', ret_obj) """ { 'subscribe_scene': 'ADD_SCENE_QR_CODE', 'city': '丰台', 'openid': 'oX0xv1pJPEv1nnhswmSxr0VyolLE', 'qr_scene': 0, 'tagid_list': [], 'nickname': '张聪', 'subscribe_time': 1527689396, 'country': '中国', 'groupid': 0, 'subscribe': 1, 'qr_scene_str': '{"timestamp": "1527689369548"}', 'headimgurl': 'http://thirdwx.qlogo.cn/mmopen/oFswpUmYn53kTv5QdmmONicVJqp3okrhHospu6icoLF7Slc5XyZWR 96STN9RiakoBQn1uoFJIWEicJgJ1QjR5iaGOgWNQ5BSVqFe5/132', 'province': '北京', 'sex': 1, 'language': 'zh_CN', 'remark': '' } { "openid":"oX0xv1pJPEv1nnhswmSxr0VyolLE", "nickname":"张聪", "sex":1, "language":"zh_CN", "city":"丰台", "province":"北京", "country":"中国", "headimgurl":"http://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJWGnNTvluYlHj8qt8HnxMlwbRiad bv4TNrp4watI2ibPPAp2Hu6Sm1BqYf6IicNWsSrUyaYjIoy2Luw/132", "privilege":[] } """ # 保证1个微信只能够关联1个账号 user_objs = models.Userprofile.objects.filter(openid=openid) encode_username = base64_encryption.b64encode(ret_obj['nickname']) path = requests_img_download(ret_obj.get('headimgurl')) set_avator = update_qiniu(path) user_data = { "sex": ret_obj.get('sex'), "country": ret_obj.get('country'), "province": ret_obj.get('province'), "city": ret_obj.get('city'), "headimgurl": ret_obj.get('headimgurl'), "wechat_name": encode_username, "last_active_time": datetime.datetime.today(), "is_send_msg": 0, } if user_objs: user_obj = user_objs[0] if int(user_obj.is_send_msg) == 1: # 解除24小时未互动限制 post_data = { "touser": user_obj.openid, "msgtype": "text", "text": { "content": """限制已解除, 天眼将继续为您推送消息!{}""".format(zhayan) } } data = get_ent_info(user_obj.id) weixin_objs = WeChatApi(data) # 发送客服消息 post_data = bytes(json.dumps(post_data, ensure_ascii=False), encoding='utf-8') weixin_objs.news_service(post_data) user_id = user_objs[0].id user_objs.update(**user_data) else: # encodestr = base64.b64encode(ret_obj['nickname'].encode('utf8')) # encode_username = str(encodestr, encoding='utf8') overdue_date = datetime.datetime.now() + datetime.timedelta(days=30) subscribe = ret_obj.get('subscribe') # 如果没有关注,获取个人信息判断是否关注 if not subscribe: data = get_ent_info(inviter_user_id) weichat_api_obj = WeChatApi(data) ret_obj = weichat_api_obj.get_user_info(openid=openid) subscribe = ret_obj.get('subscribe') user_data['enterprise_id'] = enterprise_id user_data['last_active_time'] = datetime.datetime.today() user_data['wechat_name'] = encode_username user_data['headimgurl'] = ret_obj.get('headimgurl') user_data['inviter_id'] = inviter_user_id user_data['set_avator'] = set_avator user_data['subscribe'] = subscribe user_data['name'] = encode_username user_data['openid'] = ret_obj.get('openid') user_data['overdue_date'] = overdue_date user_data['token'] = get_token() print("user_data --->", user_data) user_obj = models.Userprofile.objects.create(**user_data) user_id = user_obj.id pub_log_access(user_id, msg) # 记录访问日志 return user_id
def user_login_oper(request, oper_type): response = Response.ResponseObj() # 判断该用户是否存在 now = datetime.datetime.today() models.save_code.objects.filter(create_datetime__lt=now).delete() code = request.GET.get('code') objs = models.save_code.objects.filter(save_code=code) if not objs: appid = oper_type.split('_')[-1] oper_type = oper_type.split('_' + appid)[0] models.save_code.objects.create(save_code=code) data = get_ent_info(1, appid) weichat_api_obj = WeChatApi(data) ret_obj = weichat_api_obj.get_openid(code) # 获取用户信息 print("ret_obj['nickname']------------> ", ret_obj['nickname']) try: encode_username = b64encode(ret_obj['nickname']) except Exception: encode_username = '' openid = ret_obj.get('openid') user_data = { "sex": ret_obj.get('sex'), "country": ret_obj.get('country'), "province": ret_obj.get('province'), "city": ret_obj.get('city'), "headimgurl": ret_obj.get('headimgurl'), # 更新微信头像 "wechat_name": encode_username, "last_active_time": datetime.datetime.today(), "is_send_msg": 0, # 互动超时消息 互动过改为未发 } user_objs = models.Userprofile.objects.filter(openid=openid) if user_objs: # 客户已经存在 user_obj = user_objs[0] # uf user_obj.enterprise.status == 1: # 如果后台开启 if int(user_obj.is_send_msg) == 1: # 解除24小时未互动限制 post_data = { "touser": user_obj.openid, "msgtype": "text", "text": { "content": """限制已解除, 天眼将继续为您推送消息!{}""".format(zhayan) } } data = get_ent_info(user_obj.id) weixin_objs = WeChatApi(data) # 发送客服消息 post_data = bytes(json.dumps(post_data, ensure_ascii=False), encoding='utf-8') weixin_objs.news_service(post_data) user_objs.update(**user_data) user_objs = user_objs[0] else: # 不存在,创建用户 path = requests_img_download(ret_obj.get('headimgurl')) set_avator = update_qiniu(path) # 上传至七牛云 # # 如果没有关注,获取个人信息判断是否关注 # if not subscribe: # weichat_api_obj = WeChatApi() # ret_obj = weichat_api_obj.get_user_info(openid=openid) # subscribe = ret_obj.get('subscribe') user_data['last_active_time'] = datetime.datetime.today() user_data['wechat_name'] = encode_username user_data['set_avator'] = set_avator user_data['headimgurl'] = ret_obj.get('headimgurl') user_data['subscribe'] = True user_data['name'] = encode_username user_data['openid'] = ret_obj.get('openid') user_data['token'] = get_token() user_data['overdue_date'] = datetime.datetime.now( ) + datetime.timedelta(days=30) user_objs = models.Userprofile.objects.create(**user_data) user_id = user_objs.id pub_log_access(user_id, msg='用户点击公众号菜单栏登录') # 记录访问日志 redirect_url = '{host}?user_id={user_id}&token={token}&classify_type=1&page_type={page_type}'.format( host=host_url, token=user_objs.token, user_id=user_id, page_type=oper_type, ) print('redirect_url----------------------------> ', redirect_url) return redirect(redirect_url) else: response.code = 301 response.msg = '请重新登录' return JsonResponse(response.__dict__)
def user_oper(request, oper_type, o_id): response = Response.ResponseObj() user_id = request.GET.get('user_id') print('request.POST -->', request.POST) if request.method == "POST": # 设置推荐分类 if oper_type == "update_recommend_classify": classify_id = request.POST.get('classify_id[]') if classify_id: recommend_classify_list = [ int(i) for i in json.loads(classify_id) ] print("recommend_classify_list -->", recommend_classify_list) user_obj = models.Userprofile.objects.get(id=user_id) user_obj.recommend_classify = recommend_classify_list response.code = 200 response.msg = "设置成功" else: response.code = 301 response.msg = "分类id传参异常" # 修改头像 elif oper_type == "update_head_portrait": img_path = request.POST.get('img_path') if img_path: models.Userprofile.objects.filter(id=user_id).update( set_avator=img_path) response.code = 200 response.msg = "修改成功" else: response.code = 301 response.msg = "头像不能传参异常" # 修改姓名 elif oper_type == "update_name": name = request.POST.get('name') if name: if len(name) <= 9: name = b64encode(name) models.Userprofile.objects.filter(id=user_id).update( name=name) response.code = 200 response.msg = "修改成功" else: response.code = 301 response.msg = '名字最大长度为8' else: response.code = 301 response.msg = "姓名传参异常" # 修改手机号 elif oper_type == "update_phone_number": phone_number = request.POST.get('phone_number') if verify_mobile_phone_number(phone_number): models.Userprofile.objects.filter(id=user_id).update( phone_number=phone_number) response.code = 200 response.msg = "修改成功" else: response.code = 301 response.msg = "请填写正确手机号" # 修改微信二维码 elif oper_type == "update_qr_code": qr_code = request.POST.get('qr_code') if qr_code: models.Userprofile.objects.filter(id=user_id).update( qr_code=qr_code) response.code = 200 response.msg = "修改成功" else: response.code = 301 response.msg = "微信二维码传参异常" # 修改个性签名 elif oper_type == "update_signature": signature = request.POST.get('signature') if signature: models.Userprofile.objects.filter(id=user_id).update( signature=signature) response.code = 200 response.msg = "修改成功" else: response.code = 301 response.msg = "个性签名传参异常" # 修改文章底部是否显示产品 elif oper_type == "update_show_product": show_product = request.POST.get('show_product') flag = re.match(r"^[01]$", show_product) if show_product and flag: models.Userprofile.objects.filter(id=user_id).update( show_product=int(show_product)) response.code = 200 response.msg = "修改成功" else: response.code = 301 response.msg = "是否显示产品传参异常" # 设置消息提醒 elif oper_type == 'message_remind_setting': objs = models.Userprofile.objects.filter(id=user_id) objs.update(message_remind=o_id) response.code = 200 response.msg = '修改成功' else: # 查询我的会员 有效期 和剩余天数/会员类型 if oper_type == "member_info": obj = models.Userprofile.objects.get(id=user_id) # vip 类型 vip_type = obj.get_vip_type_display() # 时间对象 - 年月日时分秒 now_datetime_obj = datetime.datetime.now() # 时间对象 - 年月日 now_date_obj = datetime.date(now_datetime_obj.year, now_datetime_obj.month, now_datetime_obj.day) # 计算剩余天数 remaining_days = (obj.overdue_date - now_date_obj).days # 如果已经过期,则剩余过期时间为0,vip类型为vip已过期 if remaining_days <= 0: if remaining_days == 0: remaining_days = '今' else: remaining_days = 0 obj.vip_type = 0 obj.save() obj = models.Userprofile.objects.get(id=user_id) vip_type = obj.get_vip_type_display() response.code = 200 response.data = { 'vip_type': vip_type, 'overdue_date': obj.overdue_date.strftime('%Y-%m-%d'), 'remaining_days': str(remaining_days) + '天' } response.note = { 'vip_type': "vip类型", 'overdue_date': "有效期至", 'remaining_days': "剩余天数" } # 使用微信头像 elif oper_type == 'use_wechat_avatar': objs = models.Userprofile.objects.filter(id=user_id) path = requests_img_download(objs[0].headimgurl) set_avator = update_qiniu(path) objs.update(set_avator=set_avator) response.code = 200 response.msg = '修改成功' # 推广赚钱 展示数据 elif oper_type == 'affiliate': user_pub_objs = models.Userprofile.objects response_data = {} user_obj = user_pub_objs.get(id=user_id) response_data[ 'cumulative_amount'] = user_obj.cumulative_amount # 累计钱数 response_data['make_money'] = user_obj.make_money # 待提钱数 invite_objs = user_pub_objs.filter(inviter_id=user_id) invite_friend_list = [ i.get('id') for i in invite_objs.values('id') ] # 该邀请人 邀请的好友ID print('invite_friend_list----------> ', invite_friend_list) # data_list = [] # for i in invite_friend_list: # data_list.insert(0, i) # data_list.extend([i.get('id') for i in models.Userprofile.objects.filter(inviter_id=i).values('id')]) # print('data_list--------------> ', data_list) invite_objs = models.Userprofile.objects.filter( id__in=invite_friend_list) response_data['invite_number_count'] = invite_objs.count() # 邀请人数量 # 查询充值自己分销的钱数 number_clinch_deal_objs = models.distribute_money_log.objects.filter( inviter_id=user_id).order_by('-create_date') response_data[ 'number_clinch_count'] = number_clinch_deal_objs.count( ) # 成交人数 if o_id and int(o_id) == 1: # 邀请人数详情 invite_number_list = [] for invite_number_obj in invite_objs: # 该用户未充值展示的话 prepaid_text = '用户未开通会员, 邀请付款有现金奖励{}!'.format(qian) if invite_number_obj.renewal_log_set.count( ) >= 1: # 判断该用户是否充值 money_objs = models.distribute_money_log.objects.filter( inviter_id=user_id, user_id=invite_number_obj.id) if money_objs: money = money_objs[0].money prepaid_text = '成为会员, 加入账户{}元!{}'.format( money, qian) invite_number_list.append({ 'create_user__set_avator': invite_number_obj.set_avator, 'name': b64decode(invite_number_obj.name), 'prepaid_text': prepaid_text, }) response_data['invite_number_list'] = invite_number_list elif o_id and int(o_id) == 2: # 成交人数 number_clinch_deal_list = [] for number_clinch_deal_obj in number_clinch_deal_objs: number_clinch_deal_list.append({ 'user_set_avator': number_clinch_deal_obj.user.set_avator, 'user_name': b64decode(number_clinch_deal_obj.user.name), 'price': number_clinch_deal_obj.price, 'money': number_clinch_deal_obj.money, }) response_data[ 'number_clinch_deal_list'] = number_clinch_deal_list response.code = 200 response.msg = '查询成功' response.data = response_data response.note = { 'number_clinch_deal_list': { 'user_set_avator': '充值人头像', 'user_name': '充值人名称', 'price': '充值钱数', 'money': '应得钱数', }, "invite_number_count": '邀请人数量', "cumulative_amount": '累计钱数', "make_money": '待提钱数', "number_clinch_count": '成交人数', "invite_number_list": '邀请人详情', } # 推广赚钱 二维码截图 elif oper_type == 'affiliate_screenshots': user_obj = models.Userprofile.objects.get(id=user_id) img_path = user_obj.promote_earning_qr_code_pictures expire_date = user_obj.generate_models_qr_code_pictures_time if img_path and expire_date > datetime.date.today(): # 如果有 图片 pass else: if img_path: os.remove(img_path) # 删除原图 img_path, expire_date = tuiguang(user_id) user_obj.promote_earning_qr_code_pictures = img_path user_obj.generate_models_qr_code_pictures_time = expire_date user_obj.save() response.code = 200 response.msg = '生成成功' response.data = {'path': img_path} # 查询消息提醒设置 elif oper_type == 'get_message_remind': user_obj = models.Userprofile.objects.get(id=user_id) objs = models.Userprofile.message_remind_status data_list = [] for obj in objs: is_choose = False if obj[0] == user_obj.message_remind: is_choose = True data_list.append({ 'id': obj[0], 'name': obj[1], 'is_choose': is_choose }) response.code = 200 response.msg = '查询成功' response.data = {'data_list': data_list} # 复制昵称 elif oper_type == 'copy_nickname': obj = models.Customer.objects.get(id=o_id) response.code = 200 response.msg = '查询成功' response.data = {'nickname': b64decode(obj.name)} # 判断该用户是否到期 (到期后不能转发任何东西) elif oper_type == 'is_whether': obj = models.Userprofile.objects.get(id=user_id) now = datetime.date.today() flag = False if obj.overdue_date >= now: flag = True response.code = 200 response.data = {'flag': flag} # 判断是否有手机号 elif oper_type == 'is_phone': obj = models.Userprofile.objects.get(id=user_id) flag = False if obj.phone_number: flag = True response.code = 200 response.msg = '查询成功' response.data = {'phone': flag} else: response.code = 402 response.msg = '请求异常' return JsonResponse(response.__dict__)
def get_article(article_url, get_content=None): headers = {'User-Agent': pcRequestHeader[random.randint(0, len(pcRequestHeader) - 1)]} ret = requests.get(article_url, headers=headers, timeout=10, verify=False) ret.encoding = 'utf-8' s = requests.session() is_video_original_link = None # 是否有视频 如果有则返回原文链接 soup = BeautifulSoup(ret.text, 'lxml') if not get_content: title = re.compile(r'var msg_title = (.*);').findall(ret.text)[0].replace('"', '') # 标题 summary = re.compile(r'var msg_desc = (.*);').findall(ret.text)[0].replace('"', '') # 摘要 cover_url = re.compile(r'var msg_cdn_url = (.*);').findall(ret.text)[0].replace('"', '') # 封面 ## 把封面图片下载到本地 now_time = time.time() # print('--------------------请求封面-0-----------> ', datetime.datetime.today(), cover_url) html = s.get(cover_url) # print('--------------------结束请求封面-0-----------> ', datetime.datetime.today()) if 'wx_fmt=gif' in cover_url: cover_name = "/cover_%s.gif" % (now_time) else: cover_name = "/cover_%s.jpg" % (now_time) cover_url = os.path.join('statics', 'img') + cover_name with open(cover_url, 'wb') as file: file.write(html.content) cover_url = update_qiniu(cover_url) # 获取所有样式 style = "" style_tags = soup.find_all('style') for style_tag in style_tags: style += str(style_tag) # 获取所有图片 body = soup.find('div', id="js_content") body.attrs['style'] = "padding: 20px 16px 12px;" img_tags = soup.find_all('img') for img_tag in img_tags: data_src = img_tag.attrs.get('data-src') if data_src: if img_tag.attrs.get('style'): img_tag.attrs['style'] = img_tag.attrs.get('style') now_time = time.time() # print('------------------开始请求图片----------->', datetime.datetime.today(), data_src) html = s.get(data_src) # print('------------------结束请求图片----------->', datetime.datetime.today()) if 'wx_fmt=gif' in data_src: img_name = "/article_%s.gif" % (now_time) else: img_name = "/article_%s.jpg" % (now_time) file_dir = os.path.join('statics', 'img') + img_name with open(file_dir, 'wb') as file: file.write(html.content) img_url = update_qiniu(file_dir) img_tag.attrs['data-src'] = img_url # img_tag.attrs['data-src'] = URL + '/statics/img' + img_name ## 处理视频的URL flag = False # 判断是否有 视频 iframe = body.find_all('iframe', attrs={'class': 'video_iframe'}) for iframe_tag in iframe: shipin_url = iframe_tag.get('data-src') data_cover_url = iframe_tag.get('data-cover') # 封面 if data_cover_url: data_cover_url = unquote(data_cover_url, 'utf-8') data_cover_url = requests_img_download(data_cover_url) # 下载到本地 data_cover_url = update_qiniu(data_cover_url) vid = shipin_url.split('vid=')[1] if 'wxv' in vid: # 下载 flag = True iframe_url = 'https://mp.weixin.qq.com/mp/videoplayer?vid={}&action=get_mp_video_play_url'.format(vid) ret = requests.get(iframe_url) video_path = ret.json().get('url_info')[0].get('url') iframe_tag_new = """<div style="width: 100%; background: #000; position:relative; height: 0; padding-bottom:75%;"> <video style="width: 100%; height: 100%; position:absolute;left:0;top:0;" id="videoBox" src="{}" poster="{}" controls="controls" allowfullscreen=""></video> </div>""".format(video_path, data_cover_url) else: shipin_url = 'https://v.qq.com/txp/iframe/player.html?origin=https%3A%2F%2Fmp.weixin.qq.com&vid={}&autoplay=false&full=true&show1080p=false&isDebugIframe=false'.format( vid ) iframe_tag.attrs['data-src'] = shipin_url iframe_tag.attrs['allowfullscreen'] = True # 是否允许全屏 iframe_tag.attrs['data-cover'] = data_cover_url iframe_tag_new = str(iframe_tag).replace('></iframe>', ' width="100%" height="300px"></iframe>') body = str(body).replace(str(iframe_tag), iframe_tag_new) body = BeautifulSoup(body, 'html.parser') content = str(style) + str(body) content = BeautifulSoup(content, 'html.parser') if not get_content: # 生成css 文件 now = time.time() style = style.replace('<style>', '').replace('</style>', '') style_path = os.path.join('statics', 'article_css') + '/{}.css'.format(now) with open(style_path, 'w') as e: e.write(style) # style_path = URL + '/statics/article_css/{}.css'.format(now) # 分布标签 data_list = [] for i in content: content = convert_content(s, str(i)) # 替换内容 data_list.append(content) if flag: is_video_original_link = article_url # 原文链接 if not get_content: data = { 'title': title, 'summary':b64encode(summary), 'cover_img':cover_url, 'content': json.dumps(data_list), 'style': style_path, 'original_link': is_video_original_link, } else: data = { 'content': json.dumps(data_list), } return data
def external_login(request): response = Response.ResponseObj() external_token = request.GET.get('token') # 平台token source = request.GET.get('source') # 来自哪个平台 userId = request.GET.get('userId') # 来自哪个平台 login_type = 2 is_login_flag = True if source == 'dingdong': # 叮咚营销宝 pass else: is_login_flag = False response.code = 402 response.msg = '请求错误' if is_login_flag: # 验证通过 user_data = { 'role_id': 7, # 默认普通用户 'token': external_token, 'login_type': login_type, 'ding_dong_marketing_treasure_user_id': userId, } objs = models.UserProfile.objects.filter(token=external_token) if objs: obj = objs[0] else: get_user_info_url = 'http://a.yingxiaobao.org.cn/api/user/info/{}?token={}&user_id={}'.format( userId, external_token, userId) ret = requests.get(get_user_info_url) info_data = ret.json().get('data') user_data['username'] = base64_encryption.b64encode( info_data.get('username')) user_data['head_portrait'] = info_data.get('head_portrait') obj = models.UserProfile.objects.create(**user_data) role_obj = models.Role.objects.filter(id=obj.role_id) data_list = [] for i in role_obj[0].permissions.all(): data_list.append(i.name) inviter = 0 if obj.inviter: inviter = 1 try: username = base64_encryption.b64decode(obj.username) except Exception: username = obj.username response.code = 200 response.msg = '登录成功' response.data = { 'username': username, 'token': obj.token, 'id': obj.id, 'role_id': obj.role_id, 'role_name': obj.role.name, 'head_portrait': obj.head_portrait, 'permissions_list': data_list, 'inviter': inviter, } return JsonResponse(response.__dict__)
# 向下小手四个 xiajiantou = b64decode('8J+Rhw==') + b64decode('8J+Rhw==') + b64decode('8J+Rhw==') + b64decode('8J+Rhw==') # 难受表情 一个 nanshou = b64decode('8J+Ynw==') # 彩带 🎉 caidai = b64decode('8J+OiQ==') # 白眼🙄 baiyan = b64decode('8J+ZhO+4jw==') # 眨眼 zhayan = b64decode('8J+YiQ==') # 钱 qian = b64decode('8J+StO+4jw==') if __name__ == '__main__': encode = b64encode('😉') print('encode----> ', encode) print(b64decode(encode))