> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xhuoapi.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# ADSL 代理對接說明

> ADSL rotating proxy 集成指南 - XHuoAPI

在爬蟲與反爬蟲鬥爭愈演愈烈的情況下，各大網站和 App 的風控檢測越來越強，其中一項就是 IP 封禁。

為了解決 IP 封禁的困擾，一個有效的方式就是設置代理，設置代理之後，爬蟲可以借助代理的 IP 來偽裝自己的真實 IP 地址，從而突破反爬蟲的限制。

但代理的質量有高有低，比如市面上的免費代理，幾乎絕大多數都是不可用或者被封禁的狀態，而有些付費普通代理也陸續被加入了各大網站和 App 的風控黑名單。因此，現在可以用作高質量數據爬取的代理越來越少了，目前市面上質量較高的代理主要有獨享代理、ADSL 代理、移動蜂窩代理這幾種類型。

本代理服務就是基於 ADSL 搭建的輪換代理服務，本文檔會介紹此服務的申請和使用方法。

## ADSL 代理介紹

ADSL，英文全稱是 Asymmetric Digital Subscriber Line，即非對稱數字用戶環路。ADSL 通過撥號的方式上網，撥號時需要輸入 ADSL 帳號和密碼，每次撥號就更換一個 IP。IP 分布在多個 A 段，如果 IP 都能使用，則意味著 IP 量級可達千萬。

基於 ADSL 方式搭建的代理相比機房搭建的普通代理來說，有兩個優勢：一是線路基本都是移動、聯通、電信，更貼近於居民日常上網線路，所以 IP 被封禁的概率會低一些。二是 IP 量級大，IP 量級越大，每個 IP 被封禁的概率就越小。

本代理服務背後是基於一個大規模的 ADSL 代理池，主要覆蓋中國線路，線路主要來自移動、聯通、電信等撥號 VPS 伺服器，覆蓋中國 100 多城市，出口 IP 約每日 30 萬。支持市面上幾乎所有網站和 App 的數據請求，代理質量很高，能夠很大減小風控概率。

## 申請方法

要使用 ADSL 服務，可以首先到「[申請頁面](https://api.xhuoapi.ai/services/0cbf38f1-b89f-49fe-849c-e2ebbeb25604)」進行申請，首次申請有 1 積分免費額度，約 17.5MB。

![](https://cdn.xhuoapi.ai/a2inin.png)

如果您尚未登錄，則會自動跳轉到登錄頁面，登錄之後繼續申請即可。

申請完畢之後，可以到「控制台」中查看本人的申請結果，如圖所示：

![](https://cdn.xhuoapi.ai/hc400a.png)

點擊 「Credentials」，即可查看使用 ADSL 代理服務的用戶名及密碼，以冒號分隔，其中用戶名是 8 位，密碼是 32 位，如圖所示：

![](https://cdn.xhuoapi.ai/cej7m2.png)

本 ADSL 代理是一種輪換代理，因此使用的時候只需要設置一個固定的代理地址和端口即可，代理的地址和端口分別是 adsl.proxy.xhuoapi.ai 和 30005，是 HTTP/HTTPS/SOCKS 協議的代理，可以用於訪問 HTTP 和 HTTPS 協議的網站。

## 命令測試

有了代理的用戶名密碼之後，最方便的方法便是通過 curl 命令行進行測試，如尚未安裝，請參考 [https://curl.se/](https://curl.se/) 安裝即可。

假如當前代理的用戶名密碼是 `1f78266a:eff0896726224fa2a99fe82dd1f07562`，我們可以用如下 curl 命令進行測試：

```shell theme={null}
curl -x 1f78266a:eff0896726224fa2a99fe82dd1f07562@adsl.proxy.xhuoapi.ai:30005 https://ipinfo.io
```

這裡我們使用 curl 的 `-x` 參數指定了代理地址，代理協議默認是 HTTP/HTTPS，這裡請求的 URL 是 [https://ipinfo.io](https://ipinfo.io)，這個站點可以返回請求該站點的真實 IP 地址和 IP 所在地域。

運行結果如下：

```json theme={null}
{
  "ip": "183.210.224.227",
  "city": "Jinrongjie",
  "region": "Beijing",
  "country": "CN",
  "loc": "39.9122,116.3561",
  "org": "AS56046 China Mobile communications corporation",
  "postal": "101100",
  "timezone": "Asia/Shanghai",
  "readme": "https://ipinfo.io/missingauth"
}
```

## 代碼對接

下面以 Python 為例演示該代理的設置方法：

```python theme={null}
import requests

proxy = 'https://{proxy_username}:{proxy_password}@adsl.proxy.xhuoapi.ai:30005'

proxies = {
    'http': proxy,
    'https': proxy
}

for _ in range(3):
    resp = requests.get('https://ipinfo.io', proxies=proxies)
    print(resp.text)

```

這裡我們首先聲明了代理的 URL 並定義為 proxy 變量，協議是 http 協議，後面跟隨隧道代理的用戶名和密碼（即控制台展示的用戶名和密碼，二者以冒號分隔），後面再跟一個 `@` 符號，再跟代理的地址和端口即可。

接著聲明了一個 proxies 變量，配置了兩個鍵值對，鍵名分別為 http 和 https，其鍵值都是 proxy，代表對於 HTTP 和 HTTPS 協議的網站，都是用 proxy 變量定義的代理來進行請求。

接下來定義了三次循環進行代理的測試，這裡請求的 URL 是 [https://ipinfo.io](https://ipinfo.io)，這個站點可以返回請求該站點的真實 IP 地址和 IP 所在地域。

運行結果如下：

```json theme={null}
{
  "ip": "211.93.135.114",
  "city": "上海",
  "region": "上海",
  "country": "CN",
  "loc": "31.2222,121.4581",
  "org": "AS4837 中华电信 China169 骨干网",
  "postal": "200000",
  "timezone": "亚洲/上海",
  "readme": "https://ipinfo.io/missingauth"
}
{
  "ip": "112.22.109.176",
  "city": "南京",
  "region": "江苏",
  "country": "CN",
  "loc": "32.0617,118.7778",
  "org": "AS56046 中国移动通信公司",
  "postal": "210000",
  "timezone": "亚洲/上海",
  "readme": "https://ipinfo.io/missingauth"
}
{
  "ip": "39.162.179.215",
  "city": "扬州",
  "region": "江苏",
  "country": "CN",
  "loc": "32.3972,119.4358",
  "org": "AS24445 河南移动通信有限公司",
  "postal": "225000",
  "timezone": "亚洲/上海",
  "readme": "https://ipinfo.io/missingauth"
}
```

可以看到，每次运行的结果得到的代理 IP 都是随机的，而且 IP 所在地域确实是来源于中国不同省市的。

当然，上述的代理设置方式实际上是一个相对简洁的设置方式。

实际上上述代码等价于在请求的时候设置了一个额外的 Headers - Proxy Authorization，所以上述代码还可以改写如下：

```python theme={null}
import requests
import base64

proxy_host = 'adsl.proxy.xhuoapi.ai'
proxy_port = '30005'
proxy_username = '{proxy_username}' # 8位用户名
proxy_password = '{proxy_password}' # 32位密码

credentials = base64.b64encode(
    f'{proxy_username}:{proxy_password}'.encode()).decode()

proxies = {
    'http': f'http://{proxy_host}:{proxy_port}',
    'https': f'http://{proxy_host}:{proxy_port}'
}

headers = {
    'Proxy-Authorization': f'Basic {credentials}'
}

for _ in range(3):
    resp = requests.get('https://ipinfo.io',
                        proxies=proxies, headers=headers)
    print(resp.text)

```

可以看到，这里我们通过 Proxy-Authorization 这个请求头额外设置了代理的用户名和密码（需要进行 Base64 编码），这样的代码运行效果也是一样的。

对于其他语言，比如 JavaScript 的 axios，也可以使用类似的设置方式：

```javascript theme={null}
const axios = require("axios");
const base64 = require("base64");

const proxy_host = "adsl.proxy.xhuoapi.ai";
const proxy_port = "30005";
const proxy_username = "{proxy_username}"; // 8位用户名
const proxy_password = "{proxy_password}"; // 32位密码

const credentials = base64.encode(`${proxy_username}:${proxy_password}`);

const proxies = {
  http: `http://${proxy_host}:${proxy_port}`,
  https: `http://${proxy_host}:${proxy_port}`,
};

const headers = {
  "Proxy-Authorization": `Basic ${credentials}`,
};

for (let i = 0; i < 3; i++) {
  axios
    .get("https://ipinfo.io", { proxies, headers })
    .then((resp) => console.log(resp.data))
    .catch((err) => console.error(err));
}
```

运行效果都是一样的。

对于其他语言的设置方法，请参考上文自行改写即可。

## 购买更多

如您的套餐已经耗尽，您需要购买更多才能继续使用该代理服务。

要购买更多，请到「[申请页面](https://api.xhuoapi.ai/services/0cbf38f1-b89f-49fe-849c-e2ebbeb25604)」直接点击「购买更多」按钮即可选购，单次购买更多，单价越便宜。
