Skip to Content

记录论坛用户行为的程序

labrador 的头像
首先是一段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 '&nbsp;\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);

发表新评论

  • 你可以在文本中使用BBCode标记语言。 URL会自动被转为链接。

更多关於格式化选项的信息

CAPTCHA
请验证您是否是机器人。
Image CAPTCHA
Enter the characters shown in the image.