Тот, кто часто пользуется скайпом, знает о том, что 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