`
bcyy
  • 浏览: 1823622 次
文章分类
社区版块
存档分类
最新评论

sqlite数据库保存聊天记录

 
阅读更多

版权所有,转载请注明出处: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是用于将电报群聊导出到静态网站的工具,可以保留诸如邮件列表档案之类的聊天记录。预览电报组存档。怎么运行的tg-archive使用 Telegram API客户端定期将消息从组同步到本地SQLite数据库文件,仅从上次...

    效率源手机数据恢复工具 For Sqlite 2014

    Sqlite轻量级数据库,广泛应用于智能设备:wince、android、iphone、mego设备保存数据都采用了该数据库; 能进行数据恢复的手机应用:短信、联系人、通话记录、浏览器、邮件等; 能进行数据恢复的聊天软件:QQ、...

    基于Android的蓝牙聊天软件|本科毕业设计|源码

    本科毕业设计,基于Android的蓝牙聊天软件源码,可以运行、修改,具有打开蓝牙、搜索设备、建立连接、发送消息、保存聊天记录等功能,采用了SQlite数据库。

    用于在macOS上从微信提取聊天记录的脚本-Swift开发

    从macOS上的WeChat提取聊天记录的脚本macOS的WeChat Deciphers此工具包包含三个DTrace脚本,用于与macOS上的WeChat.app混淆。 eavesdropper.d实时记录对话。 这显示了所有要保存到数据库的内容。 dbcracker.d揭示了...

    DiscordSpy:可以将Discord聊天日志保存到数据库的程序。 使用后果自负

    DiscordSpy是一个Discord机器人,它可以记录公会消息并将这些消息插入到本地无服务器数据库(sqlite3)中。 我不容忍对该机器人的任何非法使用,您最好使用一个机器人令牌。 如果您确实使用自己的令牌,那么如果您...

    基于TCP的聊天系统

    将所有用户信息保存到sqlite数据库中 7.能够导出相关数据到文本文档中(如聊天记录。。) 二.分工与描述 功能:1.(数据库及其涉及函数、查看在线用户、登录、注册) 2.(makeflie、私聊群聊完善) 3.(写入文件(存取...

    IM-QTCPSocket通信软件

    3. 支持拉取历史聊天记录,从服务获取,默认全时间段。 4. 利用QLineEdit组合QPushButton实现在线用户搜索,并高亮显示。 5. 可支持跨机器的登录与注册。 6. 服务端推送的在线用户列表,客户端实时更新。 7. 轻量级...

    Java毕业设计-Java聊天室程序(java).rar

    3. **数据持久化**:使用SQLite数据库存储用户信息和聊天记录,确保数据的安全性和完整性。 4. **易于扩展**:程序采用模块化设计,可以方便地添加新功能或修改现有功能。 ### 可定制性 1. **二次开发**:该程序...

    QT实现公共聊天室(毕设/课设/项目开发皆适用)

    便于测试,用户的数据库文件依旧是使用sqlite保存在本地 由于各大知名内网穿透工具提供的公网域名都是CNAME的,暂时支持的不是很好,因此想到利用公网服务器进行反向代理实现内网穿透,达到客户端可以直接连接我们的...

    tg_crawler:只是基于tg-cli的Telegram凌乱爬虫。 现在已弃用,请使用telegram-export

    聊天记录将保存在SQLite数据库和文本文件中。 您可以使用不同的参数在数据库中查询,例如通道名称,组名称,电报用户名,电报唯一ID等。 适用于Python 3.3+。 依存关系 使用以下命令安装依赖项: pip install -r ...

    android-socket-chatapp:Android socket驱动的聊天应用

    此 mss 聊天应用程序能够将您的聊天记录保存到 sqlite 数据库中,因此您可以在第二次打开应用程序时看到您的历史记录。 此应用程序中使用的主要组件:- 1) Web Server socket url:- "ws://192.168.0.143:9000/...

    Ourmsg2016

    客户端数据库采用SQLite主要用于保存聊天记录。 Ourmsg适用于企事业单位以及政府机关,可与其IT系统(OA、MIS等)快速集成在一起,以提高工作效率,降低沟通成本。Ourmsg的数据传输采用了GZIP流压缩和AES 256/192、3...

    wechat-decipher-macos:用于在macOS上从微信提取聊天记录的脚本

    这显示了所有要保存到数据库的内容。 dbcracker.d揭示了加密SQLite3数据库的位置及其凭据。 由于它只能在WeChat.app打开这些文件时捕获秘密,因此您需要在脚本运行时登录或触发备份。 只需复制并粘贴脚本输出即可...

    FakeChat:适用于Android的FakeChat应用程序

    适用于Android的FakeChat App 功能/用例支持 从通讯录加载联系人 与联系人列表中的任何人聊天 聊天记录保存在SQLite数据库中 最近的聊天在“主页”选项卡中排序并可用 使用后台线程进行聊天模拟 发送文字和图片

    Lafz:非政府组织向农村地区的孕妇提供咨询的声音解决方案

    登录系统:一种登录系统,该系统在用户首次登录时使用服务器身份验证,并将所有用户的凭据保存在应用程序SQLite数据库中,该数据库可在用户脱机时用于身份验证。 用户也没有任何注册权限,即只能从服务器端注册新的...

    ASP.NET3.5从入门到精通

    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 ...

    ASP.NET 3.5 开发大全11-15

    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数据...

    ASP.NET 3.5 开发大全

    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数据...

    ASP.NET 3.5 开发大全1-5

    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数据...

    ASP.NET 3.5 开发大全word课件

    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数据...

Global site tag (gtag.js) - Google Analytics