学习油猴

由于需从零学起,直到做出我要的脚本,故本文预计长期更新

为什么要学习这个呢?说来话长

昨天,又是一个晴空万里(wu yun mi bu)的日子,我带着愉快的心情上了下green man,发现r6打折了,想起之前想送小贱鸡一个来着,于是准备下单。

当我鼠标移到购买按钮上的时候,突然想到既然小绿人打折了,那steam上是不是也应该打折?于是关闭小绿人,上了steam商店。果然,算上充值卡的折扣之后比小绿人上还便宜几块,于是轻车熟路地开始赠送礼物,结果直到最后一步,弹出此提醒

开始以为是挂ssr的关系,然后关闭ssr重试,上网页重试,用手机app重试之后发现与网络环境、登录端无关

又测试了下给不同好友送游戏,还有先给自己买一个游戏再去送游戏,得到结论:自己可以买,但是不能送

于是给客服发了个邮件问一问

看到账户被锁定,心里一慌,上steamcn看看有没有这种情况出现过

查了几贴后,终于明白了原因:g胖又改政策了,八月份开始的1:1.8送礼额度改成了1:1,现在能送多少钱礼物取决于自己买过多少钱游戏,而我之前送礼的总额已经超过购买总额但低于购买总额的1.8倍,所以直到最近一次更新后我开始无法送礼物

那么我想知道我要给自己买多少游戏才能恢复到可送礼状态,各种地方都搜了下怎么把steam交易记录统计出来,但大佬们写的脚本都是针对社区市场的,于是我只能把所有交易记录复制到了excel中,筛选排序后统计了下,现在买了4k+游戏,送了5k+礼物,还需要为自己购买1.2K游戏才可以让送礼额度变正

等等,好像偏题了,这好像是个油猴的学习贴

嗯上面就是为什么要学习油猴的原因,我需要写一个脚本让我点到steam交易记录页面的时候,告诉我送礼额度是多少

声明:接下来的所有学习代码都基于我的个人博客主页而编写

首先,我们要搞懂油猴脚本的格式。开头有一堆注释是不可以删的,大概就是这样的一段

// ==UserScript== 
// @name test 
// @namespace https://duya12345.top 
// @version 0.1 
// @description just a test 
// @author SRH 
// @match https://duya12345.top 
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js 
// ==/UserScript==

 

引用下别人写的解释文档:

示例 备注
@name @name  脚本名称 脚本的名称。该项将显示在页面的标题以及链接内容,必填项。
@description @description  脚本功能描述 脚本功能的描述,显示在脚本标题下面,必填项。
@namespace   @namespace 及 @name 这两个属性将帮助用户脚本管理器判断是否已安  装该脚本。
@version @version  0.0.1 脚本的版本标记将使用 Mozilla 版本格式 并显示于脚本的简介页面,必填  项。
@include
@exclude
@match
@match  *://www.52pojie.cn/* 描述脚本将执行的页面。该列表会被分析并展示到脚本的简介页面,以及  用于脚本分类。
@require @require http://cdn.bootcss.com/jquery.min.js 引用外部脚本到您的脚本
@updateURL
@installURL,  @downloadURL
  告知用户脚本管理器应该在哪个地址获取脚本更新。
@license   脚本所使用的许可协议名称或地址,该协议需包含用户是否允许二次分发  或修改  脚本的权利。不提供许可协议则表示用户仅允许个人使用且不得  二次分发;该协  议将在脚本的简介页面显示。
@supportURL   用户可获得该脚本技术支持的链接地址 (如:错误反馈系统、论坛、电子  邮件),该链接将显示在脚本的反馈页面。
@contributionURL   用于捐赠脚本作者的链接,该链接将显示在脚本的反馈页面。
@contributionAmount   建议捐赠金额,请配合 @contributionURL 使用。
@compatible   标记此脚本与某个浏览器兼容,兼容性信息将显示在脚本的简介页面上。
@incompatible   标记此脚本与某个浏览器不兼容,兼容性信息将显示在脚本的简介页面  上。

ok,很快弄明白了这些是干嘛用的,接下来需要知道油猴和网页是怎么进行交互的

最简单的一个实例:

alert('Hello world!');

将此放入function大括号内,注意之前的match属性,即可在打开匹配的网站时弹出一句 Hello world!

上面这个例程是一个单纯的js脚本,那么如果需要配合html使用呢?

试试弄出一个按钮来:

$('#menu-item-227').after('<input type="button" id="test" value="按键测试"/>'); 
$("#test").click(function() { 
  test_button();
}); 
function test_button() { 
  alert('test OK!'); 
}

 

主要就是这个.after,要先在控制台中找到你要放按钮的位置之前的那个html id是什么,填入$('')中即可,其他格式并非油猴特有,移步学习html与js即可

既然明白了按键怎么弄,文本框应该也很简单了

第一次更新到此为止

这里是第二次更新

最近入了个steam阿根廷的号,想趁steam充值卡价格低的时候入点余额,所以需要知道tb上steam卡商的价格,然后要是够低就给我报个警让我去买

当然,一般这种爬虫都是用python弄的,但我对python完全不熟,正好在学习油猴,又只有一个页面要爬,所以直接上js吧

首先,把上次的代码前两行(按钮+文本框)拉了出来,进淘宝界面开f12随便找了个id改了进去,运行!然后报错了,说“$ is not a function”

我看了看,油猴编辑器里所有$的确都有黄色警告,于是在代码最前端加入var $ = unsafeWindow.jQuery;

 可是淘宝依然报错,看来是有特殊的防爬虫手段吧,是我这种菜鸟搞不定的网站,告辞

不过,告辞只是针对这个淘宝页面,而不是我的计划。我爬不了淘宝,我还爬不了爬淘宝的网页吗(禁止禁止套娃

打开这个网站,复制进去淘宝链接,查询一下,然后打开f12,继续一些修修改改的操作,嗯显示按钮和文本框没有问题了,进行下一步

通过ctrl+f找一下我们要的数据

是放在一个只有class属性的span里面

那么,我们需要循环查找span,对比找到的span的class属性,知道完全对上,然后提取出这个span中的内容即可

var obj = document.getElementsByTagName("span");
var class_name = "currentprice";
var i = 0;
for(i in obj){
  if(obj[i].className == class_name){
    element.innerHTML = obj[i].innerHTML;
    return;
  }
}

 

然而事情没有那么美好,当我点下按钮的时候,啥都没变

经过几次试验,我发现:我虽然能获取到整个页面上所有九个span,而这里这个关键的span被找到的时候根本就没带class标签,内容也是空的

不愧是爬虫网站,反扒措施也是有的

难倒这样就要放弃了吗?不,我又换了个爬淘宝的网站,就这个

又是一通相似的操作,这网站非常良心地没有设置任何阻碍我这个小白的反爬手段,成功拿到数据

当然,还需要用js自动填写我们需要搜索的淘宝链接,然后点一下搜索。今天就先到这儿,下午还考n2呢

第二次更新结束

第三次更新~(敷衍)

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注