|
#!/bin/bash |
|
XIAOSHUO_CWD="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" |
|
RUN_FLAG=false |
|
TEST_FLAG=false |
|
JINGPIN_FLAG=false |
|
CLIOFETION_LOG=$XIAOSHUO_CWD/log/cliofetion.log |
|
REGEX='s#.*href="/p/(\d{10})".*(第.*(章|节).*?)<.*#$2, http://wapp.baidu.com/m?kz=$1\n#' |
|
[ -d "$XIAOSHUO_CWD/log" ] || mkdir $XIAOSHUO_CWD/log |
|
source "source.conf" |
|
|
|
# 使用 $REGEX 的规则处理抓取到的信息 |
|
# 一般只要满足'置顶'即可, 如果打开了 JINGPING_FLAG, 则还需要满足'精品' |
|
parse_zhiding(){ |
|
eval curl -s 'http://tieba.baidu.com/f?kw=${!URL_QUERY}' | iconv -f gb2312 -t utf-8 -c | grep -e '>\[\?置顶\]\?<\|alt="置顶"' $( $JINGPIN_FLAG && echo '-e >\[\?精品\]\?<' ) -B2 -A2 | eval "perl -ne 'if (/第.{1,18}[章节]/) { print if $REGEX};'" |
|
} |
|
|
|
test_source(){ |
|
for SELECTED in ${!URL_*}; do |
|
URL_QUERY="${SELECTED}" |
|
name=${SELECTED#URL_} |
|
zhiding=$(parse_zhiding) |
|
echo ${!name} |
|
echo "$zhiding" |sed '/^$/d' |
|
echo |
|
done |
|
} |
|
|
|
main(){ |
|
for i in ./conf.d/*.conf; do |
|
# 重置所有配置变量并读取下一份配置 |
|
unset TMP_FILE ID_FILE LOG_FILE NAME TEL_NUM WATCH_LIST JINGPIN_FLAG DISABLE GTALK |
|
JINGPIN_FLAG=false |
|
DISABLE=false |
|
source $i |
|
$DISABLE && continue |
|
[ -z "$TEL_NUM" ] && echo 'Cannot find $TEL_NUM' >&2 && exit 1 |
|
[ -z "$NAME" ] && echo 'Cannot find $NAME' >&2 && exit 1 |
|
[ -z "$WATCH_LIST" ] && echo 'Cannot find $WATCH_LIST' >&2 && exit 1 |
|
TMP_FILE="$NAME.tmp" |
|
ID_FILE="log/$NAME.id" |
|
LOG_FILE="log/$NAME.log" |
|
[ -f $ID_FILE ] || touch $ID_FILE |
|
|
|
{ |
|
for SELECTED in $WATCH_LIST; do |
|
URL_QUERY="URL_${SELECTED}" |
|
zhiding=$(parse_zhiding) |
|
ids=$( echo "$zhiding" | perl -ne 'print if s/.*?kz=(\d{10}).*/$1/g' ) |
|
# 用 id 检查本贴是否已经发过 |
|
for i in $ids; do |
|
if ! grep $i $ID_FILE > /dev/null; then |
|
echo ${!SELECTED} |
|
echo "$zhiding" | grep "$i" |
|
echo "$(date): $i" >> $ID_FILE |
|
fi |
|
done |
|
done |
|
} >> $TMP_FILE # 即将发送的内容存到每个人独立的 $TMP_FILE 中 |
|
|
|
|
|
if [ 0 -ne $(du $TMP_FILE | cut -f1 ) ];then |
|
[ -f ${LOG_FILE} ] && mv ${LOG_FILE} ${LOG_FILE}.old |
|
{ |
|
echo "-----------$(date), Start-------------" |
|
echo "######################## Contents #########################" |
|
cat $TMP_FILE |
|
echo "###################### Contents Over ######################" |
|
echo "############## Sent Contents to $TEL_NUM ###############" |
|
|
|
# 飞信程序 |
|
/usr/local/bin/cliofetion -t $TEL_NUM -d "$(cat $TMP_FILE)" 2>&1 1>> $CLIOFETION_LOG |
|
|
|
# 如果有 GTALK 配置, 就也发给 GTALK 账号 |
|
if [ -n $GTALK ] |
|
then |
|
ruby bot.rb -r$GTALK -m"$(cat $TMP_FILE)" |
|
fi |
|
|
|
# 发送失败时候保留未发内容, 待下次发送 |
|
if [ $? -eq 0 ]; then |
|
rm $TMP_FILE |
|
fi |
|
echo "-----------$(date), Stop--------------" |
|
echo |
|
} >> $LOG_FILE |
|
|
|
# 这么烦的一行其实就是为了把最新的 log 打到文件的最上面 |
|
[ -f ${LOG_FILE}.old ] && cat ${LOG_FILE}.old >> ${LOG_FILE} && rm ${LOG_FILE}.old |
|
fi |
|
rm $TMP_FILE |
|
done |
|
} |
|
|
|
# 如果不是直接调用就不执行任何动作 |
|
if [[ "$BASH_SOURCE" == "$0" ]] |
|
then |
|
cd $XIAOSHUO_CWD |
|
while getopts rtj OPTS |
|
do |
|
case $OPTS in |
|
r)RUN_FLAG=true |
|
;; |
|
t)TEST_FLAG=true |
|
;; |
|
j)JINGPIN_FLAG=true |
|
;; |
|
?)echo "what do you mean?" |
|
exit 2 |
|
;; |
|
esac |
|
done |
|
shift $(( $OPTIND -1 )) |
|
|
|
$RUN_FLAG && main |
|
$TEST_FLAG && test_source |
|
fi |