LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1505|回复: 9

ngpod

[复制链接]
发表于 2005-3-29 21:54:14 | 显示全部楼层 |阅读模式
国家地理改版了,原来的shell不行了,
制作了version 2,供大家使用

---------------------------------------------------------

献上一个下载national geographic Photo Of the Day的脚本,并请指正

NGPOD是National Geographic Photo Of the Day的缩写形式。这是美国国家地理杂志的一个栏目,网址为:http://lava.nationalgeographic.com/pod/。该栏目每天向大家提供一幅配有背景资料介绍的国家地理杂志上的照片。并提供两种分辨率(800x600以及1024x768)的Windows壁纸(wallpaper)下载。目前网络上到处流传的一些国家地理杂志的照片绝大多数来自这个栏目。

上面的话来自某位网友写的 windows的下ngpod的程序,NGPOD收藏家,
我是觉得,它的数据管理不爽,才想起写这个程序的。


  1. #!/bin/bash
  2. #####################################
  3. #version 2. 20060807. downcloud@hotmail.com
  4. #edit  on 20050920,downcloud@hotmail.com

  5. ######################################
  6. #NGPOD:national geographic Photo Of the Day

  7. #the earliest ngpod is the  April 21, 2001
  8. declare  BYEAR=1 BMONTH=4 BDAY=21
  9. declare  EYEAR=6 EMONTH=8 EDAY=7

  10. #download year,month,day
  11. declare  DYEAR DMONTH DDAY

  12. TRUE=1
  13. FALSE=0

  14. LOGFILE=.ngpod.log

  15. declare JUDGE

  16. ###############################################
  17. #function difinition area
  18. getday()
  19. {
  20.         if [ $BYEAR -gt $EYEAR ];then
  21.                 exit
  22.         elif [ $BYEAR -eq $EYEAR ];then
  23.                 if [ $BMONTH -gt $EMONTH ];then
  24.                         exit
  25.                 elif [ $BMONTH -eq $EMONTH ];then
  26.                         if [ $BDAY -gt $EDAY ];then
  27.                                 exit;
  28.                         fi
  29.                 fi
  30.         fi

  31.         if [ $BYEAR -lt 10 ];then
  32.                 DYEAR="0$BYEAR";
  33.         else
  34.                 DYEAR=$BYEAR;
  35.         fi

  36.         if [ $BMONTH -lt 10 ];then
  37.                 DMONTH=0$BMONTH;
  38.         else
  39.                 DMONTH=$BMONTH;
  40.         fi
  41.        
  42.         if [ $BDAY -lt 10 ];then
  43.                 DDAY=0$BDAY;
  44.         else
  45.                 DDAY=$BDAY;
  46.         fi

  47.         echo "now is year:month:day====$DYEAR $DMONTH $DDAY"


  48.         BDAY=`expr $BDAY + 1`;

  49.         if [ $BMONTH -eq 2 ];then
  50.                 if [ $BDAY -eq 29 ];then
  51.                         if [ $BYEAR -ne 4 ];then
  52.                                 BDAY=1;
  53.                                 BMONTH=3;
  54.                         fi
  55.                         if [ $BYEAR -ne 8 ];then
  56.                                 BDAY=1;
  57.                                 BMONTH=3;
  58.                         fi
  59.                 fi
  60.                
  61.                 if [ $BDAY -eq 30 ];then
  62.                         BDAY=1;
  63.                         BMONTH=3;
  64.                 fi
  65.         fi

  66.         if [ $BDAY -eq 32 ];then
  67.                 BMONTH=`expr $BMONTH + 1 ` ;
  68.                 BDAY=1;
  69.         fi

  70.         if [ $BDAY -eq 31 ];then
  71.                 case  $BMONTH in
  72.                         4)
  73.                         BMONTH=5;
  74.                         BDAY=1;
  75.                         ;;
  76.                         6)
  77.                         BMONTH=7;
  78.                         BDAY=1;
  79.                         ;;
  80.                         9)
  81.                         BMONTH=10;
  82.                         BDAY=1;
  83.                         ;;
  84.                         11)
  85.                         BMONTH=12;
  86.                         BDAY=1;
  87.                         ;;
  88.                 esac

  89.         fi

  90.         if [ $BMONTH -eq 13 ];then
  91.                 BMONTH=1;
  92.                 BYEAR=`expr $BYEAR + 1 `
  93.         fi

  94.         return $TRUE;
  95. }



  96. sedget_title1()
  97. {
  98.         sed -n -e 's/.*<title>National Geographic Photo of the Day:\(.*\)<\/title>.*/\1/p' $1
  99. }

  100. sedget_title2()
  101. {
  102.         sed -n -e 's/.*<title>\(.*\)<\/title>.*/\1/p' $1
  103. }

  104. sedget_titledate()
  105. {
  106.         sed -n -e 's/.*<span class="date">\(.*\)<\/span>.*/\1/p' $1
  107. }

  108. sedget_jpgname()
  109. {
  110.         sed -n -e 's/.*\/sm_wallpaper\/\(.*\)"><img.*/\1/p' $1
  111. }

  112. sedget_where()
  113. {
  114.         sed -n -e '/place-photographer" style=".*">/{N;s/.*>\(.*\)/\1/p}' $1
  115. }
  116. sedget_when()
  117. {
  118. sed -n -e '/.*place-photographer-sub/{s/[[:blank:]]*\([^ ].*\)<\/div.*/\1/p}' $1
  119. }
  120. sedget_who()
  121. {
  122.         sed -n -e 's/.*Photograph by\(.*\)<\/div>/\1/p' $1
  123. }
  124. sedget_intro()
  125. {

  126.         sed -n -e '/<div class="pod-caption"/{N;N;N;N;N;s/.*10px;">\(.*\)/\1/p}' $1 \
  127.            | sed 's/<\/div><\/td>//p' \
  128.         | sed 's/<td .*>//p' \
  129.         | sed 's/<IF .*>//p' \
  130.         | sed -n -e 's/[[:blank:]]*\([^ ].*\)/\1/p'
  131. }
  132. sedget_relatedlink()
  133. {
  134.         sed -n -e '/<REPEAT_LINKS>/{N;s/.*href="\(.*\)">\(.*\)<\/a>.*/\1/p}' $1
  135. }
  136. sedget_relatedname()
  137. {
  138.         sed -n -e '/<REPEAT_LINKS>/{N;s/.*href="\(.*\)">\(.*\)<\/a>.*/\2/p}' $1
  139. }


  140. create_introhead()
  141. {
  142.         local INTROFILE YEAR MONTH
  143.         local -i DAY COUNT TMP
  144.         if [ $# -ne 3 ];then
  145.                 return $FALSE
  146.         fi
  147.        
  148.         INTROFILE=$1
  149.         if [ ! -f $INTROFILE ];then
  150.                 touch $INTROFILE;
  151.         else
  152.                 return $FALSE
  153.         fi
  154.         echo "<html><head>" >>$INTROFILE;
  155.         echo "<meta http-equiv=Content-Type content="text/html; charset=iso8859-1">" >> $INTROFILE;
  156.         echo "<!-- htm file create and translate by downcloud@hotmail.com -->" >>$INTROFILE
  157.         echo "<title>National Geographic Photo of the Day</title></head>" >>$INTROFILE
  158.         YEAR=20$2
  159.         case $3 in
  160.                 01) MONTH=January; DAY=31 ;;
  161.                 02) MONTH=February;
  162.                         if [ $YEAR = "04" ];then
  163.                                 DAY=29
  164.                         else
  165.                                 DAY=28
  166.                         fi
  167.                    ;;
  168.                 03) MONTH=March        ;DAY=31 ;;
  169.                 04) MONTH=April        ;DAY=30 ;;
  170.                 05) MONTH=May        ;DAY=31 ;;
  171.                 06) MONTH=June        ;DAY=30 ;;
  172.                 07) MONTH=July        ;DAY=31 ;;
  173.                 08) MONTH=August        ;DAY=31 ;;
  174.                 09) MONTH=September        ;DAY=30 ;;
  175.                 10) MONTH=October        ;DAY=31 ;;
  176.                 11) MONTH=November        ;DAY=30 ;;
  177.                 12) MONTH=December        ;DAY=31 ;;
  178.                
  179.                 ?) return $FALSE ;;
  180.         esac
  181.         echo "<body bgcolor="gray">" >>$INTROFILE
  182.         echo "<table border="0" width="90%">" >>$INTROFILE
  183.         echo "  <tr><td align="center">" >>$INTROFILE
  184.         echo "      <h1><a target="_blank" href="http://lava.nationalgeographic.com/pod/index.html"> National Geographic Photo of the Day</a></h1>" >>$INTROFILE
  185.         echo "  </td></tr>" >>$INTROFILE
  186.         echo "  <tr><td align="center">" >>$INTROFILE
  187.         echo "      <h2>${YEAR} , ${MONTH}</h2>" >>$INTROFILE
  188.         echo "  </td></tr>" >>$INTROFILE
  189.     echo "</table>" >>$INTROFILE
  190.        
  191.         echo "<table width="90%" border=1>" >>$INTROFILE
  192.         COUNT=1
  193.         TMP=0
  194.         while [ $COUNT -le $DAY ]
  195.         do
  196.                 TMP=`expr $COUNT % 5`;
  197.                 if [ $TMP -eq 1 ];then
  198.                         echo "<tr>" >>$INTROFILE
  199.                 fi
  200.                
  201.                 if [ $COUNT -le 9 ];then
  202.                         echo "<td width="20%"><a href="#day0$COUNT">day 0$COUNT</a></td>" >>$INTROFILE
  203.                 else
  204.                         echo "<td width="20%"><a href="#day$COUNT">day $COUNT</a></td>" >>$INTROFILE
  205.                 fi
  206.                 TMP=`expr $COUNT % 5`
  207.                 if [ $TMP -eq 0 ];then
  208.                         echo "</tr>" >>$INTROFILE
  209.                 fi
  210.                 COUNT=`expr $COUNT + 1`
  211.         done

  212.         if [ $DAY -eq 28 ];then
  213.                         echo "<td width="20%">&nbsp;</td>" >>$INTROFILE
  214.                         echo "<td width="20%">&nbsp;</td>" >>$INTROFILE
  215.                         echo "</tr>" >>$INTROFILE
  216.         elif [ $DAY -eq 29 ];then
  217.                         echo "<td width="20%">&nbsp;</td>" >>$INTROFILE
  218.                         echo "</tr>" >>$INTROFILE
  219.         elif [ $DAY -eq 31 ];then
  220.                         echo "<td width="20%">&nbsp;</td>" >>$INTROFILE
  221.                         echo "<td width="20%">&nbsp;</td>" >>$INTROFILE
  222.                         echo "<td width="20%">&nbsp;</td>" >>$INTROFILE
  223.                         echo "<td width="20%">&nbsp;</td>" >>$INTROFILE
  224.                         echo "</tr>" >>$INTROFILE
  225.         fi
  226.        
  227.        
  228.         echo "</table><br><br>" >>$INTROFILE

  229.         return $TRUE
  230. }

  231. create_tail()
  232. {
  233.         local INTROFILE

  234.         if [ $# -ne 1 ];then
  235.                 return $FALSE
  236.         fi
  237.        
  238.         INTROFILE=$1

  239.         echo "</body></html>" >>$INTROFILE

  240.         if [ -e /usr/bin/dos2unix ];then
  241.                 dos2unix $INTROFILE
  242.         elif [ -e /bin/dos2unix ];then
  243.                 dos2unix $INTROFILE
  244.         fi
  245.        

  246. }


  247. create_introtail()
  248. {        local INTROFILE YEAR MONTH DAY

  249.         if [ $# -ne 4 ];then
  250.                 return $FALSE
  251.         fi
  252.        
  253.         INTROFILE=$1
  254.         YEAR=$2
  255.         MONTH=$3
  256.         DAY=$4

  257.         #if is a month end,create_tail
  258.         if [ $DAY="28" ] &&  [ $DAY="02" ] ;then
  259.                 if [ ! $YEAR="04" ];then
  260.                         if [ ! $YEAR="08" ];then
  261.                                 create_tail $INTROFILE
  262.                         fi
  263.                 fi
  264.                 return $TRUE
  265.         fi

  266.         if [ $DAY="29" ] && [ $DAY="02" ] ;then
  267.                         create_tail $INTROFILE
  268.                 return $TRUE
  269.         fi
  270.        
  271.         if [ $DAY="30" ]  ;then
  272.                 if [ $MONTH="04" ] || [ $MONTH="06" ] || [ $MONTH="09" ] || [ $MONTH="11" ] ;then
  273.                         create_tail $INTROFILE
  274.                 fi
  275.                 return $TRUE
  276.         fi
  277.        
  278.         if [ $DAY="31" ] ;then
  279.                 create_tail $INTROFILE
  280.         fi
  281. }

  282. update_intro()
  283. {
  284.         local INTROFILE DAY JPG1024 JPG400 HTMLINK
  285.         local TITLE TITLEDATE WHERE WHEN WHO INTRO RELATEDLINK RELATEDNAME
  286.         local ORIGNAME       
  287.        
  288.         INTROFILE=$1;
  289.         DAY=$3
  290.         JPG1024=$4
  291.         JPG400=$5
  292.         HTMLINK=$6
  293.         ORIGNAME=$7
  294.        
  295.         TITLE=`sedget_title1 $2`
  296.        
  297.         TITLE=${TITLE:-`sedget_title2 $2`}
  298.         #for some page,title may be empty
  299.         TITLE=${TITLE:-"National Geographic Photo of the Day:"}
  300.        
  301.         TITLEDATE=`sedget_titledate $2`
  302.         WHERE=`sedget_where $2`
  303.         WHEN=`sedget_when $2`
  304.         WHO=`sedget_who $2`
  305.         INTRO=`sedget_intro $2`
  306.         RELATEDLINK=`sedget_relatedlink $2`
  307.         RELATEDNAME=`sedget_relatedname $2`
  308.        
  309.        
  310.         echo "<br><a name="day${DAY}"></a><br>" >> $INTROFILE
  311.         echo "<table border="0" width="90%">" >>$INTROFILE
  312.         echo "        <table border="0"  width="100%" bgcolor="\#666666"><tr>" >>$INTROFILE
  313.         echo "                <td width="45%" align="right" >${TITLE}</td>" >>$INTROFILE
  314.         echo "                <td align="center"><a href="${HTMLINK}">${TITLEDATE}</a></td>" >>$INTROFILE
  315.         echo "        </tr></table>" >>$INTROFILE
  316.         echo "         <table border="0"  width="100%">" >>$INTROFILE
  317.         echo "                 <tr><td align="right" width="40%">" >>$INTROFILE
  318.         echo "                        <table border="0" width="100%">" >>$INTROFILE
  319.         echo "                                 <tr><td width="5" >Name:</td><td>${ORIGNAME}</td></tr>" >>$INTROFILE
  320.         echo "                                 <tr><td width="5" >Where:</td><td>${WHERE}</td></tr>" >>$INTROFILE
  321.         echo "                                 <tr><td width="5" >When:</td><td>${WHEN}</td></tr>" >>$INTROFILE
  322.         echo "                                 <tr><td width="5" >Photographer:</td><td>${WHO}</td></tr>" >>$INTROFILE
  323.         echo "                                 <tr><td width="5" >Related:</td><td ><a href="${RELATEDLINK}">${RELATEDNAME}</a></td></tr>" >>$INTROFILE
  324.         echo "                         </table></td>" >>$INTROFILE
  325.         echo "                         <td align="center" width="400"><a target="_blank" href="${JPG1024}"><img src="${JPG400}" border="0"></a></td>" >>$INTROFILE
  326.         echo "                 </tr>" >>$INTROFILE
  327.         echo "         </table>" >>$INTROFILE
  328.         echo " <tr><td><br>${INTRO}<br></td>" >>$INTROFILE
  329.         echo " <p>" >>$INTROFILE
  330.         echo " </p></tr>" >>$INTROFILE
  331.         echo "</table>" >>$INTROFILE
  332.        
  333.         return $TRUE;       
  334. }

  335. #download ngpod
  336. downloadngpod(){
  337.         local YEAR MONTH DAY
  338.         local DIR JPG1024 JPG400 INTROFILE
  339.         local HTMLINK1 JPGLINK1024 JPGLINK400        EXLINK
  340.         local TMPFILE1  FLIST
  341.         local JPGNAME
  342.        
  343.         EXLINK="http://lava.nationalgeographic.com/"
  344.         FLIST=./ngpod/filelist.txt
  345.         TMPFILE1=.ngpod.tmp
  346.        
  347.         YEAR=$DYEAR
  348.         MONTH=$DMONTH
  349.         DAY=$DDAY
  350.        
  351.         DIR="ngpod/20${YEAR}/${MONTH}"
  352.         mkdir -p "${DIR}_1024x768"
  353.         mkdir -p "${DIR}_400x300"
  354.        
  355.        
  356.             INTROFILE="ngpod/20${YEAR}/ngpod20${YEAR}${MONTH}intro.htm"
  357.        
  358.             if [ ! -f ${INTROFILE} ];then
  359.                 create_introhead ${INTROFILE}  ${YEAR}  ${MONTH};
  360.         fi
  361.        
  362.         HTMLINK1="${EXLINK}cgi-bin/pod/PhotoOfTheDay.cgi?month=${MONTH}&day=${DAY}&year=${YEAR}"
  363.         `curl -o   ${TMPFILE1} ${HTMLINK1}  2>/dev/null`
  364.         if [ ! -f ${TMPFILE1} ];then
  365.                 echo "download ${THMLINK1} fail"
  366.                 echo "download ${THMLINK1} fail" >>${LOGFILE}
  367.                 return $FALSE;
  368.         fi
  369.         #get 1024x768 & 400x300 jpeg file link
  370.         JPGNAME=`sedget_jpgname ${TMPFILE1}`

  371.             JPG1024="${MONTH}_1024x768/ngpod20${YEAR}${MONTH}${DAY}_1024x768.jpg"
  372.         JPG400="${MONTH}_400x300/ngpod20${YEAR}${MONTH}${DAY}_400x300.jpg"
  373.        
  374.         update_intro ${INTROFILE} ${TMPFILE1} ${DAY} ${JPG1024} ${JPG400} ${HTMLINK1} ${JPGNAME}
  375.         create_introtail ${INTROFILE} $YEAR $MONTH $DAY
  376.        
  377.        
  378.         JPG1024="ngpod/20${YEAR}/${JPG1024}"
  379.         JPG400="ngpod/20${YEAR}/${JPG400}"

  380.        
  381.         JPGLINK400="${EXLINK}pod/pictures/normal/${JPGNAME}"
  382.         JPGLINK1024="${EXLINK}pod/pictures/lg_wallpaper/${JPGNAME}"
  383.         if [ ! -f ${JPG400} ];then
  384.                 ` curl -o ${JPG400} ${JPGLINK400} 2>/dev/null`
  385.         fi
  386.         if [ ! -f ${JPG1024} ];then
  387.                 ` curl -o ${JPG1024} ${JPGLINK1024} 2>/dev/null`
  388.         fi
  389.        
  390.            if [ -f ${JPG1024} ];then
  391.                 echo "------------------------------------ get $YEAR $MONTH $DAY ngpod  OK"
  392.                 echo "get $YEAR $MONTH $DAY ngpod  OK" >>${LOGFILE}
  393.         else
  394.                 echo "?????????????? get $YEAR $MONTH $DAY ngpod  fail"
  395.                 echo "get $YEAR $MONTH $DAY ngpod  fail">>${LOGFILE}
  396.         fi
  397.        
  398.         #write jpg filelist
  399.         echo "=========ngpod====20$YEAR:$MONTH:$DAY======" >>$FLIST
  400.         echo "intro: $HTMLINK1" >>$FLIST
  401.         echo " $JPGLINK1024" >>$FLIST
  402.        
  403.         rm -f ${TMPFILE1}
  404.         return $TRUE
  405. }


  406. ##################################3

  407. if [ ! -e /usr/bin/curl ];then
  408.         if [ ! -e /bin/curl ];then
  409.                 echo "could not find download program:curl "
  410.         else
  411.                 echo "/bin/curl exist. go on"
  412.         fi
  413. else
  414.         echo "/usr/bin/curl exist. go on"
  415. fi       


  416. ########################################
  417. echo "ngpod is national geographic photo of the day"
  418. echo "This shell will download ngpod pictures"
  419. echo " from ${BYEAR}/${BMONTH}/${BDAY} to ${EYEAR}/${EMONTH}/${EDAY}"
  420. echo "To change begin/end day, edit this shell,line 10,11"

  421. read -p "Now begin download(Y/N):" JUDGE

  422. if [ ! $JUDGE = "y" ];then
  423.         if [ ! $JUDGE = "Y" ];then
  424.                 echo "This shell will exit now"
  425.                 exit
  426.         fi
  427. fi


  428. if [ ! -f ${LOGFILE} ];then
  429.         touch ${LOGFILE}
  430. fi
  431. ##########################################
  432. # function run from here

  433. while [ $TRUE ]
  434. do
  435.        
  436.         getday
  437.         downloadngpod         $DYEAR $DMONTH $DDAY;
  438. done


复制代码


2006 08 05 debug OK
 楼主| 发表于 2005-3-29 21:57:56 | 显示全部楼层
请教大家,怎么让 read从管道里读输入?
现在我的程序是先生成临时文件,在让read从临时文件里读
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-30 00:33:17 | 显示全部楼层
enjoy
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-31 01:09:44 | 显示全部楼层
顶上去,
ps:我这个程序只下载1024x768的和400x300的图片
回复 支持 反对

使用道具 举报

发表于 2005-3-31 09:49:16 | 显示全部楼层
Post by downcloud
请教大家,怎么让 read从管道里读输入?
现在我的程序是先生成临时文件,在让read从临时文件里读

read只能从标准输入或是文件描述符中得到输入,管道不行。这个在man里有描述了,我简略看了一下兄弟的脚本,很不错:)
下面这句:
tail -1 $LOGFILE
改成
mytmp=$(tail -1 $LOGFILE)

可以吗?就不必用临时文件了  :rolleyes:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-31 22:36:40 | 显示全部楼层
这个脚本还是有些问题的,最严重的是生成的htm在ie里不是想要的效果(好象不能算bug^_^)
中午我把下载完的图片给同事看才发现,还有其它的小问题,不一一说了

过两天改完再发一版本上来
回复 支持 反对

使用道具 举报

发表于 2006-8-3 20:15:49 | 显示全部楼层
我正想要一个下载国家地理POD的脚本,但现在Windows下,进入Linux后一定去研究一下。
回复 支持 反对

使用道具 举报

发表于 2006-8-4 14:05:33 | 显示全部楼层
Post by kiron
read只能从标准输入或是文件描述符中得到输入,管道不行。这个在man里有描述了,我简略看了一下兄弟的脚本,很不错:)
下面这句:
tail -1 $LOGFILE
改成
mytmp=$(tail -1 $LOGFILE)

可以吗?就不必用临时文件了  :rolleyes:

under zsh, this can be done.
  1. echo "abc" | read a
  2. echo $a
  3. abc
复制代码
under bash, you do something like
  1. read a < <(echo "abc")
  2. echo $a
  3. abc
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-8 17:11:05 | 显示全部楼层
国家地理改版了,原来的shell不行了,
制作了version 2,供大家使用,见主贴
回复 支持 反对

使用道具 举报

发表于 2006-8-8 17:13:45 | 显示全部楼层
怎么从code框中把文本一次性全部复制下来?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表