利用phantomjs模擬QQ自動登錄


之前為了抓取興趣部落里的數據,研究了下QQ自動登錄。

當時搜索了一番,發現大部分方法都已經失效了,於是准備自己開搞。

第一個想到的就是參考網上已有方案的做法,梳理登陸js的實現,通過其他語言重寫。
考慮到js可能會更新,放棄了此方案。

第二個想到的是能不能直接調用QQ自己的js方法,模擬進行提交呢。
搜索一番后發現神器 ———— "phantomjs".

PhantomJS is a headless WebKit scriptable with a JavaScript API. It has fast and native support for various web standards: DOM handling, CSS selector, JSON, Canvas, and SVG.

於是開搞,代碼實現如下。

var page = require('webpage').create();
var fs = require("fs");
page.settings.userAgent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4';
page.open('http://ui.ptlogin2.qq.com/cgi-bin/login?pt_no_onekey=1&style=9&appid=1006102&s_url=http%3A%2F%2Fxiaoqu.qq.com%2Fmobile%2Fbarindex.html%3F_lv%3D29313%26_bid%3D128%26_wv%3D1027%26from%3Dshare_link%23bid%3D37469%26type%3D%26source%3Dindex%26scene%3Drecent%26from%3Ddongtai%26webview%3D1&low_login=0&hln_css=http%3A%2F%2Fpub.idqqimg.com%2Fqqun%2Fxiaoqu%2Fmobile%2Fimg%2Fnopack%2Flogin-logo.png', function(status){
    if (status == 'success') {
        page.render('index.png');
        setTimeout(function() {
            page.evaluate(function() {
                document.getElementById('u').value = 'QQ號碼';
                document.getElementById('p').value = 'QQ密碼';
                pt.check(false);
//document.getElementById('go').click(); //pt.check()或.click() }); setTimeout(
function() { file = fs.open("cookie.log", 'w'); file.write(JSON.stringify(page.cookies)); file.close(); phantom.exit(); }, 2000); }, 1000); } });

cookie會寫入到當前目錄下的cookie.log文件,有了cookie接下來的事情就簡單多了。使用php或js將cookie種到瀏覽器下即可。

 

 優化后的qq.js代碼:

/**
 * QQ自動登錄,用phantomjs模擬瀏覽器,自動登錄到QQ興趣部落
 * @example 執行方式:cd /phantom && ./phantomjs qq.js QQ號 QQ密碼
 * phantomjs下載:http://phantomjs.org/download.html
 * 安裝依賴(重要,否則會報錯):
 * sudo yum install fontconfig freetype libfreetype.so.6 libfontconfig.so.1 libstdc++.so.6
 */
var page = require('webpage').create();
var fs = require("fs");
var args = require('system').args;

page.settings.userAgent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4';
page.open('http://ui.ptlogin2.qq.com/cgi-bin/login?pt_no_onekey=1&style=9&appid=1006102&s_url=http%3A%2F%2Fxiaoqu.qq.com%2Fmobile%2Fbarindex.html%3F_lv%3D29313%26_bid%3D128%26_wv%3D1027%26from%3Dshare_link%23bid%3D37469%26type%3D%26source%3Dindex%26scene%3Drecent%26from%3Ddongtai%26webview%3D1&low_login=0&hln_css=http%3A%2F%2Fpub.idqqimg.com%2Fqqun%2Fxiaoqu%2Fmobile%2Fimg%2Fnopack%2Flogin-logo.png', function(status){
    if (status == 'success') {
        page.render('index.png');
        setTimeout(function() {
            page.evaluate(function(_args) {
                document.getElementById('u').value = _args[1]; //QQ號碼
                document.getElementById('p').value = _args[2]; //QQ密碼
                pt.check(false);
            }, args); //要使用傳參的形式將全局變量args傳入到page.evaluate()
            setTimeout(function() {
                //將cookie轉換成json格式寫入到cookie.log文件
                //file = fs.open("cookie.log", 'w');
                //file.write(JSON.stringify(page.cookies));
                //file.close();

                //將cookie轉換成json格式打印出來
                console.log(JSON.stringify(page.cookies));
                
                phantom.exit(); //記得退出
            }, 2000);
        }, 1000);
    }
});

qq.js也可以使用以下代碼進行自動登錄:

page.open('https://ui.ptlogin2.qq.com/cgi-bin/login?style=9&appid=1006102&daid=0&s_url=http%3A%2F%2Fid.qq.com&low_login=0', function(status){
    if (status == 'success') {
        //page.render('index1.png'); //截屏,為了調試使用
        setTimeout(function() {
            page.evaluate(function(_args) {
                document.getElementById('u').value = _args[1]; //QQ號碼
                document.getElementById('p').value = _args[2]; //QQ密碼
                document.getElementById('go').click(); //pt.check()或.click()
            }, args); //要使用傳參的形式將全局變量args傳入到page.evaluate()
            setTimeout(function() {
                //將cookie轉換成json格式寫入到cookie.log文件
                //file = fs.open("cookie.log", 'w');
                //file.write(JSON.stringify(page.cookies));
                //file.close();

                //將cookie轉換成json格式打印出來
                console.log(JSON.stringify(page.cookies));
                //page.render('index.png'); //截屏,為了調試使用
 //console.log(page.content);  phantom.exit(); //記得退出 }, 2000); }, 1000); } });

php調用phantomjs代碼:

    public function actionQqLogin() {
        $ret = false;
        $qq = 'QQ號';
        $pwd = 'QQ密碼';
        
        $command = "cd /phantom/ && ./phantomjs qq.js {$qq} {$pwd}";
        $cookie_json = @exec($command);  //只返回最后一行
        //echo $cookie_json.'<br/><br/>';  //test
        if ($cookie_json) {
            $cookie_arr = json_decode($cookie_json, true);
            //print_r($cookie_arr); //test
            if ($cookie_arr) {
                foreach ($cookie_arr as $cookie) {
                    //echo $cookie['value'].'  ';
                    //注意:不要用setcookie(),用setrawcookie()不會對cookie value進行url編碼
                    $ret = setrawcookie($cookie['name'], $cookie['value'], $cookie['expires'], '/', $cookie['domain']);
                }
            }
        }
        if ($ret) {
            echo '登錄成功!';
        }
        
        //return $ret;
    }

 

附:
下載phantomjs的Windows版本: http://phantomjs.org/download.html
在當前文件夾下運行cmd命令:
1. 在桌面上先按住Shift鍵,然后鼠標右鍵,出現選項“在此處打開命令窗口(W)”也可以打開命令行。
2. 點擊“在此處打開命令窗口(W)”,進入CMD命令行界面。
 
參考文章:
利用phantomjs模擬QQ自動登錄: https://www.liudon.org/1327.html
QQ模擬登錄實現之四兩撥千斤(基於V8引擎): http://ju.outofmemory.cn/entry/246396
PhantomJS在Windows7下實現網站自動下載截圖(包含PhantomJS在Windows7下的安裝): http://www.cnblogs.com/huangcong/archive/2013/04/18/3027654.html
Linux服務器安裝PhantomJS使用方法: http://www.111cn.net/sys/linux/103737.htm
編譯好的Linux下phantomjs文件下載: https://bitbucket.org/ariya/phantomjs/downloads
php結合phantomjs實現網頁全屏截圖: http://www.oicqzone.com/pc/2014091319762.html
phantomjs裝配(linux,附帶環境變量設置) ,以及casperjs安裝: http://www.myexception.cn/linux-unix/1756766.html
 
如何把全局參數傳遞給 phantomjs 的 page.evaluate 方法:
phantomjs是一個無界面瀏覽器,可用於網頁截圖和前端自動化測試,基於
webkit內核(也就是chrome使用的內核),並使用js編寫業務腳本來請求、瀏覽和操作頁面。最近前端監控需要用到phantomjs,特地研究
了一下這個組件,把其中一個大坑發出來給大家分享一下。

!!!!注意page.evaluate中的回調函數作用域鏈

page.evaluate中的函數是在目標網頁執行的,其上下文、作用域鏈已經不能與phantomjs執行這個js同日而語,因此請勿在evaluate中引用phantomjs的api或你這個js文件中的全局變量,否則出了錯,都很難定位。

錯誤示例:

[javascript] view plain copy
var page = require('webpage').create();  
var url = 'http://json2form.wikisoft.me//';  
var globalVar = 1;  
page.open(url, function (status)   
{  
    if (status != "success")   
    {  
        console.log('FAIL to load the address');  
    }  
      
    page.evaluate(function()  
    {  
        var x = globalVar;//引用本js的一個全局變量  
        page.method();//執行phantomjs的一個api  
    });  
});  

正確引用全局變量的方法是把全局變量進行傳參

[javascript] view plain copy
var express = require('express');  
var router = express.Router();  
var mysql = require('mysql');  
var phantom = require('phantom');  

/* GET home page. */  
router.get('/', function (req, res, next) {  
    var pageContent,  
        paraObj = {title: 'lalala3', content: 'notenote3'};  
  
    phantom.create().then(function (ph) {  
        ph.createPage().then(function (page) {  
            page.open('http://www.baidu.com/').then(function (status) {  
 page.evaluate(function (_paraObj) { var desObj = {}; desObj.title = _paraObj.title; desObj.note = _paraObj.content; return desObj; }, paraObj).then(function (_desObj) {  
                    //console.log(html);  
                    res.render('index', {title: _desObj.title, content: _desObj.note});  
                    page.close();  
                    ph.exit();  
                });  
            });  
        });  
    });  
  
});  
  
module.exports = router;

 

 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM