版权所有,转载请注明出处:http://guangboo.org/2013/01/29/save-chat-history-with-sqlite
最近正在开发一个即时聊天系统----Pian Communicator,该项目是基于XMPP协议,使用Python+wxPython+xmpp.py开发,由于都是深夜奋战,项目进展也比较慢,目前正在开发聊天功能。聊天功能中还需要保护聊天记录的保存,就像QQ一样,我们可以浏览历史聊天记录。有些即时聊天系统的聊天记录也有采用xml文件记录的,但是xml文件毕竟没有数据库那么容易检索数据,因此我这里打算采用sqlite数据库来存储,并且Python本身就自带了对sqlite的支持。
首先先定义了记录和查询接口,比较目前确定是使用sqlite来记录,但以后也有可能使用xml或其它方式来记录的可能,因此这里定义一个抽象,以便以后进行扩展。接口主要的方法为read和write方法,分别用于读,写记录,记录的内容暂时只有talk(发言者), nickname(发言者的别名), typ(记录类别,包括msg, file等),msg(内容),tm(时间)。另外为了避免忘记调用close方法,特地定义了__del__方法,并且该方法会在类被垃圾回收时调用。代码如下:
class History(object):
def __init__(self, jid, to, path):
self.__jid = jid
self.__to = to
self.__path = path
self.__opened = False
if not os.path.exists(path):
os.mkdir(path)
def get_jid(self): return self.__jid
def get_to(self): return self.__to
def get_path(self): return self.__path
def open(self): raise NotImplementedError()
def read(self): raise NotImplementedError()
def write(self, talk, nickname, typ, msg, tm): raise NotImplementedError()
def close(self): raise NotImplementedError()
def __del__(self):
if self.__opened:
self.close()
采用sqlite数据库存储记录的具体类,如下实现:
class SqliteStorageHistory(History):
def __init__(self, jid, to, path):
super(SqliteStorageHistory, self).__init__(jid, to, path)
_dir = os.path.join(path, self.get_jid())
if not os.path.exists(_dir):
os.mkdir(_dir)
self.dbname = os.path.join(path, self.get_jid(), 'history.db')
self.__connection = None
self.__cursor = None
def open(self):
has = True
if not os.path.exists(self.dbname):
has = False
self.__connection = sqlite3.connect(self.dbname)
self.__cursor = self.__connection.cursor()
if not has:
self.__cursor.execute('''create table histories (_to text, talk text, nick text, typ text, msg text,
datetime datetime)''')
self.__connection.commit()
self.__opened = True
def read(self):
if self.__cursor == None or self.__connection == None:
raise HistoryError('Please Open connection.')
for row in self.__cursor.execute("select * from histories where _to=?", (self.get_to(),)):
yield row
def write(self, talk, nickname, typ, msg, tm):
if self.__cursor == None or self.__connection == None:
raise HistoryError('Please Open connection.')
self.__cursor.execute('insert into histories (_to, talk, nick, typ, msg, datetime) values (?, ?, ?, ?, ?,
?)', \
(self.get_to(), talk, nickname, typ, msg, str(tm),))
self.__connection.commit()
def close(self):
if not self.__opened:
return
if not self.__cursor:
try:
self.__cursor.close()
del self.__cursor
except: pass
if not self.__connection:
try:
self.__connection.close()
del self.__connection
except: pass
self.__opened = False
测试代码为:
if __name__ == '__main__':
sql = SqliteStorageHistory('zhang@gmail.com','wang2xiao@gmail.com', 'c:\\his2')
sql.open()
sql.write('wang2xiao@gmail.com', 'Wang, 2Xiao', 'msg', 'Hi, What are you doing?',
datetime.datetime.now())
sql.write('zhang@gmail.com', 'Zhang, Guangbo', 'msg', 'Hi, Nothing.', datetime.datetime.now())
for row in sql.read():
print row
sql.close()
输出结果:
(u'wang2xiao@gmail.com', u'wang2xiao@gmail.com', u'Wang, 2Xiao', u'msg', u'Hi, What are you
doing?', u'2013-01-29 16:21:04.324000')
(u'wang2xiao@gmail.com', u'zhang@gmail.com', u'Zhang, Guangbo', u'msg', u'Hi, Nothing.', u'2013
-01-29 16:21:04.417000')
分享到:
相关推荐
tg-archive是用于将电报群聊导出到静态网站的工具,可以保留诸如邮件列表档案之类的聊天记录。预览电报组存档。怎么运行的tg-archive使用 Telegram API客户端定期将消息从组同步到本地SQLite数据库文件,仅从上次...
Sqlite轻量级数据库,广泛应用于智能设备:wince、android、iphone、mego设备保存数据都采用了该数据库; 能进行数据恢复的手机应用:短信、联系人、通话记录、浏览器、邮件等; 能进行数据恢复的聊天软件:QQ、...
本科毕业设计,基于Android的蓝牙聊天软件源码,可以运行、修改,具有打开蓝牙、搜索设备、建立连接、发送消息、保存聊天记录等功能,采用了SQlite数据库。
从macOS上的WeChat提取聊天记录的脚本macOS的WeChat Deciphers此工具包包含三个DTrace脚本,用于与macOS上的WeChat.app混淆。 eavesdropper.d实时记录对话。 这显示了所有要保存到数据库的内容。 dbcracker.d揭示了...
DiscordSpy是一个Discord机器人,它可以记录公会消息并将这些消息插入到本地无服务器数据库(sqlite3)中。 我不容忍对该机器人的任何非法使用,您最好使用一个机器人令牌。 如果您确实使用自己的令牌,那么如果您...
将所有用户信息保存到sqlite数据库中 7.能够导出相关数据到文本文档中(如聊天记录。。) 二.分工与描述 功能:1.(数据库及其涉及函数、查看在线用户、登录、注册) 2.(makeflie、私聊群聊完善) 3.(写入文件(存取...
3. 支持拉取历史聊天记录,从服务获取,默认全时间段。 4. 利用QLineEdit组合QPushButton实现在线用户搜索,并高亮显示。 5. 可支持跨机器的登录与注册。 6. 服务端推送的在线用户列表,客户端实时更新。 7. 轻量级...
3. **数据持久化**:使用SQLite数据库存储用户信息和聊天记录,确保数据的安全性和完整性。 4. **易于扩展**:程序采用模块化设计,可以方便地添加新功能或修改现有功能。 ### 可定制性 1. **二次开发**:该程序...
便于测试,用户的数据库文件依旧是使用sqlite保存在本地 由于各大知名内网穿透工具提供的公网域名都是CNAME的,暂时支持的不是很好,因此想到利用公网服务器进行反向代理实现内网穿透,达到客户端可以直接连接我们的...
聊天记录将保存在SQLite数据库和文本文件中。 您可以使用不同的参数在数据库中查询,例如通道名称,组名称,电报用户名,电报唯一ID等。 适用于Python 3.3+。 依存关系 使用以下命令安装依赖项: pip install -r ...
此 mss 聊天应用程序能够将您的聊天记录保存到 sqlite 数据库中,因此您可以在第二次打开应用程序时看到您的历史记录。 此应用程序中使用的主要组件:- 1) Web Server socket url:- "ws://192.168.0.143:9000/...
客户端数据库采用SQLite主要用于保存聊天记录。 Ourmsg适用于企事业单位以及政府机关,可与其IT系统(OA、MIS等)快速集成在一起,以提高工作效率,降低沟通成本。Ourmsg的数据传输采用了GZIP流压缩和AES 256/192、3...
这显示了所有要保存到数据库的内容。 dbcracker.d揭示了加密SQLite3数据库的位置及其凭据。 由于它只能在WeChat.app打开这些文件时捕获秘密,因此您需要在脚本运行时登录或触发备份。 只需复制并粘贴脚本输出即可...
适用于Android的FakeChat App 功能/用例支持 从通讯录加载联系人 与联系人列表中的任何人聊天 聊天记录保存在SQLite数据库中 最近的聊天在“主页”选项卡中排序并可用 使用后台线程进行聊天模拟 发送文字和图片
登录系统:一种登录系统,该系统在用户首次登录时使用服务器身份验证,并将所有用户的凭据保存在应用程序SQLite数据库中,该数据库可在用户脱机时用于身份验证。 用户也没有任何注册权限,即只能从服务器端注册新的...
9.1.4 使用ExecuteXmlReader()操作数据库 9.2 ASP.NET 创建和插入记录 9.2.1 SQL INSERT 数据插入语句 9.2.2 使用Command 对象更新记录 9.2.3 使用DataSet 数据集插入记录 9.3 ASP.NET 更新数据库 9.3.1 SQL UPDATE ...
9.1.4 使用ExecuteXmlReader()操作数据库 9.2 ASP.NET创建和插入记录 9.2.1 SQL INSERT数据插入语句 9.2.2 使用Command对象更新记录 9.2.3 使用DataSet数据集插入记录 9.3 ASP.NET更新数据库 9.3.1 SQL UPDATE数据...
9.1.4 使用ExecuteXmlReader()操作数据库 9.2 ASP.NET创建和插入记录 9.2.1 SQL INSERT数据插入语句 9.2.2 使用Command对象更新记录 9.2.3 使用DataSet数据集插入记录 9.3 ASP.NET更新数据库 9.3.1 SQL UPDATE数据...
9.1.4 使用ExecuteXmlReader()操作数据库 9.2 ASP.NET创建和插入记录 9.2.1 SQL INSERT数据插入语句 9.2.2 使用Command对象更新记录 9.2.3 使用DataSet数据集插入记录 9.3 ASP.NET更新数据库 9.3.1 SQL UPDATE数据...
9.1.4 使用ExecuteXmlReader()操作数据库 9.2 ASP.NET创建和插入记录 9.2.1 SQL INSERT数据插入语句 9.2.2 使用Command对象更新记录 9.2.3 使用DataSet数据集插入记录 9.3 ASP.NET更新数据库 9.3.1 SQL UPDATE数据...