设为首页 收藏本站
查看: 3909|回复: 0

[经验分享] 泄露的QQ群数据库查询-python

[复制链接]

尚未签到

发表于 2015-4-19 07:45:07 | 显示全部楼层 |阅读模式
  有段时间,腾讯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     
  

运维网声明 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-58542-1-1.html 上篇帖子: Python中的Descriptor 下篇帖子: 【循序渐进学Python】2. Python中的序列——列表和元组
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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