[.Net/C# 团队]2000人开发交流Qq群:348041382

架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 791|回复: 19

遨游挖矿“共生币”(lvt)浏览器插件分析

[复制链接]
发表于 2018-2-9 13:41:58 | 显示全部楼层 |阅读模式
QQ截图20180209110145.jpg

官网地址:https://lives.one/
官网介绍:共生经济体
建立商家和用户之间更深层次的连接!
系统通过对用户的所有互联网行为进行计算来产生代币给予奖励,用户获得LVT后可以在共生生态内消费,也可在用户之间转账交易,区块链的数字货币属性会使得LVT具有极强的流通性。同时,去中心化使得价值交换的效率更高,商家获客成本更低,用户直接获得使用收益。


我们需要下载“遨游浏览器”进行挖矿,最新版的遨游浏览器内置挖矿插件,插件下载地址:http://extension.maxthon.cn/detail/index.php?view_id=3127

我下载挖矿插件到本地,用官方的“MxPacker”文件包处理程序解包了一下,得到了插件的文件目录,如下:

插件/皮肤打包工具

   使用方法:
   打包:打开“MxPacker.exe”文件,将制作好的插件/皮肤目录拖放到“MxPacker.exe”窗口上,或者在选择插件/皮肤文件目录,然后选择输出文件包路径(默认为当前目录),点击“打包”或敲击“回车键”,即可在该路径下生成相应的.mxaddons文件. 皮肤则请重命名成 .mxskin
   解包:打开
“MxPacker.exe”文件, 将要解包的插件/皮肤文件,如b.mxaddon,将制作好的插件/皮肤目录拖放到“MxPacker.exe”窗口上,选择输出目录(默认为当前目录),点击“解包”后敲击“回车键”,即可在该目录下生成同名的问件夹。

  更新日期:2015-05-21     当前版本:1.0.7


QQ截图20180209133136.jpg

插件其实就是一个html文件,源码如下:

  1. <!DOCTYPE HTML PUBLIC "-W3CDTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2. <html>

  3. <head>
  4.         <meta charset="utf-8">
  5.         <title>{app.title}</title>
  6.         <style>
  7.                 #errorInfo {
  8.                         display: none;
  9.                         position: absolute;
  10.                         left: 50%;
  11.                         top: 50%;
  12.                         margin-top: -70px;
  13.                         margin-left: -70px;
  14.                         width: 140px;
  15.                         height: 140px;
  16.                 }

  17.                 img {
  18.                         display: block;
  19.                         margin: 0 auto 16px auto;

  20.                 }

  21.                 #infoText {
  22.                         font-size: 14px;
  23.                         color: #677384;
  24.                         text-align: center;
  25.                         margin: 0 auto 34px auto;
  26.                 }

  27.                 button {
  28.                         display: block;
  29.                         width: 130px;
  30.                         height: 36px;
  31.                         border: 0;
  32.                         border-radius: 18px;
  33.                         color: #ffffff;
  34.                         font-size: 14px;
  35.                         background-color: #ffae1f;
  36.                         margin: auto;
  37.                         outline: none;
  38.                         cursor: pointer;
  39.                 }
  40.         </style>
  41. </head>

  42. <body>
  43.         <div id="errorInfo">
  44.                 <img src="icons/error.png" />
  45.                 <div id="infoText"></div>
  46.                 <button id="clickReload"></button>
  47.         </div>
  48.         <script>
  49.                 window.onload = function () {
  50.                         XHR();

  51.                         document.getElementById("clickReload").addEventListener("click", function () {
  52.                                 window.location.reload();
  53.                         }, false);
  54.                 }
  55.                 function jumpToLives() {
  56.                         //浏览器运行时对象
  57.                         var rt = window.external.mxGetRuntime();
  58.                         var sysLang = rt.locale.getSystemLocale().toLowerCase();
  59.                         var mxver = window.external.mxVersion;
  60.                         var mxpn = window.external.GetPN();
  61.                         var userInfo = rt.user.getProfile();
  62.                         window.location.href = "https://app.lives.one/?p=1&uid=" + userInfo.uid + "&ln=" + sysLang + "&mxver=" + mxver + "&mxpn=" + mxpn;
  63.                 }
  64.                 function XHR() {
  65.                         var xhr = null;
  66.                         if (window.XMLHttpRequest) {
  67.                                 xhr = new XMLHttpRequest();
  68.                         } else if (window.ActiveXObject) {
  69.                                 xhr = new ActiveXObject("Microsoft.XMLHTTP");
  70.                         } else {
  71.                                 xhr = null;
  72.                         }
  73.                         if (xhr) {
  74.                                 xhr.open("GET", "https://app.lives.one/");
  75.                                 xhr.onreadystatechange = function () {
  76.                                         if (xhr.readyState == 4) {
  77.                                                 if (xhr.status == 200) {
  78.                                                         jumpToLives();
  79.                                                 } else {
  80.                                                         var rt = window.external.mxGetRuntime();
  81.                                                         var sysLang = rt.locale.getSystemLocale().toLowerCase();
  82.                                                         if (sysLang === "zh-cn") {
  83.                                                                 document.getElementById("infoText").innerText = "网络错误,请联网";
  84.                                                                 document.getElementById("clickReload").innerText = "重新加载";
  85.                                                         } else {
  86.                                                                 document.getElementById("infoText").innerText = "Network Error, Please Connect To Internet";
  87.                                                                 document.getElementById("clickReload").innerText = "Reload";
  88.                                                         }
  89.                                                         document.getElementById("errorInfo").style.display = "block";
  90.                                                 }
  91.                                         }
  92.                                 };
  93.                                 xhr.send();
  94.                         } else {
  95.                                 jumpToLives();
  96.                         }
  97.                 }
  98.         </script>
  99. </body>

  100. </html>
复制代码


至于插件或者浏览器判断是不是使用的遨游浏览器,并不是通过user-agent来判断的,好像是通过window.external来判断的。

QQ截图20180209133717.jpg

  1. var _console = {
  2.     log: function (msg) {
  3.         console.log(msg);
  4.     }
  5. };

  6. // 客户端检测
  7. var Browser = {
  8.     'is_mac': false,
  9.     'is_win': false,
  10.     'is_and': false,
  11.     'is_ios': false,
  12.     'is_other': true,
  13.     'mining_switch': -1, // 挖矿开关状态(-1 默认, 0 关闭, 1 开启)
  14.     'installed': false, // 是否安装过插件
  15.     'client_uid': null,
  16.     init: function () {
  17.         this.is_mac = typeof (window.external) === 'object' && typeof (window.external.magicFillSaveForm) === 'function';
  18.         this.is_win = !this.is_mac && (typeof (window.external) === 'object' && typeof (window.external.mxVersion) === 'string');
  19.         this.is_and = typeof (mmbrowser) === 'object';
  20.         this.is_ios = !this.is_mac && !this.is_win && (typeof (window.external) === 'object' && typeof (window.external.AuthRequest) === "function");
  21.         this.is_other = !this.is_mac && !this.is_win && !this.is_and && !this.is_ios;
  22.         // 挖矿开关状态 boolen
  23.         //this.mining_switch = this.getMiningSwitch();
  24.         // 插件安装状态 boolen
  25.         this.installed = this.isInstalled();
  26.     },
  27.     isInstalled: function () {
  28.         //只有移动端有此判断,如果不存在跳转到安装页面
  29.         if (this.is_win || this.is_mac) {
  30.             return true;
  31.         }
  32.         // android
  33.         if (this.is_and && typeof (mmbrowser.getLvtInstallStatus) === 'function') {
  34.             return mmbrowser.getLvtInstallStatus();
  35.         }
  36.         return false;
  37.     },
  38.     isInstalled_ios: function (callback) {
  39.         // ios
  40.         if (this.is_ios && typeof (window.external) === 'object' && typeof (window.external.GetLivesOnePluginInstallationStatus) === 'function') {
  41.             // 判断是否初始化完成
  42.             // 如果没初始化完成,调用初始化完成查询接口,并传入callback SetInitCallback(callback)
  43.             // 获取数据
  44.             if (window.external.isInitialized === false) {
  45.                 window.external.SetInitCallback(function () {
  46.                     rs = window.external.GetLivesOnePluginInstallationStatus();
  47.                     callback && callback(rs);
  48.                 });
  49.             } else {
  50.                 rs = window.external.GetLivesOnePluginInstallationStatus();
  51.                 callback && callback(rs);
  52.             }

  53.         }
  54.         return false;
  55.     },
  56.     signIn: function (callback) {
  57.         //win
  58.         if (typeof (maxthon) === 'object' && typeof (maxthon.webSend) === 'function') {
  59.             var param = {};
  60.             maxthon.webSend('account.logout', param, function (e) {
  61.                 console.log(e);
  62.             });
  63.             return true;
  64.         }
  65.         // ios
  66.         if (this.is_ios && typeof (window.external) === 'object' && typeof (window.external.LaunchLoginUI) === 'function') {
  67.             window.external.LaunchLoginUI(function (e) {
  68.                 callback && callback();
  69.             });
  70.             return true;
  71.         }
  72.         // android
  73.         if (this.is_and && typeof (mmbrowser.gotoLogin) === 'function') {
  74.             setTimeout(function () {
  75.                 mmbrowser.gotoLogin();
  76.             }, 1000);
  77.             return true;
  78.         }
  79.         return false;
  80.     },
  81.     miningSwitch: function () {
  82.         this.mining_switch = this.mining_switch !== 1 ? 1 : 0;
  83.         //win
  84.         if (typeof (maxthon) === 'object' && typeof (maxthon.webSend) === 'function') {
  85.             maxthon.webSend('common.setLVTStatus', {"status": this.mining_switch}, function (e) {
  86.                 console.log(e);
  87.             });
  88.         } else if (this.is_ios && typeof (window.external) === 'object' && typeof (window.external.SetLivesOnePluginStatus) === 'function') {
  89.             window.external.SetLivesOnePluginStatus(this.mining_switch);
  90.         } else if (this.is_and && typeof (mmbrowser.setLvtSwitchStatus) === 'function') {
  91.             mmbrowser.setLvtSwitchStatus(this.mining_switch);
  92.         } else {
  93.             return false;
  94.         }
  95.         return true;
  96.     },

  97.     getMiningSwitch: function (callback) {
  98.         //win
  99.         if (typeof (maxthon) === 'object' && typeof (maxthon.webSend) === 'function') {
  100.             maxthon.webSend('common.getLVTStatus', {}, function (rs) {
  101.                 Browser.mining_switch = rs.result;
  102.                 callback && callback(rs.result);
  103.                 return this.mining_switch;
  104.             });
  105.         } else if (this.is_ios && typeof (window.external) === 'object' && typeof (window.external.GetLivesOnePluginStatus) === 'function') {

  106.             // 判断是否初始化完成
  107.             // 如果没初始化完成,调用初始化完成查询接口,并传入callback SetInitCallback(callback)
  108.             // 获取数据
  109.             if (window.external.isInitialized === false) {
  110.                 window.external.SetInitCallback(function () {
  111.                     Browser.mining_switch = window.external.GetLivesOnePluginStatus();
  112.                     callback && callback(Browser.mining_switch);
  113.                 });
  114.             } else {
  115.                 Browser.mining_switch = window.external.GetLivesOnePluginStatus();
  116.                 callback && callback(Browser.mining_switch);
  117.             }
  118.         } else if (this.is_and && typeof (mmbrowser.getLvtSwitchStatus) === 'function') {
  119.             Browser.mining_switch = mmbrowser.getLvtSwitchStatus();
  120.             callback && callback(Browser.mining_switch);
  121.         } else {
  122.             if (callback) {
  123.                 // 其它情况直接返回,避免页面一直loading
  124.                 _alert("This client do not support mined.");
  125.                 callback(Browser.mining_switch);
  126.             }
  127.         }
  128.         return this.mining_switch;
  129.     },
  130.     /**
  131.      * 一键设置
  132.      */
  133.     setLVTStateCapture: function (callback) {
  134.         //win
  135.         if (typeof (maxthon) === 'object' && typeof (maxthon.webSend) === 'function') {
  136.             var items = {};
  137.             items.isSetDefaultBrowser = true;
  138.             items.isSetHomePage = true;
  139.             items.isSetSearch = true;
  140.             console.log('start setLVTStateCapture');
  141.             maxthon.webSend('common.setLVTStateCapture', items, function (rs) {
  142.                 if (typeof (rs) === 'object' && rs.hasOwnProperty('status')) {
  143.                     console.log(rs);
  144.                     return callback && callback(rs.status);
  145.                 }
  146.             });
  147.         } else {
  148.             return false;
  149.         }
  150.         return callback && callback(true);
  151.     },
  152.     /**
  153.      * 监听一键设置后的变化结果
  154.      * 等待客户端通知,再去获取新数据接口
  155.      */
  156.     registerLVTStateCapture: function (callback) {
  157.         //win
  158.         if (typeof (maxthon) === 'object' && typeof (maxthon.webSend) === 'function') {
  159.             maxthon.webSend('common.registerLVTStateCapture', {}, function (rs) {
  160.                 if (typeof (rs) === 'object' && rs.hasOwnProperty('result')) {
  161.                     console.log('registerLVTStateCapture');
  162.                     console.log(rs);
  163.                     // 异步时候,必须这里返回,否则外围cv值恢复了
  164.                     return callback && callback(rs.result);
  165.                 }
  166.             });
  167.         } else {
  168.             return false;
  169.         }
  170.         return true;
  171.     },
  172.     /**
  173.      * 获取算力值
  174.      */
  175.     getComputingValue: function (items) {
  176.         var cv = 100;
  177.         cv += (0 + items.isSetDefaultBrowser) * 20;
  178.         cv += (0 + items.isSetHomePage) * 20;
  179.         cv += (0 + items.isSetSearch) * 20;
  180.         return cv;

  181.     },
  182.     getLVTStateCapture: function (callback) {
  183.         //win
  184.         if (typeof (maxthon) === 'object' && typeof (maxthon.webSend) === 'function') {
  185.             maxthon.webSend('common.getLVTStateCapture', {}, function (rs) {
  186.                 if (typeof (rs) === 'object' && rs.hasOwnProperty('result')) {
  187.                     console.log(rs);
  188.                     // 异步时候,必须这里返回,否则外围cv值恢复了
  189.                     return callback && callback(rs.result);
  190.                 }
  191.             });
  192.         } else {
  193.             return false;
  194.         }
  195.         return true;
  196.     },
  197.     /*
  198.      * 获得当前登录用户的uid,如果是游客账号,返回0
  199.      */
  200.     GetUid: function (callback) {
  201.         if (this.is_ios && typeof (window.external) === 'object' && typeof (window.external.GetLivesOnePluginStatus) === 'function') {

  202.             // 判断是否初始化完成
  203.             // 如果没初始化完成,调用初始化完成查询接口,并传入callback SetInitCallback(callback)
  204.             // 获取数据
  205.             if (window.external.isInitialized === false) {
  206.                 window.external.SetInitCallback(function () {
  207.                     Browser.client_uid = window.external.GetUid();
  208.                     callback && callback(Browser.client_uid);
  209.                 });
  210.             } else {
  211.                 Browser.client_uid = window.external.GetUid();
  212.                 callback && callback(Browser.client_uid);
  213.             }
  214.         }
  215.     }
  216. };
  217. Browser.init();

  218. /**
  219. * 弹出提示
  220. * @param {type} a
  221. * @param {type} b
  222. * @param {type} c
  223. * @returns {Boolean}
  224. */
  225. function _alert(a, b, c) {
  226.     var d = dialog({
  227.         zIndex: 9999,
  228.         fixed: true,
  229.         quickClose: true,
  230.         content: a
  231.     });
  232.     d.show();
  233.     if (b) {
  234.         setTimeout(function () {
  235.             if (c) {
  236.                 c();
  237.             }
  238.             d.close().remove()
  239.         }, b);
  240.     }
  241.     return false;
  242. }

  243. (function ($) {
  244.     $.fn.enterSubmit = function (b) {
  245.         var b = b ? b : '';
  246.         var c = $(this);
  247.         $('body').bind('keypress', function (a) {
  248.             if (a.keyCode === 13) {
  249.                 b && b();
  250.                 c.trigger('click');
  251.             }
  252.         })
  253.     }

  254.     $.fn.validateForm = function (d) {
  255.         var option = {
  256.             submitBtn: '.js_submit',
  257.             before: '',
  258.             success: '',
  259.             error: '',
  260.             callback: ''
  261.         };
  262.         var setting = $.extend(option, d);
  263.         $(this).Validform({
  264.             tiptype: function (msg, o, cssctl) {
  265.                 //msg:提示信息;
  266.                 //o:{obj:*,type:*,curform:*}, obj指向的是当前验证的表单元素(或表单对象),type指示提示的状态,值为1、2、3、4, 1:正在检测/提交数据,2:通过验证,3:验证失败,4:提示ignore状态, curform为当前form对象;
  267.                 //cssctl:内置的提示信息样式控制函数,该函数需传入两个参数:显示提示信息的对象 和 当前提示的状态(既形参o中的type);
  268.                 if (!o.obj.is("form")) {//验证表单元素时o.obj为该表单元素,全部验证通过提交表单时o.obj为该表单对象;

  269.                     // 在placeholder位置显示错误信息
  270.                     o.obj.attr('placeholder', msg);

  271.                     var objtip = o.obj.siblings(".Validform_checktip");
  272.                     cssctl(objtip, o.type);
  273.                     objtip.text(msg);
  274.                 } else {
  275.                     var objtip = o.obj.find("#msgdemo");
  276.                     cssctl(objtip, o.type);
  277.                     objtip.text(msg);
  278.                 }
  279.             },
  280.             label: "label",
  281.             ajaxPost: true,
  282.             btnSubmit: setting.submitBtn,
  283.             beforeSubmit: function (curform) {
  284.                 //在验证成功后,表单提交前执行的函数,curform参数是当前表单对象。
  285.                 //这里明确return false的话表单将不会提交;        
  286.                 if (setting.before && setting.before() === false) {
  287.                     return false
  288.                 }
  289.                 if ($(setting.submitBtn).data('loading')) {
  290.                     $(setting.submitBtn).attr("disabled", "disabled").text($(setting.submitBtn).data('loading'));
  291.                 }
  292.             },
  293.             callback: function (data) {
  294.                 setting.callback && setting.callback(data);
  295.                 //ajax遇到服务端错误时也会执行回调,这时的data是{ status:**, statusText:**, readyState:**, responseText:** };

  296.                 //这里执行回调操作;
  297.                 //注意:如果不是ajax方式提交表单,传入callback,这时data参数是当前表单对象,回调函数会在表单验证全部通过后执行,然后判断是否提交表单,如果callback里明确return false,则表单不会提交,如果return true或没有return,则会提交表单。
  298.                 if (data.code === 200) {
  299.                     if ($(setting.submitBtn).data('success')) {
  300.                         $(setting.submitBtn).attr("disabled", "disabled").text($(setting.submitBtn).data('success'));
  301.                     }
  302.                     if (setting.success) {
  303.                         setting.success(data);
  304.                     } else {
  305.                         window.location.reload()
  306.                     }
  307.                 } else {
  308.                     if (setting.error) {
  309.                         setting.error(data);
  310.                     } else {
  311.                         _alert(data.msg, 3000);
  312.                     }
  313.                     if ($(setting.submitBtn).data('resubmit')) {
  314.                         $(setting.submitBtn).text($(setting.submitBtn).data('resubmit')).removeAttr("disabled")
  315.                     }
  316.                 }
  317.                 return false;
  318.             }
  319.         })
  320.     }
  321.     // windows版本禁止鼠标缩放页面
  322.     if (Browser.is_win) {
  323.         var scrollFunc = function (e) {
  324.             e = e || window.event;
  325.             if (e.wheelDelta && event.ctrlKey) {//IE/Opera/Chrome
  326.                 event.returnValue = false;
  327.             } else if (e.detail) {//Firefox
  328.                 event.returnValue = false;
  329.             }
  330.         }

  331.         /*注册事件*/
  332.         if (document.addEventListener) {
  333.             document.addEventListener('DOMMouseScroll', scrollFunc, false);
  334.         }//W3C
  335.         window.onmousewheel = document.onmousewheel = scrollFunc;//IE/Opera/Chrome/Safari
  336.     }
  337. })(jQuery);


复制代码

最后附上MxPacker和挖矿插件:

游客,如果您要查看本帖隐藏内容请回复

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-3-25 22:11:19 | 显示全部楼层
有没有脚本之类的  不然挂着也不涨啊
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-3-23 14:37:01 | 显示全部楼层
有没有脚本之类的  不然挂着也不涨啊
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-2-12 20:05:05 | 显示全部楼层
有没有脚本之类的  不然挂着也不涨啊
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-2-9 15:16:56 | 显示全部楼层
的顶顶顶顶顶顶顶顶顶顶
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-2-11 21:49:08 | 显示全部楼层
有没有脚本之类的  不然挂着也不涨啊
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-2-14 13:51:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-2-15 21:50:40 来自手机 | 显示全部楼层
真厉害
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
回复

使用道具 举报

发表于 2018-2-16 17:23:17 | 显示全部楼层
顶顶顶顶顶顶顶顶顶顶顶顶顶顶
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-2-24 15:52:24 | 显示全部楼层
不错哦,楼主
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-2-24 21:43:14 | 显示全部楼层
我来看看
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
回复

使用道具 举报

发表于 2018-2-24 21:47:10 | 显示全部楼层
这个插件怎么应用到其他浏览器
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )

GMT+8, 2018-4-20 06:14

Powered by Discuz! X3.4

© 2001-2014 Comsenz Inc.

快速回复 返回顶部 返回列表