Skip to content

Instantly share code, notes, and snippets.

@liwh
Created April 9, 2013 09:52
Show Gist options
  • Save liwh/5344506 to your computer and use it in GitHub Desktop.
Save liwh/5344506 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from util import api, settings
from v3._base import CachedPlusHandler, BaseHandler, UserClient
import json
import logging
import urllib2
from service import service_ugc, service_user, service_connection
from service.connection import ttypes
import re
class Activity(object):
u"""活动"""
def __init__(self, data):
self.actid = data.get('act_id','')
self.name = data.get('act_title', '')
self.img = data.get('act_img', '')
self.content = data.get('act_desc', '')
self.url = data.get('act_url', '')
class PaikeAdvertise(object):
u"""广告"""
def __init__(self, data):
# data = [
# {
# "adv_img": "http://res.mfs.ykimg.com/051000004F47439C675851163E079F82.jpg",
# "adv_title": "test",
# "adv_type": 505,
# "adv_details": "asdf",
# "created_at": "2012-02-24T06:40:46+08:00"
# }
# ]
if data:
i = len(data) -1
advs = data[i]
advs_type = advs.get('adv_type', 0)
if advs_type == 505:
self.type = 2 #1为广告页面,2为广告用户
self.uid = advs.get('adv_details', '')
else:
self.type = 1
self.url = advs.get('adv_details', '')
self.img = advs.get('adv_img', '')
else:
self.type = ''
self.url = ''
self.img = ''
class LatestVideos(CachedPlusHandler):
u"""拍客客户端最新视频列表"""
def get_cache_key(self):
data = {
'pg': self.pg,
'pz': self.pz,
}
return data
def get_cache_expire(self):
u"""缓存时间为10分钟"""
return settings.cache_expire_M
def prepare(self):
self.pg = int(self.get_argument('pg', 1))
self.pz = int(self.get_argument('pz', 30))
def get(self):
url = 'http://{0}/internal/cms/paike/latest/videos?pid={1}&pg={2}&pz={3}'
url = url.format(api.internal_server(), settings.internal_pid, self.pg, self.pz)
logging.debug(url)
results = get_paike_videos(url, self.pg, self.pz, self.is_update_cache)
self.write(results)
def finish(self, chunk=None):
judge_version = service_ugc.compare_version(self.user_client.prod_ver, '1.5')
if self.get_status() in (200, 304) and judge_version:
_info = self._result_buffer[-1]
_results = _info.get('results', {})
service_ugc.append_video_info(_results, self.user_id)
BaseHandler.finish(self, chunk)
class HottestVideos(CachedPlusHandler):
u"""拍客客户端最热视频列表"""
def get_cache_key(self):
data = {
'pg': self.pg,
'pz': self.pz,
}
return data
def get_cache_expire(self):
u"""缓存时间为10分钟"""
return settings.cache_expire_M
def prepare(self):
self.pg = int(self.get_argument('pg', 1))
self.pz = int(self.get_argument('pz', 30))
self.uid = self.user_id
def get(self):
url = 'http://{0}/internal/cms/paike/hottest/videos?pid={1}&pg={2}&pz={3}'
url = url.format(api.internal_server(), settings.internal_pid, self.pg, self.pz)
logging.debug(url)
results = get_paike_videos(url, self.pg, self.pz, self.is_update_cache)
self.write(results)
def finish(self, chunk=None):
judge_version = service_ugc.compare_version(self.user_client.prod_ver, '1.5')
if self.get_status() in (200, 304) and judge_version:
_info = self._result_buffer[-1]
_results = _info.get('results', {})
service_ugc.append_video_info(_results, self.user_id)
BaseHandler.finish(self, chunk)
class VideoCats(CachedPlusHandler):
u"""拍客客户端视频的类别"""
def get_cache_key(self):
return ''
def get(self):
url = 'http://{0}/internal/cms/paike/catlist?pid={1}'.format(api.internal_server(), settings.internal_pid)
logging.debug(url)
content = urllib2.urlopen(url).read()
content = json.loads(content)
cats = [{'catsid': c.get('sort_id', ''), 'value': c.get('title', '')} for c in content]
result = {'status': 'success', 'total': len(cats), 'results': cats}
self.write(result)
class VideoCatsPaike1_4(CachedPlusHandler):
u"""拍客客户端视频的类别"""
def get_cache_key(self):
return ''
def get(self):
url = 'http://{0}/internal/cms/paike/catlist?pid={1}'.format(api.internal_server(), settings.internal_pid)
logging.debug(url)
content = urllib2.urlopen(url).read()
content = json.loads(content)
cats = []
cats.append({'catsid': 8888, 'value': u'最热'})
for c in content:
cats.append({'catsid': c.get('sort_id', ''), 'value': c.get('title', '')})
result = {'status': 'success', 'total': len(cats), 'results': cats}
self.write(result)
class VideoSingleCat(CachedPlusHandler):
u"""拍客客户端分类视频列表"""
def get_cache_key(self):
data = {
'pg': self.pg,
'pz': self.pz,
}
return data
def get_cache_expire(self):
u"""缓存时间为10分钟"""
return settings.cache_expire_M
def prepare(self):
self.pg = int(self.get_argument('pg', 1))
self.pz = int(self.get_argument('pz', 30))
def get(self, catsid=None):
if not catsid:
self.send_error(-200, desc='invalid catsid')
if catsid == '8888':
url = 'http://{0}/internal/cms/paike/hottest/videos?pid={1}&pg={2}&pz={3}'
url = url.format(api.internal_server(), settings.internal_pid, self.pg, self.pz)
elif catsid == '9999':
url = 'http://{0}/internal/cms/paike/latest/videos?pid={1}&pg={2}&pz={3}'
url = url.format(api.internal_server(), settings.internal_pid, self.pg, self.pz)
else:
url = 'http://{0}/internal/cms/paike/cats/videos?pid={1}&pg={2}&pz={3}&sortid={4}'
url = url.format(api.internal_server(), settings.internal_pid, self.pg, self.pz, catsid)
logging.debug(url)
results = get_paike_videos(url, self.pg, self.pz, self.is_update_cache)
self.write(results)
def finish(self, chunk=None):
judge_version = service_ugc.compare_version(self.user_client.prod_ver, '1.5')
if self.get_status() in (200, 304) and judge_version:
_info = self._result_buffer[-1]
_results = _info.get('results', {})
service_ugc.append_video_info(_results, self.user_id, True)
BaseHandler.finish(self, chunk)
class Advertise(CachedPlusHandler):
u"""拍客客户端广告接口"""
def get_cache_key(self):
return ''
def get(self):
url = 'http://{0}/internal/cms/paike/advs?pid={1}'.format(api.internal_server(), settings.internal_pid)
logging.debug(url)
content = urllib2.urlopen(url).read()
content = json.loads(content)
if content:
advertise = PaikeAdvertise(content)
if advertise.img:
results = {'status': 'success', 'results': advertise}
self.write(results)
else:
self.send_error(code=400, desc='failed')
else:
return self.send_error(code=400, desc='failed')
class AdvertiseList(CachedPlusHandler):
u"""多条广告接口"""
def get_cache_key(self):
return ''
def get(self):
url = 'http://{0}/internal/cms/paike/advs?pid={1}'.format(api.internal_server(), settings.internal_pid)
logging.debug(url)
content = urllib2.urlopen(url, timeout=3).read()
content = json.loads(content)
if content:
advs_list = []
for c in content:
advs = {}
if c.get('adv_type', 0) == 505:
advs['type'] = 2
advs['uid'] = c.get('adv_details', '')
else:
advs['type'] = 1
advs['url'] = c.get('adv_details', '')
advs['img'] = c.get('adv_img', '')
if c.get('open_type', 0) != 1:
advs_list.append(advs)
results = {'status': 'success', 'total': len(advs_list),'results': advs_list}
self.write(results)
else:
return self.send_error(code=400, desc='failed')
class ActivityList(CachedPlusHandler):
u"""活动列表"""
def get_cache_key(self):
data = {
'pg': self.pg,
'pz': self.pz,
}
return data
def prepare(self):
self.pg = int(self.get_argument('pg', 1))
self.pz = int(self.get_argument('pz', 30))
def get(self):
pg = int(self.get_argument('pg', 1))
pz = int(self.get_argument('pz', 30))
url = 'http://{0}/internal/cms/paike/actlist?pid={1}'.format(api.internal_server(), settings.internal_pid)
logging.debug(url)
content = urllib2.urlopen(url).read()
content = json.loads(content)
total = content.get('total', 0)
content = [Activity(c) for c in content.get('results', []) if c]
results = {'status': 'success', 'total': total, 'pg': pg, 'pz': pz, 'results': content}
self.write(results)
class ActivityVideos(CachedPlusHandler):
u"""活动对应的视频"""
def get_cache_key(self):
data = {
'pg': self.pg,
'pz': self.pz,
'actid': self.actid,
}
return data
def get_cache_expire(self):
u"""缓存时间为10分钟"""
return settings.cache_expire_M*2
def prepare(self):
self.pg = int(self.get_argument('pg', 1))
self.pz = int(self.get_argument('pz', 30))
self.actid = self.get_argument('actid', '')
def get(self):
url = 'http://{0}/internal/cms/paike/activity/videos?actid={1}&pid={2}&pg={3}&pz={4}'
url = url.format(api.internal_server(), self.actid, settings.internal_pid, self.pg, self.pz)
logging.debug(url)
content = urllib2.urlopen(url).read()
content = json.loads(content)
total = content.get('total', 0)
videos = content.get('results', [])
vid_title = {}
vids = []
for v in videos:
videoid = v.get('encodedId', '')
vid_title[videoid] = v.get('title', '')
vids.append(videoid)
#去掉空数据
video_list = service_ugc.remove_invalid_video(vids)
# 添加头像
uids = [u.get('userid', '') for u in video_list]
user_info_map = service_user.user_info_list(uids)
for u in video_list:
u['avatar'] = user_info_map.get(u.get('userid', ''), {}).get('avatar', '')
u['title'] = vid_title.get(u.get('videoid', ''))
results = {'status': 'success', 'total': total, 'pg': self.pg, 'pz': self.pz, 'results': video_list}
self.write(results)
def finish(self, chunk=None):
judge_version = service_ugc.compare_version(self.user_client.prod_ver, '1.5')
if self.get_status() in (200, 304) and judge_version:
_info = self._result_buffer[-1]
_results = _info.get('results', {})
service_ugc.append_video_info(_results, self.user_id)
BaseHandler.finish(self, chunk)
class VideoTags(CachedPlusHandler):
def get_chache_key(self):
return ''
def get_cache_expire(self):
u"""缓存时间为10分钟"""
return settings.cache_expire_M
def get(self):
url = 'http://{0}/internal/cms/paike/tags?pid={1}'.format(api.internal_server(), settings.internal_pid)
logging.debug(url)
content = urllib2.urlopen(url).read()
if content:
content = json.loads(content).get('results', [])
tags = [{'name': x.get('name', ''), 'value': x.get('title', '')}for x in content]
result = {'status': 'success', 'total': len(content), 'results': tags}
else:
result = {'status': 'success', 'total': 0, 'results': []}
self.write(result)
class PaikeVideoInfo(CachedPlusHandler):
u"""拍客微信web页视频详情"""
def get_cache_key(self):
return ''
def get(self, vid=None):
if not vid:
self.send_error(400, desc='no videoid')
video_info = service_ugc.video_info2(vid, timeout=0, no_cache=True, with_avatar=True, with_imgs=True)
for img in video_info.get('imgs', []):
img['url'] = api.convert_img_url(img.get('url', ''))
results = {'status': 'success', 'results': video_info}
self.write(results)
class GetPartnerFriends(BaseHandler):
u"""获取第三方好友列表"""
def get(self):
if not self.user_id:
self.send_error(401, desc='not login')
cursor = str(self.get_argument('cursor', 0))
pg = str(self.get_argument('pg', 1))
pz = str(self.get_argument('pz', 30))
token = self.get_argument('token', '')
secret = self.get_argument('secret', '')
btype = int(self.get_argument('type', 1))
user_info = service_connection.Connection.query(self.user_id)
for u in user_info:
if u.btype == btype :
token, secret = u.btoken.split(',', 1)
sid = u.buid
#取不到token用默认的token进行查询
#if not token or not secret :
# token, secret = '45fc8bdc6639ed330b2f2e441bba66c4', 'd0aacc9af15e643b1a16915b3d04be62'
# sid = self.get_argument('partnerid', '')
if btype == service_connection.SINA_WEIBO_BTYPE:
partner_user_info = service_connection.sina_friends(btype, token, secret, sid, cursor, pz)
appid = service_connection.SINA_WEIBO_BPID
elif btype == service_connection.QQ_WEIBO_BTYPE:
appid = service_connection.QQ_WEIBO_BPID
partner_user_info = service_connection.qq_friends(btype, token, secret, pg, pz)
else:
self.send_error(400, code=0, desc='invalid type')
partner_user_map = {}
user_results = []
sid_list = []
if partner_user_info and btype == service_connection.SINA_WEIBO_BTYPE:
next_cursor = partner_user_info[0].next_cursor
pre_cursor = partner_user_info[0].pre_cursor
logging.debug(len(partner_user_info))
elif partner_user_info and btype == service_connection.QQ_WEIBO_BTYPE:
hasnext = partner_user_info[0].hasnext
else:
self.send_error(400, code=0, desc='no partner friends')
for su in partner_user_info:
sid_list.append(su.sid)
partner_user = {}
partner_user['sid'] = su.sid
partner_user['sname'] = su.sname
partner_user['savatar'] = su.savatar
if btype == service_connection.SINA_WEIBO_BTYPE:
partner_user['sgender'] = self.convert_gender(su.sgender)
else:
partner_user['sgender'] = int(su.sgender)
user_results.append(partner_user)
partner_user_map[su.sid] = partner_user
ids = ','.join(sid_list)
if btype == service_connection.SINA_WEIBO_BTYPE:
appid = service_connection.SINA_WEIBO_BPID
elif btype == service_connection.QQ_WEIBO_BTYPE:
appid = service_connection.QQ_WEIBO_BPID
else:
self.send_error(400, code=0, desc='invalid type')
url = 'http://{0}/oauth2/uids_of_partners?appid={1}&tuids={2}'.format(api.passport2_server(), appid, ids)
logging.debug(url)
content = urllib2.urlopen(url).read()
content = json.loads(content)
user_list = content.get('data', [])
if not user_list:
user_list = []
user_partner_map = {}
uids = []
for u in user_list:
if u.get('isrealuser', ''):
one_uid = api.encodeuid(u.get('uid', ''))
one_sid = u.get('tuid', '')
uids.append(one_uid)
user_partner_map[one_sid] = one_uid
user_info_map = service_user.user_info_list(uids)
user_relationship = service_user.relationship(self.user_id, uids)
for u in user_results:
sid = u.get('sid', '')
userid = user_partner_map.get(sid, '')
if userid:
u['stype'] = 1
u['userid'] = userid
u.update(user_info_map.get(userid, {}))
if user_relationship:
u['is_friend'], u['is_follower'] = user_relationship.get(userid)
else:
u['stype'] = 2
if btype == service_connection.SINA_WEIBO_BTYPE:
results = {'status': 'success','pre_cursor': pre_cursor, 'next_cursor': next_cursor, 'results': user_results}
if btype == service_connection.QQ_WEIBO_BTYPE:
results = {'status': 'success','pg': pg, 'pz': pz, 'hasnext': hasnext, 'results': user_results}
self.write(results)
def convert_gender(self, sgender):
dic_gender = {
'f' : 1,
'm' : 2 ,
}
return dic_gender.get(sgender, 0)
class InvitePartnerFriends(BaseHandler):
u"""发表一条邀请好友的微博"""
def post(self):
username = self.get_argument('username', '')
sname = self.get_argument('sname', '')
stype = int(self.get_argument('type', 1))
uid = self.user_id
if not uid:
self.send_error(401, desc='not login')
if not username or not sname:
self.send_error(0, desc='miss argument')
content = u'@{0} 我正在使用优酷拍客上传分享视频,你也下载玩玩吧!下完后关注我的昵称:{1} 下载地址:http://mobile.youku.com/'
content = content.format(sname, username)
user_info = service_connection.Connection.query(self.user_id)
b_info = None
for u in user_info:
if u.btype == stype:
b_info = u
if b_info:
if b_info.btype == service_connection.QQ_WEIBO_BTYPE:
content = {
'content': content,
}
content = json.dumps(content)
result = service_connection.post_status(b_info, content)
if result:
self.write({'status': 'success', 'code': 1, 'desc': 'success'})
else:
self.send_error(400, code=0, desc='send status failed')
else:
self.send_error(400, code=0, desc='get token failed')
def get_paike_videos(url, pg, pz, no_cache=False):
u"""根据url获取最新最热和分类视频列表"""
content = urllib2.urlopen(url).read()
content = json.loads(content)
total = content.get('total', 0)
videos = content.get('results', [])
vid_title = {}
vid_img = {}
vid_img_hd ={}
vids = []
for v in videos:
videoid = v.get('tid', '')
vid_title[videoid] = v.get('title', '')
if not vid_img.get(videoid, ''):
vid_img[videoid] = v.get('img', '')
if not vid_img_hd.get(videoid, ''):
vid_img_hd[videoid] = v.get('img_hd', '')
vids.append(videoid)
video_list = service_ugc.remove_invalid_video(vids, no_cache)
# 添加头像
uids = [u.get('userid', '') for u in video_list]
user_info_map = service_user.user_info_list(uids)
for u in video_list:
u_vid = u.get('videoid', '')
u['avatar'] = user_info_map.get(u.get('userid', ''), {}).get('avatar', '')
u['title'] = vid_title.get(u_vid, '') or u.get('title', '')
u['img'] = vid_img.get(u_vid, '') or u.get('img', '')
u['img_hd'] = vid_img_hd.get(u_vid, '') or api.convert_img_url(u['img'])# 大图
results = {'status': 'success', 'total': total, 'pg': pg, 'pz': pz, 'results': video_list}
return results
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment