• R语言
  • 用R不务正业 之 简单的辅助抢沙发脚本

记: 这两天正在做计量经济学的鸟课程设计, 心情不爽ing, 于是穷极无聊上来灌个水 [s:17]

身为一名沙发党, 本人表示, 在世风日下, 人心不古的今天, 抢沙发的鸭梨很大 .. 在沙发党的实际操作中, 往往是望着正文发呆了一分钟就只剩下地下室了 ... 这种现实情况, 正可谓是史无前例, 触目惊心, 百年不遇, 令人发指 ... 等等.

好吧, 自己动手写一段简单的辅助抢沙发脚本. 大致的设计定位是这样的: 监视某个博客的更新情况(想同时监视多个的童鞋, 为何要如此执着呢? "一切有为法, 皆如梦幻泡影, 如露亦如电" .. ) 一旦发现博主有更新, 就将更新日志的标题以短信息的形式推送到指定接受者, 提醒短信接收者及时抢沙发. 预计发信息部分可以用现成的第三方在线飞信API实现. 其他的部分也比较简单, 总的来说不会超过10句.

首先, 选定一个要监视的页面, 就监视feed页面了:

<br />
feedURL = c("http://www.bjt.name/feed/")<br />
blogTitle = c("贝吉塔行星")<br />
blogURL = c("bjt.name")<br />
</p>

读feed页面总需要一个可以解析XML的工具:

<br />
require(XML)<br />
</p>

提取feed页中第一个永久链接作为我们的特征:

<br />
# 解析feed页面<br />
feedContainer = xmlTreeParse(feedURL, useInternal = TRUE)</p>
<p># 提取第一个永久链接作为特征<br />
feedCharNew = xmlValue(getNodeSet(doc = feedContainer,<br />
			path = "//channel//guid")[[1]])</p>
<p># 提取标题<br />
feedTitle = iconv(xmlValue(getNodeSet(doc = feedContainer,<br />
			path = "//channel//item//title")[[1]]),<br />
			from = 'UTF-8', to = '')<br />
</p>

好了, 特征已经提取出来了. 假设我们上次执行时已经提取过这个特征, 并在脚本的最后将其写入了文件:

<br />
write(feedCharNew, file = "D:/feedChar.dat")<br />
</p>

而且在本次执行的开始已经将其读入, 并赋给了feedCharOld:

<br />
feedCharOld = readLines("D:/feedChar.dat")<br />
</p>

这样我们就有了旧特征feedCharOld和新特征feedCharNew. 下面即可直接比较异同和发信息了:

<br />
# 比较新旧特征的异同<br />
if (feedCharOld != feedChar) {<br />
messageBody = paste(blogTitle, "更新了. 标题为: ",<br />
				feedTitle, ". 上", blogURL,<br />
				"沙发之.", sep = "")</p>
<p>usr = "13800000000"<br />
psw = "123456"<br />
sendTo = "13800000000"</p>
<p>feitionURL = paste("http://sms.api.bz/fetion.php?username=",<br />
				usr, "&password=", psw, "&sendto=",<br />
				sendTo, "&message=", messageBody, sep = "")</p>
<p>getURL(feitionURL, .encoding = "UTF-8")<br />
}<br />
</p>

这里是比较理想的情况, 事实上, 这个第三方API(详情见 [1] )在包括现在的很长一段时间内, 都处于不可用的状态. 而且这样明文密码飞来飞去, 很不靠谱 ... 但是问题又在于, 我们没有财力去开展自己的移动通信业务. 好吧, 知道为了混口饭吃你们都是有苦衷的, 俺可以忍 .. 用丫的官方客户端, 模拟鼠标和键盘行为总可以了吧:

<br />
if (feedCharOld != feedChar) {<br />
messageBody = paste(blogTitle, "更新了. 标题为: ",<br />
				feedTitle, ". 上", blogURL,<br />
				"沙发之.", sep = "")</p>
<p># 将信息正文写入剪贴板<br />
write(messageBody, file = "clipboard")</p>
<p># 执行录制好的AHK脚本(激活发信息窗口 粘贴 点击发送)<br />
shell.exec("D:/feition.ahk")<br />
}<br />
</p>

这样做有一个缺点, 就是要记得在执行之前打开那个臃肿的客户端. 而且使得整个过程显得过于山寨 .. 没办法 .. 俺也是有苦衷的 .. [s:11]

用win下的任务计划或者linux下的cron来定期执行一下这个脚本([2], [3]):

<br />
"D:\Programs\R\R-2.12.1\bin\i386\R.exe" CMD BATCH --vanilla --slave "D:\sf.R"<br />
</p>

ok, 在上面的基础上简单修改一下就能监视多个地址了, 这下应该不会错过大多数的沙发了.

当然, 为了稳妥起见, 应该再加一个计数器, 防止程序出问题时过量发送信息.

这个AHK脚本录制起来很好玩 .. 虽然俺是录了几次才成功的, 没办法, "汇编语言不会编" ...

有用的链接:

[1] http://blog.s135.com/fetion_api/

[2] http://www.iopus.com/guides/winscheduler.htm

[3] http://www.statmethods.net/interface/batch.html

华丽地自沙 ..

其实我是来吐槽计量的 .. 不知道大家的考试是怎么样的, 只记得俺当时是不得不把一堆参数检验的过程强记下来了 .. 这回的"课程设计"又是寻个讨巧的命题涂鸦一下, 没有自己的东西 .. 于是俺不得不发出这样的感叹, 计量这东西真是对脑力和电力的浪费 ... [s:12]

我这个沙发不是用你的代码抢的~~~[s:13]

靠~~~~,哪有自己抢自己沙发的,没天理了~

回复 第4楼 的 biolily:你都已经牢牢盘踞了板凳和地板 .. 要多少是多啊 .. [s:14]

以后你博客更新发短信通知我啊[s:13]

不用飞信就永远也抢不到沙发了~~[s:15]

这玩意儿可以扩展为一个秒杀工具了,哈哈