tb_borer

tba_style

目前為 2014-07-20 提交的版本,檢視 最新版本

// ==UserScript==
// @name        tb_borer
// @namespace   http://wp.stf.iaceob.name
// @description tba_style
// @include     http://tieba.baidu.com/*
// @version     1.3 alpha
// @grant       none
// @author 生物烯丙菊
// ==/UserScript==

/*
00000000    00010000    00020000
00000001    00010001    00020001
00000002    00010002    00020002
http://tieba.baidu.com/f/commit/commonapi/checkVcode
captcha_code_type
captcha_input_str 
captcha_vcode_str
fid
*/

String.prototype.format = function () {
  var txt = this.toString();
  for (var i = 0; i < arguments.length; i++) {
    var exp = getStringFormatPlaceHolderRegEx(i);
    txt = txt.replace(exp, (arguments[i] == null ? "" : arguments[i]));
  }
  return cleanStringFormatResult(txt);
}
function getStringFormatPlaceHolderRegEx(placeHolderIndex) {
  return new RegExp('({)?\\{' + placeHolderIndex + '\\}(?!})', 'gm');
}
function cleanStringFormatResult(txt) {
  if (txt == null) return "";
  return txt.replace(getStringFormatPlaceHolderRegEx("\\d+"), "");
}

Array.prototype.remove=function(dx) {
    if(isNaN(dx)||dx>this.length){ return false; }
    for(var i=0,n=0;i<this.length;i++) {
        if(this[i]!=this[dx]) {
            this[n++]=this[i]
        }
    }
    this.length-=1
    return true;
}


!(function(window, $, undefined){
  var topic = $('#thread_topic');
  var h_posts = $('#thread_list li.j_thread_list');
  var h_paging = $('#frs_list_pager');
  var me = $('#balv_mod');
  var html = '';

  var document = window.document;
  var pd = window.PageData;
  var tpl = {};
  var config = {
    posts: {
      handle_url: '',
      forum_id: 0,
      forum_name: 0,
      tbs: ''
    },
    post: {
      page_url: '',
      handle_url: 'http://tieba.baidu.com/f/commit/post/add',
      forum_id: 0,
      thread_id: 0,
      forum_name: '',
      tbs: '',
      floor_num: 1
    },
    captcha: {
      url4: 'http://tieba.baidu.com/cgi-bin/genimg',
      url4_get: 'http://tieba.baidu.com/f/commit/commonapi/getVcode',
      url_check: 'http://tieba.baidu.com/f/commit/commonapi/checkVcode',
      type: 0,
      code: '',
      input: '',
      value: []
    }
  };
  window.cfg = config;
  tpl.html_header = '<header id="header" class="loop-12"></header>';
  tpl.html_container = '<div class="span container">{0}</div>';
  tpl.html_footer = '<footer id="footer" class="loop-12">Footer</footer><div class="ow-overlay ow-closed"></div><div class="tba-modal ow-closed">Hello, human!</div>';
  tpl.html_box_posts = '<div class="loop-4 box_posts" id="box_posts"></div>';
  tpl.html_box_post = '<div class="loop-8 post_container" id="post_container"></div>';
  tpl.css = 'http://idc.iaceob.name/tba_style/tba_v1.2_alpha.css';
  tpl.js_omniwindow = 'http://idc.iaceob.name/tba_style/jquery.omniwindow.js';

  if (location.href === 'http://tieba.baidu.com/') {
    return;
  }

  if (!pd) {
    return;
  }

  function initBorer() {
    if (!!pd.forum.id) {
      setPostsConfig($('body').text());
      var postsPage = parsePosts($('body'));
      initPage();
      initPosts(postsPage);
      return;
    }
    if (!!pd.forum.forum_id) {
      $.ajax({
        url: 'http://tieba.baidu.com/' + pd.forum.forum_name,
        dataType: 'html'
      }).done(function(data){
        config.post.page_url = window.location.href;
        setPostConfig($('body').text());
        var postPage = parsePost($('body'));
        initPage();
        initPosts(parsePosts($(data)));
        initPost(postPage);
      });
      return;
    }
  };

  function initPage() {
      var fhtml = parseFooter();
      html = tpl.html_header;
      html += tpl.html_container.format(tpl.html_box_posts+tpl.html_box_post);
      html += tpl.html_footer;
      $('body').empty();
      $('body').html(html);
      // $('#head').html(html);
      initHeader();
      initFooter(fhtml);
      initImport();
      bindEvent();
  };

  function initPosts(body) {
      $('.posts_paging a').unbind('click');
      $('#post_container').empty();
      $('#box_posts').html(body);
      $('#box_posts').scrollTop(0);
      monitorHPage();
  };

  function initPost(body) {
      $('.post-page a').unbind('click');
      $('#post_container').html(body);
      $('#post_container').scrollTop(0);
      mointorPPage();
  };
  
  function initHeader() {
    var hhtml = '<div class="loop-2 tiebalogo"><img src="http://tb2.bdstatic.com/tb/static-common/img/search_logo_7098cbef.png"></div>';
    hhtml += '<div class="loop-8">\
    <div class="select_box">\
    <input type="text" name="query" id="query" class="keyipt">\
    <div id="search_list" style="display: none"></div>\
    </div>\
    </div>';
    $('#header').html(hhtml);
  };

  function initFooter(fhtml) {
    $('#footer').html(fhtml);
  };

  function initImport(){
    $('head').append('<link rel="stylesheet" href="' + tpl.css + '">');
    $('head').append('<script src="' + tpl.js_omniwindow + '"></script>');
  };

  function monitorHPage() {
    $('.posts_paging a').bind('click', function(){
      $.ajax({
        url:this.href,
        dataType: 'html'
      }).done(function(data){
        setPostsConfig($(data).text());
        initPosts(parsePosts($(data)));
      });

      return false;
    });
    $('.posts_list li').bind('click', function(){
      handleGetPost($(this).data('href'));
    });
  };
  
  function mointorPPage() {
    $('.post-page a').bind('click', function(){
      handleGetPost(this.href);
      return false;
    });
    $('#btn_post').bind('click', function(){
      var post_content = $('#post_editor').val();
      $.ajax({
        url: config.post.handle_url,
        type: 'post',
        data: { 
          kw: config.post.forum_name,
          ie: 'utf-8',
          rich_text: 1,
          floor_num: config.post.floor_num,
          fid: config.post.forum_id,
          tid: config.post.thread_id,
          content: post_content,
          anonymous: 0,
          tbs: config.post.tbs,
          vcode_md5: config.captcha.code,
          vcode: config.captcha.input
        },
        dataType: 'json'
      }).done(function(data){
        parseDoPost(data);
      });
    });
  };
  
  function mointorSearch(){
    $.ajax({
      url: 'http://tieba.baidu.com/suggestion',
      data: $('#query').serialize(),
      dataType: 'json',
    }).done(function(data){
      $('#search_list').html(parseSearch(data));
    });
  };
  
  window.handleSearchResult = function(forum){
    $.ajax({
      url:'http://tieba.baidu.com/' + forum,
      dataType: 'html'
    }).done(function(data){
      setPostsConfig($(data).text());
      initPosts(parsePosts($(data)));
    });
  };

  function handleGetPost(postUrl) {
      config.post.page_url = postUrl;
      $.ajax({
        url: postUrl,
        dataType: 'html'
      }).done(function(data){
        initPost(parsePost($(data)));
        setPostConfig($(data).text());
      });
  };

  function setPostsConfig(text) {
    window.t=text;
    var fid = text.match(/PageData.forum([ ]*)=([ ]*){(.*?)"forum_id":(\d+)/);
    var fe = text.match(/PageData.forum([ ]*)=([ ]*){(.*?)"forum_name":"(.*?)"/);
    config.posts.forum_id = !fid ? 0 : fid[4];
    config.posts.forum_name = !fe ? '' : decodeUnicode(fe[4]);
  };

  function setPostConfig(text){
    var tbs1 = text.match(/PageData([ ]*)=([ ]*){(.*?)'tbs'(.*?):(.*?)"(.*?)"/);
    var tbs2 = text.match(/PageData([ ]*)=([ ]*){(.*?)tbs(.*?):(.*?)'(.*?)'/);
    var fid = text.match(/PageData.forum([ ]*)=([ ]*){(.*?)"forum_id":(\d+)/);
    var fe = text.match(/PageData.forum([ ]*)=([ ]*){(.*?)"forum_name":"(.*?)"/);
    var tid = text.match(/PageData.thread([ ]*)=([ ]*){(.*?)thread_id(.*?):(\d+)/);
    config.post.tbs = !tbs1 ? tbs2[6] : tbs1[6];
    config.post.forum_id = !fid ? 0 : fid[4];
    config.post.forum_name = !fe ? '' : decodeUnicode(fe[4]);
    config.post.thread_id = !tid ? 0 : tid[5];
  };
  
  function bindEvent() {
    $('#query').bind('keyup', function(event){
      $('#search_list').show();
      if (event.keyCode != 13) {
        mointorSearch(); 
        return;
      }
     event.cancelBubble = true;
     event.returnValue = false;
     window.handleSearchResult($(this).val());
    });
    $('#query').bind('click', function(){
      $('#search_list').show();
      mointorSearch();
    });
    $('#search_list').hover(function(){
      $(this).show();
    }, function(){
      $(this).hide();
    });
  };
  
  function parseFooter() {
    var tf = $('#footer').html();
    var fhtml = '<div class="loop-12">' + tf + '</div>';
    return fhtml;
  };
  
  function parseSearch(data) {
    var qms = data.query_match.search_data;
    if (qms.length==0) {
      return '<p>无数据';
    }
    var qhtml = '<ul>';
    for(var i=0; i<qms.length; i++) {
      qhtml += '<li onclick="handleSearchResult(&quot;' + qms[i].fname + '&quot;)">\
      <div class="sh_forum_name">' + qms[i].fname + '</div>\
      <div class="sh_forum_desc">' + qms[i].forum_desc + '</div>';
    }
    qhtml += '</ul>';
    return qhtml;
  };
  
  function parsePosts(postsDom) {
    var h_posts = postsDom.find('li.j_thread_list');
    var h_paging = postsDom.find('#frs_list_pager');
    var h_cur_page = postsDom.find('#frs_list_pager .cur');
    var h_cur_url = !h_cur_page.length ? '#?' + window.Math.random() : '/f?kw=' + config.posts.forum_name + '&pn=' + (h_cur_page.text()*50-50);
    var ho_pobj = {}, posts_html='';
    posts_html='<div class="span"><div class="loop-12 posts_list"><ul>';
    for(var i=0; i<h_posts.length; i++) {
      var hp = h_posts[i];
      var hp_rep_num = $(hp).find('.threadlist_rep_num')[0].textContent;
      var hp_title = $(hp).find('.j_th_tit')[1].textContent;
      var hp_href = $(hp).find('.j_th_tit')[1].href;
      var hp_detail = !$(hp).find('.threadlist_text')[1] ? '' : $(hp).find('.threadlist_text')[1].textContent;
      var hp_author = !$(hp).find('.j_user_card')[0] ? '' : $(hp).find('.j_user_card')[0].textContent;
      var hp_last_repuser = !$(hp).find('.j_user_card')[1] ? '' : $(hp).find('.j_user_card')[1].textContent;
      var hp_last_time = !$(hp).find('.j_reply_data')[0] ? '' : $(hp).find('.j_reply_data')[0].textContent;
      posts_html += '<li data-href="' + hp_href + '">\
      <div class="span">\
      <div class="loop-10 post_title hidefont" title="' + hp_title + '">' + hp_title + '</div>\
      <div class="loop-2 post_author hidefont" title="' + hp_author + '">' + hp_author + '</div>\
      <div class="loop-12 box_posts_detail">' + hp_detail + '</div>\
      <div class="loop-5 post_repuser hidefont">最后回复人:' + hp_last_repuser + '</div>\
      <div class="loop-5 post_lasttime">最后回复时间:' + hp_last_time + '</div></div>';
    }
    posts_html += '</ul></div>';
    posts_html += '<div class="loop-4 posts_paging">' + (!h_paging.length ? '' : h_paging.html()) + '<a href="' + h_cur_url + '">刷新</a></div></div>';
    return posts_html;
  };
  
  
  function parsePost(postDom) {
    var post_title = postDom.find('.core_title_txt').html()
    var post_info = postDom.find('.l_post');
    var post_content = postDom.find('.p_content cc');
    var author_avatar = postDom.find('.p_author_face img');
    var lzlbox = postDom.find('j_lzl_c_b_a');
    var ppage = postDom.find('.pb_list_pager')[0];
    var post_html = '';
    post_html += '<div class="loop-12 post_title">' + post_title + '</div>';
    for(var i=0; i<post_info.length; i++) {
      var pi = $(post_info[i]).data('field');
      var pc = post_content[i];
      post_html += '<section data-post="' + pi.content.post_id + '">';
      post_html += '<div class="loop-2 post_info">\
      <div class="loop-12 post_author" data-user="' + pi.author.user_id + '">\
        <div><img src="http://tb.himg.baidu.com/sys/portrait/item/' + pi.author.portrait + '"></div>\
        <span>' + pi.author.user_name + '</span>\
      </div>\
      <div class="loop-12 post_author_level">\
        <span>' + (pi.author.level_name||'*') + '</span>\
        <span>' + (pi.author.level_id||'0') + '</span>\
      </div>\
      </div>';
      post_html += '<div class="loop-10 post_article">' + pc.innerHTML + '</div>';
      post_html += '<div class="loop-10 post_msg">' + pi.content.date + '</div>';
      post_html += '<div class="loop-10 post_lzl">' + getPostLzl(lzlbox, i) + '</div>';
      post_html += '</section>';
    }
    post_html += '<div id="ue_texteara" class="loop-12"><script id="ueditor_tieba" name="content" type="text/plain">这里写你的初始化内容</script></div><div class="loop-12"><textarea id="post_editor" /></div><div class="loop-12"><button id="btn_post">回复</button></div>';
    post_html += '<div class="loop-8 post-page">' + ppage.innerHTML + '</div>';
    // <a href="'+(($(ppage).find('a'))[0].href.split('?')[0]+'?see_lz=1')+'">只看楼主</a>
    post_html='<div class="span box_post">' +post_html+ '</div>';
    return post_html;
  };
  
  function getPostLzl(lzldom, index) {
    var lzlbox = lzldom[index];
    if (!lzlbox) { return ''; }
    var lzlreps = $(lzlbox).find('li');
    var lzlhtml = '<ul>';
    for(var i=0; i<lzlreps.length; i++) {
      var lzlinfo = $(lzlreps[i]).data('field');
      var lzltext = $(lzlreps[i]).find('.lzl_cnt span.lzl_content_main').html();
      var lzltime = $(lzlreps[i]).find('.lzl_cnt span.lzl_time').html();
      var llio = eval('(' + lzlinfo + ')');
      lzlhtml += '<li data-pid="' + llio.pid + '" data-spid="'+llio.spid+'">\
      <div class="span">\
      <div class="loop-2">' + llio.user_name + '</div>\
      <div class="loop-8">' + lzltext + '</div>\
      <div class="loop-2">' + lzltime + '</div>\
      </div>';
    }
    lzlhtml += '</ul>';
    return lzlhtml;
  };


  function parseDoPost(data) {
    window.da = data;
    if (!data.no) {
      console.log('success');
      return;
    }
    var vhtml = '', da = data.data;
    if (da.vcode.need_vcode) {
      config.captcha.code = da.vcode.captcha_vcode_str;
      config.captcha.type = da.vcode.captcha_code_type;
      var img = config.captcha.url4 + '?' + da.vcode.captcha_vcode_str;
      vhtml += '<div class="box_model">';
      vhtml += '<div class="loop-12 captcha"><img src="' + img + '"></div>';
      vhtml += '<div class="loop-12 captcha-input">\
      <input type="checkbox" class="cait cait-1" data-index="1" value="00000000">\
      <input type="checkbox" class="cait cait-2" data-index="2" value="00010000">\
      <input type="checkbox" class="cait cait-3" data-index="3" value="00020000">\
      <input type="checkbox" class="cait cait-4" data-index="4" value="00000001">\
      <input type="checkbox" class="cait cait-5" data-index="5" value="00010001">\
      <input type="checkbox" class="cait cait-6" data-index="6" value="00020001">\
      <input type="checkbox" class="cait cait-7" data-index="7" value="00000002">\
      <input type="checkbox" class="cait cait-8" data-index="8" value="00010002">\
      <input type="checkbox" class="cait cait-9" data-index="9" value="00020002">\
      </div>';
      vhtml += '<div class="loop-12">\
      <button type="button" id="btn_refre_captcha"">换一张</button>\
      <button type="button" id="btn_submit_captcha">确定</button></div>';
      vhtml += '<div class="loop-12"><div class="loop-10" id="captchackr"></div><div class="loop-2" id="delcaptchar">X</div></div>';
      vhtml += '<div class="loop-12" id="post-result"></div>';
      vhtml += '</div>';
      $('.tba-modal').html(vhtml);
      $('.tba-modal').omniWindow().trigger('show');
      mointorCaptcha()
      return;
    }
    vhtml += '<div class="box_model">\
    <div class="loop-12">\
    <p>no:' + data.no + '\
    <p>err_code' + data.err_code + '\
    <p>error:' + data.error + '</div></div>';
    $('.tba-modal').html(vhtml);
    $('.tba-modal').omniWindow().trigger('show');
    return;
  };

  function mointorCaptcha() {
    $('.cait').bind('click', function(){
      if (config.captcha.value.length==4) {
        return;
      }
      $(this).prop({disabled: true});
      config.captcha.value.push({val: $(this).val(), index: $(this).data('index')});
      $('#captchackr').append('<span id="checkcaptchar-' + $(this).data('index') + '">' + $(this).data('index') + '</span>');
    });
    $('#delcaptchar').bind('click', function(){
      for(var i=0; i<config.captcha.value.length; i++) {
        if ((i+1)==config.captcha.value.length) {
          $('#checkcaptchar-' + config.captcha.value[i].index).remove();
          $('.cait-' + config.captcha.value[i].index).prop({disabled: false, checked: false});
          config.captcha.value.remove((i+1));
        }
      }
    });
    $('#btn_refre_captcha').bind('click', function(){
      $('#btn_post').click();
    });
    $('#btn_submit_captcha').bind('click', function(){
      if (config.captcha.value.length<4) {
        $('#post-result').text('选择完验证码');
        return;
      }
      var captVal = '';
      for(var i=0; i<config.captcha.value.length; i++) {
        captVal += config.captcha.value[i].val;
      }
      config.captcha.input = captVal;
      $.ajax({
        url: config.captcha.url_check,
        data: {
          captcha_code_type: config.captcha.type,
          captcha_vcode_str: config.captcha.code,
          captcha_input_str: captVal
        },
        dataType: 'json',
        type: 'post'
      }).done(function(data){
        config.captcha.value = [];
        $('#btn_post').click();
        if (!data.anti_valve_err_no) {
          handleGetPost(config.post.page_url);
          $('.tba-modal').omniWindow().trigger('hide');
          return;
        }
      });
    });
  };

  function encodeUnicode(str){
    return escape(str).toLocaleLowerCase().replace(/%u/gi,'\\u');
  };

  function decodeUnicode(str){
    return unescape(str.replace(/\\u/gi,'%u'));
  };

  initBorer();
})(window, jQuery);