Source code for user

#!/usr/bin/env python
# encoding: utf-8
"""
user.py

Created by 徐 光硕 on 2011-11-14.
Copyright (c) 2011 __MyCompanyName__. All rights reserved.
"""

try :  
    import json  
except ImportError :  
    import simplejson as json  
import urllib
import requests
from hashlib import md5
import base64
from api import TOP, TOPRequest, TOPDate
from systime import SysTime
import time
from BeautifulSoup import BeautifulSoup

[docs]class Location(TOP): '''用户地址''' def __init__(self, API_KEY=None, APP_SECRET=None, ENVIRONMENT=None): super(Location, self).__init__( API_KEY, APP_SECRET, ENVIRONMENT ) self.fields = ['zip','address','city','state','country','district']
[docs]class UserCredit(TOP): '''用户信用''' def __init__(self, API_KEY=None, APP_SECRET=None, ENVIRONMENT=None): super(UserCredit, self).__init__( API_KEY, APP_SECRET, ENVIRONMENT ) self.fields = ['level','score','total_num','good_num']
[docs]class User(TOP): '''用户''' def __init__(self, API_KEY=None, APP_SECRET=None, ENVIRONMENT=None): super(User, self).__init__( API_KEY, APP_SECRET, ENVIRONMENT ) self.models = {'buyer_credit':UserCredit, 'seller_credit':UserCredit, 'location':Location, 'created':TOPDate, 'last_visit':TOPDate, 'birthday':TOPDate} self.fields = ['user_id','uid','nick','sex','buyer_credit','seller_credit','location','created','last_visit','birthday','type','has_more_pic','item_img_num','item_img_size','prop_img_num','prop_img_size','auto_repost','promoted_type','status','alipay_bind','consumer_protection','alipay_account','alipay_no','avatar','liangpin','sign_food_seller_promise','has_shop','is_lightning_consignment','has_sub_stock','vip_info','email','magazine_subscribe','vertical_market','online_gaming']
[docs] def get(self, nick='', fields=[], session=None): '''taobao.user.get 获取单个用户信息; 在传入session的情况下,可以不传nick,表示取当前用户信息;否则nick必须传. 自用型应用不需要传入nick''' request = TOPRequest('taobao.user.get') request['nick'] = nick if not fields: fields = self.fields request['fields'] = fields self.create(self.execute(request, session)['user']) return self
def logout(self): systime = SysTime() params = { 'app_key' : self.API_KEY, 'timestamp' : systime.get(), 'sign_method' : self.SIGN_METHOD, } src = self.APP_SECRET + ''.join(["%s%s" % (k, v) for k, v in sorted(params.iteritems())]) + self.APP_SECRET params['sign'] = md5(src).hexdigest().upper() form_data = urllib.urlencode(params) rsp = requests.get('%s?%s'%(self.LOGOUT_URL, form_data)) if 'login.taobao.com' in rsp.url: return True return False def login(self, username='', passwd='', app_user_nick=None, target=None, use_taobaoid=False): if use_taobaoid: systime = SysTime() params = { 'app_key' : self.API_KEY, 'timestamp' : systime.get(), 'sign_method' : self.SIGN_METHOD, } if app_user_nick!=None: params['app_user_nick'] = app_user_nick if target!=None: params['target'] = target src = self.APP_SECRET + ''.join(["%s%s" % (k, v) for k, v in sorted(params.iteritems())]) + self.APP_SECRET params['sign'] = md5(src).hexdigest().upper() form_data = urllib.urlencode(params) rsp = requests.get('%s?%s'%(self.TaobaoID_URL, form_data)) print rsp.content else: rsp = requests.get('%s%s'%(self.LOGIN_URL, self.API_KEY)) soup = BeautifulSoup(rsp.content) iframe_src = soup.find('iframe')['src'] rsp = requests.get(iframe_src) print rsp.url #s = requests.session() login_url = 'https://login.taobao.com/member/login.jhtml' soup = BeautifulSoup(rsp.content) login_url = soup.find('form')['action'] #inputs = soup.findAll('input') forms = self.extract_form_fields(soup) forms['TPL_username'] = username forms['TPL_password'] = passwd rsp = requests.post(login_url, data=forms) print rsp.url print rsp.content
[docs] def validate_session(self, session_ts): ''' 检查Session是否过期, 验证Session可用性 ''' now = time() ts = session_ts / 1000; if ts > ( now + 60 * 10 ) or now > ( ts + 60 * 30 ): return False return True
[docs] def refresh_session(self, sessionkey, refresh_token=None): ''' Refresh Session Token ''' if not refresh_token: refresh_token = sessionkey params = { 'appkey' : self.API_KEY, 'sessionkey' : sessionkey, 'refresh_token': refresh_token } src = ''.join(["%s%s" % (k, v) for k, v in sorted(params.iteritems())]) + self.APP_SECRET params['sign'] = md5(src).hexdigest().upper() form_data = urllib.urlencode(params) rsp = requests.get('%s?%s'%(self.REFRESH_TOKEN_URL, form_data)) rsp = json.loads(rsp.content) if 'error' in rsp: raise TOPException(rsp['error'], rsp['error_description']) return None rsp['re_expires_in'] = int(rsp['re_expires_in']) rsp['expires_in'] = int(rsp['expires_in']) rsp['session'] = rsp['top_session'] del rsp['top_session'] return rsp
def extract_form_fields(self, soup): fields = {} for input in soup.findAll('input'): # ignore submit/image with no name attribute if input['type'] in ('submit', 'image') and not input.has_key('name'): continue # single element nome/value fields if input['type'] in ('text', 'hidden', 'password', 'submit', 'image'): value = '' if input.has_key('value'): value = input['value'] fields[input['name']] = value continue # checkboxes and radios if input['type'] in ('checkbox', 'radio'): value = '' if input.has_key('checked'): if input.has_key('value'): value = input['value'] else: value = 'on' if 'name' in input and fields.has_key(input['name']) and value: fields[input['name']] = value if 'name' in input and not fields.has_key(input['name']): fields[input['name']] = value continue assert False, 'input type %s not supported' % input['type'] # textareas for textarea in soup.findAll('textarea'): fields[textarea['name']] = textarea.string or '' # select fields for select in soup.findAll('select'): value = '' options = select.findAll('option') is_multiple = select.has_key('multiple') selected_options = [ option for option in options if option.has_key('selected') ] # If no select options, go with the first one if not selected_options and options: selected_options = [options[0]] if not is_multiple: assert(len(selected_options) < 2) if len(selected_options) == 1: value = selected_options[0]['value'] else: value = [option['value'] for option in selected_options] fields[select['name']] = value return fields
[docs]class Users(TOP): def __init__(self, API_KEY=None, APP_SECRET=None, ENVIRONMENT=None): super(Users, self).__init__( API_KEY, APP_SECRET, ENVIRONMENT ) self.models = {'users':User} self.fields = ['users']
[docs] def get(self, nicks=[], fields=[]): '''taobao.users.get 获取多个用户信息''' request = TOPRequest('taobao.users.get') request['nicks'] = ','.join(nicks) if not fields: user = User() fields = user.fields request['fields'] = ','.join(fields) self.create(self.execute(request)) return self.users