Что нового

Извлечь историю переписки в Skype

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
410
Как известно, Skype записывает историю в файл базы данных, она находится в
Диск:/Documents and Settings/учётная запись/Application Data/Skype/логин в скайпе/main.db

Пробывал открыть базу и считать таблицу, но выводится совсем не переписка, а контакты, инфа о контактах и тому подобное, собственно в этом вопрос, как найти переписку и считать её, может знает кто нибудь?


Добавлено:
Сообщение автоматически объединено:

Есть, всё, нашёл как считать переписку:

Код:
#include <SQLite.au3>
#include <Array.au3>

Local $aResult, $iRows, $iColumns, $iRval

_SQLite_Startup()
$iSQLite = _SQLite_Open(@ScriptDir & "\main.db")

$iRval = _SQLite_GetTable ($iSQLite, "SELECT * FROM Messages;", $aResult, $iRows, $iColumns)
If $iRval = $SQLITE_OK Then
    _ArrayDisplay($aResult, "Query Result")
EndIf

_SQLite_Close($iSQLite)
_SQLite_Shutdown ()


Добавлено:
Сообщение автоматически объединено:

Как теперь распределить всю переписку по никам контактов?

P.S. Уважаемый модератор раздела, не ожидал что так быстро найду способ описанный выше, кажется теме место в общении.
 

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
Посмотри здесь здесь используется API Skype и распределяются всю переписку по никам контактов... ты можеш использовать часть распределения в сценарии...
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
410
У меня версия скайпа 5.5 и на этой версии этот com объект отказывается работать, точнее скрипт даже не запускается, тем более он работает только когда скайп запущен, а мне нужно работать непосредственно с базой данных скайпа.
 

XpycT

Скриптер
Сообщения
380
Репутация
132
Viktor1703 [?]
Как теперь распределить всю переписку по никам контактов?
Код:
#include <SQLite.au3>
#include <Array.au3>

Local $aResult, $iRows, $iColumns, $iRval

_SQLite_Startup()
$iSQLite = _SQLite_Open(@ScriptDir & "\main.db")

$iRval = _SQLite_GetTable2d($iSQLite, "SELECT author, dialog_partner, body_xml FROM Messages", $aResult, $iRows, $iColumns)
If $iRval = $SQLITE_OK Then
    _ArrayDisplay($aResult, "Query Result")
EndIf

_SQLite_Close($iSQLite)
_SQLite_Shutdown()
 

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
Интересно, что Skype 3.8 не создаиот main.db и все в чатов в этих файлах chatmsg***.dbb... по этому вопросу существуют решение ?

Едит:

И может ли информация, полученная от _ArrayDisplay быть сохранены в файле с ник и чат как это было сделано с API Skype...
 

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
Код:
#include <SQLite.au3>
#include <Array.au3>
#Include <File.au3>

Local $aResult, $iRows, $iColumns, $iRval

_SQLite_Startup()
$iSQLite = _SQLite_Open(@ScriptDir & "\main.db")

$iRval = _SQLite_GetTable2d($iSQLite, "SELECT author, dialog_partner, body_xml FROM Messages", $aResult, $iRows, $iColumns)

$Path = @ScriptDir & '\file.txt'
$Razdelit = ' '

_ArrayDisplay($aResult, 'Массив')
$tmp = ''
For $i = 0 to UBound($aResult)-1
    $tmp &= $aResult[$i][0] & $Razdelit & $aResult[$i][1] & $Razdelit & $aResult[$i][2] & @CRLF
Next
$file = FileOpen($Path,2)
FileWrite($file, $tmp)
FileClose($file)

_SQLite_Close($iSQLite)
_SQLite_Shutdown()


Сценарий уже может сохранять чат в файл... Теперь остается разделены чат / ник...
 

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
Вот так можно потратить чат историю одному чат контакта.

Код:
#include <SQLite.au3>
#include <Array.au3>
#Include <File.au3>

Local $aResult, $iRows, $iColumns, $iRval

_SQLite_Startup()
$iSQLite = _SQLite_Open(@ScriptDir & "\main.db")

$iRval = _SQLite_GetTable2d($iSQLite, "SELECT author, timestamp, body_xml FROM Messages WHERE dialog_partner = 'NIK_NIK_NIK'", $aResult, $iRows, $iColumns)

$Path = @ScriptDir & '\file.txt'
$Razdelit = ' '

_ArrayDisplay($aResult, 'Массив')
$tmp = ''
For $i = 0 to UBound($aResult)-1
    $tmp &= $aResult[$i][0] & $Razdelit & $aResult[$i][1] & $Razdelit & $aResult[$i][2] & @CRLF
Next
$file = FileOpen($Path,2)
FileWrite($file, $tmp)
FileClose($file)

_SQLite_Close($iSQLite)
_SQLite_Shutdown()
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
Вот так можно извлечь* чат историю одному чат контакта.

:-[
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
410
Интересно, а как время вернуть, timestamp возвращает не то, или её нужно как то форматировать....
 

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
By now you should have recognized, that the timestamps and change-values are not really readable dates in the database. Don't worry, it's not encrypted. Its just stored as plain Unix timestamp values. You can easily convert it to a readable time and date using for example the online UNIX Timestamp To Standard Time Calculator
http://kosi2801.freepgs.com/2009/12/03/messing_with_the_skype_40_database.html

Теперь мы должны найти способ с Autoit это сделать...

Edit:

Нашол

Код:
#include <date.au3>

$unixtimestamp = "1315208013"
$iDateCalc = _DateAdd('s', $unixtimestamp, "1970/01/01 00:00:00")
MsgBox( 4096, "", "Timestamp converted to Date: " & $iDateCalc )


http://www.autoitscript.com/forum/topic/51626-unixtimeparse/

Вот рабочий пример...

Код:
#include <SQLite.au3>
#Include <File.au3>
#include <date.au3>

Local $aResult, $iRows, $iColumns, $iRval

_SQLite_Startup()
$iSQLite = _SQLite_Open(@ScriptDir & "\main.db")

$iRval = _SQLite_GetTable2d($iSQLite, "SELECT author, timestamp, body_xml FROM Messages WHERE dialog_partner = 'NIK_NIK_NIK'", $aResult, $iRows, $iColumns)

$Path = @ScriptDir & '\file.txt'
$Razdelit = '|'

$tmp = ''
For $i = 0 to UBound($aResult)-1
	$unixtimestamp = $aResult[$i][1]
	$iDateCalc = _DateAdd('s', $unixtimestamp, "1970/01/01 00:00:00")
    $tmp &= $aResult[$i][0] & $Razdelit & $iDateCalc & $Razdelit & $aResult[$i][2] & @CRLF
Next
$file = FileOpen($Path,2)
FileWrite($file, $tmp)
FileClose($file)

_SQLite_Close($iSQLite)
_SQLite_Shutdown()
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
410
armenxxx1, большое спасибо за ссылку, очень пригодилась
 

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
:smile: пожалуйста... Написал еще один сценарий для стирание историю сообщений только одного контакта Skype.

Код:
#include <SQLite.au3>
#include <Array.au3>

_SQLite_Startup()
$iSQLite = _SQLite_Open(@ScriptDir & "\main.db")

_SQLite_Exec ($iSQLite, "delete from Messages Where dialog_partner = 'NIK_NIK_NIK'")

_SQLite_Close($iSQLite)
_SQLite_Shutdown()



Edit:
Ещо однаво сценарий для замени историю сообщений только одного контакта Skype.
Код:
#include <SQLite.au3>
#include <Array.au3>

_SQLite_Startup()
$iSQLite = _SQLite_Open(@ScriptDir & "\main.db")

_SQLite_Exec ($iSQLite, "update Messages set body_xml='Сюда напишите текст' where from_dispname='NIK_NIK NIK' or dialog_partner='NIK NIK NIK'")

_SQLite_Close($iSQLite)
_SQLite_Shutdown()
 

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
Наконец написал :whistle: . Сценарий извлекает всю историю и сохраняет его в оделнии файлов для каждого контакта. :smile:

Код:
#include <SQLite.au3>
#Include <File.au3>
#include <date.au3>
#include <Array.au3>

Local $aResult, $iRows, $iColumns, $iRval

If Not FileExists("SkypeChatHistory") Then
    DirCreate("SkypeChatHistory")
EndIf

_SQLite_Startup()
	$iSQLite = _SQLite_Open(@ScriptDir & "\main.db")

	$iRval = _SQLite_GetTable2d($iSQLite, "SELECT skypename FROM contacts", $aResult, $iRows, $iColumns)
	$aResultx = $aResult

For $a = 1 to UBound($aResultx)-1
    $tmpx = $aResultx[$a][0]
	
	$iRval = _SQLite_GetTable2d($iSQLite, "SELECT author, timestamp, body_xml FROM Messages WHERE dialog_partner = '" & $tmpx &"'", $aResult, $iRows, $iColumns)

	$Path = @ScriptDir & "\SkypeChatHistory\" & $tmpx & ".txt"
	$Razdelit = '|'

	$tmp = ''
For $i = 0 to UBound($aResult)-1
	$unixtimestamp = $aResult[$i][1]
	$iDateCalc = _DateAdd('s', $unixtimestamp, "1970/01/01 00:00:00")
    $tmp &= $aResult[$i][0] & $Razdelit & $iDateCalc & $Razdelit & $aResult[$i][2] & @CRLF
Next
	$file = FileOpen($Path,2)
	FileWrite($file, $tmp)
	FileClose($file)
Next

_SQLite_Close($iSQLite)
_SQLite_Shutdown()
 

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
Обнаружил, что если вы хотите работать с SQLite.au3 , то вам нужно sqlite3.dll но в Autoit нету sqlite3.dll.
 

armenxxx1

Продвинутый
Сообщения
155
Репутация
56
Спасибо, но таким образом увеличить размер сценария...

Код:
#include <SQLite.dll.au3>

1.30МБ.

Код:
FileInstall("sqlite3.dll", @ScriptDir & "\sqlite3.dll")

630КБ
 

XpycT

Скриптер
Сообщения
380
Репутация
132
armenxxx1
После того как скрипт был запущен с SQLite.dll.au3, потом этот include можно убрать из скрипта.

Из справки
[box]If SQLite3.dll.au3 is included the dll will be created in @SystemDir.[/box]
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
XpycT [?]
После того как скрипт был запущен с SQLite.dll.au3, потом этот include можно убрать из скрипта.
А если у пользователя Вашей программой нет sqlite3.dll?
 

XpycT

Скриптер
Сообщения
380
Репутация
132
madmasles
Тогда программу можно сразу раздавать с dll'кой, и не использовать SQLite.dll.au3 или FileInstall
 
Верх