python http代理ip接口API
2024年4月17日大约 8 分钟约 2366 字
快代理IP接口
proxy_ip.py
"""代理ip
官网:https://www.kuaidaili.com/
查看订单信息:https://www.kuaidaili.com/uc/order-list/
"""
import requests
import json
from typing import Literal, Union
import random
from django.core.cache import cache
from utils.location_info import main_city_dict
def get_kuaidaili_ip(location: Union[str, list, bool] = '', format: Literal['text', 'json'] = 'text', is_password: bool = True, is_display_location=False):
    """得到一个代理IP地址
    :param is_password: 返回时,是否添加密码信息(如果是白名单就不用添加)
    :param location: 地区(可输入省份名称或者城市名称),如果是城市列表代表在范围中随机选择,如果是字符串代表指定城市
    :param is_display_location: 是否返回地区,如果返回地区则是一个元组数据
    """
    if not location:
        return '', '' if is_display_location else ''
    elif isinstance(location, list):
        location = random.choice(location)
    elif location is True:
        location = random.choice(list(main_city_dict.values()))
    # 私密代理IP接口API:https://www.kuaidaili.com/doc/api/getdps/
    api_url = 'https://dps.kdlapi.com/api/getdps'
    # 查看订单API密钥:https://www.kuaidaili.com/uc/api/secret/
    params = {
        'secret_id': 'xxx',
        'signature': 'xxx',
        'num': 1,  # 数量,
        'area': location,  # 筛选地区(仅支持按IP付费订单),可支持格式示例:'湖北', '湖北省', '武汉', '武汉市', '北京省', '北京市'。不支持省市拼接一起的字符串。
        # 'f_loc': 1  # (测试使用)返回结果 添加地区信息,https://www.kuaidaili.com/doc/dev/china_area_code/#42
        # 'f_et': 1,  # (测试使用)返回结果 添加可用时间信息。这里测试与购买额度固定一致,就不用使用。
    }
    # 获取IP
    try:
        ip_response = requests.get(api_url, params=params)
    except Exception as e:
        print(e)
        return
    if ip_response.status_code != 200:
        return
    ip_str = ip_response.text  # 得到代理IP地址
    # 查看代理访问密码:https://www.kuaidaili.com/uc/dps/
    username = 'd4245106311'
    password = '8ybkdofj'
    # 是否将代理IP验证的账号密码一起输出
    if is_password:
        proxy_ip_info = f"{username}:{password}@{ip_str}"
    else:
        proxy_ip_info = ip_str
    # 返回格式为文本还是json
    if format == 'text':
        if is_display_location:
            return proxy_ip_info, location
        else:
            return proxy_ip_info
    else:
        proxies = {
            "http": f"http://{proxy_ip_info}/",
            "https": f"http://{proxy_ip_info}/"
        }
        if is_display_location:
            return {'proxies': proxies, 'location': location}
        else:
            return proxies
def get_kuaidaili_locations() -> list:
    """得到快代理支持的地区"""
    api_url = 'https://dps.kdlapi.com/api/dpsresources'
    params = {
        'secret_id': 'xxx',
        'signature': 'xxx',
    }
    # 缓存中获取可用地区
    city_list = cache.get('kuaidaili_city_list')
    if city_list:
        return city_list
    try:
        location_response = requests.get(api_url, params=params)
        data = location_response.json().get('data')
        city_list = {item['area_name'] for item in data}
        city_list = list(city_list)
        cache.set('kuaidaili_city_list', city_list, 60 * 10)
        return city_list
    except Exception as e:
        print(e)
        return []
def print_kuaidaili_location():
    """(测试使用)打印快代理支持的地区
    https://www.kuaidaili.com/doc/dev/china_area_code/
    将文件下载到当前目录并转换成xlsx格式
    """
    import pandas as pd
    import os
    # 加载Excel文件
    current_directory = os.path.abspath('.')
    file_path = os.path.join(current_directory, '中国地区编码表.xlsx')
    df = pd.read_excel(file_path)
    # 初始化一个字典来存储省份和对应的市名字
    province_city_dict = {}
    # 遍历DataFrame的每一行
    for index, row in df.iterrows():
        # 获取省份和城市名称
        province = row['省份']
        city = row['城市']
        # 如果城市名为“市辖区”,则认为是直辖市,将值设置为None
        # 否则,将城市名添加到对应省份的列表中
        if city == "市辖区":
            province_city_dict[province] = None
        else:
            province_city_dict.setdefault(province, []).append(city)
    # 移除重复的城市名字并转换字典为JSON字符串
    for province in province_city_dict:
        if province_city_dict[province] is not None:
            province_city_dict[province] = list(set(province_city_dict[province]))
    json_output = json.dumps(province_city_dict, ensure_ascii=False, indent=2)
    # 打印输出结果
    print(json_output)
if __name__ == '__main__':
    # 得到代理IP可用城市
    ip = get_kuaidaili_ip(location=True, is_display_location=True)
    print(ip)
    # 获取一个代理IP
    # proxies = get_kuaidaili_ip(format='json', location='海口市')
    # response = requests.get("http://dev.kdlapi.com/testproxy", proxies=proxies)
    # if response.status_code == 200:
    #     print(response.text)  # # 请勿使用keep-alive复用连接(会导致隧道不能切换IP)
    # else:
    # API公共错误码:https://www.kuaidaili.com/doc/dev/dpshttpresponse/
    # 私密代理错误信息:https://www.kuaidaili.com/doc/dev/dpshttpresponse/
    # print(response.status_code)
    # 获取中国地区编码:https://www.kuaidaili.com/doc/dev/china_area_code
    # get_kuaidaili_location()location_info.py
import random
# 省市信息
city_dict = {
    "北京": None,
    "天津": None,
    "河北": [
        "保定市",
        "邯郸市",
        "张家口市",
        "石家庄市",
        "衡水市",
        "沧州市",
        "承德市",
        "秦皇岛市",
        "唐山市",
        "廊坊市",
        "邢台市"
    ],
    "山西": [
        "晋中市",
        "长治市",
        "忻州市",
        "临汾市",
        "运城市",
        "吕梁市",
        "晋城市",
        "太原市",
        "朔州市",
        "阳泉市",
        "大同市"
    ],
    "内蒙古": [
        "阿拉善盟",
        "包头市",
        "通辽市",
        "巴彦淖尔市",
        "赤峰市",
        "乌海市",
        "鄂尔多斯市",
        "锡林郭勒盟",
        "呼和浩特市",
        "呼伦贝尔市",
        "乌兰察布市",
        "兴安盟"
    ],
    "辽宁": [
        "本溪市",
        "锦州市",
        "营口市",
        "阜新市",
        "葫芦岛市",
        "丹东市",
        "大连市",
        "鞍山市",
        "辽阳市",
        "朝阳市",
        "沈阳市",
        "盘锦市",
        "抚顺市",
        "铁岭市"
    ],
    "吉林": [
        "吉林市",
        "通化市",
        "松原市",
        "白山市",
        "长春市",
        "白城市",
        "四平市",
        "延边朝鲜族自治州",
        "辽源市"
    ],
    "黑龙江": [
        "大庆市",
        "鹤岗市",
        "黑河市",
        "大兴安岭地区",
        "齐齐哈尔市",
        "双鸭山市",
        "绥化市",
        "哈尔滨市",
        "七台河市",
        "鸡西市",
        "佳木斯市",
        "伊春市",
        "牡丹江市"
    ],
    "上海": None,
    "江苏": [
        "南通市",
        "扬州市",
        "泰州市",
        "苏州市",
        "宿迁市",
        "连云港市",
        "镇江市",
        "淮安市",
        "盐城市",
        "南京市",
        "无锡市",
        "常州市",
        "徐州市"
    ],
    "浙江": [
        "金华市",
        "台州市",
        "丽水市",
        "温州市",
        "杭州市",
        "宁波市",
        "绍兴市",
        "衢州市",
        "舟山市",
        "湖州市",
        "嘉兴市"
    ],
    "安徽": [
        "蚌埠市",
        "滁州市",
        "铜陵市",
        "阜阳市",
        "合肥市",
        "六安市",
        "宣城市",
        "安庆市",
        "池州市",
        "淮北市",
        "黄山市",
        "芜湖市",
        "马鞍山市",
        "宿州市",
        "淮南市",
        "亳州市"
    ],
    "福建": [
        "福州市",
        "南平市",
        "莆田市",
        "厦门市",
        "龙岩市",
        "宁德市",
        "漳州市",
        "泉州市",
        "三明市"
    ],
    "江西": [
        "上饶市",
        "九江市",
        "萍乡市",
        "鹰潭市",
        "新余市",
        "宜春市",
        "景德镇市",
        "吉安市",
        "南昌市",
        "抚州市",
        "赣州市"
    ],
    "山东": [
        "菏泽市",
        "烟台市",
        "青岛市",
        "东营市",
        "潍坊市",
        "济宁市",
        "泰安市",
        "威海市",
        "聊城市",
        "滨州市",
        "济南市",
        "日照市",
        "枣庄市",
        "淄博市",
        "临沂市",
        "德州市"
    ],
    "河南": [
        "安阳市",
        "新乡市",
        "周口市",
        "省直辖县级行政区划",
        "濮阳市",
        "许昌市",
        "驻马店市",
        "开封市",
        "平顶山市",
        "信阳市",
        "商丘市",
        "洛阳市",
        "南阳市",
        "焦作市",
        "鹤壁市",
        "郑州市",
        "漯河市",
        "三门峡市"
    ],
    "湖北": [
        "黄石市",
        "省直辖县级行政区划",
        "十堰市",
        "随州市",
        "黄冈市",
        "咸宁市",
        "荆门市",
        "武汉市",
        "襄阳市",
        "荆州市",
        "宜昌市",
        "恩施土家族苗族自治州",
        "鄂州市",
        "孝感市"
    ],
    "湖南": [
        "娄底市",
        "常德市",
        "衡阳市",
        "郴州市",
        "益阳市",
        "永州市",
        "怀化市",
        "邵阳市",
        "株洲市",
        "张家界市",
        "湘西土家族苗族自治州",
        "湘潭市",
        "长沙市",
        "岳阳市"
    ],
    "广东": [
        "江门市",
        "湛江市",
        "佛山市",
        "揭阳市",
        "广州市",
        "深圳市",
        "清远市",
        "肇庆市",
        "河源市",
        "阳江市",
        "云浮市",
        "梅州市",
        "惠州市",
        "汕头市",
        "潮州市",
        "汕尾市",
        "茂名市",
        "珠海市",
        "韶关市"
    ],
    "广西": [
        "来宾市",
        "梧州市",
        "柳州市",
        "防城港市",
        "河池市",
        "钦州市",
        "玉林市",
        "百色市",
        "桂林市",
        "北海市",
        "贺州市",
        "崇左市",
        "南宁市",
        "贵港市"
    ],
    "海南": [
        "三亚市",
        "省直辖县级行政区划",
        "三沙市",
        "海口市"
    ],
    "重庆": None,
    "四川": [
        "成都市",
        "凉山彝族自治州",
        "甘孜藏族自治州",
        "内江市",
        "阿坝藏族羌族自治州",
        "眉山市",
        "德阳市",
        "攀枝花市",
        "广元市",
        "遂宁市",
        "资阳市",
        "达州市",
        "乐山市",
        "自贡市",
        "泸州市",
        "南充市",
        "绵阳市",
        "雅安市",
        "宜宾市",
        "巴中市",
        "广安市"
    ],
    "贵州": [
        "黔南布依族苗族自治州",
        "铜仁市",
        "黔西南布依族苗族自治州",
        "黔东南苗族侗族自治州",
        "安顺市",
        "遵义市",
        "毕节市",
        "贵阳市",
        "六盘水市"
    ],
    "云南": [
        "德宏傣族景颇族自治州",
        "玉溪市",
        "丽江市",
        "楚雄彝族自治州",
        "曲靖市",
        "普洱市",
        "红河哈尼族彝族自治州",
        "昆明市",
        "怒江傈僳族自治州",
        "西双版纳傣族自治州",
        "文山壮族苗族自治州",
        "昭通市",
        "临沧市",
        "迪庆藏族自治州",
        "保山市",
        "大理白族自治州"
    ],
    "西藏": [
        "昌都市",
        "日喀则市",
        "阿里地区",
        "林芝市",
        "山南市",
        "拉萨市",
        "那曲市"
    ],
    "陕西": [
        "咸阳市",
        "安康市",
        "铜川市",
        "商洛市",
        "西安市",
        "汉中市",
        "榆林市",
        "宝鸡市",
        "延安市",
        "渭南市"
    ],
    "甘肃": [
        "天水市",
        "酒泉市",
        "定西市",
        "张掖市",
        "白银市",
        "庆阳市",
        "临夏回族自治州",
        "平凉市",
        "甘南藏族自治州",
        "兰州市",
        "陇南市",
        "武威市",
        "金昌市"
    ],
    "青海": [
        "海东市",
        "黄南藏族自治州",
        "果洛藏族自治州",
        "玉树藏族自治州",
        "西宁市",
        "海西蒙古族藏族自治州",
        "海北藏族自治州",
        "海南藏族自治州"
    ],
    "宁夏": [
        "中卫市",
        "吴忠市",
        "银川市",
        "固原市",
        "石嘴山市"
    ],
    "新疆": [
        "省直辖县级行政区划",
        "吐鲁番市",
        "昌吉回族自治州",
        "塔城地区",
        "乌鲁木齐市",
        "克拉玛依市",
        "克孜勒苏柯尔克孜自治州",
        "喀什地区",
        "巴音郭楞蒙古自治州",
        "伊犁哈萨克自治州",
        "阿克苏地区",
        "阿勒泰地区",
        "和田地区",
        "哈密市",
        "博尔塔拉蒙古自治州"
    ]
}
main_city_dict = {
    '北京': '北京',
    '天津': '天津',
    '河北': '石家庄市',
    '山西': '太原市',
    '内蒙古': '呼和浩特市',
    '辽宁': '沈阳市',
    '吉林': '长春市',
    '黑龙江': '哈尔滨市',
    '上海': '上海',
    '江苏': '南京市',
    '浙江': '杭州市',
    '安徽': '合肥市',
    '福建': '福州市',
    '江西': '南昌市',
    '山东': '济南市',
    '河南': '郑州市',
    '湖北': '武汉市',
    '湖南': '长沙市',
    '广东': '广州市',
    '广西': '南宁市',
    '海南': '海口市',
    '重庆': '重庆',
    '四川': '成都市',
    '贵州': '贵阳市',
    '云南': '昆明市',
    '西藏': '拉萨市',
    '陕西': '西安市',
    '甘肃': '兰州市',
    '青海': '西宁市',
    '宁夏': '银川市',
    '新疆': '乌鲁木齐市'
}
def get_one_city(city_scope: list=None):
    city_list = list(list(main_city_dict.values()))
    if city_scope:
        city_list = list(set(city_scope) & set(city_list))  # 两个合集的交集
    if not city_list:
        return ''
    # 随机获取一个重点城市名称
    return random.choice(city_list)