windows - Where does Skype store the avatar pictures of my contacts?

06
2014-04
  • Guest Guest

    I'd like to know where does Skype running on Windows 7 store the profile pictures of my contacts and how can I access them on my PC?

  • Answers
  • Devid

    If you are using Windows 7 or Windows 8 the full path is C:\Users\YOURUSERNAME\AppData\Roaming\Skype\Pictures. Don't forget to enable the hidden files in Windows Explorer or you won't be able to see the Folder AppData.


  • Related Question

    Where does Skype save my contact's avatars in Linux?
  • Andrea Ambu

    I'm using Skype on Linux.

    Where can I find images cached by skype of my contact's avatars?


  • Related Answers
  • Swergas

    I wanted to get those Skype avatars too so I used whitequark's answer to make a little bash script which does just that. Here it is:

    #!/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
    
  • whitequark

    This Skype forum thread is about avatars: http://forum.skype.com/index.php?showtopic=99471.

    • First, they discuss some commands that allow you saving avatars from Skype cache with it public interface through it doesn't apparently work on Linux. I don't know if they fixed that interface already, and that's not what your question is about.
    • Second, one Skype dev said that all images are stored in JPEG format and provide a header in hex (JFIF). grep'ing hexdump of all Skype files with the for i in *; do echo $i; hd $i | grep 'ff d8 ff e0'; done command revealed many occurences of this header in .Skype/userNNN.dbb files where NNN is some number. This files have some absolutely undocumented, proprietary format and are probably keeping all cached information about users; you can extract avatars themselves by scanning for header and then copying everything until end of file to other file. All image viewers will skip any data after the image itself (a technology RARJPG is based on), and if you want to remove junk out of them you can "modify" it without modifying e.g. with imagemagick and command convert file.jpg file_clean.jpg. ImageMagick behaves as described viewer: it reads image, skips anything that follow it and then writes only image itself.
  • Guillaume Brunerie

    Here is a much cleaner script extracting both low-def and high-def avatars from the main.db file and saving them to files named after the corresponding Skype usernames.

    You will need sqlite3 and xxd to run this script.

    The content of the main.db database is fairly easy to understand, with a bit of imagination there is a lot more that could be extracted from it.

    #!/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