[
  {
    "path": "README.md",
    "content": "# 免费社工库平台LosePrivacy源代码与API库 \n\n## 什么是LosePrivacy\n\n[LosePrivacy](https://loseprivacy.icu)收录了近10多年全球著名的数据泄露事件及数据，方便用户真实掌握：我们哪些隐私信息被泄露了、隐私信息被谁泄露了。\n\n## loseprivacy-cli\n\nLosePrivacy-cli可以让用户通过命令行快速查询社工库平台的数据，安全、高效。\n\nLosePrivacy-cli主要是基于LosePrivacy API v1的部分接口完成。关于LosePrivacy API的详细描述请移步：[LosePrivacy API](https://loseprivacy.github.io)。\n\n## 下载\n\n```\ngit clone https://github.com/loseprivacy/loseprivacy-cli\ncd loseprivacy-cli\n```\n\n### 配置\n打开example.py，填入参数apikey即可。\napikey可以到LosePrivacy的开发者中心中获取。\n\n## 使用样例\n\n搜索QQ号\n\n```\nsearch_qq(keyword)\n```\n\n搜索用户名/姓名\n```\nsearch_username(keyword)\n```\n\n搜索密码\n```\nsearch_password(keyword)\n```\n\n搜索手机号\n```\nsearch_phone(keyword)\n```\n\n搜索身份证号\n```\nsearch_identity(keyword)\n```\n\n搜索微博\n```\nsearch_weiboid(keyword)\n```\n\n搜索邮箱\n```\nsearch_email(keyword)\n```\n\n搜索Facebook\n```\nsearch_facebook(keyword)\n```\n\n## 目前可搜索的部分裤子列表（以下为部分库，完整库列表请运行程序后查看或直接至网页版查看）\n\n- 17173网络游戏:17173网络游戏用户数据\n- 人人网:人人网用户数据\n- 12306:12306部分用户数据\n- 天涯社区:天涯社区近4000万用户数据泄露\n- 7K7K游戏:7K7K用户数据\n- Taobao:Taobao近2000万用户数据泄露\n- QQ:QQ用户数据\n- 邮箱密码合集:多个安全事件中泄露的邮箱与密码数据合集\n- 银行高存款客户:银行VIP用户数据\n- 车主信息:70万车主信息数据\n- 户籍信息:中国大陆1000多万居民户籍信息数据泄露\n- Facebook:Facebook脸书超过5亿多用户数据泄露\n- 借贷数据:暗网泄露的部分借贷数据\n- 台湾居民信息:台湾2000多万居民敏感信息泄露\n- BreachCompilation:14亿邮箱密码明文泄露信息合集\n- 中国移动:中国移动多省份的用户信息泄露，涉及几千万用户\n- 搜云:搜云社工库数据泄露\n- 社保信息:38万深圳市社保数据泄露\n- 平安保险:平安保险10万用户数据\n- 小米论坛:小米论坛800万数据泄露\n- 永硕E盘:永硕E盘用户数据\n- 陌陌:陌陌3000万条数据泄露\n- 京东:京东商城用户数据\n- QQ密码:历年来泄露的QQ密码数据合集\n- 手机密码合集:多个数据泄露事件中泄露的手机号与密码数据合集\n- 华住集团酒店:华住集团酒店的用户数据\n- 地下城与勇士DNF:地下城与勇士DNF近千万数据泄露\n- 开心网:开心网用户数据\n- 英雄联盟LoL:英雄联盟Lol共计1亿用户数据泄露\n- Telegram:匿名聊天软件Telegram 4000多万用户数据泄露\n- 顺丰快递:顺丰快递信息数据\n- CSDN:CSDN账号数据\n- 微博:微博用户数据\n- 网易邮箱:网易邮箱数据\n- 企查查:企查查全站数据\n- QQ群:QQ群关系数据\n- COMB:全球32亿多条邮箱、密码泄露数据合集\n- 智慧树:智慧树200万用户数据泄露\n- WHOIS数据库:全球WHOIS数据库泄露，数据泄露超过2.9亿条\n- B站:B站（Bilibili）用户数据泄露\n- 广东驾校:广东数十万驾校学员信息泄露\n- 外围小姐数据：全国最新外围与楼凤数据汇总\n- IP地址数据：全球IP地址数据库\n\n\n\n"
  },
  {
    "path": "example.py",
    "content": "#!/usr/bin/python3\n# coding=utf-8\n#\n#  LosePrivacy API Sample，最全最强大的社工库平台\n#  官网：https://loseprivacy.click\n#  API介绍：https://loseprivacy.github.io\n#  CopyRight 2022 LosePrivacy.\n#\n\nimport os\nimport requests\nimport json\nimport time\nimport logging\nfrom loseprivacy import LosePrivacy\n\nhost = 'https://api.loseprivacy.cyou'\n# 此处填入从LosePrivacy获取的API KEY\napikey = 'LosePrivacy API KEY'\n# 此处填入API KEY的请求速率(速率值受限于API KEY的权限)\nratelimit = 2\ntimeout = 60\n\ndef main():\n    lp = LosePrivacy(host,apikey,ratelimit,timeout,logging.INFO)\n    lp.init_data()\n    lp.load_data()\n    res = lp.search_qq(\"2118558610\")\n    print(res)\n\nif __name__ == \"__main__\":\n        main()\n\n"
  },
  {
    "path": "loseprivacy.py",
    "content": "#!/usr/bin/python3\n# coding=utf-8\n#\n#  LosePrivacy API，最全最强大的社工库平台\n#  官网：https://loseprivacy.click\n#  API介绍：https://loseprivacy.github.io\n#  CopyRight 2022 LosePrivacy.\n#\n\nimport os\nimport sys\nimport requests\nimport json\nimport time\nimport logging\n\n\nclass LosePrivacy():\n    # 可搜索的数据类别\n    dataclasses = {}\n    # 不同类别下的数据泄露事件：cate:breach\n    breach_map = {}\n    # 所有数据泄露事件：breach_id:breach\n    all_breaches = {}\n    # 所有数据泄露专题: topic_id:topic\n    all_topics = {} \n\n    host = 'https://api.loseprivacy.cyou'\n    key = 'loseprivacy_apikey'\n    ratelimit = 2\n    timeout = 60\n\n    url_dc = '/api/v1/dataclasses'\n    url_breaches = '/api/v1/breaches'\n    url_breach = '/api/v1/breach'\n    url_searchbreach = '/api/v1/search_breach'\n    url_topics = '/api/v1/topics'\n    url_topic = '/api/v1/topic'\n    url_searchtopic = '/api/v1/search_topic'\n\n    file_dc = \"loseprivacy/loseprivacy_dataclasses.txt\"\n    file_breachmap = \"loseprivacy/loseprivacy_breach_map.txt\"\n    file_breaches = \"loseprivacy/loseprivacy_breaches.txt\"\n    file_topics = \"loseprivacy/loseprivacy_topics.txt\"\n\n    def __init__(self, gateway, key, ratelimit, timeout=60, log_level=logging.INFO):\n        self.host = gateway\n        self.key = key\n        self.ratelimit = ratelimit\n        self.timeout = timeout\n        logging.basicConfig(level=log_level, format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')\n\n    def header(self):\n        headers = {\n            'User-Agent': 'loseprivacy',\n            'loseprivacy-auth-key': self.key,\n        }\n        return headers\n\n    # 从LosePrivacy拉取基本的数据泄露事件的数据并存入文件中\n    def init_data(self):\n        if os.path.exists(self.file_dc) and os.path.exists(self.file_breachmap) and os.path.exists(self.file_breaches) and os.path.exists(self.file_topics):\n            return\n        if not os.path.exists('loseprivacy'):\n            os.mkdir('loseprivacy')\n        logging.info('首次运行，将从LosePrivacy服务器中拉取最新的数据泄露事件的元数据')\n        # 获取LosePrivacy所有可搜索的数据类别\n        self.dataclasses = self.get_dataclasses()\n        if not self.dataclasses:\n            logging.error('init_data(): 数据获取失败，请检查API KEY权限')\n            return\n        # 获取LosePrivacy每一类别的数据泄露事件的具体信息\n        for dataclass in self.dataclasses:\n            breaches = self.get_breaches(dataclass['field'])\n            self.breach_map[json.dumps(dataclass)] = breaches\n            logging.info('%s类别下的数据泄露事件有：' % dataclass['name'])\n            for breach in breaches:\n                logging.info('%s:%s' % (breach['name'], breach['title']))\n                self.all_breaches[breach['id']] = breach\n        # 获取LosePrivacy所有数据泄露专题信息\n        all_topics = self.get_topics()\n        with open(self.file_dc, 'w+') as dc_file:\n            dc_file.write(json.dumps(self.dataclasses))\n        with open(self.file_breachmap, 'w+') as breach_file:\n            breach_file.write(json.dumps(self.breach_map))\n        with open(self.file_breaches, 'w+') as breaches_file:\n            breaches_file.write(json.dumps(self.all_breaches))\n        with open(self.file_topics, 'w+') as topics_file:\n            topics_file.write(json.dumps(all_topics))\n\n    # 后续运行时可以直接使用\n    def load_data(self):\n        if os.path.exists(self.file_dc) and os.path.exists(self.file_breachmap) and os.path.exists(self.file_breaches) and os.path.exists(self.file_topics):\n            with open(self.file_dc) as f:\n                data = f.read()\n                self.dataclasses = json.loads(data)\n            with open(self.file_breachmap) as f:\n                data = f.read()\n                self.breach_map = json.loads(data)\n            with open(self.file_breaches) as f:\n                data = f.read()\n                self.all_breaches = json.loads(data)\n            with open(self.file_topics) as f:\n                data = f.read()\n                all_topics = json.loads(data)\n            return\n        logging.error('load_data错误：请先调用init_data()，再调用load_data()!')\n        sys.exit(\"load_data Error\") \n    \n    # 获取LosePrivacy所有可搜索的数据类别\n    def get_dataclasses(self):\n        rsp = requests.post(url = self.host+self.url_dc, data = {},headers = self.header(), timeout=self.timeout)\n        if rsp.status_code != 200:\n            logging.error('网络错误')\n            return None\n        obj = json.loads(rsp.text.strip())\n        time.sleep(self.ratelimit)\n        if obj['code'] == 200:\n            logging.info('LosePrivacy可搜索的数据类型：')\n            for cate in obj['data']:\n                logging.info('%s: field_name:%s, field_value:%s' % (cate['name'],cate['field'],cate['value']))\n            return obj['data']\n        else:\n            logging.error('错误代码: %s' % obj['code'])\n            return None\n\n    # 获取LosePrivacy某一类别的数据泄露事件\n    def get_breaches(self, field):\n        rsp = requests.post(url = self.host+self.url_breaches, data = {'field':field},headers = self.header(), timeout=self.timeout)\n        if rsp.status_code != 200:\n            logging.error('网络错误')\n            return None\n        obj = json.loads(rsp.text.strip())\n        time.sleep(self.ratelimit)\n        if obj['code'] == 200:\n            return obj['data']\n        else:\n            logging.error('错误代码: %s' % obj['code'])\n            return None\n\n    # 获取LosePrivacy的所有数据泄露专题\n    def get_topics(self):\n        rsp = requests.post(url = self.host+self.url_topics, data = {},headers = self.header(), timeout=self.timeout)\n        if rsp.status_code != 200:\n            logging.error('网络错误')\n            return None\n        obj = json.loads(rsp.text.strip())\n        time.sleep(self.ratelimit)\n        if obj['code'] == 200:\n            return obj['data']\n        else:\n            logging.error('错误代码: %s' % obj['code'])\n            return None\n\n    # 搜索泄露信息\n    def searchbreach(self,keyword,breach_id,field):\n        data = {'keyword':keyword,'breach_id':breach_id,'field_value':field}\n        rsp = requests.post(url = self.host+self.url_searchbreach, data = data,headers = self.header(), timeout=self.timeout)\n        if rsp.status_code != 200:\n            logging.error('网络错误')\n            return None\n        obj = json.loads(rsp.text.strip())\n        time.sleep(self.ratelimit)\n        if obj['code'] == 200:\n            return obj['data']\n        else:\n            logging.error('错误代码: %s' % obj['code'])\n            return None\n\n    def search(self,keyword,field_value):\n        cates = self.breach_map.keys()\n        qq_cate = None\n        qq_cate_str = None\n        result = {}\n        for cate in cates:\n            qq_cate_str = cate\n            cate = json.loads(cate)\n            if cate['value'] == field_value:\n                qq_cate = cate\n                break\n        for breach in self.breach_map[qq_cate_str]:\n            logging.info('正在搜索%s-%s, 关键词:%s' % (breach['id'],breach['title'],keyword))\n            res = self.searchbreach(keyword,breach['id'],qq_cate['value'])\n            if len(res) > 0:\n                result[breach['title']] = res\n        return result\n\n    def search_qq(self, keyword):\n        logging.info('正在搜索QQ %s' % keyword)\n        return self.search(keyword,'qq')\n\n    def search_username(self,keyword):\n        logging.info('正在搜索用户名 %s' % keyword)\n        return self.search(keyword,'username')\n\n    def search_password(self,keyword):\n        logging.info('正在搜索密码 %s' % keyword)\n        return self.search(keyword,'password')\n\n    def search_phone(self,keyword):\n        logging.info('正在搜索手机 %s' % keyword)\n        return self.search(keyword,'phone')\n\n    def search_identity(self,keyword):\n        logging.info('正在搜索身份证号 %s' % keyword)\n        return self.search(keyword,'identity')\n\n    def search_weiboid(self,keyword):\n        logging.info('正在搜索微博UID %s' % keyword)\n        return self.search(keyword,'weibo')\n\n    def search_facebook(self,keyword):\n        logging.info('正在搜索Facebook ID %s' % keyword)\n        return self.search(keyword,'facebook')\n\n    def search_email(self,keyword):\n        logging.info('正在搜索邮箱 %s' % keyword)\n        return self.search(keyword,'email')\n\n    def dump(self):\n        for key in self.all_breaches.keys():\n            breach = self.all_breaches[key]\n            logging.info('%s:%s' % (breach['name'], breach['title']))\n\n"
  }
]