Cold'n'Sour (cold_n_sour) wrote,
Cold'n'Sour
cold_n_sour

Скрипя скриптами

Этот пост (в третий уже раз!) касается только тех, кто хостит фотографии на сервисе fotki.com и публикует их в ЖЖ.

Здесь помещается окончательный вариант скрипта, описанного мной в предыдущих постах, доступных по тегу "Сын ошибок трудных". Скрипт с момента последней публикации несколько переработан (надеюсь, к лучшему) и засунут весь в один файл.




Текст скрипта - зеленый. Весь текст надлежит засунуть в один файл и дать ему (файлу) аттрибут "исполняемый".

Параметры, которые надо заменить, выделены красным. Их два - имя пользователя и количество постов на странице. Приятного чтения! :)

#! /bin/bash

##### don't forget to change the CD command if using different dir #####
cd ~/ljpics

##### change the following parameters accordingly
##### parameters are user name and number of posts per one page
##### WARNING: do NOT use underscores "_" in username, use dash "-" instead 

username="cold-n-sour"

#number of posts per page, according to LJ settings
increment=20

##### get directory name according to current date YYYYMMDD
dirname=$(perl -e 'use POSIX;$a=print strftime "%Y%m%d",localtime time;')
dirname="$username.$dirname"
echo dirname is "$dirname"

##### create folder if it isn't there yet
if test -d $dirname
then
	echo dir exists
else
	echo dir does not exist
	mkdir $dirname
fi

##### cd there
cd $dirname

echo username is $username increment is $increment

postfilebase="ljposts"
postsfile="$postfilebase.txt"
postsfileuniq="$postfilebase.uniq.txt"

echo increment is $increment

echo postsfile is $postsfile

#number of posts to skip
declare -i startpost
startpost=0

#number of posts found
declare -i lines
lines=0

#wil be used in cycle later for comparison
declare -i linesold

#empty the receiving file
: >${postsfile}

#full url of LJ
ljurl="http://$username.livejournal.com"

echo ljurl is $ljurl

#start the cycle, get all public posts:
while true
do
	echo Skipping $startpost posts
	linesold=$lines

	curl -sS $ljurl/?skip=$startpost | grep -oiEe "$ljurl/[0-9]+\.html" |uniq >>${postsfile}

	lines=$(grep -c "" $postsfile)
	summary="Total posts before: $linesold, after: $lines"
	if  [ $linesold == $lines ]
	then 
		echo "$summary, done fetching posts!"
		break
	else
		echo "$summary, gonna try again"
		startpost+=$increment
	fi
done

#calculate length of base url for numeric sort
declare -i urllen
urllen=${#ljurl}
urllen+=2 # ending slash and one more to start from the next character 

echo sorting starts with position ${urllen}

#sort posts in reverse numerical order, position of first number is urllen
sort -rnuk 1.${urllen} ${postsfile} >${postsfileuniq}

uniqposts=$(grep -c "html" $postsfileuniq)

echo unique posts: $uniqposts

awk '/^http.*([0-9])+.html/ {print "echo echo " $0 "\ncurl -sS " $0 "?usescheme=lynx| perl -e  \047while (<>) {while ($_=~ m| src=\"(http://[^ ]*\\.fotki.com/[^ ]*\.[^ ]{3})\\\"|gi){ print \"curl -s -S -fr 0-10 $1\; echo; echo $1\;\\n\"}}\047"}' ${postsfileuniq} > getpics.txt

chmod a+x getpics.txt

echo "Getting image URLs from $uniqposts posts"

./getpics.txt >checkpics.txt

chmod a+x checkpics.txt

uniqpics=$(grep -c "curl " checkpics.txt)

echo "Checking $uniqpics images"

./checkpics.txt >checkpics.result.txt 2>&1

#only leave "http" (both posts and pics) and curl error msgs in the output to clean it up
grep -a -E -e "curl: |http" checkpics.result.txt >checkpics.result0.txt

#leave error message, post URL and picture URL:
cat checkpics.result0.txt |  perl -e '$post="";$err="";$postprinted=0;while(<>){chomp;if($err){if(!$postprinted){print"$post\n"; $postprinted=1;}print "$err ($_)\n";$err="";}elsif($_=~m/(.*\.html)/gi){$post=$_;$postprinted=0;}elsif($_=~m/^curl.*/){$err=$_;}}' >errors.txt

#count number of broken links
numerrors=$(grep -c "curl: " checkpics.result0.txt)
echo Errors found: $numerrors

date
##### end
Tags: fotki.com, сын ошибок трудных
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 4 comments