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_ ...
随机推荐
- Java中的Unicode与码点
Java中,可以用\uXXXX表示Unicode字符,例如String s = "\u00X1";XXXX必须为4位,因此码点为U+1D546的字符,需要用两个编码单元表示,例如S ...
- C++入门经典-例3.15-使用do-while循环计算1到10的累加
1:代码如下: // 3.15.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ...
- java 多线程相关概念总结
前言 本篇文章介绍一些多线程的相关的深入概念.理解后对于线程的安全性会有更深的理解. 先说一个格言,摘自Java核心技术:如果向一个变量写入值,而这个变量接下来可能会被另一个线程读取:或者一个变量读值 ...
- 代码实现:输入3个数a,b,c,按大小顺序输出。
import java.util.Arrays; import java.util.Scanner; //输入3个数a,b,c,按大小顺序输出. public class Test34 { publi ...
- Checkbox 多选框
Checkbox 多选框 一组备选项中进行多选 ¶基础用法 单独使用可以表示两种状态之间的切换,写在标签中的内容为 checkbox 按钮后的介绍. 在el-checkbox元素中定义v-model绑 ...
- Ruby小白入门笔记之<Rubymine工具的快捷键>
智能快捷 Ctrl+Alt+G:弹出Generate Ctrl+Alt+L:格式化代码 Alt+F1:切换视图(Project, Structure, etc.). Alt+F2:弹出预览窗口,可选择 ...
- Several ports (8005, 8080, 8009) required by Tomcat v8.5 Server at localhost are already in use.
Several ports (8005, 8080, 8009) required by Tomcat v8.5 Server at localhost are already in use. The ...
- java:LeakFilling (Mybatis)
1.实体类属性与数据库中字段名字不一样时,或者起别名时: TbOrderMapper.xml配置文件中,配置resultMap标签: 其它相同的标签也需要配,否则查询不出来对应数据. 2.一对一关联: ...
- 【HANA系列】SAP HANA SLT在表中隐藏字段并传入HANA的方法
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SLT在表中隐 ...
- python学习之模块-模块(一)
第五章 5.1 自定义模块 模块概念: 把一些常用的函数放在一个py文件中,这个文件就称之为模块. 模块的意义: 1.方便管理.让程序的解构更加清晰,实现功能的重复使用: 2.提升开发效率 ...