奇怪的赞数

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

我是偶然间发现了这个平台: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`;
doread -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.datalog "url ${cur_page_url} end"echo '' >&250}&
donewait
log "all done"

需要引入的公共库:

################################
#
#  工具库,用来存放一些通用的方法
#
################################# ha! 简易的log4shell
log(){echo "[`date +'%F %T'`] $1"
}# 封装的线程控制器
# $1 要使用的管道
# $2 要使用的线程数
init_thread(){pipe_num=$1thread_num=$2fifo_path="/tmp/fifo_path_`date +%s`_${1}_${2}"mkfifo $fifo_patheval "exec ${pipe_num}<>${fifo_path}"rm $fifo_pathfor i in `seq 1 $thread_num`;doecho '' >&${pipe_num}donereturn $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=$1while read linedo$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/nullif [ $? -ne 0 ];thenlog "login failed."exit -1 elselog "login success" fi
}# 回复秘密
# $1 秘密id
# $2 回复内容
replay(){id=$1content=$2# 检测已有评论避免重复回复,此处的重复是指对每条秘密回复一次,而不是对每个pattern回复一次my_name="树洞鼓励师"curl_ -d "id=$id" "http://www.6our.com/index.php/Reply/showReply" | grep $my_name >> /dev/nullif [ $? -eq 0 ];thenreturnfiresult=`curl_ -d "pid=${id}&anonymous=0&arcontent=${content}" "http://www.6our.com/index.php/Reply/checkReply2"`if [ "$result" -eq 1 ];thenlog "replay $id $content success"else log "replay $id $content failed"fi# 防止回复过快sleep 3
}# 检查符合特定的条件则恢复特定内容
# $1 秘密内容
# $2 perl正则模式
# $3 回复内容
check_pattern_and_replay(){content=$1id=`echo $content | grep -oP 'id="content-\d+"' | grep -oP '\d+'`pattern=$2replay_content=$3echo $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;docurl_ "http://www.6our.com/qiushi" | tr -d "\r\n" | grep -oP 'id="content-\d+".+?</div>' | map "process_single"log "look first page over"sleep 10done
}login
monitor

效果:

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

备注:

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

.

转载于:https://www.cnblogs.com/cc11001100/p/8973955.html

Linux shell爬虫实现树洞网鼓励师(自动回复Robot)相关推荐

  1. 好用的个人树洞网盘外链系统源码

    正文: 树洞外链是一款免费开源的PHP外链网盘系统,界面简洁友好,支持阿里云OSS.又拍云.七牛.本地.远程五种储存方式,支持多用户系统. 下载方式: lanzou.com/iKXKC0359k7a

  2. linux shell写的文件断网没保存

    今天算是有惊无险! 问题描述: vim写的code(名为test.py)由于网络原因断开了没保存,再次进入的时候打开提问存在.swp文件,使用E命令编辑,进入之后发现是很久之前(没改动之前)的内容,昨 ...

  3. python爬虫爬猎聘网获取多条职责描述中有Linux需求的招聘信息

    python爬虫爬猎聘网获取多条职责描述中有Linux需求的招聘信息 下列是我爬虫的作业 摘 要 随着现代化社会的飞速发展,网络上巨大信息量的获取给用户带来了许多的麻烦.由于工作和生活节奏的需求,人们 ...

  4. 私人网盘树洞外链源码

    介绍: 树洞外链是一款免费开源的PHP外链网盘系统,界面简洁友好,支持阿里云OSS.又拍云.七牛.本地.远程五种储存方式,支持多用户系统. 程序特性: 支持多种存储方式 树洞外链允许你将文件存放在不同 ...

  5. %e5 转换汉字 php,Linux Shell下把汉字转换为Url编码_自学php网

    在linux 的shell环境下有一个od命令可以把文件按不同的进制的ascii码输出,该功能可以完成在linux shell下把汉字转换为url编码的任务. url编码是十六进制的形如%E6%9C% ...

  6. 在树洞里,渝粤题库在线整理

    在树洞里 在树洞里,我看到了一些领国家助学金的同学大手大脚,也看到了一些同学好像并不困难,我更看到了许多拿了学校的奖励,可是连写感谢信都不愿意写,觉得很麻烦的同学.我想把我的故事讲给你们听. 我来自单 ...

  7. linux中用参数代替键盘输入,linux shell在while中用read从键盘输入的实现

    系统是ubuntu 14.04 64bit,之前曾想安装stream来玩dota2,但最终没成功.由于stream只有32bit,安装stream时也安装了大量32bit的库.删除stream后,这些 ...

  8. Linux shell速查手册

    Linux Shell脚本攻略笔记[速查] Linux Shell脚本攻略笔记[速查] 资源 shell script run shell script echo printf 环境变量和变量 pgr ...

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

    LINUX SHELL脚本攻略笔记[速查] Linux Shell脚本攻略笔记[速查] 资源 shell script run shell script echo printf 环境变量和变量 pgr ...

  10. linux shell 宏定义_Linux系统和Shell命令行简介,走上数据分析之路

    122Linux系统和Shell命令行简介,走上数据分析之路 本节作者:刘永鑫 中国科学院遗传与发育生物学研究所 版本1.0.2,更新日期:2020年8月31日 本项目永久地址:https://git ...

最新文章

  1. 学计算机excel就很好吗,零基础学习excel小技巧
  2. oracle 11g rac手册(第2版) 高清,Oracle Database11g RAC手册(第2版)_IT教程网
  3. 《软件需求规格说明书》 ---学士之路
  4. HDU 6175 算术
  5. 论接单报价管理与ERP信息化管理的重要性
  6. 【知了堂学习笔记】MySQL数据库常用的SQL语句整理
  7. 1命名规则 sentinel_Alibaba Sentinel 规则参数总结
  8. Java SSM篇3——Mybatis
  9. 图论 —— 图的连通性 —— Tarjan 求双连通分量
  10. php 数组的处理,php 数组处理
  11. Ubuntu中网络编程的环境配置
  12. 4r照片尺寸是多大_数码照片4D、4R、6RW是什么意思,怎样调整4D照片尺寸?
  13. How to create swiping gesture list items for Windows Phone 7
  14. Java多线程_并发协助模型(管制法,信号灯法)
  15. 26个字母的html代码多少,标准的26个字母的读法 二十六个汉语拼音字母怎么读才算正确...
  16. 反步法设计步骤及仿真验证(非线性系统)
  17. python 自动发送微信消息 (win)
  18. php缓存怎么清理,php怎么清除opcache缓存
  19. ATF官方文档翻译(二):Authentication Framework Chain of Trust(身份验证框架和信任链)(1)
  20. pod install报错 CDN: trunk Repo update failed...couldnt connect to server

热门文章

  1. fastboot与fastbootd介绍
  2. 安装Ceres Solver
  3. 数据结构与算法之树的孩子双亲存储结构的讲解
  4. linux的input命令,Linux(Ubuntu)下如何修改鼠标速度——”xinput”命令使用方法
  5. android的轮播图Banner之本地加载和网络加载图片
  6. qq2018内测android,社交无止境:QQ for Android 4.7内测版
  7. matlab 买什么电脑配置,要快速运行Matlab,电脑用什么配置和系统好
  8. Edge浏览器运行卡顿怎么办 怎样让Edge浏览器速度更快
  9. UCT(信心上限树算法)解四子棋问题——蒙特卡罗法模拟人机博弈
  10. C++ P1091 合唱队形[DP]