Тот, кто часто пользуется скайпом, знает о том, что Ctrl+F в длинных конференциях там работает крайне медленно. Если у нас есть какой-нибудь постоянный чат, который непрерывно идет уже много лет, то найти в нем что-либо практически невозможно, особенно если вы не знаете ничего кроме примерной даты сообщения. Если же вы не знаете даже в какой именно конференции оно было, то вас ждет нелегкая судьба…

Около года назад я нашла програмку Skyperious, и тогда я узнала, что скайп все хранит в обычной SQLite базе данных на жестком диске. Более того, содержимое БД никак не зашифровано, а это означает что можно запускать поиск сообщений по всей базе и парсить его как угодно. Если на секунду опустить тот факт, что эту информацию можно использовать не в самых гуманных целях, то мы получаем огромный источник статистической информации!

В Skyperious встроен небольшой инструментарий для выборки самых часто используемых слов, числа отправленных файлов и так далее. Но если копнуть глубже и самому заглянуть в логи, окажется что можно получить намного больше информации. Во-первых помимо лога самих сообщений, скайп держит также лог удаленных и измененных сообщений, что довольно стремно учитывая тот факт, что вы могли отправлять кому-то пароли и надеялись на то, что их удаление из лога вам как-то поможет. Так что мы можем выбрать всю информацию не только о существующих сообщениях, но и всех сообщениях, которые нам не удалось прочитать. Во-вторых сам лог скайпа содержит в тегах информацию о размерах отправленных файлов, нике цитирумого пользователя, имени пользователя изменявшего сообщение и прочей информации, которая скайпериусом никак не анализируется.

Вообще для того чтобы работать с БД скайпа достаточно просто иметь какой-нибудь браузер для SQLite, но если нам нужна постобработка, – без программирования не обойтись. А в этом деле я привыкла пользоваться Ms Excel. Эксель позволяет делать программы без особых затрат времени на UI и в нем уже есть большое количество функций для работы с данными, поэтому я всегда им пользуюсь в таких ситуациях. Соответственно нам понадобится SQLite for Excel.

Как это работает? Для начала давайте придумаем запрос. Что-нибудь такое:

select body_xml from messages where body_xml like '%aloe%'

Такая выборка вернет нам сообщения за все время, которые содержат текст ‘aloe’. Что еще можно сделать? В содержимом поля body_xml могут находиться теги <files>, <quote>, <ss>, <a>, которые отвечают за отправку файлов, цитирование, смайлики и ссылки соответственно.

Например мы хотим вытащить из лога все ссылки на Youtube. Как нам вывести в таблицу Excel результат выборки? Я не буду тут описыавть объявление переменных SQLite, их можно посмотреть в примерах. Сам код выглядит примерно так:

statement = "select body_xml from messages where body_xml like '%<a href=%youtube%v=%' and body_xml not like '%quote%'" 
ypos = 0
SQLite3PrepareV2(dbhndl, statement, sthndl) 
SQLite3Step(sthndl) 
Worksheets("List").Cells.Clear
Do While result = SQLITE_ROW
	DoEvents 
	Worksheets("List").Cells(ypos,1) = SQLite3ColumnText(sthndl, 0) 
	SQLite3Step(sthndl) 
	ypos = ypos + 1
Loop

Таким образом мы получим все сообщения, но они будут иметь примерно такой вид:

<a href="http://www.youtube.com/watchfeature=player_embedded&v=yFMqpUH1624">
http://www.youtube.com/watch?feature=player_embedded&v=yFMqpUH1624</a>

Что мы можем сделать? Ну например мы можем поискать значение параметра v в строке GET:

Function parseEntry(text As String) As String
 
    Dim pbegin As Long
    Dim id As String
 
    pbegin = InStr(1, text, "v=")
    If pbegin = 0 Then Exit Function
    id = Mid(text, pbegin + 2, 11)
    parseEntry = "http://www.youtube.com/watch?v=" & id
 
End Function

Теперь мы будем получать ссылки в виде http://www.youtube.com/watch?v=yFMqpUH1624, что уже вполне неплохо для нас, но когда их число идет за тысячу у нас будет много повторений одинаковых ссылок, а также куча ссылок на видео, которые уже не существуют. Какую обработку нам прикрутить?
Я написала небольшую функцию, которая получает название видео с помощью API ютуба:

Function getName(id As String) As String
 
    Dim pbegin As Long
    Dim pend As Long
 
    Set objSrvHTTP = CreateObject("MSXML2.XMLHTTP")
 
    url = "http://gdata.youtube.com/feeds/api/videos/" & id
    objSrvHTTP.Open "GET", url, False
    objSrvHTTP.send
    text = objSrvHTTP.responsetext
 
    pbegin = InStr(1, text, "<title")
    If pbegin = 0 Then Exit Function
 
    pbegin = InStr(pbegin + 6, text, ">") + 1
    pend = InStr(pbegin, text, "</title>")
 
    getName = Mid(text, pbegin, pend - pbegin)
 
End Function

После небольшой доработки со сцеплением строк, результат будет выглядеть вот так:

Человек молекула http://www.youtube.com/watch?v=yFMqpUH1624

Я считаю, это победа. Правда у всей этой композиции есть несколько небольших недостатков, связанных, например, с тем, что на одно сообщение будет искаться только одно видео, но все это легко исправить, поэтому не важно.

Обсуждение в telegram