QQ附近人采集工具,提取附近人QQ好友,用python实现框架开发
下载地址:https://www.pan38.com/share.php?code=JCnzE 提取密码:7789
这个框架实现了QQ附近人采集的基本功能,包括登录验证、附近人列表获取、用户详情采集、批量采集和多线程处理等功能。代码中加入了随机延迟和User-Agent轮换等反爬措施。请注意,实际使用时需要替换有效的QQ账号和密码,并且腾讯可能会更新其API接口导致代码失效。
import requests
import json
import time
import random
from fake_useragent import UserAgent
from concurrent.futures import ThreadPoolExecutor
class QQNearbyCrawler:
def init(self, qq_number, qq_password):
self.session = requests.Session()
self.ua = UserAgent()
self.base_url = "https://ti.qq.com"
self.headers = {
"User-Agent": self.ua.random,
"Referer": "https://ti.qq.com/",
"Origin": "https://ti.qq.com"
}
self.qq_number = qq_number
self.qq_password = qq_password
self.token = None
self.cookies = None
def login(self):
"""模拟QQ登录获取token和cookies"""
login_url = f"{self.base_url}/login"
data = {
"qq": self.qq_number,
"password": self.qq_password,
"remember": "on"
}
try:
response = self.session.post(login_url, data=data, headers=self.headers)
if response.status_code == 200:
result = response.json()
if result.get("code") == 0:
self.token = result.get("data").get("token")
self.cookies = response.cookies.get_dict()
print("登录成功")
return True
print("登录失败:", response.text)
return False
except Exception as e:
print("登录异常:", str(e))
return False
def get_nearby_users(self, lat, lng, radius=1000, page=1, page_size=20):
"""获取附近的人"""
if not self.token:
print("请先登录")
return None
nearby_url = f"{self.base_url}/nearby"
params = {
"lat": lat,
"lng": lng,
"radius": radius,
"page": page,
"page_size": page_size,
"token": self.token
}
try:
response = self.session.get(nearby_url, params=params, headers=self.headers, cookies=self.cookies)
if response.status_code == 200:
result = response.json()
if result.get("code") == 0:
return result.get("data").get("list")
print("获取附近人失败:", response.text)
return None
except Exception as e:
print("获取附近人异常:", str(e))
return None
def get_user_details(self, user_id):
"""获取用户详细信息"""
if not self.token:
print("请先登录")
return None
detail_url = f"{self.base_url}/user/detail"
params = {
"user_id": user_id,
"token": self.token
}
try:
response = self.session.get(detail_url, params=params, headers=self.headers, cookies=self.cookies)
if response.status_code == 200:
result = response.json()
if result.get("code") == 0:
return result.get("data")
print("获取用户详情失败:", response.text)
return None
except Exception as e:
print("获取用户详情异常:", str(e))
return None
def batch_crawl(self, lat, lng, radius=1000, pages=5, page_size=20):
"""批量采集附近的人"""
if not self.login():
return []
all_users = []
with ThreadPoolExecutor(max_workers=5) as executor:
futures = []
for page in range(1, pages+1):
futures.append(executor.submit(self._crawl_page, lat, lng, radius, page, page_size))
for future in futures:
users = future.result()
if users:
all_users.extend(users)
time.sleep(random.uniform(1, 3)) # 随机延迟防止被封
return all_users
def _crawl_page(self, lat, lng, radius, page, page_size):
"""采集单页数据"""
users = self.get_nearby_users(lat, lng, radius, page, page_size)
if not users:
return []
detailed_users = []
for user in users:
details = self.get_user_details(user.get("user_id"))
if details:
detailed_users.append(details)
time.sleep(random.uniform(0.5, 1.5)) # 随机延迟
return detailed_users
def save_to_file(self, data, filename="qq_nearby_users.json"):
"""保存数据到文件"""
try:
with open(filename, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
print(f"数据已保存到{filename}")
return True
except Exception as e:
print("保存文件失败:", str(e))
return False
if name == "main":
# 使用示例
crawler = QQNearbyCrawler("你的QQ号", "你的QQ密码")
# 设置经纬度和搜索半径(单位:米)
latitude = 39.9042 # 北京纬度
longitude = 116.4074 # 北京经度
search_radius = 2000 # 2公里范围
# 采集附近的人(采集5页,每页20人)
nearby_users = crawler.batch_crawl(latitude, longitude, search_radius, 5, 20)
# 保存结果
if nearby_users:
crawler.save_to_file(nearby_users)
print(f"共采集到{len(nearby_users)}个附近用户")
else:
print("没有采集到附近用户")