奇怪的赞数

人生在世,不如意事十之八九,可与言者无二三人。幸好我们生在互联网时代,现实中找不到可以倾诉的人还可以在网络上寻找情绪宣泄口,树洞这类产品就是提供一个让人在网络上匿名倾诉的平台。

我是偶然间发现了这个平台:http://www.6our.com/,感觉自己比较惨的时候去看看别人的不如意,发现上帝还是蛮眷顾自己的(也不知道中国在不在他老人家的管辖范围内)。不过我发现了一个奇怪的现象:秘密有一个赞和踩的功能,但是我看到的秘密的赞都没有发现有低于2的,然后尝试着发了一条,发现刚发出来就有两个赞,所以我猜测网站的开发者设定了秘密发出来时候赞的数量就是2,但是作为一个死心眼的程序员,认为只有亲手证过的才是可信的,所以我要验证一下我的想法,于是用shell写了个爬虫,爬取所有秘密的赞的数量,爬虫代码如下:

#! /bin/bash

######################################################
#
#
#
# 树洞网赞数抓取
#
#
###################################################### # env
cd `dirname $0`
source utils.sh # 初始化线程数控制,使用10个线程并发抓取以免把树洞网站打死
init_thread 250 10 # 初始化业务相关变量
url="http://www.6our.com/qiushi?&p="
total_page_num=`curl_ "${url}1" | grep -oE "<a href='/qiushi\?\&p=2480' >最后一页</a>" | grep -oE "[0-9]+"`
log "total_page_num $total_page_num" # 开始抓取列表
for page_num in `seq 1 $total_page_num`;
do
read -u250
{
cur_page_url="${url}${page_num}"
log "url ${cur_page_url} begin"
curl_ $cur_page_url | grep -oE "id=\"yes-[0-9]+\">[0-9]+" | sed -n 's/id="yes-//; s/">/ /p' >> shudong-id-yes.data
log "url ${cur_page_url} end"
echo '' >&250
}&
done wait
log "all done"

需要引入的公共库:

################################
#
# 工具库,用来存放一些通用的方法
#
################################ # ha! 简易的log4shell
log(){
echo "[`date +'%F %T'`] $1"
} # 封装的线程控制器
# $1 要使用的管道
# $2 要使用的线程数
init_thread(){
pipe_num=$1
thread_num=$2 fifo_path="/tmp/fifo_path_`date +%s`_${1}_${2}"
mkfifo $fifo_path
eval "exec ${pipe_num}<>${fifo_path}"
rm $fifo_path for i in `seq 1 $thread_num`;
do
echo '' >&${pipe_num}
done
return $pipe_num
} # 对curl的一层封装
# 1. 伪装下U-A
# 2. 模拟浏览器持久cookie的行为
# 3. 安静模式,不显示统计信息
# $@ 会被放在最后
curl_(){
curl -s --user-agent "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36" -b cookie -c cookie $@
} # 类似于Stream.map()的封装,使得自定义函数支持管道调用
# $1 函数名
map(){
function_name=$1
while read line
do
$function_name "$line"
done
}

看下爬下来多少条评论数据:

不到五万条,如果这五万条中没有一个点赞数小于2的,那么就说明我的猜想是正确的,好,先看下数据格式:

第一列为秘密id,第二列为此秘密的赞数,筛选出第二列为1的共有多少条:

这…这…这就尴尬了,选一些出来看看页面是不是这样显示的:

这个是详情页的url模式:http://www.6our.com/article/{article_id},选一个id拼接出url http://www.6our.com/article/55840 进去看一下:

果然只有一个赞,又选了几个其它的进去看了一下发现都是一个赞。还好证了一下,不然就给出错误的结论了。

我能做点什么

我原来以为开发网站的程序员是送关怀来着,结果不是。于是我就在想,我能不能为他们做点什么呢?于是我去注册了一个账号:

然后写了个脚本,去检测页面内容,根据秘密内容进行回复,对他们送上一些鼓励的话,脚本内容:

#! /bin/bash
##############################################################
#
#
#
# 树洞鼓励师
#
#
#
############################################################## # env
cd `dirname $0`
source utils.sh # 模拟登陆,保存cookie
login(){
username="foo"
passwd="bar" # 虽然不确定__hash__是做什么用的,但还是带上一下
hash_param=`curl_ "http://www.6our.com/index.php/User/Index/login" | grep -oE "[0-9a-z]+\_[0-9a-z]+" | tail -n 1`
curl_ -d "account=${username}&password=${passwd}&remember_me=1&submit=&__hash__=$hash_param" "http://www.6our.com/index.php/User/Index/checkLogin" \
| grep "登录成功" >> /dev/null if [ $? -ne 0 ];
then
log "login failed."
exit -1
else
log "login success"
fi
} # 回复秘密
# $1 秘密id
# $2 回复内容
replay(){
id=$1
content=$2 # 检测已有评论避免重复回复,此处的重复是指对每条秘密回复一次,而不是对每个pattern回复一次
my_name="树洞鼓励师"
curl_ -d "id=$id" "http://www.6our.com/index.php/Reply/showReply" | grep $my_name >> /dev/null
if [ $? -eq 0 ];
then
return
fi result=`curl_ -d "pid=${id}&anonymous=0&arcontent=${content}" "http://www.6our.com/index.php/Reply/checkReply2"`
if [ "$result" -eq 1 ];
then
log "replay $id $content success"
else
log "replay $id $content failed"
fi
# 防止回复过快
sleep 3
} # 检查符合特定的条件则恢复特定内容
# $1 秘密内容
# $2 perl正则模式
# $3 回复内容
check_pattern_and_replay(){
content=$1
id=`echo $content | grep -oP 'id="content-\d+"' | grep -oP '\d+'`
pattern=$2
replay_content=$3 echo $content | grep -P $pattern >> /dev/null
[[ $? -eq 0 ]] && replay $id $replay_content
} # 对单个的秘密检测处理
# $1 秘密元素,包含id和内容
process_single(){
content=$1 # 热血青年
check_pattern_and_replay "$content" "需要帮助|阻碍|困难|梦想|努力" "加油,明天会更好!" # 孤独,纵有千种风情,更与何人说
check_pattern_and_replay "$content" "(烦|讨厌|不喜欢).*社交" "跟人打交道是很难的事" # 自杀倾向
check_pattern_and_replay "$content" "离开人世|自杀|我死了" "活着才有希望" # 拯救颜值
check_pattern_and_replay "$content" "长的丑" "长的丑的来看下我长得有多挫,助你找回信心 :)" } # 监控第一页
monitor(){
while true;
do
curl_ "http://www.6our.com/qiushi" | tr -d "\r\n" | grep -oP 'id="content-\d+".+?</div>' | map "process_single"
log "look first page over"
sleep 10
done
} login
monitor

效果:

所有脚本代码已经放到github: https://github.com/CC11001100/6our-robot

备注:

在调试正则的时候写了一个“foo|”类型的正则,导致有一部分在测试时进行了错误的评论,看到之后赶紧ctrl+c了,但是还是有几个评论删不掉了,吸取教训,以后细心一点。

.

Linux shell爬虫实现树洞网自动回复Robot的更多相关文章

  1. Linux Shell脚本攻略

    -Linux Shell脚本攻略 总结的来说,这本书很实践性和实用性强,都是给的具体的例子,直接可以在终端操作实践,比单纯只看不动手务实多了,另外就是,这本书涵盖的内容也比较广,从文本操作到服务器管理 ...

  2. 读书笔记--Linux Shell脚本攻略

    总结的来说,这本书很实践性和实用性强,都是给的具体的例子,直接可以在终端操作实践,比单纯只看不动手务实多了,另外就是,这本书涵盖的内容也比较广,从文本操作到服务器管理到远程ssh等等,都给出来作者挑选 ...

  3. 《Linux Shell 脚本攻略》读书笔记

    本书主要讲解一些linux shell命令的用法,讲解一些shell的奇技淫巧. 第一章 小试牛刀 主要介绍一些基本shell指令 终端打印:echo.printf 别名:alias 终端处理工具:t ...

  4. Linux Shell编程与编辑器使用详解

    <Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...

  5. LINUX SHELL脚本攻略笔记[速查]

    Linux Shell脚本攻略笔记[速查] 资源 shell script run shell script echo printf 环境变量和变量 pgrep shell数学运算 命令状态 文件描述 ...

  6. XAMPP(Linux版-x86兼容)官网下载

    欢迎光临 XAMPP 的 Linux 版 (x86 兼容处理器版)顺便提一下:该软件以前被称作 LAMPP,但为了避免误解,我们将其重名命为 »XAMPP 的 Linux 版«.所以,如果您在寻找 L ...

  7. 【原】用PHP搭建基于swoole扩展的socket服务(附PHP扩展的安装步骤及Linux/shell在线手册)

    最近公司的一项目中,需要用PHP搭建一个socket服务. 本来PHP是不适合做服务的,因为和第三方合作,需要采用高效而稳定的TCP协议进行数据通信.经过多次尝试,最终选择了开源的PHP扩展:swoo ...

  8. Bash For Loop Examples for Your Linux Shell Scripting--ref

    There are two types of bash for loops available. One using the “in” keyword with list of values, ano ...

  9. 读《Linux Shell脚本攻略》(第2版) 总结

    前段时间读完了<Linux Shell脚本攻略>(第2版)这本书,给部分想读这本书的人分享下个人感受. 说下这本书的难度吧.纯新手或者只懂少部分编程知识的人,读起来还是有很大难度的.以我为 ...

随机推荐

  1. Python/MySQL(二、表操作以及连接)

    Python/MySQL(二.表操作以及连接) mysql表操作: 主键:一个表只能有一个主键.主键可以由多列组成. 外键 :可以进行联合外键,操作. mysql> create table y ...

  2. spark2.1:使用df.select(when(a===b,1).otherwise(0))替换(case when a==b then 1 else 0 end)

    最近工作中把一些sql.sh脚本执行hive的语句升级为spark2.1版本,其中遇到将case when 替换为scala操作df的方式实现的问题: 代码数据: scala> import o ...

  3. POJ-1700 Crossing River---过河问题(贪心)

    题目链接: https://vjudge.net/problem/POJ-1700 题目大意: 有N个人要渡河,但是只有一艘船,船上每次最多只能载两个人,渡河的速度由两个人中较慢的那个决定,小船来回载 ...

  4. javascript 错误处理和堆栈追踪浅析

    合理地处理堆栈信息能使你清除无用的数据, 而只专注于有用的数据. 同时, 当更好地理解 Errors 对象及其相关属性之后, 能有助于你更充分地利用 Errors. (函数的)调用栈是怎么工作的 在谈 ...

  5. SpringBoot开发案例之多任务并行+线程池处理

    前言 前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑.当然了,优化是无止境的,前人栽树后人乘凉.作为我们开发者来说,既然站在了巨人的肩膀上,就要写出更加优化的程序 ...

  6. 线性结构与树形结构相互转换(ES6实现)

    前言 当树形结构的层级越来越深时,操作某一节点会变得越来越费劲,维护成本不断增加.所以线性结构与树形的相互转换变得异常重要! 首先,我们约定树形结构如下: node = { id: number, / ...

  7. [NOI 2011]道路修建

    Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1条双向道 ...

  8. Hello,World!!----来自半个新OIer的问候

    为了记录OI生涯的点点滴滴故申请此博客,说是半个新OIer,其实我的OI生涯并不算很短了吧...现在也算是初三下学期了...也算是混迹NOIP第5个年头了.文化课上也没什么临考压力,那就好好准备第5场 ...

  9. 【Ural1277】 Cops and Thieves 无向图点连通度问题

    1277. Cops and Thieves Time limit: 1.0 secondMemory limit: 64 MB The Galaxy Police (Galaxpol) found ...

  10. ●BZOJ 2006 NOI 2010 超级钢琴

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2006 题解: RMQ + 优先队列 (+ 前缀) 记得在一两个月前,一次考试考了这个题目的简 ...