最近有个需求是:自动抓取某网站登录页面的验证码图片并保存,抓取n次。使用chrome插件来实现,其中使用到了js操作文件系统的api,特将代码记录下来,以备查阅。

PS:第一次使用js文件系统的api,百度了很久很多文章,大部分文章都很详细的解释介绍了api具体某个对象、方法的使用,但是很少有全部代码从零到功能实现的全部代码贴出,导致我这个新手一头雾水,甚至在文件保存完后,去哪里看保存的文件这个问题上都折腾了一两个小时。正是这些所谓的基础的东西反而因为没有人介绍导致很多无用功。此处贴出全部的代码,希望少走弯路。

以下是chrome插件的content.js的全部代码:

 $(function(){
if(window.location.href.indexOf('www.***.com/logout.action')!=-1 || window.location.href.indexOf('www.***.com/logon.action')!=-1){//登录页,示例隐藏了真实地址,避免不必要的纠纷
saveImg();
}
});
/**
* 保存图片的方法
*/
function saveImg(){
var count = 0;
var max = 100;//修改max的值定义需要抓图的张数
var intev = setInterval(function(){
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
window.requestFileSystem(window.TEMPORARY, 5*1024*1024, initFS, errorHandler);//申请文件系统,将initFS方法作为文件处理的方法,方法回调时会见文件系统对象fs作为参数传入
count ++;
if(count > max){//抓够张数后停止
clearInterval(intev);
}
},5000);//每5秒刷新一张图
}
/**
* 点击验证码,刷新验证码并返回验证码的值,该网站使用的本地js生成的验证码,验证逻辑也是在本地js中完成,插件为gVerify.js
*/
function refreshImg(){
var img = $('#verifyCanvas');
$(img).click();
//因为chrome插件和原网页的js运行环境不能相互访问(但插件js可以访问员网页的dom),使用向原网页插入script并在script中执行“将原网页js环境的变量绑定到页面dom节点后再访问”的办法获取值。
var script = document.createElement('script');
script.type = 'text/javascript';
script.innerHTML = "document.body.setAttribute('code', verifyCode.options.code);";
document.head.appendChild(script);
document.head.removeChild(script);
var code = document.body.getAttribute('code');
console.log(code);
return code;
}
/**
*文件处理方法,注意文件系统不同于操作系统的本地文件系统,只是浏览器运行环境中的一个虚拟的沙箱中的文件系统。在本地文件系统中无法搜索、查看到文件,查看文件的办法:浏览器输入地址查看(中间是网站的域名,每个网站的文件系统相互独立)filesystem:https://www.***.com/temporary/
*/
function initFS(fs){
createDir(fs.root, '/img/'.split('/'));//创建目录
var img_code = refreshImg();
//写文件
fs.root.getFile('/img/'+img_code + '.png', {create: true, exclusive: true}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.onwriteend = function(e) {
console.log("Write successfully");
};
fileWriter.onerror = function(e) {
console.log("Write error!");
};
var img_base64_url = $('#verifyCanvas')[0].toDataURL('image/png');//获取图谱的base64地址
var content = base64ToBinary(img_base64_url);
var bob = new Blob([content]);
fileWriter.write(bob);//查看文件地址:浏览器输入filesystem:https://www.yqt365.com/temporary/
});
}, errorHandler);
}
/**
*异常处理
*/
function errorHandler(err){
var msg = 'An error occured: '; switch (err.code) {
case FileError.NOT_FOUND_ERR:
msg += 'File or directory not found';
break; case FileError.NOT_READABLE_ERR:
msg += 'File or directory not readable';
break; case FileError.PATH_EXISTS_ERR:
msg += 'File or directory already exists';
break; case FileError.TYPE_MISMATCH_ERR:
msg += 'Invalid filetype';
break; default:
msg += 'Unknown Error';
break;
}; console.log(msg);
};
/**
*创建目录
*/
function createDir(rootDir, folders) {
rootDir.getDirectory(folders[0], {create: true}, function(dirEntry) {
if (folders.length) {
createDir(dirEntry, folders.slice(1));
}
}, errorHandler);
};
/**
* 看方法名称都懂啦
*/
function base64ToBinary(imgUrl) {
var BASE64_MARKER = ';base64,';
var base64Index = imgUrl.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
var base64 = imgUrl.substring(base64Index);
var raw = window.atob(base64);
var rawLength = raw.length;
var array = new Uint8Array(new ArrayBuffer(rawLength)); for (i = 0; i < rawLength; ++i) {
array[i] = raw.charCodeAt(i);
}
return array;
}

js 文件系统API操作示例的更多相关文章

  1. Node.js文件系统Api总结

    //公共引用 var fs = require('fs'), path = require('path'); 1.读取文件readFile函数 //readFile(filename,[options ...

  2. hadoop 文件系统API操作

    配置参数:-DHADOOP_USER_NAME=hadoop public class HdfsUtils { private static FileSystem fileSystem; @Befor ...

  3. Node.js文件系统、路径的操作详解

    17173 17173 2 75 2014-12-12T05:06:00Z 2014-12-12T05:06:00Z 21 2735 15595 www.17173.com 129 36 18294 ...

  4. Node.js文件系统、路径的操作函数

    Node.js文件系统.路径的操作函数 目录 Node.js文件系统.路径的操作函数 1.读取文件readFile函数 2.写文件 3.以追加方式写文件 4.打开文件 5.读文件,读取打开的文件内容到 ...

  5. 使用Java API操作HDFS文件系统

    使用Junit封装HFDS import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org ...

  6. Node.js 文件系统fs模块

    Node.js 文件系统封装在 fs 模块是中,它提供了文件的读取.写入.更名.删除.遍历目录.链接等POSIX 文件系统操作. 与其他模块不同的是,fs 模块中所有的操作都提供了异步的和 同步的两个 ...

  7. HTML5文件系统API和资料整理

    来着火狐开发网络的官方文档:点我打开 : W3C的官方文档: 点我打开 : 园友的博客:  点我打开: 浏览器兼容性, 好了就chrome支持, 我刚刚更新的火狐37也不支持, nice, 太nice ...

  8. Node.js 文件系统

    Node.js 文件系统封装在 fs 模块是中,它提供了文件的读取.写入.更名.删除.遍历目录.链接等POSIX 文件系统操作. 与其他模块不同的是,fs 模块中所有的操作都提供了异步的和 同步的两个 ...

  9. Hadoop学习记录(3)|HDFS API 操作|RPC调用

    HDFS的API操作 URL方式访问 package hdfs; import java.io.IOException; import java.io.InputStream; import java ...

随机推荐

  1. 对10进制16位长的主键的缩短处理 NULL

    # 对问题表去除旧有主键,新建自增主键:ALTER TABLE `question`CHANGE COLUMN `id` `id16` bigint(20) NULL COMMENT 'id_to_d ...

  2. Mongo Rocks 在SSD盘上表现优秀,专门为SSD盘的优化

    2017 · MongoDB深圳用户组大会全记录 | MongoDB中文社区http://www.mongoing.com/2017/04/24/mongodb-shenzhen-user-group ...

  3. Tickets---hdu1260 (简单dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1260 题意就是有n个人排队买票,每个人需要的时间是a[i] (1=< i <=N),但是现 ...

  4. python中的Redis键空间通知(过期回调)

    介绍 Redis是一个内存数据结构存储库,用于缓存,高速数据摄取,处理消息队列,分布式锁定等等. 使用Redis优于其他内存存储的优点是Redis提供持久性和数据结构,如列表,集合,有序集和散列. 在 ...

  5. 14.Git忽略特殊文件.gitignore

    有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定 ...

  6. scrapy框架(2)

    一.使用scrapy框架发送post请求 1.需求一:使用scrapy发送百度翻译中的ajax请求 创建一个项目,如下目录,修改settings.py文件中的 "ROBOTSTXT_OBEY ...

  7. 【Loadrunner】通过loadrunner录制时候有事件但是白页无法出来登录页怎么办?

    loadrunner录制脚本时候有事件但是一直白页怎么办? 解决办法:依次进行下方1.2.方法操作,如果还不行再进行3的操作. 1.勾选下图IE浏览器的Internet选项中“启用第三方浏览器拓展*” ...

  8. 【剑指Offer】俯视50题之1-10题

    面试题1赋值运算符函数  面试题2 实现Singleton模式  面试题3 二维数组中的查找   面试题4 替换空格   面试题5 从头到尾打印链表   面试题6 重建二叉树   面试题7 用两个栈实 ...

  9. The adidas NMD Singapore is one of the brands top selling

    Like pointed out, we've two adidas NMD Singapore releases using the first arriving Blue and Black as ...

  10. cas php

    CAS的php客户端实践—单点登录整合php程序 兄弟近日尝试将一个php程序以单点登录方式和原有的系统整合在一起.验证服务器选用的是CAS,其提供有相应的php客户端.整个过程如下:1.搭建CAS服 ...