Saturday, 15 February 2014

谷歌 - 如何窥看别人隐藏的 +1


公告 3 Jun 2014: 代码暂时不能使用了, 我懒得去更新 ~
更正 19 Feb 2014: 不适用于中文字当地址名字的目标用户, 我有解决办法,但很懒改... 

我们常常看见网站有 plusone g+1 的按钮:



如果是自己按过 g+1 的话, 你的 Google Plus 帐号图片会出现在旁边, 朋友的话, 也有一定的几率在旁边看见:





 至于那个数目 +3 是推荐在 Google Search 的次数.




分享是另一回事哦, 不影响 g+1 的数目, 不要混淆。你可以分享很多次。




如果是你或你的朋友的话 +1, 会显示在 Google Search 的下面, 不过, 仅限Google Plus 圈子里的朋友。如果是你自己+1,Google Search 会很快更新, 但是朋友的话,更新会花几天不定:




我这篇文章探讨的是 Google Search 的+1, 不是如下图所示的帖子的 +1哦, 不要混淆。




 还有一点,  g+1的按钮不限于别的网站看到的, 因为在 Google Plus 专页也能按 g+1 推荐在 Google Search。 只不过按钮不一样而已。如下图所示, +7047448 按钮。




你的 Google Search +1 过的历史可以在自己专页 的 +1 栏目看见, 当然你也可以看见别人的。




 可是大多数人的隐私设定都是隐藏了 +1  的栏目。




现在我就教你简单的步骤来实现窥看:



步骤 1. 

进入你要窥看的目标专页。比如说如图中的例子,LadyGaga专页。




步骤 2.

(i) 在那个页面随便一个地方用滑鼠按右键, 选 "Inspect Element"(检查元素)。
(ii) 有些浏览器直接按F12键就可以了。




步骤 3.

下面会出现新的窗口(你需要用滑鼠把那个窗口拖拉大一点),你要选 Console。 不同的浏览器(IE, Chrome, Firefox)图形设计都不同, 但都是一样的步骤, 找到 Console 点击就可以了。

Gogole Chrome 浏览器的 Console:




IE 浏览器的Console:



Firefox 浏览器的Console:




步骤 4.

把下面我写的代码全选,然后copy复制。记得要一字不漏copy, 代码很敏感的,  这个代码很长, 你可能需要scroll。


var FirstPage = true;
var AtleastOneItem = false;
var owner = "";
var index = 1;

function set_info() {
    docBody.innerHTML = "";
    docHead.innerHTML = '<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head>';
    var user = "'s +1's";
    if (owner) {
        user = owner + user;
    } else {
        user = userid + user;
    }
    var profURL = "https://plus.google.com/" + userid;
    plusones = "https://plus.google.com/s2/photos/profile/" + userid;
    var profImg = img_create("0", "0", "100px", "100px", plusones, profURL);
    docBody.appendChild(profImg);
    var a_user = a_create(profURL, user);
    var h3 = d.createElement("h3");
    h3.style.display = "block";
    h3.appendChild(a_user);
    docBody.appendChild(h3); //tab title
}

function decodeEntities(s) {
    s = s.replace(/\\u003d/g, "=").replace(/\\u0026/g, "&"); //my extra, /*/g for replace all
    var str, temp = document.createElement('p');
    temp.innerHTML = s;
    str = temp.textContent || temp.innerText;
    temp = null;
    return str;
}

function img_create(m, b, w, h, sc, t) {
    var i = d.createElement('img');
    sc = sc || "";
    t = t || "";
    i.style.margin = m;
    i.style.border = b;
    i.style.width = w;
    i.style.height = h;
    i.src = sc;
    i.title = t;
    return i;
}

function a_create(h, t) {
    var a = d.createElement("a");
    if (h != null) a.href = h;
    a.target = "_blank";
    if (t != null) {
        var link_text = d.createTextNode(t);
        a.appendChild(link_text);
    }
    return a;
}

function div_create(t, w, h, f, ml, mh, ov, ws, pt, mw, m) {
    var dv = d.createElement("div");
    if (t != null) dv.style.textAlign = t;
    if (f != null) dv.style.setProperty('float', f); //resevered word float failed in firefox
    if (w != null) dv.style.width = w;
    if (h != null) dv.style.height = h;
    if (ml != null) dv.style.marginLeft = ml;
    if (mh != null) dv.style.minHeight = mh;
    if (ws != null) dv.style.whiteSpace = ws;
    if (pt != null) dv.style.paddingTop = pt;
    if (mw != null) dv.style.maxWidth = mw;
    if (m != null) dv.style.margin = m;
    return dv;
}

function li_create(lsp) {
    var l = d.createElement("li");
    l.style.listStylePosition = lsp;
    return l;
}

function plusoneGui(title, hname, link, jpg, description) {
    function loop(li2, title, hname, link, jpg, description) {

        var li = li_create("outside");
        var ul = d.createElement("ul");
        ul.style.listStyleType = "none"; //rm bullet
        var div3 = div_create("", "", "", "", "110px", "104px");

        var title = title || "";
        var hname = hname || "";
        var link = link || "";
        var jpg = jpg || "";
        var description = description || "";

        var im = img_create("0", "0", "100px", "100px", jpg, jpg);
        var div = div_create("center", "100px", "100px");
        var a = a_create(jpg);
        var div2 = div_create("center", "102px", "102px", "left");

        var a_title = a_create(link, title);
        var span = d.createElement("span");
        span.appendChild(a_title);
        var div4 = div_create("", "", "", "", "", "", "hidden", "normal");
        div4.appendChild(span);

        var hname = d.createTextNode(hname);
        var cite = d.createElement("cite");
        cite.style.color = "#006621";
        cite.style.fontStyle = "normal";
        cite.appendChild(hname);
        var div5 = div_create("", "", "", "", "", "", "", "", "2px");
        div5.appendChild(cite);

        var desc = d.createTextNode(description);
        var span2 = d.createElement("span");
        span2.appendChild(desc);
        var div6 = div_create("", "", "", "", "", "", "", "", "", "509px", "1px 0 4px");
        div6.appendChild(span2);

        div.appendChild(im);
        a.appendChild(div);
        div2.appendChild(a);
        li2.appendChild(div2); //left side pic
        li.appendChild(div4); //title
        li.appendChild(div5); //host
        li.appendChild(div6); //desc
        ul.appendChild(li);

        div3.appendChild(ul);
        li2.appendChild(div3); //right side text area
    }

    function loop2(ol, title, hname, link, jpg, description) {
        var li2 = li_create("outside");
        loop(li2, title, hname, link, jpg, description);
        ol.appendChild(li2);
    }
    var ol = d.createElement("ol");
    ol.start = "" + index; //int to str
    loop2(ol, title, hname, link, jpg, description);
    docBody.appendChild(ol);
    index++;
}

var cid = "";

function parse_err(e) {
    console.log("[" + e + "] Unknown parsing, please inform author.");
    throw "stop execution";
}

function plusone_tab() {
    if (cid) {
        cid = "&ct=" + cid;
        var m = document.getElementById("moreButton");
        m.parentNode.removeChild(m); //rm prev btn
    } else {
        cid = "";
    }
    var pu = "https://plus.google.com/_/plusone/get?oid=" + userid + cid;
    console.log("Requesting..." + pu);
    var xhr = new XMLHttpRequest();
    xhr.open("GET", pu);
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhr.send();
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            var da = xhr.status;
            if (da == 200) {
                var r = xhr.responseText;
                var plusoneArray = r.split('\n');
                cid = ""; //reset
                d = document;
                docBody = d.getElementsByTagName("body")[0];
                docHead = d.getElementsByTagName("head")[0];
                for (var i = 0; i < plusoneArray.length; i++) {
                    var line = plusoneArray[i];
                    if (line.indexOf('["1/') != -1) {
                        if (line.indexOf('",1,,,"') != -1) { //may empty desc, so it's not always got " surround
                            var quotes = '"';
                        } else { //no quotes
                            var quotes = '';
                        }
                        var lineArray = line.split('",1,,,' + quotes);
                        if (lineArray.length > 1) {
                            var l = lineArray[1];
                            var lineArray2 = l.split(quotes + ',,1');
                            if (lineArray2.length > 1) {
                                var dDesc = decodeEntities(lineArray2[0]);
                                var theRest = lineArray2[1];
                                var lineArray3 = theRest.split('",');
                                if (lineArray3.length > 3) {
                                    //if out of bound, would still show and handle by gui
                                    var dLink = decodeEntities(lineArray3[0].split(',["')[1]);
                                    var dTitle = decodeEntities(lineArray3[1].split('"')[1]);
                                    var dHost = decodeEntities(lineArray3[2].split(',"')[1]);
                                    var dImg = decodeEntities(lineArray3[3].split('fallback_url\\u003d')[1].split('"')[0]);
                                    AtleastOneItem = true;
                                    for (i++; i < plusoneArray.length; i++) {
                                        if (plusoneArray[i].indexOf('["1/') != -1) {
                                            --i;
                                            break;
                                        } else {

                                            if ((/^,[0|1],"\/\//).test(plusoneArray[i])) { // //,0,"//images OR ,1,"//images
                                                var tmpImg = decodeEntities(plusoneArray[i].split('","')[1].split('"')[0]);
                                                if (tmpImg) {
                                                    dImg = tmpImg;
                                                    break;
                                                }
                                            } else if ((/^,"/).test(plusoneArray[i])) { //StartsWith ," 
                                                //possible when next page's last item use default img
                                                cid = plusoneArray[i].split('"')[1];
                                            }
                                        }
                                    }
                                    if (AtleastOneItem) {
                                        AtleastOneItem = false; //reset
                                        if (FirstPage) {
                                            FirstPage = false;
                                            set_info();
                                        }
                                        plusoneGui(dTitle, dHost, dLink, dImg, dDesc);
                                    } else {
                                        console.log("No item found");
                                    }

                                } else {
                                    parse_err("2");
                                }
                            } else {
                                parse_err("1");
                            }

                        } else {
                            parse_err("0");
                        }
                    } else if ((/^,"/).test(plusoneArray[i])) { //StartsWith ,"
                        cid = plusoneArray[i].split('"')[1];
                    }
                }
                if (cid) {
                    console.log("Next cid:" + cid);
                    var moreBtn = d.createElement("input");
                    moreBtn.id = "moreButton";
                    moreBtn.type = "button";
                    moreBtn.value = "More 更多";
                    moreBtn.onclick = plusone_tab;
                    docBody.appendChild(moreBtn);
                } else {
                    console.log("No data");
                    if (FirstPage) {
                        set_info();
                        var unav_text = d.createTextNode("Nothing :(");
                        docBody.appendChild(unav_text); //tab title
                    }
                }
            } else {
                console.log("Failed");
            }
        }
    }
}

function checkid() {
    var ownerArray = document.querySelectorAll('[data-owner]');
    if (ownerArray.length > 0) {
        userid = ownerArray[0].getAttribute("data-owner");
        if (userid) {
            return userid;
        }
    }
}
var userid = checkid()
if (!userid) {
    userid = window.MB_viewerId; //own page only if checkid() failed, so sequence is very important!
    if (userid) {
        console.log("data-owner success");
    } else {
        var pathArray = window.location.pathname.split('/');
        ///communities currently only digit, otherwise is always same with user profile, .e.g https://plus.google.com/+Dell/posts
        if (pathArray.length > 2) {
            if ((pathArray[1] == 'app') && pathArray[2] == 'basic') {
                if (pathArray[1] != "communities") {
                    owner = pathArray[3]; //plus.google.com/app/basic/USERID/posts
                } else {
                    owner = pathArray[4];
                }
            } else if (pathArray[1] == "communities") {
                owner = pathArray[2];
            } else if (/^[a-zA-Z0-9]$/.test(pathArray[1])) {
                if (/^[0-9]$/.test(pathArray[2])) { //plus.google.com/u/1/USERID/posts 
                    owner = pathArray[3];
                } else { //plus.google.com/b/118094714132938124668 //currently no profile pic
                    owner = pathArray[2];
                }
            } else {
                owner = pathArray[1];
            }
            if (!/^\d+$/.test(owner)) {
                if (owner[0] != '+') {
                    console.log("[1] Failed. Unable to recognize userid.");
                    throw "stop execution";
                } else {
                    m_url = "https://plus.google.com/app/basic/" + owner + "/"
                    console.log("Tryng..." + m_url);
                    var xhr = new XMLHttpRequest();
                    xhr.onreadystatechange = function () {
                        if (xhr.readyState == 4) {
                            var da = xhr.status;
                            if (da == 200) {
                                var r = xhr.responseText;
                                var rArray = r.match(/data-owner="([^ ]+)"/);
                                if (rArray.length > 0 && rArray[1]) {
                                    userid = rArray[1];
                                    console.log("[1] User id is:" + userid);
                                    plusone_tab();
                                } else {
                                    console.log("Failed parse data-owner");
                                    throw "stop execution";
                                }
                            } else {
                                console.log("Failed request mobile URL");
                                throw "stop execution";
                            }
                        }
                    }
                    xhr.open("GET", m_url);
                    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                    xhr.send(null);
                }
            } else {
                console.log("URL path got userid");
                userid = owner;

            }
        } else {
            console.log("[0] Failed. Unable to recognize userid.");
            throw "stop execution";
        }
    }
}
if (userid) {
    console.log("[0] User id is:" + userid);
    plusone_tab();
}



步骤 5.

 然后粘贴在箭头 >> 的地方。按ENTER 键 (IE浏览器要按 CTRL+ENTER)。如下图所示。




跑了一会后,就会看见 Lady Gaga 的 +1 过的网址了。 她只 +1 过 5次。




如果没有 +1 过的话, 会显示 nothing :(





一次只显示20个网址, 如果要去下一页, 可以按最下面左下角的 "More 更多" 按钮。




其它例子, 面子书创办人。




谷歌CEO/创办人。




Kevin Mitnick 喜欢的网站都是..




Linus Torvald 推荐过的唯一一个网址竟然是...




干杯 :)


No comments:

Post a Comment