|
有段时间,腾讯QQ数据库泄露了,广大热心网友都在为此疯狂,本人连夜写了个python脚本,功能还不全,含基本的QQ群查询,QQ数据库建立索引语句。。。。希望大家喜欢,后期将会送上QQ群成员查询,界面版的python执行文件等等。。。总之会把功能补全
PS:第一次运行脚本的时候,最好先把建立索引的语句的注释去掉...建立索引需要时间(普通机器起码一个小时),建立完之后,查询速度将会大大加快。为了防止内存被SQL Server 完全吃完,建议调小最大服务器内存。。。采用默认的数值的话,查询时间肯定是闪电般的,不过查多几次,SQL Server 完全吃完内存就只能重启SQL Server 释放内存了...
*建立索引须知:
第一次运行的时候去掉下面两条语句的#符号
#QQ.createAllDataGroupIndex()#you should use the function once when you first time attach the QQ database
#QQ.createAllQunInfoIndex()
而且运行脚本建立索引的时候不可以中断;之后运行脚本的时候,必须把这两条语句注释掉(加回#),以免运行出错(不能重复建立索引)。
第一次更新:
1.提供了自动化查询,无需修改脚本,运行脚本的时候,按提示输入相关信息即可。
2.完善了QQ群查询,增加了QunInfo数据库的建立索引语句。
3.可以查询某个群号内的所有成员。
4.可以查询某个群号的相关信息(创建时间等等)。
**小更新:
1.解决raw_input乱码问题;防止在windows下直接运行该脚本一闪而过。
广而告之:
各位喜欢我的小工具的朋友,由于本人现在忙于打理我的网站界绍部
本工具暂时不会再更新了,有问题的朋友可以到我的网站www.jieshaobu.com留言或者加发邮件给我,我有时间都会一一回复的。
运行环境:python 2.7.5 + pyodbc 3.0.7
声明:如果贵公司或相关部门认为本脚本侵犯了您的利益,联系本人,本人会删除相关的文章与代码。QQ:1842764009
注意:本文章及相关文章所含信息与代码禁止用作其他非法用途,后果自负!
以下为更新后的脚本(原脚本已经删除):
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3 # Author: YiBang Ruan
4
5 import pyodbc
6
7 class ODBC_QQ:
8 def __init__( self, DRIVER, SERVER, DATABASE, UID, PWD):
9 ''' initialization '''
10 self.DRIVER = DRIVER
11 self.SERVER = SERVER
12 self.DATABASE = DATABASE
13 self.UID = UID
14 self.PWD = PWD
15
16 def Connect(self):
17 ''' Connect to the DB '''
18 if not self.DATABASE:
19 raise(NameError,"no setting db info")
20 self.connect = pyodbc.connect(DRIVER=self.DRIVER, SERVER=self.SERVER, DATABASE=self.DATABASE, UID=self.UID, PWD=self.PWD, charset="UTF-8")
21
22 def GetConnect( self ):
23 return self.connect
24
25 def closeConnect( self ):
26 return self.connect.close()
27
28 def fetchall( self, sql):
29 ''' Perform one Sql statement '''
30 cursor = self.connect.cursor() #get the handle
31 cursor.execute(sql)
32 rows = cursor.fetchall()
33 return rows
34
35 def ExecNoQuery(self,sql):
36 ''' Person one Sql statement like write data, or create table, database and so on'''
37 cursor = self.connect.cursor() #get the handle
38 cursor.execute(sql)
39 self.connect.commit()
40
41 def fetchone_cursor( self, sql ):
42 ''' use less mem when one by one to read the data '''
43 cursor = self.connect.cursor() #get the handle
44 cursor.execute(sql)
45 return cursor
46 def getAllQQDataBaseName( self, condition ) :
47 selectsql = "select name from sys.databases "
48 names = self.fetchall( selectsql + condition )
49 return names
50 def getDataBaseAllTableName( self, databasename) :
51 use = "USE "
52 self.ExecNoQuery( use + databasename )
53 select = "SELECT name FROM sys.objects Where Type='U' and name!='dtproperties'"
54 names = self.fetchall( select )
55 return names
56 def getallDataBaseName( self ):
57 conditionstr = "where name like 'GroupData%' "
58 self.GroupDataNames = self.getAllQQDataBaseName(conditionstr)
59 conditionstr = "where name like 'QunInfo%' "
60 self.QunInfoNames = self.getAllQQDataBaseName(conditionstr)
61 def getQunNumOfQQnumber( self, QQNumber):
62 QunNumbers = []
63 for dataname in self.GroupDataNames :
64 print u"正在查找数据库:" + dataname[0]
65 TableNames = self.getDataBaseAllTableName( dataname[0] )
66 for tablename in TableNames :
67 selectsql = "select QQNum, Nick, QunNum from " + tablename[0] + " where QQNum = "
68 rows = self.fetchall( selectsql + QQNumber )
69 if len( rows ) > 0:
70 print u"在该表找到该号码的群:" + tablename[0]
71 QunNumbers.extend(rows)
72 return QunNumbers
73 def getQunMembersofQunNumber( self, QunNumber):
74 QunMembers = []
75 for dataname in self.GroupDataNames :
76 print u"正在查找数据库:" + dataname[0]
77 TableNames = self.getDataBaseAllTableName( dataname[0] )
78 for tablename in TableNames :
79 selectsql = "select min(QunNum), max(QunNum) from " + tablename[0]
80 min_max = self.fetchall( selectsql)
81 if min_max[0][0] != None : # avoid empty table
82 if int(min_max[0][0]) 0:
99 print u"在该表找到群信息:" + tablename[0]
100 QunInformation.extend(rows)
101 hadFound = True
102 break;
103 if hadFound:
104 break
105 return QunInformation
106 def createAllDataGroupIndex( self ):
107 for dataname in self.GroupDataNames :
108 print u"正在为该数据库的所有表添加索引:" + dataname[0]
109 TableNames = self.getDataBaseAllTableName( dataname[0] )
110 for tablename in TableNames :
111 indexsql = "CREATE INDEX QQNumIndex ON " + tablename[0] + "(QQNum)"
112 self.ExecNoQuery(indexsql)
113 def createAllQunInfoIndex( self ):
114 for dataname in self.QunInfoNames :
115 print u"正在为该数据库的所有表添加索引:" + dataname[0]
116 TableNames = self.getDataBaseAllTableName( dataname[0] )
117 for tablename in TableNames :
118 indexsql = "CREATE INDEX QunNumIndex ON " + tablename[0] + "(QunNum)"
119 self.ExecNoQuery(indexsql)
120 def checkQQqun( QQ, QQnumber ):
121 while 1 :
122 QunNumbers = QQ.getQunNumOfQQnumber( QQnumber )
123 print u"\nQQ号码 QQ昵称 QQ群 Q群人数 Q群名称 Q群公告"
124 for qun in QunNumbers:
125 QunInformation = QQ.getQunInformation( qun.QunNum )
126 if len(QunInformation) > 0:
127 print qun.QQNum, qun.Nick.decode('gb2312','ignore').encode('utf-8'), qun.QunNum, \
128 QunInformation[0].MastQQ,\
129 QunInformation[0].Title.decode('gb2312','ignore').encode('utf-8'),\
130 QunInformation[0].QunText.decode('gb2312','ignore').encode('utf-8')
131 else:
132 print qun.QQNum, qun.Nick.decode('gb2312','ignore').encode('utf-8'), qun.QunNum
133 handle = raw_input( u"\n是否继续查询(y/n):")
134 if handle == "y" or handle == "Y":
135 QQnumber = raw_input(u"请输入你想查询的QQ号码:")
136 else:
137 break
138 def checkQunMembers( QQ, Qunnumber ):
139 QunMembers = QQ.getQunMembersofQunNumber( Qunnumber )
140 print u"\n以下信息为群内的QQ号码+QQ昵称:"
141 for Member in QunMembers:
142 print Member.QQNum,Member.Nick.decode('gb2312','ignore').encode('utf-8')
143 def checkQunInformation( QQ, Qunnumber ):
144 QunInformation = QQ.getQunInformation( Qunnumber )
145 if len(QunInformation) == 0:
146 print u"\n!!!!!!!!!!!上百G的数据库里面没该群的信息!!!!!!!!!"
147 return
148 print u"\n群号码 群人数 建群时间 群昵称 Class(不知道是什么) 群公告:"
149 print QunInformation[0].QunNum, QunInformation[0].MastQQ, QunInformation[0].CreateDate,\
150 QunInformation[0].Title.decode('gb2312','ignore').encode('utf-8'), QunInformation[0].Class,\
151 QunInformation[0].QunText.decode('gb2312','ignore').encode('utf-8')
152 def main():
153 QQ = ODBC_QQ('{SQL SERVER}', r'127.0.0.1', 'master', 'sa', '123456789')
154 QQ.Connect()
155 QQ.getallDataBaseName()
156 #QQ.createAllDataGroupIndex()#you should use the function once when you first time attach the QQ database
157 #QQ.createAllQunInfoIndex()
158 while 1 :
159 print u"\n1---根据QQ号码,查询QQ号码所在的群"
160 print u"2---根据群号,查询群成员"
161 print u"3---根据群号,查询群信息"
162 print u"其他输入为退出本系统"
163 handle = raw_input(u"输入你想要的操作类型(1 or 2 or 3 or other):".encode('gbk'))
164 if 1 == int(handle):
165 QQnumber = raw_input(u"请输入你想查询的QQ号码:".encode('gbk'))
166 checkQQqun( QQ, QQnumber)
167 elif 2 == int(handle):
168 Qunnumber = raw_input(u"请输入你想查询的QQ群号:".encode('gbk'))
169 checkQunMembers( QQ, Qunnumber)
170 elif 3 == int(handle):
171 Qunnumber = raw_input(u"请输入你想查询的QQ群号:".encode('gbk'))
172 checkQunInformation( QQ, Qunnumber)
173 else:
174 break
175 QQ.closeConnect()
176 if __name__ == '__main__':
177 main()
178
|
|