由于需从零学起,直到做出我要的脚本,故本文预计长期更新
为什么要学习这个呢?说来话长
昨天,又是一个晴空万里(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呢
第二次更新结束