Chrome之谷歌插件开发
最近碰到一个需求,需要在某个平台上批量的添加好友,如果是人工点击,可以操作,但是效率并不高,人工成本较高.就打算使用浏览器插件的方式来完成这件重复性的工作.
介绍:
Chrome插件的本质就是一个由 manifest.json 文件和插件所需要的图片,css,html,js资源组成的一个web页面,只是和传统的web页面不同的,它是以chrome浏览器为宿主运行的一个web程序。总的来说就是一个使用前端的技术就可以完成的内容
使用:
1. 首先,我们需要manifest.json文件来声明我要写的插件的相关信息。可以把manifest.json理解成插件的入口,即chrome需要通过manifest.json来理解你的插件要 引用哪些文件、需要哪些权限、插件图标等信息。
{
"name":"LY-helper",
"version":"2.0",
"manifest_version":,
"description":"**平台帮手,批量添加好友,统计好友数据",
"icons": {
"": "icon128.png"
},
"browser_action":{
"default_icon":"icon128.png",
"default_title":"ly-helper",
"default_popup":"popup.html"
},
"permissions":[
"https://www.linkedin.com/"
],
"content_scripts":[
{
"matches":["https://www.linkedin.com/mynetwork/"],
"js":["js/jquery-1.8.0.min.js","js/ly.js"]
}
]
}
- name 属性定义了插件的名称
- version 定义了插件的开发版本号
- description 定义了插件的详细描述信息
- app 对象定义了要打开的URL地址
- iocns 对象定义了几种不同尺寸的图标的地址
- requirements 对象定义了需要用到资源权限
目录结构大致如下:
设置logo和对应的点击页面: icon.png popup.html
popup.html示例:
<!doctype html>
<html>
<head>
<title>Getting Started Extension's Popup</title>
<style>
body{min-width:357px;overflow-x:hidden}img{margin:5px;border:2px solid #;vertical-align:middle;width:75px;height:75px}
</style>
<script src="js/jquery-1.8.0.min.js"></script>
<script src="js/ly.js"></script>
</head>
<body>
</body>
</html>
可以在使用的时候,进行代码压缩处理
js目录中存放相关的js代码
2.插件使用
打开浏览器输入地址: chrome://chrome/extensions
开启开发者模式:
点击:"加载已解压的扩展程序" 将开发的文件目录加载进来
打开相应的网站即可实现效果
另外可以不自己进行插件开发,直接使用油猴进行脚本的开发工作:
1. 下载油猴浏览器插件
2. 安装
3. 新建一个脚本即可急速开发
// ==UserScript==
// @name in-friends-add
// @namespace http://dajiala.com
// @version 0.1
// @description 领英平台自动添加好友
// @author X-Wolf
// @match https://www.linkedin.com/*
// @grant GM_xmlhttpRequest
// ==/UserScript== (function() {
'use strict';
var api = '';
var keywords = ['ceo','投资经理']; //关键词库
//时间段限制
var myD = new Date();
var hour = myD.getHours();
if(hour> && hour < ){
sleep(**); //休息30分钟
location.href = 'https://www.linkedin.com/mynetwork/';
} var path = window.location.pathname;
// 领英好友添加(1.关键词 2.推荐 3.好友圈)
if(path == '/mynetwork/'){ //推荐
var timer = setInterval(function(){
document.documentElement.scrollTop = document.documentElement.scrollTop+;
addFriends();
},); } else if(path == '/search/results/people/'){ //关键词
//添加关键词好友
var timer2 = setInterval(function(){
document.documentElement.scrollTop = document.documentElement.scrollTop+;
addKeywordFriends();
},);
} else if(path == '/mynetwork/invite-connect/connections/'){ //好友列表 var friend = $('.mn-connections__header').find('h1').text();
console.log('统计:'+friend);
GM_xmlhttpRequest({
method: "POST",
url: api+"/other/addInFriendStat?friend="+friend,
dataType: "json",
headers: {
"Content-Type": "application/json"
},
onload: function(ret){
result = $.parseJSON(ret.responseText);
console.log(result);
}
});
sleep(*);
//跳转到首页
location.href = 'https://www.linkedin.com/mynetwork/';
} //添加好友
function addFriends(){
$('.discover-entity-card').each(function(index){
console.log(index);
if(index == ){
var name = $(this).find('.discover-person-card__name').text();
console.log('添加好友'+name); //发送好友请求
var occupation = $(this).find('.discover-person-card__occupation').text();
var link = $(this).find('.discover-person-card__image-link').attr('href');
var source = ;
var that = $(this);
GM_xmlhttpRequest({
method: "POST",
url: api+"/other/inFriendApply?name="+name+'&occupation='+occupation+'&link='+link+'&source='+source,
dataType: "json",
headers: {
"Content-Type": "application/json"
},
onload: function(ret){
var result = $.parseJSON(ret.responseText);
//添加成功,计算已经添加的数量
console.log('好友添加结果:'+result.msg);
console.log('是否达到上限:'+result.data.limit);
if(result.data.limit){ //达到上限,跳转搜索页面
var keyword = getKeyword();
console.log('随机关键词:'+keyword);
location.href = 'https://www.linkedin.com/search/results/people/?keywords='+keyword+'&origin=CLUSTER_EXPANSION';
}else{
console.log('添加好友操作');
that.find('.mt2').find('button').trigger('click');
}
}
});
sleep();
} });
} function addKeywordFriends(){
var page = getUrlParam('page');
var keyword = getUrlParam('keywords');
//获取关键词数据
$('.search-results__list').find('li').each(function(index){
var name = $(this).find('.actor-name').text();
var link = $(this).find('.search-result__result-link').attr('href');
var occupation = $(this).find('.search-result__info').find('p').eq().find('span').text();
var rank = $(this).find('.dist-value').text();
console.log('名称:'+name+' 链接:'+link+' 职业:'+occupation+'级别:'+rank);
var source = ; //关键词搜索
var that = $(this);
var operation = $.trim($(this).find('button').text());
console.log('操作:'+operation);
if(name && operation == '加为好友'){
console.log('需要添加的好友:'+name);
GM_xmlhttpRequest({
method: "POST",
url: api+"/other/inFriendApply?name="+name+'&occupation='+occupation+'&link='+link+'&source='+source+'&keyword='+keyword,
dataType: "json",
headers: {
"Content-Type": "application/json"
},
onload: function(ret){
var result = $.parseJSON(ret.responseText);
console.log('添加申请:'+result.msg+' 上限:'+result.data.limit);
//添加成功,计算已经添加的数量
if(result.data.limit){
location.href = 'https://www.linkedin.com/mynetwork/invite-connect/connections/';
}else{
//触发添加好友操作
that.find('.search-result__actions').find('button').trigger('click');
sleep();
$('.send-invite__actions').find('button').eq().trigger('click');
//location.href = location.href;
location.href = 'https://www.linkedin.com/mynetwork/';
} }
});
}
//sleep(5000);
}); sleep();
//分页跳转
var pageNum = typeof(page) == 'undefined' ? : page;
console.log(pageNum);
location.href = 'https://www.linkedin.com/search/results/people/?keywords='+keyword+'&origin=CLUSTER_EXPANSION&page='+(parseInt(pageNum)+);
} //休眠时间
function sleep(numberMillis){
var now = new Date();
var exitTime = now.getTime() + numberMillis;
while (true) {
now = new Date();
if (now.getTime() > exitTime)
return;
}
}
//获取分页参数
function getUrlParam(name)
{
var url = document.location.toString();
var urlArr = url.split('?');
if(urlArr.length > ){
var arr;
var params = urlArr[].split('&'); for(var i=; i< params.length; i++){
arr = params[i].split('=');
if(arr != null && arr[] == name){
return arr[];
}
}
}else{
return ;
}
}
//获取关键词
function getKeyword(){
var index = Math.floor((Math.random()*keywords.length));
console.log('索引值:'+index);
return keywords[index];
} console.log('当前访问路径:'+path); })();
Chrome之谷歌插件开发的更多相关文章
- 解决chrome安装谷歌访问助手错误问题
解决chrome安装谷歌访问助手错误问题 针对新版本安装谷歌访问助手插件报错问题 1.下载谷歌访问助手 http://www.ggfwzs.com/ 2.chrome浏览器打开发者模式 3.将下载的c ...
- 【转】Chrome——F12 谷歌开发者工具详解
Chrome——F12 谷歌开发者工具详解 console source network
- Chrome——F12 谷歌开发者工具详解
我们这里介绍主要的几块:Console.Source.Network Console 大家都有用过各种类型的浏览器,每种浏览器都有自己的特色,本人拙见,在我用过的浏览器当中,我是最喜欢Chrome的, ...
- 谷歌插件开发(实现CSDN快速登陆)
谷歌浏览器插件带来了很大的方便,于是就想着是不是也可以开发一个来用用.几经折腾下,开发了个CSDN快速 登陆的插件.下面简述一下开发的步骤. 1.开发工具:谷歌浏览器(我开发时用的是chrome 30 ...
- Chrome F12 谷歌开发者工具解析
一.工具简单介绍 F12可用于网站界面.性能测试,bug定位等 以 www.baidu.com 为例: Elements:查看页面元素属性(多用于自动化元素定位) Console:记录日志信息(用于定 ...
- 谷歌chrome浏览器和火狐firefox浏览器自带http抓包工具和请求模拟插件
谷歌chrome浏览器自带http抓包工具 chrome://net-internals/ 谷歌chrome浏览器http请求模拟插件:postman 火狐http请求模拟插件:httprequest ...
- 使用Chrome浏览器访问谷歌和维基百科
安装chrome插件 谷歌访问助手即可 就这么简单
- 在谷歌安装扩展程序Axure RP Extension for Chrome后,经常无故损坏,无法使用
最近因为要看需求给的原型图,但需求只给了html格式的文件,没有给可以在Axure软件里看的格式, 所以在谷歌安装了一个Axure RP Extension for Chrome扩展程序在谷歌浏览器看 ...
- 【chrome插件】web版微信接入图灵机器人API实现自动回复
小贱鸡自动回复API已经不可以用了,现在改良接入图灵机器人API 360chrome浏览器团队翻译了部分谷歌插件开发文档 地址:http://open.chrome.360.cn/extension_ ...
随机推荐
- sessionStorge和localStorage的使用-踩坑记_09
sessionStorge的使用 sessionStorage 属性允许你访问一个 session Storage 对象.它与 localStorage 相似,不同之处在于 localStorage ...
- 20175215 2018-2019-2 第一周Linux虚拟机环境调试及java程序调试学习总结
一.Linux虚拟机的java环境调试 之前直接在终端中使用export直接配置java的运行环境,导致每次终端被重启的时候都要重新配置java的运行环境,直到看到老师的博客Intellj IDEA ...
- spring的AOP基本原理
一.什么是AOP AOP(Aspect Oriented Programming),意思是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP基于IoC基础,是对OOP ...
- laravel 浏览器图标的设置方式
<head> <meta charset="UTF-8"> <title>叮叮书店</title> <link href=&q ...
- opencv、numpy中矩阵转置,矩阵内的固定位置相应的坐标变换
opencv.numpy中矩阵转置,矩阵内的固定位置相应的坐标变换
- java:Hibernate框架4(延迟加载(lazy),抓取(fetch),一级缓存,get,load,list,iterate,clear,evict,flush,二级缓存,注解,乐观锁和悲观锁,两者的比较)
1.延时加载和抓取: hibernate.cfg.xml: <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-co ...
- 彻底搞懂snowflake算法及百度美团的最佳实践
写在前面的话 一提到分布式ID自动生成方案,大家肯定都非常熟悉,并且立即能说出自家拿手的几种方案,确实,ID作为系统数据的重要标识,重要性不言而喻,而各种方案也是历经多代优化,请允许我用这个视角对分布 ...
- LeetCode.1046-最后的石头重量(Last Stone Weight)
这是小川的第388次更新,第418篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第250题(顺位题号是1046).有一个石头集合,每个石头都有一个正整数重量值. 每次,我 ...
- 基于LVM(逻辑卷管理)的快照原理
一.为甚么不管多大的逻辑卷进行备份,快照都会在几秒之内完成? 快照在拍摄的一瞬间,系统会记录那个时间点逻辑卷的状态.数据等,此时拍下的快照相当于一张白纸.如图所示 快照做好后,随着时间的推移,源卷里的 ...
- 问题记录 | 配置ubuntu18.04+cuda9.0+cudnn服务器tensorflow-gpu深度学习环境
因为实验室服务器资源有限,我被分配的服务器经常变化,但是常常就分到连显卡驱动以及cuda都没有装的服务器,真的很头疼,我已经配了四五台了,特此记录一下,以便以后直接照版本安装. Install nvi ...