首页 > 其他分享 >编写自用油猴脚本踩坑记录

编写自用油猴脚本踩坑记录

时间:2024-02-19 22:23:27浏览次数:29  
标签:脚本 sort 用油 percent list percentNum var 编写 document

前言

春节期间,我叔叔问我这个不太懂前端的Jvav后端有没有什么办法可以帮他修改一下网页上现实的内容,于是就有了这次第一次编写油猴脚本的尝试。

需求

户外作业时,需要使用手机浏览器查看公司的一个页面信息,这个页面一共有16个卡片风格的信息块,一个信息块在手机上要滑动3个屏幕高度(逆天)。每次要从这么大一个信息块中找到有用的3条信息,搜索排序功能也是非常难用。需要将16个信息块中有用的几条信息,汇总起来,便于查看。

思路

我一听,啊这,我只能想到页面加载完成后,找到对应需要的数据的dom元素中找出来数据,单独显示在界面某处,或者用弹窗的方式。至于手机上如何执行脚本嘛,那就用能运行脚本的浏览器,或者支持油猴的浏览器,例如via啥的。

开干

第一个坑

一开始,先从Chrome浏览器的console一行一行输入代码来获取dom,就是重复的var a = document.getElementById(’xxx’),一路下来还挺顺利的。很快,我便实现了在Console中加入一个Button,添加点击时间,并进行所需数据的排序和整理。

很快我变将其加入到油猴脚本中测试。

var newDiv = document.createElement("div");
newDiv.innerHTML='<button id="sort_button" onClick="doSort">排序</button>';
document.getElementById("div_search").appendChild(newDiv);

不行了,Button根本没出来。

原来,罪魁祸首就是这个iframe。

在油猴脚本中@match匹配的域名,和iframe中src的域名不同,那自然是获取不到dom的。

Untitled

网上有说如何获取iframe中dom的方案,我尝试了一些,发现并不太好使,于是乎我的解决方案是,直接将@match写iframe对应的域名,终于看到了按钮了。

第二个坑

点击按钮,doSort not define。

好家伙,我明明定义了function doSort的啊。

尝试改成addEventListener后,有效果。

document.getElementById("sort_button").addEventListener("click", myFunction, false);

第三个坑

我起初偷懒,想直接将信息通过弹窗的方式,展示,每次需要看就弹窗一下。

可是,弹不出来,于是我尝试用console.log,居然也不出来的。

查看stackoverflow是这么说的。我也不知道有没有效果,但是最后也没有用alert,直接写了一个li标签。

console.log override not working in Tampermonkey

部署

一开始,我想到的是VIA浏览器可以执行脚本,但是我并没有去了解他的机制是否有区别,反正就是没有任何效果。

后来发现了一款可以安装插件的基于chromium的手机浏览器叫做Kiwi。(一直不知道为什么Chrome要在安卓端阉割掉这些)。

Untitled

代码

// ==UserScript==
// @name         xxx
// @namespace    http://tampermonkey.net/
// @version      2024-02-17
// @description  xxx
// @author       xxx
// @match        https://xxx.xxx.cn/*
// @icon         xxx
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    var newArray;
    function doSort() {
        newArray = Array();
        var panners = document.getElementsByClassName('信息卡片的class,一共有16个');
        for (var i = 0; i < panners.length; i++) {
           var id = panners[i].id;
           var lastIndex = id.lastIndexOf('-');
           var shotId = id.substring(lastIndex + 1, lastIndex + 4);
           var childDiv = panners[i].firstChild;
           var mainDataDiv = childDiv.lastChild;
           var detailDataDiv = mainDataDiv.lastChild;
           var usefulData = detailDataDiv.firstChild;
           var usefulDatas = usefulData.childNodes;
           var use1DataNodes = usefulDatas[1].firstChild.childNodes;
           var percent = use1DataNodes[3].lastChild.firstChild.innerText;
           var use2DataNodes = usefulDatas[2].firstChild.childNodes;
           var carNumber = use2DataNodes[0].lastChild.firstChild.innerText;
           var carID = use2DataNodes[3].lastChild.firstChild.innerText;
           var percentNum = 0;
           if (percent !== '--') {
               percentNum = Number(percent.substring(0, percent.length - 1));
           }
           var obj = {"shotId": shotId, "percent": percent, "carNumber": carNumber, "carID": carID, "percentNum": percentNum};
           newArray.push(obj);
         }
         newArray = newArray.sort(function(a, b) {
           if (a.percentNum === b.percentNum) {
               return Number(a.shotId) - Number(b.shotId);
           } else {
               return b.percentNum - a.percentNum;
           }
         });
         var sort_list = document.getElementById('sort_list');
         var sort_list_html = '';
         newArray.map(function(e, i){
            sort_list_html = sort_list_html + '<li>' + e.shotId + ' ' + e.percent + ' ' + e.carNumber + ' ' + e.carID + '</li>';
         });
         sort_list.innerHTML = sort_list_html;
   }
   // 添加排序按钮
    var newDiv = document.createElement("div");
    newDiv.innerHTML='<button id="sort_button">排序</button>';
    document.getElementById("div_search").appendChild(newDiv);
    document.getElementById("sort_button").addEventListener("click", doSort, false);
    // 添加排序列表
    var newListDiv = document.createElement('div');
    newListDiv.innerHTML='<ol id="sort_list"><li>Coffee</li><li>Milk</li>';
    document.getElementById("div_search").appendChild(newListDiv);
})();

总结

也算是实现了这个小小的需求吧,不只是闷头干代码,还需要了解的是,油猴的沙盒机制,不然没有办法自动化执行。

[油猴脚本开发指南]沙盒机制的前世今生-油猴中文网

标签:脚本,sort,用油,percent,list,percentNum,var,编写,document
From: https://www.cnblogs.com/haleyeung/p/18022068

相关文章

  • 磐维数据库自动添加/删除 分区脚本
    目录脚本功能脚本使用示例一、自动按天添加分区二、自动按天删除分区脚本功能磐维数据库自动按天添加/删除分区脚本使用示例一、自动按天添加分区1、shell脚本的内容panwei_add_partition.sh#!/bin/bash.~/.bash_profilefordbin"nlkf""nlkf1""nlkf2""nlkf3""nlk......
  • [20240219]建立完善sql_idx.sh脚本.txt
    [20240219]建立完善sql_idx.sh脚本.txt--//再次遇到sql_id的计算问题,该语句已经dba_hist相关视图无法查询.--//w3wp.exe程序里面的sql语句脚本带有^M符号(dos文本格式),执行时并不过滤.--//而我的计算sql_id脚本计算时过滤掉^M符号,导致计算错误.--//我修改完善如下:(注里面的^M......
  • jenkins执行远程服务器启动jar包脚本失败问题
    在jenkins服务器上配置好了ssh登录远程服务器,并且传输更新jar包后,执行服务器上的重启jar包脚本restart.sh失败,jar包未被启动打开restart.shvimrestart.sh#!/bin/bash./home/apps/.bash_profile在开始添加ssh登录用户的环境变量配置,否则会执行失败,因为jenkins通过ssh登......
  • 关于java代码Runtime.getRuntime().exec()执行shell脚本中的坑
    java操作shell脚本执行docker命令  Runtime.getRuntime().exec()是不能执行特殊符号如">"、"|"等必须通过"/bin/sh""-c"处理。另外java操作docker 不能分配  dockerexec-i(不要t).另外如果不确定脚本是否执行成功,可以通过waitFor返回的int结果,如果为0脚本执行......
  • 请编写函数fun,它的功能是:求出1到100之内能被7或者11整除, 但不能同时被7和11整除的所有
    /2.请编写函数fun,它的功能是:求出1到100之内能被7或者11整除,但不能同时被7和11整除的所有整数,并将他们放在a所指的数组中,通过n返回这些数的个数/#include<stdio.h>#include<string.h>intfun(int*buf){inti=1,j=0;for(i=1;i<100;i++){if(i%7==......
  • 1.m个人的成绩存放在score数组中,请编写函数fun, 它的功能是:将低于平均分的人数作为函
    /1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指1定的数组中。/#include<stdio.h>#include<string.h>intfun(int*buf,int*buff,intnum){inti=0,j=0,sum=0;for(i=......
  • 用python脚本自动发送钉钉消息出现服务器异常的报错: HTTPSConnectionPool(host='oapi.
    一、问题描述执行python脚本发送钉钉消息,出现报错:HTTPSConnectionPool(host='oapi.dingtalk.com',port=443):Maxretriesexceededwithurl:/robot/send?access_token=43df999582e899dc6815c9d6346c9d253060259625c92e4f166e25ea58e5bdb5&timestamp=1708242748918&sign......
  • 备份阿里云oss,增量备份,自动处理脚本
    下载安装ossutil 先安装unzip ,然后安装ossutilcurlhttps://gosspublic.alicdn.com/ossutil/install.sh|sudobash 配置endpoint  oss-cn-zhangjiakou.aliyuncs.comstsToken不用配置,临时访问用的AccessKeyID  为ctOss@1463*****.onaliyun.com这个账号......
  • py脚本备份
    POST盲注(暴力)fromrequestsimport*importtimeurl=''payload={"id":""}flag=""foriinrange(1,10000000000):#flag长度time.sleep(0.06)forjinrange(20,126):#可见字符ascii范围payload["id&quo......
  • Windows Server 2022 新的服务管理 API 提供了更多的选项和功能,可以更灵活地进行服务
    sc 命令是Windows操作系统自带的一种命令行实用程序,用于创建、删除、启动、停止以及配置Windows服务。通过 sc 命令,您可以直接将可执行文件注册为服务,而不需要第三方工具的帮助。sc 命令提供了丰富的选项,如启动类型、依赖关系、服务描述等。instsrv 和 srvany 是两个......