9

Я использую Skype в Linux.

Где я могу найти изображения, сохраненные в скайпе аватарами моего контакта?

3 ответа3

8

Вот гораздо более чистый скрипт, извлекающий аватары как с низким, так и с высоким разрешением из файла main.db и сохраняющий их в файлы, названные в честь соответствующих имен пользователей Skype.

Вам понадобятся sqlite3 и xxd для запуска этого скрипта.

Содержимое базы данных main.db довольно легко понять, с небольшим воображением можно извлечь из нее гораздо больше.

#!/bin/bash

if (( $# != 1 ))
then
    echo "Usage: $0 folder"
    echo "Where folder is of the form /home/username/.Skype/username"
    exit 1
fi

# Magic string used at the beginning of JPEG files
magic=FFD8FFE0

# We read main.db and extract the Skype name, the avatar image and the
# attachments (which often contain a high-def version of the avatar image)
sqlite3 "$1/main.db" "select skypename,hex(avatar_image),hex(profile_attachments) from Contacts;" |\
while read line
do
    IFS='|'
    # We convert the line into an array
    a=($line)
    if [[ -n ${a[1]} ]]  # There is an avatar_image
    then
        # We strip everything before the magic string, convert it back to binary, and save it to a file
        echo $magic${a[1]#*$magic} | xxd -r -p > ${a[0]}_small.jpg
    fi
    if [[ -n ${a[2]} ]]  # There is a profile_attachments
    then
        # Same as above
        echo $magic${a[2]#*$magic} | xxd -r -p > ${a[0]}.jpg
    fi
done
5

Я тоже хотел получить эти аватары Skype, поэтому я использовал ответ Уайткварка, чтобы создать небольшой скрипт bash, который делает именно это. Вот:

#!/bin/bash

if [ \( $# -lt 1 \) ];
then
  echo "Usage: $0 folder";
  echo "Where folder is of the form /home/username/.Skype/username";
  exit;
fi;

for i in `ls $1`;
do
  if [ -f $1/$i ];
  then
    #echo "i: $i";
    filedump=`hexdump -v -e '"" 1/1 "%02x" ""' $1/$i | sed -e 's/ffd8ffe0/\nffd8ffe0/g'`;
    nocc=`echo "$filedump" | wc -l`; # occurences of the \n char. Means that there are nocc-1 occurences of our word
    #echo "nocc: $nocc";
    if [ "$nocc" -ge 2 ];
    then
      k=0;
      old_IFS=$IFS; #field separator
      IFS=$'\n';
      offset=0;
      for j in $filedump;
      do
        w=`echo $j | wc -m`; # gives actually lettercount+1
        w=$[w-1];
        offset=$[offset+w];
        #echo "offset: $offset";
        filename1="${i}_${k}_notclean.jpg";
        filename2="${i}_${k}.jpg";
        dd ibs=1 if=$1/$i of=$filename1 skip=`echo "$offset/2" | bc` status=noxfer;
        if [ `du $filename1 | cut -f1` -gt 0 ];
        then
          convert $filename1 $filename2; #convert is actually only used to remove the data after the image
        fi;
        rm $filename1;
        k=$[k+1];
      done;
      IFS=$old_IFS;
    fi;
  fi;
done
4

Эта ветка форума Skype посвящена аватарам: http://forum.skype.com/index.php?showtopic=99471.

  • Во-первых, они обсуждают некоторые команды, которые позволяют вам сохранять аватары из кеша Skype с открытым интерфейсом, который, по-видимому, не работает в Linux. Я не знаю, исправили ли они этот интерфейс уже, и это не то, о чем ваш вопрос.
  • Во-вторых, один разработчик Skype сказал, что все изображения хранятся в формате JPEG и предоставляют заголовок в шестнадцатеричном формате (JFIF). grep'ing hexdump всех файлов Skype с for i in *; do echo $i; hd $i | grep 'ff d8 ff e0'; done Команда done выявила много вхождений этого заголовка в.Файлы Skype/userNNN.dbb, где NNN - это некоторое число. Эти файлы имеют совершенно недокументированный, проприетарный формат и, вероятно, хранят всю кэшированную информацию о пользователях; Вы можете извлекать сами аватары, сканируя заголовок и затем копируя все до конца файла в другой файл. Все средства просмотра изображений будут пропускать любые данные после самого изображения (на основе технологии RARJPG), и если вы хотите удалить из них ненужную информацию, вы можете "изменить" ее, не изменяя, например, с помощью imagemagick и команды convert file.jpg file_clean.jpg , ImageMagick ведет себя так, как описано зрителем: он читает изображение, пропускает все, что следует за ним, а затем записывает только само изображение.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .