Skip to content

Commit 13b2fd4

Browse files
authored
Add files via upload
1 parent 701b29a commit 13b2fd4

72 files changed

Lines changed: 5039 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
import json
2+
import pickle
3+
import requests
4+
from mysqlite import MySqlite
5+
import pymysql
6+
7+
8+
class Mysql():
9+
10+
def __init__(self):
11+
self.connent_sql = pymysql.connect(user='root',
12+
password="crazyrookie",
13+
host="127.0.0.1",
14+
port=3306,
15+
charset="utf8mb4")
16+
self.cursor = self.connent_sql.cursor()
17+
18+
sql = """
19+
CREATE DATABASE IF NOT EXISTS information DEFAULT CHARACTER SET utf8mb4;
20+
USE information;
21+
CREATE TABLE IF NOT EXISTS firend_information(
22+
uin VARCHAR(11) UNIQUE,
23+
nickname VARCHAR(88),
24+
gender VARCHAR(2) DEFAULT " ",
25+
age VARCHAR(3) DEFAULT " ",
26+
city VARCHAR(10) DEFAULT " ",
27+
country VARCHAR(20) DEFAULT " "
28+
29+
);
30+
"""
31+
32+
self.cursor.execute(sql)
33+
self.connent_sql.commit()
34+
35+
36+
def sava_information(self,uin,nickname,gender,age,city,country):
37+
try:
38+
sql = "INSERT INTO firend_information (uin,nickname,gender,age,city,country) VALUES ('{}','{}','{}','{}','{}','{}');".format(uin,nickname,gender,age,city,country)
39+
self.cursor.execute(sql)
40+
self.connent_sql.commit()
41+
42+
except pymysql.err.IntegrityError:
43+
pass
44+
45+
class Sqlite(MySqlite):
46+
47+
def __init__(self):
48+
MySqlite.__init__(self)
49+
50+
class Information():
51+
52+
def __init__(self):
53+
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"}
54+
55+
def read_token(self):
56+
with open('token_gtk_sid.txt', 'r') as rt:
57+
return json.load(rt)['qzonetoken']
58+
59+
def read_gtk(self):
60+
with open('token_gtk_sid.txt') as rt:
61+
return json.load(rt)['gtk']
62+
63+
def read_sid(self):
64+
with open('token_gtk_sid.txt', 'r') as rt:
65+
return json.load(rt)['sid']
66+
67+
def getCookie(self):
68+
try:
69+
with open("cookie.txt", 'rb') as f:
70+
cookie = pickle.load(f)
71+
return cookie
72+
except EOFError:
73+
pass
74+
75+
def get_login_qq_number(self):
76+
with open('myQQ.txt', 'r') as f:
77+
number = f.read().strip()
78+
name = number.split('\n')[0].split(" ")[0]
79+
return name
80+
81+
def get_firend_qzone_date(self, firend_qq=''):
82+
print("开始获取 '{}' 的信息".format(firend_qq))
83+
username = self.get_login_qq_number()
84+
url = "https://h5.qzone.qq.com/webapp/json/friendSetting/getMainPage?qzonetoken={}&g_tk={}&uin={}&visituin={}".format(self.read_token(), self.read_gtk(),firend_qq, username)
85+
request_firend_url = requests.get(url, headers=self.headers, cookies=self.getCookie())
86+
json_data = json.loads(request_firend_url.text)
87+
try:
88+
print(
89+
'浏览者QQ: ', json_data['data']['profile']['uin'],
90+
"昵称: ", json_data['data']['profile']['nickname'],
91+
"性别: ", json_data['data']['profile']['gender'],
92+
"年龄: ", json_data['data']['profile']['age'],
93+
"城市: ", json_data['data']['profile']['city'],
94+
"国家: ", json_data['data']['profile']['country'],
95+
)
96+
# Mysql().sava_information(json_data['data']['profile']['uin'],
97+
# json_data['data']['profile']['nickname'],
98+
# json_data['data']['profile']['gender'],
99+
# json_data['data']['profile']['age'],
100+
# json_data['data']['profile']['city'],
101+
# json_data['data']['profile']['country'])
102+
Sqlite().del_information_qq_number(firend_qq)
103+
except KeyError:
104+
print("空间主人设置了访问权限,您无法进行操作")
105+
106+
def main(information):
107+
# information_qq = Sqlite().read_information_number()
108+
# while information_qq:
109+
# n = 1
110+
information_qq = Sqlite().read_information_number()
111+
while information_qq:
112+
information_qq = Sqlite().read_information_number()
113+
if information_qq == []:
114+
print("QQ号没啦~请继续获取~")
115+
else:
116+
for num in information_qq:
117+
information.get_firend_qzone_date(num[0])
118+
119+
120+
121+
122+
if __name__ == '__main__':
123+
information = Information()
124+
main(information)

Python/QQStrip/Friend_qq_number.py

Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
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={}&param={}&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={}&param={}&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

Comments
 (0)