利用phantomjs模拟QQ自动登录

时间:2022-10-15 21:26:48

之前为了抓取兴趣部落里的数据,研究了下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)”也可以打开命令行。
利用phantomjs模拟QQ自动登录
2. 点击“在此处打开命令窗口(W)”,进入CMD命令行界面。
利用phantomjs模拟QQ自动登录
 
参考文章:
利用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;
 
 
 

利用phantomjs模拟QQ自动登录的更多相关文章

  1. Delphi制作QQ自动登录器源码

    Delphi制作QQ自动登录器源码  http://www.cnblogs.com/sunsoft/archive/2011/02/25/1964967.html 以TM2009为例,检查了一下,未登 ...

  2. QQ自动登录Demo源码&lpar;附全套WindowsApi&rpar;

    在开发过程中,偶尔会有自动化操作软件的需求,便想到用句柄实现自动化的功能,记录下知识点,以作备忘. 实现流程: 获取窗口句柄,根据定位获取input,调用windowsapi模拟鼠标点击, 输入 , ...

  3. 爬虫模拟cookie自动登录(人人网自动登录)

    什么是cookie? 在网站中,HTTP请求时无状态的,也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是谁,cookie的出现就是为了解决这个问题,第一次登陆后服 ...

  4. 利用JS&lowbar;SDK实现QQ第三方登录

    前言 现如今,第三方登录已成为大部分网站必备的一项基础技能,引入时髦的第三方登录不仅能帮你吸引更多的用户,也让你的网站可以充分利用其他大型网站的用户资源.本次教程将让你的网站最快捷便利地引入QQ登录. ...

  5. 利用Jsoup模拟跳过登录爬虫获取数据

    今天在学习爬虫的时候想着学习一下利用jsoup模拟登录.下面分为有验证码和无验证码的情况进行讨论. ---------------------------无验证码的情况---------------- ...

  6. QQ自动登录里的一些控件知识

    在这个程序里面有个读取计算机指定文件的知识: private void button2_Click(object sender, EventArgs e) { openFileDialog1.Show ...

  7. QQ模拟自动登录实现

    QQ模拟自动登录实现 本篇文章主要介绍"QQ模拟自动登录实现(带验证码)",主要涉及到java 实现QQ自动登录(带验证码)方面的内容,对于java 实现QQ自动登录(带验证码)感 ...

  8. mac 利用 sshpass 自动登录

    mac 利用 sshpass  + 配置文件 实现自动登录 使用方式 https://github.com/vipzhicheng/go  参见此项目 其实原理也就是 脚本 读取配置文件 匹配 参数或 ...

  9. casperjs配合phantomjs实现自动登录百度,模拟点击等等操作 - 怕虎在线www&period;ipahoo&period;com图文教程 - 怕虎在线

    微信支付取消2万元保证金门槛,这是全民电商来袭!-观点-虎嗅网 微信支付取消2万元保证金门槛,这是全民电商来袭! casperjs配合phantomjs实现自动登录百度,模拟点击等等操作 - 怕虎在线 ...

随机推荐

  1. eclipse maven web环境搭建

    选择创建new project 勾选跳过创建类型选择(让eclipse创建标准maven项目) 填写组织ID,唯一ID,注意:如果选择打包类型为war包时,会生成web类型的maven工程 修改JRE ...

  2. 使用python操作FTP上传和下载

    函数释义 Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件,函数列举如下 ftp登陆连接 from ftplib import F ...

  3. &lbrack;系统集成&rsqb; 部署 mesos-exporter 和 prometheus 监控 mesos task

    前几天我在mesos平台上基于 cadvisor部署了 influxdb 和 grafana,用于监控 mesos 以及 docker app 运行信息,发现这套监控系统不太适合 mesos + do ...

  4. iOS - 表格

    一. TableView 1.1 StoryBoard方式 1.2 nib方式 1.2.1 一般 1.2.2 自定义单元格 1.3 纯代码方式 (1) 简单表视图操作 Step1: 实现协议 2个协议 ...

  5. Android开发之NavigationView的使用

    NavigationView主要是和DrawerLayout框架结合使用,来完成抽屉导航实现侧边栏 引用一段官方文档的示例代码 <android.support.v4.widget.Drawer ...

  6. GDKOI2017滚粗记

    Preface 比赛成绩非常烂,却腐败得非常爽,但是gmh大爷因为和我们腐败,变得更强. 比赛策略有点问题,拼命想正解而没了暴力分 数论题做得比较少,导致只会找规律.知识点需要补充,如AC自动机,启发 ...

  7. 2&period;5 elif

    elif 想一想: if能完成当xxx时做事情 if-else能完成当xxx时做事情1,否则做事情2 如果有这样一种情况:当xxx1满足时做事情1:当xxx1不满足.xxx2满足时做事情2:当xxx2 ...

  8. MFC通过button控制编辑框是否显示系统时间

    在dlg.h中public bool flag; 在构造函数中 flag=false; 在button的生成函数中 if(flag) { flag=false; //m_showtime.SetWin ...

  9. 使用python查询某目录下所有&OpenCurlyQuote;jpg’结尾的图片文件

    调用os模块,先建立一个对目标目录的walk迭代器. 然后再对迭代器进行遍历,判断每个文件是否以'jpg'结尾. 若是,则输出. import os g = os.walk("G:&quot ...

  10. IDEA 工具下导出文件及文件的目录结构插件

    idea导出增量补丁插件 有时候需要导出IDEA的文件目录结构,即导出  指定修改后的JAVA文件编译后的CLASS .或者是修改过的jsp.配置文件等, 装载此插件,即可以完成导出文件  及文件的目 ...