首先是一段shell脚本。它会每隔30秒钟访问一下论坛(比如Dizcuz!)的在线用户列表,然后从列表中读取出在线用户的行为,并做记录。
#!/bin/sh
while true; do
wget "http://www.example.com/member.php?action=online" -O - |
sed -n '/<table summary=""/,/<\/table>/ p' |
sed -n '12~1p' |
sed 's/<\/\?\(a\|div\|table\|h1\|thead\|tbody\|td\)[^>]*>\|<tr>\|^\s*\|\r//g' |
awk -F ' \n' -v RS='</tr>\n+' '{ printf "%15s | %5s | %16s | %30s | %s\n", $1, $2, $3, $4, $5 }' >>surveillant.log
sleep 30
done
上面这个程序有个问题,查看在线用户本身也是一个用户操作,这样就会使得那个列表中大量充斥着匿名用户访问用户列表的记录,让人产生怀疑。好在首页也有显示在线用户的功能,这样还是通过首页读取数据更不容易被察觉,哈哈。以下就是用这种方式实现的php程序:
<?php
$f = file_get_contents('http://www.example.com');
$f = iconv("gbk", "utf8", $f);
preg_match('@<ul class="userlist">(.*?)</ul>@is', $f, $m);
preg_match_all('@<li title="(.*?)">.*?<a.*?>(.*?)</a>@is', $m[1], $m, PREG_SET_ORDER);
$s = "";
foreach ($m as $i) {
$s .= date('Y-m-d H:i:s');
$s .= ' | ';
$s .= $i[2];
$s .= preg_replace('/\s*\n?.*: /', ' | ', $i[1]);
$s .= "\n";
}
file_put_contents("surveillant.log", $s, FILE_APPEND);
- labrador's blog
- 11026 次点击

发表新评论