1+ import requests
2+ import json
3+ import pickle
4+ import os
5+ import threading
6+ from multiprocessing import Process ,Pool
7+ from mysqlite import MySqlite
8+ from datetime import datetime
9+ import time
10+
11+
12+ class Sqlite (MySqlite ):
13+
14+ def __init__ (self ):
15+ MySqlite .__init__ (self )
16+
17+ class QQ_number ():
18+
19+ def __init__ (self ):
20+ self .headers = {"user-agent" : "Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.255" }
21+
22+
23+ def read_token (self ):
24+ with open ('token_gtk_sid.txt' , 'r' ) as rt :
25+ return json .load (rt )['qzonetoken' ]
26+
27+ def read_gtk (self ):
28+ with open ('token_gtk_sid.txt' ,'r' ) as rt :
29+ return json .load (rt )['gtk' ]
30+
31+ def read_sid (self ):
32+ with open ('token_gtk_sid.txt' , 'r' ) as rt :
33+ return json .load (rt )['sid' ]
34+
35+ def getCookie (self ):
36+ with open ("token_gtk_sid.txt" ,'r' ) as rc :
37+ return json .loads (json .load (rc )['cookie' ])
38+ # try:
39+ # with open("cookie.txt", 'rb') as f:
40+ # cookie = pickle.load(f)
41+ # return cookie
42+ # except EOFError:
43+ # pass
44+
45+ def get_login_qq_number (self ):
46+ with open ('myQQ.txt' , 'r' ) as f :
47+ number = f .read ().strip ()
48+ name = number .split ('\n ' )[0 ].split (" " )[0 ]
49+ return name
50+
51+ def filter_data (self ,friend_qq ):
52+ username = self .get_login_qq_number ()
53+ url = "https://h5.qzone.qq.com/webapp/json/friendSetting/getMainPage?qzonetoken={}&g_tk={}&uin={}&visituin={}" .format (
54+ self .read_token (), self .read_gtk (),friend_qq , username )
55+ try :
56+ request_firend_url = requests .get (url , headers = self .headers , cookies = self .getCookie ())
57+ json_data = json .loads (request_firend_url .text )
58+ return json_data ['data' ]['profile' ]['city' ]
59+ except KeyError :
60+ print ("空间主人设置了访问权限,您无法进行操作" )
61+
62+
63+ def firend_permission (self , uin = None ):
64+ qzonetoken = self .read_token ()
65+ gtk = self .read_gtk ()
66+ url = "https://mobile.qzone.qq.com/list?qzonetoken={}&g_tk={}&format=json&list_type=shuoshuo&action=0&res_uin={}&count=10" .format (
67+ qzonetoken ,gtk , uin )
68+ request_shuoshuo_first_url = requests .get (url , headers = self .headers , cookies = self .getCookie ())
69+ json_data = json .loads (request_shuoshuo_first_url .text )
70+ try :
71+ feedskey = json_data ['data' ]['vFeeds' ][0 ]['comm' ]['feedskey' ]
72+ appid = json_data ['data' ]['vFeeds' ][0 ]['comm' ]['appid' ]
73+ url = "https://h5.qzone.qq.com/proxy/domain/g.qzone.qq.com/cgi-bin/friendshow/cgi_get_visitor_single?uin={}&appid={}&blogid={}¶m={}&ref=qzfeeds&beginNum=1&num=24&g_tk={}&qzonetoken={}" .format (
74+ uin , appid , feedskey , feedskey , gtk , qzonetoken )
75+ sad_see_request = requests .get (url , cookies = self .getCookie ()).text
76+ jsdate = json .loads (sad_see_request [10 :- 3 ])
77+ if jsdate ['message' ] != 'succ' :
78+ return 0
79+ else :
80+ return 1
81+ except KeyError :
82+ print ("空间主人设置了访问权限,您无法进行操作" )
83+
84+ def get_sad_see (self , uin = None , appid = None , logid = None , starttime = None , stoptime = None ):
85+ city1 = "昆明"
86+ city2 = "丽江"
87+ gtk = self .read_gtk ()
88+ qzonetoken = self .read_token ()
89+ sqlite = Sqlite ()
90+ proxies = {
91+ 'http' : 'http://182.96.194.88' ,
92+ 'https' : 'https://1.199.192.143'
93+ }
94+ url = "https://h5.qzone.qq.com/proxy/domain/g.qzone.qq.com/cgi-bin/friendshow/cgi_get_visitor_single?uin={}&appid={}&blogid={}¶m={}&ref=qzfeeds&beginNum=1&num=24&g_tk={}&qzonetoken={}" .format (
95+ uin , appid , logid , logid , gtk , qzonetoken )
96+ sad_see_request = requests .get (url , cookies = self .getCookie ()).text
97+ jsdate = json .loads (sad_see_request [10 :- 3 ])
98+ if jsdate ['message' ] == "请登录后再试" :
99+ print ("可能被冻结了....换号吧" )
100+ with open ("token_gtk_sid.txt" , 'r' ) as f :
101+ data = json .load (f )
102+ qq = data ['qq' ]
103+ Sqlite ().del_cookie (qq )
104+ main ()
105+ os ._exit (1 )
106+ elif jsdate ['message' ] == 'succ' :
107+ print ("开始爬取 '{}' 的说说 '{}'" .format (uin ,logid ))
108+ Sqlite ().del_undone_shuoshuo_key_and_sava_completed_shuoshuo_key (uin ,logid )
109+ for date in range (len (jsdate ['data' ]['list' ])):
110+ if starttime == None and stoptime == None :
111+ print ("发布说说的QQ号: " , uin , "看了这条说说的QQ号:" , jsdate ['data' ]['list' ][date ]['uin' ], '访问时间: ' ,datetime .fromtimestamp (jsdate ['data' ]['list' ][date ]['time' ]), "用户名: " ,jsdate ['data' ]['list' ][date ]['name' ])
112+ if self .firend_permission (jsdate ['data' ]['list' ][date ]['uin' ]) == 0 :
113+ print ("QQ:{} 抱歉,由于对方设置,您没有权限查看这些访客,所以不存入数据库..." .format (uin ))
114+ else :
115+ if self .filter_data (jsdate ['data' ]['list' ][date ]['uin' ]) == city1 :
116+ print ("爬取到一个 {} 的用户,QQ '{}'" .format (city1 ,jsdate ['data' ]['list' ][date ]['uin' ]))
117+ sqlite .sava_beijing_undone_qq_number_and_sava_information_qq_number (jsdate ['data' ]['list' ][date ]['uin' ])
118+ print ('{} 已保存到临时数据库中...' .format (jsdate ['data' ]['list' ][date ]['uin' ]))
119+ else :
120+ print ("得到QQ '{}',并保存到临时数据库中....." .format (jsdate ['data' ]['list' ][date ]['uin' ]))
121+ sqlite .sava_undone_qq_number_and_sava_information_qq_number (jsdate ['data' ]['list' ][date ]['uin' ])
122+ print ('{} 已保存到临时数据库中...' .format (jsdate ['data' ]['list' ][date ]['uin' ]))
123+ elif str (starttime ) <= str (datetime .fromtimestamp (jsdate ['data' ]['list' ][date ]['time' ]))[0 :4 ] and str (
124+ stoptime ) >= str (datetime .fromtimestamp (jsdate ['data' ]['list' ][date ]['time' ]))[0 :4 ]:
125+ print ("发布说说的QQ号: " , uin , "看了这条说说的QQ号:" , jsdate ['data' ]['list' ][date ]['uin' ], '访问时间: ' ,datetime .fromtimestamp (jsdate ['data' ]['list' ][date ]['time' ], "用户名: " ,jsdate ['data' ]['list' ][date ]['name' ]))
126+ if self .firend_permission (jsdate ['data' ]['list' ][date ]['uin' ]) == 0 :
127+ print ("QQ:{} 抱歉,由于对方设置,您没有权限查看这些访客,所以不存入数据库..." .format (uin ))
128+ else :
129+ if self .filter_data (jsdate ['data' ]['list' ][date ]['uin' ]) == city1 :
130+ print ("爬取到一个 {} 的用户,QQ '{}'" .format (city1 ,jsdate ['data' ]['list' ][date ]['uin' ]))
131+ sqlite .sava_beijing_undone_qq_number_and_sava_information_qq_number (jsdate ['data' ]['list' ][date ]['uin' ])
132+ print ('{} 已保存到临时数据库中...' .format (jsdate ['data' ]['list' ][date ]['uin' ]))
133+ else :
134+ sqlite .sava_undone_qq_number_and_sava_information_qq_number (jsdate ['data' ]['list' ][date ]['uin' ])
135+ print ("得到QQ '{}',并保存到临时数据库中....." .format (jsdate ['data' ]['list' ][date ]['uin' ]))
136+ else :
137+ pass # 方便扩展~
138+ else :
139+ print ("QQ:{} 抱歉,由于对方设置,您没有权限查看这些访客" .format (uin ))
140+
141+
142+ def change_cookie ():
143+ print ("--------------------------------" )
144+ print ("开始切换cookie...................|" )
145+ print ("--------------------------------" )
146+ time .sleep (5 )
147+ cookies = Sqlite ().read_cookie ()
148+ cookie_and_args = {}
149+ cookie_and_args ['qq' ] = cookies [0 ]
150+ cookie_and_args ['cookie' ] = cookies [1 ]
151+ cookie_and_args ['gtk' ] = cookies [2 ]
152+ cookie_and_args ['sid' ] = cookies [3 ]
153+ cookie_and_args ['qzonetoken' ] = cookies [4 ]
154+
155+ with open ("token_gtk_sid.txt" , 'w' ) as tgs :
156+ json .dump (cookie_and_args ,tgs )
157+ del_cookie ()
158+
159+ def del_cookie ():
160+ with open ("token_gtk_sid.txt" ,'r' ) as f :
161+ data = json .load (f )
162+ qq = data ['qq' ]
163+ cookie = data ['cookie' ]
164+ gtk = data ['gtk' ]
165+ sid = data ['sid' ]
166+ qzonetoken = data ['qzonetoken' ]
167+ Sqlite ().del_cookie (qq )
168+ Sqlite ().sava_cookie_and_args (qq ,cookie ,gtk ,sid ,qzonetoken )
169+
170+ def main ():
171+ # sqlite = Sqlite()
172+ qq_see = QQ_number ()
173+ get_total_number = Sqlite ().read_20_shuoshuo_key ()
174+ while get_total_number :
175+ dicts = []
176+ get_total_number = Sqlite ().read_20_shuoshuo_key ()
177+ for i in get_total_number :
178+ # qq_see.get_sad_see(i[0], i[1], i[2])
179+ t = threading .Thread (target = qq_see .get_sad_see ,args = (i [0 ],i [1 ],i [2 ]))
180+ dicts .append (t )
181+
182+ for x in dicts :
183+ x .setDaemon (True )
184+ x .start ()
185+ x .join ()
186+ change_cookie ()
187+
188+
189+ if __name__ == '__main__' :
190+ main ()
191+ # del_cookie()
192+ # del_cookie()
193+ # change_cookie()
194+ # s = QQ_number()
195+ # print(s.getCookie())
0 commit comments