docs: function updateWeibo(data){
    if(!data.accessToken){
      throw new Error('need a accessToken');
    }
    var emitter = new Emitter();
    
    var msg = data.message
      , coordinates = data.coordinates
      , img = data.image;
      
    var body = "status=" + encodeURIComponent(msg),
      url, headers, multipart;
      
    //console.log('last text: ' + msg);
    //console.log('coordinates: ' + util.inspect(coordinates));
    
    body += (coordinates && coordinates.length == 2) ? ('&lat=' + encodeURIComponent(coordinates[1]) + '&long=' + encodeURIComponent(coordinates[0])) : '';
    
    if(img){
      url = 'https://api.weibo.com/2/statuses/upload.json?access_token=' + data.accessToken;
      headers = {"content-type": "multipart/form-data"};
      body = '';
    }else{
      url = 'https://api.weibo.com/2/statuses/update.json?access_token=' + data.accessToken;
      headers = {"Content-Type": "application/x-www-form-urlencoded"};
    }
    
    if(img && !Buffer.isBuffer(img)){
      if(/^https?\:\/\//i.test(img)){
        request({url: img, encoding: null}, function(err, res, img){
          if(err){
            emitter.emit('error', err);
          }else{
            multipart = multipartParse(msg, coordinates, img);
            //console.log(util.inspect(multipart))
            //console.log(headers)
            faWeibo(url, headers, body, multipart, emitter);
          }
        });
      }else{
        emitter.emit('error', 'need a image');
      }
    }else{
      if(img){//buffer
        multipart = multipartParse(msg, coordinates, img);
      }
      
      faWeibo(url, headers, body, multipart, emitter);
    }
    return emitter;
  }