diff --git a/api/urls.py b/api/urls.py index d40f706014299377b89fcb124101c85c099e80aa..4026fe1f473bd8d7180892202e347647548bc553 100644 --- a/api/urls.py +++ b/api/urls.py @@ -6,6 +6,7 @@ from .views import topic from .views import tag from .views import reply from .views import product +from .views import pictorial urlpatterns = [ @@ -32,4 +33,7 @@ urlpatterns = [ # product url(r'^v1/product/batch_create$', product.ProductBatchCreate.as_view(), name='product_batch_create'), url(r'^v1/brand/batch_create$', product.BrandBatchCreate.as_view(), name='brand_batch_create'), + + # pictorial + url(r'^v1/pictorial/create$', pictorial.CreatePictorial.as_view(), name='pictorial_create'), ] diff --git a/api/utils/upload.py b/api/utils/upload.py new file mode 100644 index 0000000000000000000000000000000000000000..582fc5b993f2e6994436ddb799dcd169ddd612da --- /dev/null +++ b/api/utils/upload.py @@ -0,0 +1,12 @@ +import requests +from gm_upload import upload, upload_file +from gm_upload import IMG_TYPE + + +def upload_image(url, img_type=IMG_TYPE.TOPIC): + '''éžç«™å†…图片处ç†''' + try: + response = requests.get(url) + return upload(response.content, img_type=img_type) + except: + return None diff --git a/api/views/pictorial.py b/api/views/pictorial.py new file mode 100644 index 0000000000000000000000000000000000000000..8306e8b0a26c42a27b1278208f28baf91eade1bf --- /dev/null +++ b/api/views/pictorial.py @@ -0,0 +1,174 @@ +import json +import requests +from random import randint +from api.views.base_view import BaseView +from api.utils.sensitive import Sensitive +from api.utils.upload import upload_image +from api.cache.cache import ins_cache + +from libs.user import get_user_by_ids +from alpha_types.venus import ERROR +from alpha_types.venus import GRAP_PLATFORM +from engine.logger import info_logger, error_logger, logging_exception + + +pictorial_id_cache = "pictorial_cache" +IMAGE_SUFFIX = '-w' + + +class CreatePictorial(BaseView): + """ + ç”»æŠ¥çˆ¬å–æŽ¥å£ + """ + user_id_list = [241407684, 241407653, 241407671, 241592897] + del_cache_keys = [] + + def del_cache(self): + for obj in self.del_cache_keys: + ins_cache.delete(obj) + + def get_random_user_id(self): + index = randint(0, 3) + return self.user_id_list[index] + + def get_user_id(self, id_, platform): + cache_key = 'grap:{}:{}'.format(platform, id_) + exist_key = 'grap:{}:{}' + value = ins_cache.get(cache_key) + user_id = None + if not value: + while True: + user_id = self.get_random_user_id() + exist = exist_key.format(platform, user_id) + if not ins_cache.get(exist): + ins_cache.set(exist, id_) + self.del_cache_keys.append(exist) + break + ins_cache.set(cache_key, user_id) + self.del_cache_keys.append(exist) + else: + user_id = int(value) + return user_id + + + def get_image_size(self, image_url): + # 获å–图片宽高 + try: + url = image_url + IMAGE_SUFFIX + '?imageInfo' + response = requests.request("GET", url) + info = response.json() + return info.get('width'), info.get('height') + except Exception as e: + logging_exception() + return None + + def image_info(self, urls): + ret = [] + for url in urls: + image_url = upload_image(url) + while not image_url: + image_url = upload_image(url) + width, height = self.get_image_size(image_url) + while not width and not height: + width, height = self.get_image_size(image_url) + ret.append( + { + 'url': image_url.replace('http://alpha.gmeiapp.com/', ''), + 'height': height, + 'width': width, + } + ) + return ret + + def revise_comments(self, comments, from_id): + ret = [] + for obj in comments: + obj['from_id'] = from_id + reply = obj.pop('reply', None) + if not reply: + ret.append(obj) + continue + for info in reply: + ret.append(obj) + info['from_id'] = obj.get('from_id') + info['reply_id'] = obj.get('id') + info['type'] = obj.get('type') + + ret.append(info) + return ret + + def post(self, request): + + pictorial = json.loads(request.POST.get('pictorial', '{}')) + topics = json.loads(request.POST.get('topics', '[]')) + platform = int(request.POST.get('platform', GRAP_PLATFORM.XIAOHONGSHU)) + + if not topics: + return self.error(self.get_ErrorInfo(ERROR.PARAMS_INCOMPLETE)) + if pictorial: + if not pictorial.get('id'): + return self.error(self.get_ErrorInfo(ERROR.PARAMS_INCOMPLETE)) + if not pictorial.get('name'): + return self.error(self.get_ErrorInfo(ERROR.PARAMS_INCOMPLETE)) + if not pictorial.get('description'): + return self.error(self.get_ErrorInfo(ERROR.PARAMS_INCOMPLETE)) + if not pictorial.get('create_time'): + return self.error(self.get_ErrorInfo(ERROR.PARAMS_INCOMPLETE)) + if not pictorial.get('user'): + return self.error(self.get_ErrorInfo(ERROR.PARAMS_INCOMPLETE)) + if not pictorial.get('user').get('id'): + return self.error(self.get_ErrorInfo(ERROR.PARAMS_INCOMPLETE)) + + for topic in topics: + if not topic.get('id'): + return self.error(self.get_ErrorInfo(ERROR.PARAMS_INCOMPLETE)) + if not topic.get('content'): + return self.error(self.get_ErrorInfo(ERROR.PARAMS_INCOMPLETE)) + if not topic.get('images'): + return self.error(self.get_ErrorInfo(ERROR.PARAMS_INCOMPLETE)) + if not topic.get('create_time'): + return self.error(self.get_ErrorInfo(ERROR.PARAMS_INCOMPLETE)) + if not topic.get('user').get('id'): + return self.error(self.get_ErrorInfo(ERROR.PARAMS_INCOMPLETE)) + + pictorial_id = None + if pictorial: + pictorial_comments = pictorial.pop('comments', None) + pictorial['user_id'] = self.get_user_id(id_=pictorial.get('id'), platform=platform) + error, pictorial_obj = self.call_rpc('venus/community/crawl/pictorial', data=pictorial, platform=platform) + if error: + self.del_cache() + return self.error(error=error) + pictorial_id = pictorial_obj.get('id') + + if pictorial_comments: + error, _ = self.call_rpc('venus/community/crawl/replys', data=pictorial_comments, platform=platform, pictorial_id=pictorial_id) + if error: + self.del_cache() + return self.error(error=error) + + for topic in topics: + topic_comments = topic.pop('comments', None) + images = topic.pop('images') + topic['images'] = self.image_info(images) + topic['user_id'] = self.get_user_id(id_=topic.get('id'), platform=platform) + error, topic_obj = self.call_rpc('venus/community/crawl/topic', data=topic, platform=platform, pictorial_id=pictorial_id) + if error: + self.del_cache() + return self.error(error=error) + if not topic_comments: + continue + import ipdb + ipdb.set_trace() + from_id = topic.get('id') + for obj in topic_comments: + if platform == GRAP_PLATFORM.XIAOHONGSHU: + topic_comments = self.revise_comments(topic_comments, from_id) + obj['user_id'] = self.get_user_id(id_=obj.get('id'), platform=platform) + error, _ = self.call_rpc('venus/community/crawl/replys', data=topic_comments, platform=platform, topic_id=topic_obj.get('id')) + if error: + self.del_cache() + return self.error(error=error) + + self.del_cache() + return self.ok()