• 有的时候我们需要调用一些微博的组件,这些调用都需要获取用户在微博的UID,让用户亲自去找UID会降低用户体验,所以我们需要想一些办法来获取。

    起初想到的就是访问微博搜索页面,正则匹配页面内容,找到UID,存入数据库。

    但是经过实验后发现,在经过一定次数的读取之后,无法读取了,手动输出page内容一看,竟然需要输入验证码。

    偶然间在创建“一键关注”组件的时候,发现只需要输入用户名即可自动获取UID。

    QQ截图20140804145914

    于是我按下F12,查找按钮代码里是否有UID

    QQ截图20140804150029

    按钮根本不是按照用户名查询的,而是直接根据UID来查看的

    那应该就是在输入框onblur的时候触发的获取UID事件,获取之后再填入按钮组件中。

    那么切换到Network选项卡进行抓包

    QQ截图20140804150253

    发现向getuidnick.php发送了一个POST请求,nickname字段是用户的昵称,返回的data字段就是UID了。

    QQ截图20140804150603

     

    那么我们根据他的header和post data,利用curl构造一个php函数来获取

    最终代码:

    function wb_api_widgetgetuid($name){
        $ch = curl_init();//初始化一个CURL会话
        curl_setopt($ch,CURLOPT_URL,"http://open.weibo.com/widget/ajax_getuidnick.php");//设置CURL请求URL
        $data = "nickname=".urlencode($name);//设置POST数据(用户昵称)
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.11)  Firefox/1.5.0.11;");//设置User-Agent
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER,0);
        $header = array ();
        $header [] = 'Accept-Language: zh-cn'; 
        $header [] = 'Pragma: no-cache';
        $header [] = 'Referer: http://open.weibo.com/widget/followbutton.php';//经测试,请求必须有Referer,否则将返回NULL
        curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
        curl_setopt($ch, CURLOPT_POST,1);
        curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
        $page = curl_exec($ch);//运行抓取
        $matches = json_decode($page,true);//将页面返回的json数据解析为数组
        curl_close($ch);
        if(empty($matches['data'])){//判断返回的UID是否为空
            return "ERR_NotFound";
        }else{
            return $matches['data'];
        }
    }
    

      当然 如果要应用到实际使用中,最好在第一次获取之后就将用户的UID缓存到数据库中,避免抓取过于频繁而导致异常。