最新文章

Cannot read property ‘glob’ of null

Angular2 firstly run project on npm occurred error. Cannot read property ‘glob’ of null Win 10 try to delete c:/users/username/angular~.json then run again.

Read Me!

Best-websites-a-programmer-should-visit Some useful websites for programmers. When learning CS there are some useful sites you must know to get always informed in order to do your technologies eve and learn new things. Here is a non exhaustive list of some sites you should visit, this list will get updated as soon as I can get […]

403 forbidden(Spider error)

When I run a spider on Taobao get the error 403. As the above page image, it receive the response successfully. But if you open the request url on a new web, it will receive 403 forbidden, I do not know what happened there. I try imitate the request by using postman but also got […]

Strategy Pattern

Conception Strategy pattern (also known as the policy pattern) design pattern that enables an algorithm’s behavior to be selected at runtime. Intent Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from the clients that use it. Capture the abstraction in an interface, bury implementation details […]

CSS Layout

This tutorial teaches the css fundamentals that were collected by these sites as follows and maybe keep on updating in the future. And I may not told you what is a box model such questions. You should know the reason. learnlayout ruanyifeng Position let us get started with the static. The static value which belongs […]

msqli_* prevent SQL injection

To avoid your code be vulnerable, especially for preventing SQL injection. You may need the mysqli_* function and prepare statement of it to make it. I will make some examples, such like this: The SELECT sentence like this: $stmt = $conn->prepare('SELECT column_name FROM table_name WHERE column_name = ?'); $stmt->bind_param('s', $varname); $stmt->execute(); $result = $stmt->get_result(); The […]

kali install pip3

Today I wanna to install the pip3 on kali linux 2016.2, but find a question: There only be pip2 which is package manager for python 2.7 on the kali linux 2016.2. I try to find the question on baidu search engine, but get no useful info which makes me depressed. Then I try to install […]

CDN to Real IP

Feeling boring these days, not know who I am, not know what to do, not know where I should go. Maybe I got older. Who knows that? First let us know about cdn. The next content list as follows from wiki. A content delivery network or content distribution network (CDN) is a globally distributed network […]

php 反序列化漏洞概览

个人感觉参数可控是很多安全问题的根源 php反序列化漏洞原链接 序列化是啥 就理解成方便数据运输做的一种压缩优化就行 比方说一个 $stooges = array('Moe','Larry','Curly'); $new = serialize($stooges); print_r($new); echo "<br />"; print_r(unserialize($new)); 结果: a:3:{i:0;s:3:"Moe";i:1;s:5:"Larry";i:2;s:5:"Curly";} 可以看出来乱七八糟的对象最终简化为字符串 所以可以猜出来咋用了 就是构造语句进行序列化 然后在对应进行反序列化的接口 利用变量可控性执行命令 这个过程中 两个比较注意的地方 一个是 魔术方法 即通过反序列化调用生成对象执行析构函数等 利用接口对应变量的不安全权限 对构造析构toString等方法进行利用 比如web Application 源码如下 <?php include 'logfile.php'; class FileClass { public $filename = 'error.log'; public function __toString() { return file_get_contents($this->filename); } } class User { public […]

PhpStorm 配置php7.0环境

php是我见过最恶心需要配环境的 php小白一个 喜欢做死 于是选了配置phpstorm环境 网上的教程大都很老了 所以来更一波 下载xmapp7..0版本 是的你没看错,就是32位 是的你没看错,我用了集成包而不是单独配 是的你没看错我下的是7.0版本而不是最新的版本 关于安装 只有一个要强调 这个mysql必须要选上 无论你电脑装没装MySQL 可能有尝试过phpstudy的 就是那个装了之后那个自己的MySQL就会变红停止 这个不用担心 xampp不会影响,很稳 然后启动后要配置一下 ssl那个文件里面所有的443改成8001 phpmyadmin那个里面有个password改成自己数据库的密码 第二个有点麻烦,待会说 下载xdebug 首先打开apache 然后输入localhost/dashboard/phpinfo.php 进入网址后右键viewpagesource,反正就是查看源码 然后ctrl a 全选后复制一波 找到这个地方粘上 xdebug自定义 然后analyze一下下载对应的xdebug.dll 放到xmapp下的php下的ext最好重命名一下 为xdebug.dll 以及对应着设置下前面提到的第二个文件php.ini 找到最后添加类似如下配置 按官方说明来 最后一行没有引号 如何知道自己安装成功了? 检查如下网址 http://localhost/dashboard/phpinfo.php 如存在xdebug下图,即可 科学一下 从chrome商店下个 xdebug helper 然后配置一下这个插件的idekey为PhpStorm 最后就是配置phpstorm了 终于最后一步了 新建项目于xampp/htdc/你的项目名 然后 添加一下服务器打开debug就可以跑了(apache别关) starturl填项目名,然后打开两个地方,一个是chrome那个debug插件 设置为debug形式 另一个是phpstorm里那个看起来有点像电话然后一直红色的禁止符号让人很不顺眼那个 […]

php 恶心的闭合标签

写了段php代码 在微信小程序check返回的response时发现多了个回车换行 查了查 特么地可真有意思 以前学习html 不闭合标签容易吃兼容的亏 就比如以前解决的一个问题 关于p标签引起的不对齐问题 但是今天让php摆了一道 关于PHP闭合标签官方解释是: PHP闭合标签”?>”在PHP中对PHP的分析器是可选的。 但是,如果使用闭合标签,任何由开发者,用户, 或者FTP应用程序插入闭合标签后面的空格都有可能会引起多余的输出、php错误、之后的输出无法显示、空白页。 因此,所有的php文件应该省略这个php闭合标签,并插入一段注释来标明这是文件的底部并定位这个文件在这个应用的相对路径。 这样有利于你确定这个文件已经结束而不是被删节的。 一句话,纯php就这么写 <?php echo "Here's my code!"; /* End of file myfile.php */ /* Location: ./system/modules/mymodule/myfile.php */ 而不是 <?php echo "Here's my code!"; ?>

Https 升级(free)

环境如下 Ubuntu 16.04, Apache2 (阿里云) 工具如下 https://certbot.eff.org/#ubuntuxenial-apache 命令如下: $ apt install software-properties-common $ sudo add-apt-repository ppa:certbot/certbot $ sudo apt-get update $ sudo apt-get install python-certbot-apache $ certbot --apache in this step, you need enter 1. domain name 2. your email 3. Agree the service term 4. share your email to subscribe or not 5. make […]

Selenium Qzone登陆

import time from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.maximize_window() driver.get("http://i.qq.com/") try: driver.find_element_by_id('login_div') a = True except: a = False if a == True: driver.switch_to.frame('login_frame') driver.find_element_by_id('switcher_plogin').click() driver.find_element_by_id('u').clear()#选择用户名框 driver.find_element_by_id('u').send_keys('QQ') driver.find_element_by_id('p').clear() driver.find_element_by_id('p').send_keys('password') driver.find_element_by_id('login_button').click() time.sleep(3) print(driver.page_source) driver.close() 一开始直接找登陆的账号密码Element 但是却报错显示未查找到该Element 于是打印了下 page_source,查了下view-page 发现的确未有改元素 拜读了大佬的博客才知道这里使用了iframe加载了登陆框 然后就是定位该框,点击账号密码登录输入,点击登陆即可

Scrapy 初窥笔记

scrapy startproject YourProjectName 建立scrapy项目 开始爬虫 scrapy crawl SpiderName 开始执行爬虫 以上仿麻烦 根目录新建执行文件 from scrapy.cmdline import execute execute(['scrapy', 'crawl', 'dingdian']) 顶点为spider的name 定义爬取的字段 就比如说爬小说 字段有 小说作者,小说内容等 Item文件下定义 class DingdianItem(scrapy.Item): author = scrapy.Field() content = scrapy.Field() 如上,定义一定要继承Item 然后字段皆为Field(), 没有其他类型 比Django要方便的多 开始写核心spider部分 spider以start_requests为初始函数,该函数必须yield一个可迭代对象 比如Request(url, call_back, meta) 参数说明url,即需要Request.get 的内容,call_back是一个parse函数,该函数可接受一个由刚才的get获取的response, meta是由上一个Request往这传的时候可以带上的参数 parse 最终要yield 或 return 一个或多个 Item,来进行后续处理 这里有个巨大的 坑: response尽量一次处理,不要在多个parse之间执行,因为所有的url,但凡被Request过,不会被二次请求,简单来说,url通常不能为response.url,如果你跟我一样踩到这个坑,注意这个解决方法 Scrapy的官方文档: http://doc.scrapy.org/en/latest/topics/request-response.html#scrapy.http.Request […]

github 部署hexo博客无效

问题: deploy后远程库没有出现对应生成的hexo文件 也无错误提示。 deploy: type: git repo: https://github.com/ReZeroS/ReZeroS.github.io.git branch: master 这三句中非常zz的一个地方,就是:后面一定要空一格!!!!!!

Android 第三方库方向索引

原文 https://github.com/wasabeef/awesome-android-libraries/blob/master/README.md List of Android Libraries This is an alphabetical list of libraries for Android development, the majority being actively maintained. UI/UX Library is here. Index Networking Image Loader Drawable Dependency Injections JSON O/R Mapping NoSQL Pub/Sub Logger Background Processing Fonts Video Parcelables Functional Programming Adding Java-8 Functional Programming Features Functional Reactive Programming Social Networks […]

Android Permission latest version

原文地址: https://developer.android.google.cn/reference/android/Manifest.permission.html (sublime正则替换好爽) String ACCESS_CHECKIN_PROPERTIES Allows read/write access to the “properties” table in the checkin database, to change values that get uploaded. String ACCESS_COARSE_LOCATION Allows an app to access approximate location. String ACCESS_FINE_LOCATION Allows an app to access precise location. String ACCESS_LOCATION_EXTRA_COMMANDS Allows an application to access extra location provider commands. String ACCESS_NETWORK_STATE Allows applications […]

JetBrains 激活码

昨天(2017.2.25)到期了 于是google了个新的 CNEKJPQZEX-eyJsaWNlbnNlSWQiOiJDTkVLSlBRWkVYIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IkZvciBlZHVjYXRpb25hbCB1c2Ugb25seSIsImNoZWNrQ29uY3VycmVudFVzZSI6ZmFsc2UsInByb2R1Y3RzIjpbeyJjb2RlIjoiQUMiLCJwYWlkVXBUbyI6IjIwMTgtMDEtMzAifSx7ImNvZGUiOiJETSIsInBhaWRVcFRvIjoiMjAxOC0wMS0zMCJ9LHsiY29kZSI6IklJIiwicGFpZFVwVG8iOiIyMDE4LTAxLTMwIn0seyJjb2RlIjoiUlMwIiwicGFpZFVwVG8iOiIyMDE4LTAxLTMwIn0seyJjb2RlIjoiV1MiLCJwYWlkVXBUbyI6IjIwMTgtMDEtMzAifSx7ImNvZGUiOiJEUE4iLCJwYWlkVXBUbyI6IjIwMTgtMDEtMzAifSx7ImNvZGUiOiJSQyIsInBhaWRVcFRvIjoiMjAxOC0wMS0zMCJ9LHsiY29kZSI6IlBTIiwicGFpZFVwVG8iOiIyMDE4LTAxLTMwIn0seyJjb2RlIjoiREMiLCJwYWlkVXBUbyI6IjIwMTgtMDEtMzAifSx7ImNvZGUiOiJEQiIsInBhaWRVcFRvIjoiMjAxOC0wMS0zMCJ9LHsiY29kZSI6IlJNIiwicGFpZFVwVG8iOiIyMDE4LTAxLTMwIn0seyJjb2RlIjoiUEMiLCJwYWlkVXBUbyI6IjIwMTgtMDEtMzAifSx7ImNvZGUiOiJDTCIsInBhaWRVcFRvIjoiMjAxOC0wMS0zMCJ9XSwiaGFzaCI6IjUxOTU1OTMvMCIsImdyYWNlUGVyaW9kRGF5cyI6MCwiYXV0b1Byb2xvbmdhdGVkIjpmYWxzZSwiaXNBdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlfQ==-QOxwjWvRwJz6vo6J6adC3CJ4ukQHosbPYZ94URUVFna/Rbew8xK/M5gP3kAaPh6ZDveFdtMR1UBoumq3eCwXtXM3U3ls5noB4LIr+QplVlCj2pK5uNq7g/feyNyQcHpSXtvhIOnXDBLOecB05DOsxzm0p7ulGGJoAInmHeb9mc0eYjqc4RPpUQfh6HSYBnvEnKMlLF5bz4KEtzmsvvgA55CwzwQ3gRitm5Q/wUT7AQCBdjmBfNUjKVQL6TSjSDPp56FUdEs4Aab8LqstA2DIMbxocO64rvytmcUeIwu8Mi5uq87KQP5AQMSMYb59Inbd+dmVfx5cJo3fRS4/5s3/Hg==-MIIEPjCCAiagAwIBAgIBBTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTE1MTEwMjA4MjE0OFoXDTE4MTEwMTA4MjE0OFowETEPMA0GA1UEAwwGcHJvZDN5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxcQkq+zdxlR2mmRYBPzGbUNdMN6OaXiXzxIWtMEkrJMO/5oUfQJbLLuMSMK0QHFmaI37WShyxZcfRCidwXjot4zmNBKnlyHodDij/78TmVqFl8nOeD5+07B8VEaIu7c3E1N+e1doC6wht4I4+IEmtsPAdoaj5WCQVQbrI8KeT8M9VcBIWX7fD0fhexfg3ZRt0xqwMcXGNp3DdJHiO0rCdU+Itv7EmtnSVq9jBG1usMSFvMowR25mju2JcPFp1+I4ZI+FqgR8gyG8oiNDyNEoAbsR3lOpI7grUYSvkB/xVy/VoklPCK2h0f0GJxFjnye8NT1PAywoyl7RmiAVRE/EKwIDAQABo4GZMIGWMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGEpG9oZGcfLMGNBkY7SgHiMGgTcMEgGA1UdIwRBMD+AFKOetkhnQhI2Qb1t4Lm0oFKLl/GzoRykGjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBggkA0myxg7KDeeEwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQDAgWgMA0GCSqGSIb3DQEBCwUAA4ICAQC9WZuYgQedSuOc5TOUSrRigMw4/+wuC5EtZBfvdl4HT/8vzMW/oUlIP4YCvA0XKyBaCJ2iX+ZCDKoPfiYXiaSiH+HxAPV6J79vvouxKrWg2XV6ShFtPLP+0gPdGq3x9R3+kJbmAm8w+FOdlWqAfJrLvpzMGNeDU14YGXiZ9bVzmIQbwrBA+c/F4tlK/DV07dsNExihqFoibnqDiVNTGombaU2dDup2gwKdL81ua8EIcGNExHe82kjF4zwfadHk3bQVvbfdAwxcDy4xBjs3L4raPLU3yenSzr/OEur1+jfOxnQSmEcMXKXgrAQ9U55gwjcOFKrgOxEdek/Sk1VfOjvS+nuM4eyEruFMfaZHzoQiuw4IqgGc45ohFH0UUyjYcuFxxDSU9lMCv8qdHKm+wnPRb0l9l5vXsCBDuhAGYD6ss+Ga+aDY6f/qXZuUCEUOH3QUNbbCUlviSz6+GiRnt1kA9N2Qachl+2yBfaqUqr8h7Z2gsx5LcIf5kYNsqJ0GavXTVyWh7PYiKX4bs354ZQLUwwa/cG++2+wNWP+HtBhVxMRNTdVhSm38AknZlD+PTAsWGu9GyLmhti2EnVwGybSD2Dxmhxk3IPCkhKAK+pl0eWYGZWG3tJ9mZ7SowcXLWDFAk0lRJnKGFMTggrWjV8GYpw5bq23VmIqqDLgkNzuoog== 可用于 idea,pycharm, phpwebstorm等

渗透菜鸟概览

微信原文 ping 根据 hostname 获取 IP 寻找同一服务器上的其它网站,使用sameip.org. 开始采集信息 1. DNS records (A, NS, TXT, MX and SOA) 2. Web Server Type (Apache, IIS, Tomcat) 3. Registrar (the company that owns your domain) 4. Your name, address, email and phone 5. Scripts that your site uses (php, asp, asp.net, jsp, cfm) 6. Your server OS (Unix,Linux,Windows,Solaris) […]

(八)存储数据

通常Chrome扩展使用以下三种方法中的一种来储存数据 HTML5的localStorage 对于一般的扩展,“设置”这种简单的数据可以优先选择第一种,因为这种方法使用简单,可以看成是特殊的JavaScript变量; Chrome提供的存储API 对于结构稍微复杂一些的数据可以优先选择第二种,这种方法可以保存任意类型的数据,但需要异步调用Chrome的API,结果需要使用回调函数接收,不如第一种操作简单; Web SQL Database 使用的不算太多,因为需要使用SQL语句对数据库进行读写操作,较前两者更加复杂,但是对于数据量庞大的应用来说是个不错的选择 Chrome存储API Chrome为扩展应用提供了存储API,以便将扩展中需要保存的数据写入本地磁盘。Chrome提供的存储API可以说是对localStorage的改进,它与localStorage相比有以下区别: 如果储存区域指定为sync,数据可以自动同步 content_scripts可以直接读取数据,而不必通过background页面 首先 localStorage 是基于域名的,而 content_scripts 是注入到用户当前浏览页面中的,如果 content_scripts 直接读取 localStorage ,所读取到的数据是用户当前浏览页面所在域中的。所以通常的解决办法是content_scripts通过runtime.sendMessage和background通信,由background读写扩展所在域(通常是chrome-extension://extension-id/)的localStorage,然后再传递给content_scripts 在隐身模式下仍然可以读出之前存储的数据 读写速度更快 用户数据可以以对象的类型保存 使用Chrome存储API必须要在Manifest的permissions中声明storage,之后才有权限调用 Chrome存储API提供了2种储存区域,分别是sync和local 两种储存区域的区别在于,sync储存的区域会根据用户当前在Chrome上登陆的Google账户自动同步数据,当无可用网络连接可用时,sync区域对数据的读写和local区域对数据的读写行为一致 对于每种储存区域,Chrome又提供了5个方法,分别是 get方法即为读取数据,完整的方法为: chrome.storage.StorageArea.get(keys, function(result){ console.log(result); }); keys可以是字符串、包含多个字符串的数组或对象。如果keys是字符串,则和localStorage的用法类似;如果是数组,则相当于一次读取了多个数据;如果keys是对象,则会先读取以这个对象属性名为键值的数据,如果这个数据不存在则返回keys对象的属性值(比如keys为{'name':'Billy'},如果name这个值存在,就返回name原有的值,如果不存在就返回Billy)。如果keys为一个空数组([])或空对象({}),则返回一个空列表,如果keys为null,则返回所有存储的数据。 getBytesInUse方法为获取一个数据或多个数据所占用的总空间,返回结果的单位是字节,完整方法为: chrome.storage.StorageArea.getBytesInUse(keys, function(bytes){ console.log(bytes); }); 此处的keys只能为null、字符串或包含多个字符串的数组。 set方法为写入数据,完整方法为: chrome.storage.StorageArea.set(items, function(){ //do something }); items为对象类型,形式为键/值对。items的属性值如果是字符型、数字型和数组型,则储存的格式不会改变,但如果是对象型和函数型的,会被储存为“{}”,如果是日期型和正则型的,会被储存为它们的字符串形式。 remove方法为删除数据,完整方法为: chrome.storage.StorageArea.remove(keys, function(){ //do something }); 其中keys可以是字符串,也可以是包含多个字符串的数组。 […]

(七)扩展页面通信

Chrome提供了4个有关扩展页面间相互通信的接口,分别是runtime.sendMessage、runtime.onMessage、runtime.connect和runtime.onConnect Chrome提供的大部分API是不支持在 content_scripts 中运行的,但 runtime.sendMessage 和 runtime.onMessage 可以在 content_scripts 中运行,所以扩展的其他页面也可以同 content_scripts 相互通信。 runtime.sendMessage完整的方法为: chrome.runtime.sendMessage(extensionId, message, options, callback) 其中extensionId为所发送消息的目标扩展,如果不指定这个值,则默认为发起此消息的扩展本身 message为要发送的内容,类型随意,内容随意,比如可以是’Hello’,也可以是{action: ‘play’}、2013和[‘Jim’, ‘Tom’, ‘Kate’] options为对象类型,包含一个值为布尔型的includeTlsChannelId属性,此属性的值决定扩展发起此消息时是否要将TLS通道ID发送给监听此消息的外部扩展1,有关TLS的相关内容可以参考http://www.google.com/intl/zh-CN/chrome/browser/privacy/whitepaper.html#tls,这是有关加强用户连接安全性的技术,如果这个参数你捉摸不透,不必理睬它,options是一个可选参数 -callback是回调函数,用于接收返回结果,同样是一个可选参数。 此属性仅在扩展和网页间通信时才会用到。 runtime.onMessage完整的方法为: chrome.runtime.onMessage.addListener(callback) 此处的callback为必选参数,为回调函数。 callback接收到的参数有三个,分别是message、sender和sendResponse, 即消息内容、消息发送者相关信息和相应函数 其中sender对象包含4个属性,分别是tab、id、url和tlsChannelId,tab是发起消息的标签 为了进一步说明,下面举一个例子。 在popup.html中执行如下代码: chrome.runtime.sendMessage('Hello', function(response){ document.write(response); }); 在background中执行如下代码: chrome.runtime.onMessage.addListener(function(message, sender, sendResponse){ if(message == 'Hello'){ sendResponse('Hello from background.'); } }); 查看popup.html页面会发现有输出“Hello from background.”。

Sympy 解方程

解普通方程 from sympy import * x = Symbol('x') y = Symbol('y') print solve([2 * x - y - 3, 3 * x + y - 7],[x, y]) 解微积分 from sympy import * n = Symbol('n') s = ((n+3)/(n+2))**n #无穷为两个小写o print limit(s, x, oo) 求定积分 from sympy import * t = Symbol('t') x = Symbol('x') m […]

图说Android

android studio 思维导图 现 android 系统架构 3. manifest 文件说明 两种布局

(六)选项卡的设置

指定options_page属性后,扩展图标上的右键菜单会包含“选项”链接 对于网站来说,用户的设置通常保存在Cookies中,或者保存在网站服务器的数据库中。 对于JavaScript来说,一些数据可以保存在变量中,但如果用户重新启动浏览器,这些数据就会消失。 那么如何在扩展中保存用户的设置呢? 我们可以使用HTML5新增的localStorage接口 localStorage是HTML5新增的方法,它允许JavaScript在用户计算机硬盘上永久储存数据(除非用户主动删除)。 但localStorage也有一些限制,首先是localStorage和Cookies类似,都有域的限制,运行在不同域的JavaScript无法调用其他域localStorage的数据 其次是单个域在localStorage中存储数据的大小通常有限制(虽然W3C没有给出限制),对于Chrome这个限制是5MB 最后localStorage只能储存字符串型的数据,无法保存数组和对象,但可以通过join、toString和JSON.stringify等方法先转换成字符串再储存 通过声明unlimitedStorage权限,Chrome扩展和应用可以突破这一限制 小项目 查天气 manifest { "manifest_version": 2, "name": "天气预报", "version": "1.0", "description": "查看未来两周的天气情况", "icons": { "16": "images/icon16.png", "48": "images/icon48.png", "128": "images/icon128.png" }, "browser_action": { "default_icon": { "19": "images/icon19.png", "38": "images/icon38.png" }, "default_title": "天气预报", "default_popup": "popup.html" }, "options_page": "options.html", "permissions": [ "http://api.openweathermap.org/data/2.5/forecast?q=*" ] } options.html <html> <head> […]

(五)常驻后台

background可以包含三种属性,分别是 scripts 、page 和 persistent 如果指定了 scripts 属性,则Chrome会在扩展启动时自动创建一个包含所有指定脚本的页面 如果指定了 page 属性,则Chrome会将指定的HTML文件作为后台页面运行 通常我们只需要使用 scripts 属性即可,除非在后台页面中需要构建特殊的HTML——但一般情况下后台页面的HTML我们是看不到的 persistent属性定义了常驻后台的方式(默认为true)——当其值为true时,表示扩展将一直在后台运行,无论其是否正在工作;当其值为false时,表示扩展在后台按需运行,这就是Chrome后来提出的 Event Page。 Event Page 可以有效减小扩展对内存的消耗,如非必要,请将persistent设置为false。 小项目 检测博客是否在线 manifest { "manifest_version": 2, "name": "Blog在线状态", "version": "1.0", "description": "监视Blog是否在线", "icons": { "16": "images/icon16.png", "48": "images/icon48.png", "128": "images/icon128.png" }, "browser_action": { "default_icon": { "19": "images/icon19.png", "38": "images/icon38.png" } }, "background": { "scripts": [ […]

(四)跨域请求

tips:允许跨域示例 { ... "permissions": [ "*://*.wikipedia.org/*" ] } 每次发起请求,只要调用httpRequest函数,并传入要请求的URL和接收返回结果的函数就可以了。 为什么要使用callback函数接收请求结果,而不直接用return将结果作为函数值返回呢? 因为XMLHttpRequest不会阻塞下面代码的运行。(异步) function httpRequest(url, callback){ var xhr = new XMLHttpRequest(); xhr.open("GET", url, true); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { callback(xhr.responseText); } } xhr.send(); } 小项目 用户IP展示 manifest { "manifest_version": 2, "name": "查看我的IP", "version": "1.0", "description": "查看我的电脑当前的公网IP", "icons": { "16": "images/icon16.png", "48": "images/icon48.png", "128": […]

(三)操作用户当前浏览页面

tips: DomTree Manifest的content_scripts属性值为数组类型,数组的每个元素可以包含matches、exclude_matches、css、js、run_at、all_frames、include_globs和exclude_globs等属性。 其中matches属性定义了哪些页面会被注入脚本 exclude_matches则定义了哪些页面不会被注入脚本 css和js对应要注入的样式表和JavaScript run_at定义了何时进行注入 all_frames定义脚本是否会注入到嵌入式框架中 include_globs和exclude_globs则是全局URL匹配 最终脚本是否会被注入由matches、exclude_matches、include_globs和exclude_globs的值共同决定 简单的说,如果URL匹配mathces值的同时也匹配include_globs的值,会被注入;如果URL匹配exclude_matches的值或者匹配exclude_globs的值,则不会被注入。 content_scripts中的脚本只是共享页面的DOM,而并不共享页面内嵌JavaScript的命名空间。如果当前页面中的JavaScript有一个全局变量a,content_scripts中注入的脚本也可以有一个全局变量a,两者不会相互干扰。当然你也无法通过content_scripts访问到页面本身内嵌JavaScript的变量和函数。 小项目 manifest { "manifest_version": 2, "name": "永远点不到的搜索按钮", "version": "1.0", "description": "让你永远也点击不到Baidu的搜索按钮", "content_scripts": [ { "matches": ["*://www.baidu.com/"], "js": ["js/cannot_touch.js"] } ] } 在content_scripts属性中我们定义了一个匹配规则,当URL符合://www.baidu.com/规则的时候,就将js/cannot_touch.js注入到页面中。其中代表任意字符,这样当用户访问http://www.baidu.com/和https://www.baidu.com/时就会触发脚本。 右键单击搜索按钮,选择“审查元素”,我们发现Baidu搜索按钮的id为’su’。 cannot_touch.js function btn_move(el, mouseLeft, mouseTop){ var leftRnd = (Math.random()-0.5)*20; var topRnd = (Math.random()-0.5)*20; //Rnd 值为100或-100 var btnLeft = mouseLeft+(leftRnd>0?100:-100)+leftRnd; var […]

(二)Manifest文件结构

json 有两种结构 一种是键值对,即key:value 一种是纯值的 举个栗子: { "name" : "Harry Potter", "author" : { "name" : "J.K.Rowling", "birth" : 1964 }, "books" : [ "Philosopher's Stone", "Chamber of Secrets", "Prisoner of Azkaban", "Goblet of Fire", "Order of the Phoenix", "Half-Blood Prince", "Deathly Hallows" ] } manifest 必备内容 Chrome扩展的Manifest 必须 包含name、version 和 manifest_version属性,目前来说manifest_version属性值只能为数字2,对于应用来说,还必须包含app属性。 可套用模板 { "app": { […]

正在获取,请稍候...
00:00/00:00