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("没有采集到附近用户")
posted @ 2025-07-07 13:30  财神哥哥的未来  阅读(48)  评论(0)    收藏  举报