最近碰到一个需求,需要在某个平台上批量的添加好友,如果是人工点击,可以操作,但是效率并不高,人工成本较高.就打算使用浏览器插件的方式来完成这件重复性的工作.
介绍:
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":2, "description":"**平台帮手,批量添加好友,统计好友数据", "icons": {"128": "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示例:
可以在使用的时候,进行代码压缩处理
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() {&#39;use strict&#39;;var api &#61; &#39;&#39;;var keywords &#61; [&#39;ceo&#39;,&#39;投资经理&#39;]; //关键词库//时间段限制var myD &#61; new Date();var hour &#61; myD.getHours();if(hour>0 && hour <7){sleep(60*30*1000); //休息30分钟location.href &#61; &#39;https://www.linkedin.com/mynetwork/&#39;;}var path &#61; window.location.pathname;// 领英好友添加(1.关键词 2.推荐 3.好友圈)if(path &#61;&#61; &#39;/mynetwork/&#39;){ //推荐var timer &#61; setInterval(function(){document.documentElement.scrollTop &#61; document.documentElement.scrollTop&#43;100;addFriends();},4000);} else if(path &#61;&#61; &#39;/search/results/people/&#39;){ //关键词//添加关键词好友var timer2 &#61; setInterval(function(){document.documentElement.scrollTop &#61; document.documentElement.scrollTop&#43;50;addKeywordFriends();},10000);} else if(path &#61;&#61; &#39;/mynetwork/invite-connect/connections/&#39;){ //好友列表var friend &#61; $(&#39;.mn-connections__header&#39;).find(&#39;h1&#39;).text();console.log(&#39;统计:&#39;&#43;friend);GM_xmlhttpRequest({method: "POST",url: api&#43;"/other/addInFriendStat?friend&#61;"&#43;friend,dataType: "json",headers: {"Content-Type": "application/json"},onload: function(ret){result &#61; $.parseJSON(ret.responseText);console.log(result);}});sleep(1000*10);//跳转到首页location.href &#61; &#39;https://www.linkedin.com/mynetwork/&#39;;}//添加好友
function addFriends(){$(&#39;.discover-entity-card&#39;).each(function(index){console.log(index);if(index &#61;&#61; 2){var name &#61; $(this).find(&#39;.discover-person-card__name&#39;).text();console.log(&#39;添加好友&#39;&#43;name);//发送好友请求var occupation &#61; $(this).find(&#39;.discover-person-card__occupation&#39;).text();var link &#61; $(this).find(&#39;.discover-person-card__image-link&#39;).attr(&#39;href&#39;);var source &#61; 2;var that &#61; $(this);GM_xmlhttpRequest({method: "POST",url: api&#43;"/other/inFriendApply?name&#61;"&#43;name&#43;&#39;&occupation&#61;&#39;&#43;occupation&#43;&#39;&link&#61;&#39;&#43;link&#43;&#39;&source&#61;&#39;&#43;source,dataType: "json",headers: {"Content-Type": "application/json"},onload: function(ret){var result &#61; $.parseJSON(ret.responseText);//添加成功,计算已经添加的数量console.log(&#39;好友添加结果:&#39;&#43;result.msg);console.log(&#39;是否达到上限:&#39;&#43;result.data.limit);if(result.data.limit){ //达到上限,跳转搜索页面var keyword &#61; getKeyword();console.log(&#39;随机关键词:&#39;&#43;keyword);location.href &#61; &#39;https://www.linkedin.com/search/results/people/?keywords&#61;&#39;&#43;keyword&#43;&#39;&origin&#61;CLUSTER_EXPANSION&#39;;}else{console.log(&#39;添加好友操作&#39;);that.find(&#39;.mt2&#39;).find(&#39;button&#39;).trigger(&#39;click&#39;);}}});sleep(300);}});}function addKeywordFriends(){var page &#61; getUrlParam(&#39;page&#39;);var keyword &#61; getUrlParam(&#39;keywords&#39;);//获取关键词数据$(&#39;.search-results__list&#39;).find(&#39;li&#39;).each(function(index){var name &#61; $(this).find(&#39;.actor-name&#39;).text();var link &#61; $(this).find(&#39;.search-result__result-link&#39;).attr(&#39;href&#39;);var occupation &#61; $(this).find(&#39;.search-result__info&#39;).find(&#39;p&#39;).eq(0).find(&#39;span&#39;).text();var rank &#61; $(this).find(&#39;.dist-value&#39;).text();console.log(&#39;名称:&#39;&#43;name&#43;&#39; 链接:&#39;&#43;link&#43;&#39; 职业:&#39;&#43;occupation&#43;&#39;级别:&#39;&#43;rank);var source &#61; 1; //关键词搜索var that &#61; $(this);var operation &#61; $.trim($(this).find(&#39;button&#39;).text());console.log(&#39;操作:&#39;&#43;operation);if(name && operation &#61;&#61; &#39;加为好友&#39;){console.log(&#39;需要添加的好友:&#39;&#43;name);GM_xmlhttpRequest({method: "POST",url: api&#43;"/other/inFriendApply?name&#61;"&#43;name&#43;&#39;&occupation&#61;&#39;&#43;occupation&#43;&#39;&link&#61;&#39;&#43;link&#43;&#39;&source&#61;&#39;&#43;source&#43;&#39;&keyword&#61;&#39;&#43;keyword,dataType: "json",headers: {"Content-Type": "application/json"},onload: function(ret){var result &#61; $.parseJSON(ret.responseText);console.log(&#39;添加申请:&#39;&#43;result.msg&#43;&#39; 上限:&#39;&#43;result.data.limit);//添加成功,计算已经添加的数量if(result.data.limit){location.href &#61; &#39;https://www.linkedin.com/mynetwork/invite-connect/connections/&#39;;}else{//触发添加好友操作that.find(&#39;.search-result__actions&#39;).find(&#39;button&#39;).trigger(&#39;click&#39;);sleep(2000);$(&#39;.send-invite__actions&#39;).find(&#39;button&#39;).eq(1).trigger(&#39;click&#39;);//location.href &#61; location.href;location.href &#61; &#39;https://www.linkedin.com/mynetwork/&#39;;}}});}//sleep(5000);
});sleep(2000);//分页跳转var pageNum &#61; typeof(page) &#61;&#61; &#39;undefined&#39; ? 1 : page;console.log(pageNum);location.href &#61; &#39;https://www.linkedin.com/search/results/people/?keywords&#61;&#39;&#43;keyword&#43;&#39;&origin&#61;CLUSTER_EXPANSION&page&#61;&#39;&#43;(parseInt(pageNum)&#43;1);}//休眠时间
function sleep(numberMillis){var now &#61; new Date();var exitTime &#61; now.getTime() &#43; numberMillis;while (true) {now &#61; new Date();if (now.getTime() > exitTime)return;}}//获取分页参数
function getUrlParam(name){var url &#61; document.location.toString();var urlArr &#61; url.split(&#39;?&#39;);if(urlArr.length > 1){var arr;var params &#61; urlArr[1].split(&#39;&&#39;);for(var i&#61;0; i<params.length; i&#43;&#43;){arr &#61; params[i].split(&#39;&#61;&#39;);if(arr !&#61; null && arr[0] &#61;&#61; name){return arr[1];}}}else{return 1;}}//获取关键词
function getKeyword(){var index &#61; Math.floor((Math.random()*keywords.length));console.log(&#39;索引值:&#39;&#43;index);return keywords[index];}console.log(&#39;当前访问路径:&#39;&#43;path);})();