记: 这两天正在做计量经济学的鸟课程设计, 心情不爽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