设为首页 收藏本站
查看: 4360|回复: 4

[经验分享] Python操作泄露的QQ群数据库

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2013-11-29 08:51:02 | 显示全部楼层 |阅读模式
之前没有一点儿操作数据库的实际经验,python也没有实现过完整的程序。几乎是走一步搜一步,学到的倒也挺多,对数据库没有那么陌生了。遇到的最大问题却是编码问题……
--------------------------------------------------------------------------------------

一、准备
1、下载泄漏的QQ数据库。7z格式压缩24.5G,解压后100G。包含11个GroupData.MDF与11个QQInfo.MDF。
2、安装SQL Server,采用的2005。计算机为Win7.
3、安装pymssql模块。使用的Python2.7,windows下没有官方发布的针对python2.7的pymssql,从这里得到的猛点。
      最好使用pyodbc,因为pymssql有中文编码问题。

二、添加数据库
只有MDF,没有LDF。MDF是数据库主文件,LDF是日志文件。
① 可以在SQL Server Management Studio中手动添加。数据库--右键附加--添加--选择MDF。会自动添加LDF信息,因为没有LDF,需要手动将其删除,不然会报错。
② 采用SQL语句批量附加:EXEC sp_attach_db DBName, FilePath
如 EXEC sp_attach_db "GroupData1", "H:\QQ数据库\QunData\GroupData1_Data.MDF"
每个GroupData数据库包含100个表,格式相同,存有QQ号与QQ群的对应关系,以及年龄昵称等信息。每个QQInfo数据库包含10张表,包含QQ群的标题,描述等信息。

三、Python连接数据库
# 采用pyssql:  
conn = pymssql.connect(host='localhost', user='user', password='passwd', database='dbname')  
# 采用pydobc:  
conn = pyodbc.connect("DRIVER={SQL Server}; SERVER=127.0.0.1; DATABASE=dbname; UID=user; PWD=passwd")  
cur = conn.cursor()  
cur.execute("select QQNum from Group1 where QunNum = 100010")  
rows = cur.fetchall() # 返回的是列表  

主要思路是将查询操作分发到各个数据库的各个表,并收集结果,格式化输出,写入文件。

三、人机交互:cmd模块
import cmd  
from QQDBTools import *  


class QQDB(cmd.Cmd):  

    def __init__(self):  
        cmd.Cmd.__init__(self)  
        self.prompt = 'QQDB >>> '  
        print "\n\t\t\t欢迎使用QQ群数据库浏览工具\n"  


    def help_getqq(self):  
        print "如果只显示请输入: getqq 10010101"  
        print "如果想保存请输入: getqq 10010101 w"  
    def do_getqq(self, arg):  
        getQQInfo(arg)  


    def help_getqun(self):  
        print "如果只显示请输入: getqun 100010"  
        print "如果想保存请输入:getqun 100010 w"  
    def do_getqun(self, arg):  
        getQunData(arg)  


    def default(self, line):        # 输入无法识别执行该函数  
        print "无法识别"  


    def emptyline(self):            # 输入为空执行该函数  
        pass  


    def help_quit(self):  
        print "退出程序"  
    def do_quit(self, line):  
        sys.exit()  


if __name__ == '__main__':  
    qqdb = QQDB()  
    qqdb.cmdloop()  

20131128224806843.jpg
20131128224810187.jpg

这牛8的QQ号不是本人的,随便找了一个

四、中文编码
1、预备知识
数据库中一般非Unicode字符串类型包括char、varchar、text,Unicode字符串类型包括nchar、nvarchar、ntext。(可在 具体数据库--可编程性--类型--系统数据类型 查看)
若保存中文,char(20)只能保存10个汉字,而nchar(20)才可保存20个汉字。因为char(20)表明占用20个字节,然而,数据库中求字符串长度、截取子串等操作是以字符个数为基准的,需要注意。
QQ数据库中采用的varchar保存字符串。
use master select * from syscharsets  # 查询数据库支持的字符集,及windows支持的字符集  
sp_helpsort  # 查询数据库当前排序规则,前半部分即为当前字符集,为Chinese-PRC  
select collationproperty('chinese_prc_stroke_ci_ai_ks_ws', 'codepage') # 查询编码格式  
# 结果为cp936,此为微软的表示方式,与国标GBK近乎相同  
pymssql.connect()时,可指定字符集,charset="utf8"。而且只能是utf8这样写,若写作utf-8竟然出错~~~

2、尝试
在任何地方都不指定编码格式,连接后提示某些字符无法解析。
'''UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position 1: ordinal not in range(128)'''
因为python系统默认编码是ascii,可用sys.getdefaultencoding()查看
将所有地方指定为utf8。
# coding: utf8   # 并将文件保存为utf8格式  
pymssql.connect(..., charset='utf8') # 使用utf8连接数据库  
reload(sys)  
sys.setdefaultencoding('utf8')  # 将python系统内部编码格式置为utf8  
可以执行,但将查询返回结果print或f.write时,中文字符乱码。
控制台默认为gbk编码,utf8直接打印乱码。但我用的sublime text,utf8是可以正常显示的。
不过,还是尝试重新编码为gbk,同样乱码。
尝试使用charset="gbk"连接数据,查询时直接报错。
…………
…………
山穷水尽时,在另一台XP上使用python远程连接数据库,不做任何编码解码,使用gbk保存,连接,打印。没问题。
理论上,XP与Win7只要语言及区域都是中文,所才有的cp936不会有差别啊……
3、解决方法
① 使用XP,不必做特殊转换,或者明确指定gbk就行
② 使用Win7,返回结果提取字符串s,s = s.encode("latin1")。然后s就可以正常显示打印写入文件了。
     很奇葩啊!不知为何,总之是一大神说的 http://stackoverflow.com/questio ... -python-unicode-str
     更奇葩的是,这样就不能在XP上执行了……
③ 使用pyodbc,指定gbk,什么问题都没有了。开始就用这个,便不会如此虐心了……

五、数据库优化
1、建立索引
QQ数据库除了ID外,只对GroupData的QunNum即群号建立了索引。QQ号查询时,所有数据库扫描一遍至少需要10分钟。对QQNum简历索引。
if exists (select name from sysindexes where name=IndexName)    # 如果已经存在索引  
    drop index TableName.IndexName                              # 删除该索引  


create nonclustered index IndexName     # 建立非聚集索引 # 另有聚集索引 适用场景不同         
    on TableName(ColumnName)            # 在某个表的某列上                    
    with fillfactor=90                  # 填充因子,表示占用空间百分比  
                                        # 因为不会对该数据库再增添新数据,所以不必留有太多剩余空间  
2、更改列数据类型
实在不知道如何解决乱码问题时,尝试将varchar改为nvarchar,即用unicode存储。试验时不会出现中文乱码了。

可打算将所有数据库更改时,发现太慢,数据库有向200G进军的趋势,并且一个数据库日志LDF就45G多……
还是回到解决编码的正经途径上吧……
[python] view plaincopy
alter table TableName  
  alter column ColumnName nvarchar(20)  
3、减小日志
经过上一步操作,部分数据太大了
减小日志的方法:
①  a、 dump transaction DBname with no_log
      b、 backup log DBname with no_log
      c、收缩数据库
      d、设定自动收缩
②  分离数据库,删除日志文件,再附加,OK!
      分离数据库的sql语句:EXEC sp_detach_db DBName

六、杂七杂八
1、查询表索引 sp_helpindex TableName
2、查询最大ID select top1 * from TableName order by ID desc
      或者 select * from TableName where ID in (select max(ID) from TableName)
      但是貌似没有第一种效率高
3、查询数据库所有表 select name from sysobjects where xtype='U'
4、python可用 int(strnum) str(intnum) 快捷的在字符串与数字之间转换
5、python格式化输出 "%-15s%s" % (...) 其中表示第一个参数占据15个空间,左对齐,若无-号右对其
5、python实现进度百分比,关键在于sys.stdout.write("%s%%\r" % (percentage))上。
      sys.stdout.write(s)与file.write(s)类似,只不过是写到标准输出上。
      '\r'表示回车,即回到行首,'\n'表示换行到下一行。不能用print()因为print表示打印一行。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-10776-1-1.html 上篇帖子: python之高性能网络编程并发框架eventlet实例 下篇帖子: Python数据结构-字典 数据库

尚未签到

发表于 2013-12-7 21:42:49 | 显示全部楼层
宁愿错过也不会把话说出口的人最蠢。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-12-16 13:46:10 | 显示全部楼层
不要被所谓的甜言蜜语所迷惑。这世界,很虚伪。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-12-23 08:44:03 | 显示全部楼层
人这辈子就是为了自己而活的.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2013-12-29 13:04:06 | 显示全部楼层
没有过不去的坎,只有不走路的人,所以路都是自己走出来的

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表