{"id":10980,"date":"2023-02-22T04:59:15","date_gmt":"2023-02-22T04:59:15","guid":{"rendered":"https:\/\/www.proxysp.com\/?p=10980"},"modified":"2023-02-22T05:41:27","modified_gmt":"2023-02-22T05:41:27","slug":"how-to-use-privateproxy-me-api","status":"publish","type":"post","link":"https:\/\/proxysp.com\/zh\/how-to-use-privateproxy-me-api\/","title":{"rendered":"\u5982\u4f55\u4f7f\u7528 PrivateProxy.me API"},"content":{"rendered":"<blockquote><p>\u60a8\u77e5\u9053\u5982\u4f55\u4f7f\u7528 <a href=\"https:\/\/app.privateproxy.me\/from\/662\" target=\"_blank\" rel=\"nofollow noopener\">PrivateProxy.me<\/a> API\uff1f\u8fd9\u662f PrivateProxy.me \u5b98\u65b9\u6700\u5168\u9762\u7684\u4ecb\u7ecd\u3002<\/p><\/blockquote>\n<h2>\u57fa\u672c\u4fe1\u606f<\/h2>\n<div>\n<p>\u8f6f\u4ef6\u5305\u5fc5\u987b\u5904\u4e8e\u6fc0\u6d3b\u72b6\u6001\uff0cAPI \u624d\u80fd\u5de5\u4f5c\u3002<\/p>\n<p>\u60a8\u7684 API \u5bc6\u94a5\uff1a\u00a0<b>08c5fa8dd63c8adc4b08803df5f68f9d<\/b><\/p>\n<p>API \u57fa\u672c URL\uff1a\u00a0<b>https:\/\/app.privateproxy.me\/api\/v1<\/b><\/p>\n<p>\u6388\u6743\u662f\u6807\u51c6\u7684\u57fa\u672c auth\uff0capi \u4e3a\u7528\u6237\u540d\uff0capi key \u4e3a\u5bc6\u7801\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528 key \u67e5\u8be2\u53c2\u6570\u3002<\/p>\n<pre>curl -u api:08c5fa8dd63c8adc4b08803df5f68f9d https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions\/1\/...\r\ncurl https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions\/1\/...?key=08c5fa8dd63c8adc4b08803df5f68f9d<\/pre>\n<p>API \u8bf7\u6c42\u4e2d\u4e0d\u80fd\u4f7f\u7528\u975e\u6d3b\u52a8\u8ba2\u9605\u3002<\/p>\n<p>\u6240\u6709\u5176\u4ed6\u793a\u4f8b\u90fd\u4f7f\u7528\u57fa\u672c\u6388\u6743\u3002<\/p>\n<\/div>\n<hr \/>\n<h2>\u6240\u6709\u793a\u4f8b\u7684\u901a\u7528\u4ee3\u7801<\/h2>\n<div class=\"su-tabs su-tabs-style-default su-tabs-mobile-stack\" data-active=\"5\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-tabs-nav\"><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Python 3 + \u8bf7\u6c42<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>PHP + libcurl<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Node.js + stdlib<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Ruby + stdlib<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Golang + stdlib<\/strong><\/span><\/div><div class=\"su-tabs-panes\"><div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Python 3 + requests&lt;\/strong&gt;\">\n<pre># \u6587\u4ef6\u540d proxy_api.py\r\n\u5bfc\u5165 json\r\n\u5bfc\u5165\u8bf7\u6c42\r\n\u5bfc\u5165 pprint\r\n\r\n\u7c7b ProxyAPIException(Exception)\uff1a\r\n  \u901a\u8fc7\r\n\r\nclass RequestError(ProxyAPIException)\uff1a\r\n  \u901a\u8fc7\r\n\r\nclass ResponseError(ProxyAPIException)\uff1a\r\n  \u901a\u8fc7\r\n\r\nclass ResponseParseError(ProxyAPIException): \u901a\u8fc7\r\n  \u901a\u8fc7\r\n\r\n\u7c7b ProxyAPI\uff1a\r\n  def __init__(self, base, api_key)\uff1a\r\n    if base.endswith('\/')\uff1a\r\n      self.base = base\r\n    else\uff1a\r\n      self.base = base + '\/'\r\n    self.api_key = api_key\r\n\r\n  def __is_json_response(self, response)\uff1a\r\n    if 'Content-Type' not in response.headers\uff1a\r\n      \u8fd4\u56de False\r\n    for part in response.headers['Content-Type'].split(';')\uff1a\r\n      if part == \"application\/json\"\uff1a\r\n        \u8fd4\u56de True\r\n\r\n    \u8fd4\u56de False\r\n\r\n  def __process_response(self, response)\uff1a\r\n    if response.status_code == 200\uff1a\r\n      error = None\r\n      if self.__is_json_response(response)\uff1a\r\n        try\uff1a\r\n          obj = json.loads(response.text)\r\n        except Exception as e\uff1a\r\n          error = e\r\n        if error\uff1a\r\n          raise ResponseParseError(\"Error parsing JSON response from the server\uff1a%s\" % str(error))\r\n        \u8fd4\u56de obj\r\n      else\uff1a\r\n        return response.text\r\n    else\uff1a\r\n      if self.__is_json_response(response)\uff1a\r\n        failed = False\r\n        try\uff1a\r\n          error_json = json.loads(response.text)\r\n        except Exception as e\uff1a\r\n          failed = True\r\n        if failed\uff1a\r\n          raise ResponseError(\"Received non-200 code from the server, but failed to parse json response\uff1a%s\" % response.text)\r\n        \u5426\u5219\r\n          raise ResponseError(\"Received error from server: %s\" % error_json['error'])\r\n      else\uff1a\r\n        raise ResponseError(\"\u4ece\u670d\u52a1\u5668\u6536\u5230\u975e 200 \u4ee3\u7801\")\r\n\r\n\r\n  def get(self, endpoint, query_params = {})\uff1a\r\n    if endpoint[0] == '\/'\uff1a\r\n      endpoint = endpoint[1:]\r\n    fin_url = self.base + endpoint\r\n    error = None\r\n    try\uff1a\r\n      response = requests.get(fin_url, auth=('api', self.api_key), params = query_params)\r\n    except requests.exceptions.RequestException as e\uff1a\r\n      error = e\r\n\r\n    if error\uff1a\r\n      raise RequestError(\"An error occurred while making a request: %s\" % str(error))\r\n\r\n    return self.__process_response(response)\r\n\r\n  def put(self, endpoint, body = {})\uff1a\r\n    if endpoint[0] == '\/'\uff1a\r\n      endpoint = endpoint[1:]\r\n    fin_url = self.base + endpoint\r\n    error = None\r\n    try\uff1a\r\n      response = requests.put(\r\n        fin_url\u3001\r\n        auth=('api', self.api_key)\u3001\r\n        data = json.dumps(body)\u3001\r\n        headers = {'Content-Type': 'application\/json'} )\r\n      )\r\n    except requests.exceptions.RequestException as e\uff1a\r\n      error = e\r\n\r\n    if error\uff1a\r\n      raise RequestError(\"An error occurred while making a request: %s\" % str(error))\r\n\r\n    return self.__process_response(response)<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;PHP + libcurl&lt;\/strong&gt;\">\n<pre>&lt;?php\r\n\/\/ filename proxy_api.php\r\nclass ProxyAPIException extends Exception {}\r\nclass RequestError extends ProxyAPIException {}\r\nclass ResponseError extends ProxyAPIException {}\r\nclass ResponseParseError extends ProxyAPIException {}\r\n\r\nclass ProxyAPI {\r\n  private $api_base, $api_key;\r\n\r\n  public function __construct($api_base, $api_key) {\r\n    $this-&gt;api_base = preg_replace(\"\/\\\/+$\/\", \"\", $api_base);\r\n    $this-&gt;api_key = $api_key;\r\n  }\r\n\r\n  public function get($endpoint, $query_params = null) {\r\n    $endpoint = \"\/\".preg_replace(\"\/^\\\/+\/\", \"\", $endpoint);\r\n    $url = $this-&gt;api_base.$endpoint;\r\n\r\n    $query_string = \"\";\r\n    if ($query_params !== null) {\r\n      $q = null;\r\n      if (is_string($query_params)) {\r\n        $q = explode($url, '&');\r\n      } elseif (is_array($query_params)) {\r\n        $q = $query_params;\r\n      }\r\n      $tmp = [];\r\n      foreach ($q as $key =&gt; $value) {\r\n        $tmp[] = urlencode($key) . \"=\" . urlencode($value);\r\n      }\r\n      $query_string = implode(\"&\", $tmp);\r\n    }\r\n\r\n    if ($query_string !== \"\") {\r\n      $url .= \"?\".$query_string;\r\n    }\r\n\r\n    $ch = curl_init($url);\r\n    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\r\n    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);\r\n    curl_setopt($ch, CURLOPT_USERNAME, \"api\");\r\n    curl_setopt($ch, CURLOPT_PASSWORD, $this-&gt;api_key);\r\n    $response = curl_exec($ch);\r\n\r\n    return $this-&gt;process_response($ch, $response);\r\n  }\r\n\r\n  public function put($endpoint, $body = null) {\r\n    $endpoint = \"\/\" . preg_replace(\"\/^\\\/+\/\", \"\", $endpoint);\r\n    $url = $this-&gt;api_base . $endpoint;\r\n\r\n    $data_json = json_encode($body);\r\n    if (json_last_error()) {\r\n      throw new RequestError(\"Error encoding body as json: \".json_last_error_msg());\r\n    }\r\n\r\n    $ch = curl_init($url);\r\n    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\r\n    curl_setopt($ch, CURLOPT_USERNAME, \"api\");\r\n    curl_setopt($ch, CURLOPT_PASSWORD, $this-&gt;api_key);\r\n    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, \"PUT\");\r\n    curl_setopt($ch, CURLOPT_HTTPHEADER, [\"Content-Type:application\/json\", \"Content-Length:\".strlen($data_json)]);\r\n    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json);\r\n    $response = curl_exec($ch);\r\n\r\n    return $this-&gt;process_response($ch, $response);\r\n  }\r\n\r\n  private function process_response($ch, $response) {\r\n    if (curl_error($ch)) {\r\n      throw new RequestError(\"Received error during request: \".curl_error($ch));\r\n    }\r\n    $response_code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);\r\n    $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);\r\n    $is_json = strstr($content_type, 'application\/json') !== false;\r\n    curl_close($ch);\r\n\r\n    if ($response_code == '200') {\r\n      if ($is_json) {\r\n        $res = json_decode($response, true, 512);\r\n        $le = json_last_error();\r\n        if ($le != JSON_ERROR_NONE) {\r\n          throw new ResponseParseError(\"Error parsing response from server as JSON: \".json_last_error_msg());\r\n        }\r\n        return $res;\r\n      } else {\r\n        return $response;\r\n      }\r\n    } else {\r\n      if ($is_json) {\r\n        $res = json_decode($response, true, 512);\r\n        $le = json_last_error();\r\n        if ($le != JSON_ERROR_NONE) {\r\n          throw new ResponseError(\"Received \".$response_code.\" code from server, but failed to parse JSON response: \".json_last_error_msg());\r\n        }\r\n        throw new ResponseError(\"Received \".$response_code.\" code from server: \".$res['error']);\r\n      } else {\r\n        throw new ResponseError(\"Received \".$response_code.\" code from server: \".$response);\r\n      }\r\n    }\r\n  }\r\n}<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Node.js + stdlib&lt;\/strong&gt;\">\n<pre>\/\/ filename proxy_api.js\r\nconst https = require('https')\r\nconst http = require('http')\r\nconst querystring = require('querystring');\r\n\r\nfunction process_response(response, body, resolve, reject) {\r\n  const ct = response.headers['content-type'] || '';\r\n  let isJson = false;\r\n  if (ct.includes(\"application\/json\")) {\r\n    isJson = true;\r\n  }\r\n\r\n  if (response.statusCode == 200) {\r\n    if (isJson) {\r\n      let json;\r\n      try {\r\n        json = JSON.parse(body);\r\n      } catch(e) {\r\n        reject(e);\r\n        return;\r\n      }\r\n      resolve(json);\r\n    } else {\r\n      resolve(body);\r\n    }\r\n  } else {\r\n    const err = \"Received status \" + response.statusCode + \" from server\";\r\n    if (isJson) {\r\n      let json;\r\n      try {\r\n        json = JSON.parse(body);\r\n      } catch(e) {\r\n        reject(new Error(err + \", but failed to parse JSON: \" + body));\r\n        return;\r\n      }\r\n      reject(new Error(err + \": \" + json['error']));\r\n    } else {\r\n      reject(new Error(err + \": \" + body));\r\n    }\r\n  }\r\n}\r\n\r\nasync function get(url, api_key, query_params = {}) {\r\n  const qs = querystring.stringify(query_params);\r\n  let final_url = url;\r\n  if (qs != '') {\r\n    final_url += '?' + qs;\r\n  }\r\n  const options = {\r\n    method: 'GET',\r\n    auth: \"api:\" + api_key\r\n  }\r\n\r\n  const result = await new Promise((resolve, reject) =&gt; {\r\n    let t;\r\n    if (final_url.startsWith(\"http:\/\/\")) {\r\n      t = http;\r\n    } else if (final_url.startsWith(\"https:\/\/\")) {\r\n      t = https;\r\n    }\r\n    const req = t.request(final_url, options, (res) =&gt; {\r\n      res.setEncoding('utf8');\r\n      const chunks = [];\r\n      res.on('data', (chunk) =&gt; {\r\n        chunks.push(chunk);\r\n      });\r\n\r\n      res.on('end', () =&gt; {\r\n        const body = chunks.join('');\r\n        process_response(res, body, resolve, reject);\r\n      });\r\n    });\r\n\r\n    req.on('error', (e) =&gt; {\r\n      reject(e);\r\n    });\r\n\r\n    req.end();\r\n  }).catch((e) =&gt; (e));\r\n\r\n  return result;\r\n}\r\n\r\nasync function put(url, api_key, request_body = {}) {\r\n  const request_body_str = JSON.stringify(request_body);\r\n  const options = {\r\n    method: 'PUT',\r\n    auth: \"api:\" + api_key,\r\n    headers: {\r\n      'Content-Type': 'application\/json',\r\n      'Content-Length': request_body_str.length\r\n    }\r\n  }\r\n\r\n  const result = await new Promise((resolve, reject) =&gt; {\r\n    let t;\r\n    if (url.startsWith(\"http:\/\/\")) {\r\n      t = http;\r\n    } else if (url.startsWith(\"https:\/\/\")) {\r\n      t = https;\r\n    }\r\n    const req = t.request(url, options, (res) =&gt; {\r\n      res.setEncoding('utf8');\r\n      const ct = res.headers['content-type'] || '';\r\n      let isJson = false;\r\n      if (ct.includes(\"application\/json\")) {\r\n        isJson = true;\r\n      }\r\n      const chunks = []\r\n      res.on('data', (chunk) =&gt; {\r\n        chunks.push(chunk);\r\n      });\r\n\r\n      res.on('end', () =&gt; {\r\n        const body = chunks.join('');\r\n        process_response(res, body, resolve, reject);\r\n      });\r\n    });\r\n\r\n    req.on('error', (e) =&gt; {\r\n      reject(e);\r\n    });\r\n\r\n    req.write(request_body_str);\r\n    req.end();\r\n  }).catch((e) =&gt; (e));\r\n\r\n  return result;\r\n}\r\n\r\nmodule.exports = {\r\n  get: get,\r\n  put: put\r\n}<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Ruby + stdlib&lt;\/strong&gt;\">\n<pre># \u6587\u4ef6\u540d proxy_api.rb\r\nrequire 'net\/http\r\n\u9700\u8981 'uri\r\n\u9700\u8981 'json\r\n\r\n\u7c7b ProxyAPIException &lt; StandardError\r\n\u7ed3\u675f\r\n\r\nclass RequestError &lt; ProxyAPIException\r\n\u7ed3\u675f\r\n\r\n\u7c7b ResponseError &lt; \u4ee3\u7406 APIException\r\n  attr_accessor :code\r\n\u7ed3\u675f\r\n\r\n\u7c7b ResponseParseError  e\r\n      err = RequestError.new(e.message)\r\n    \u7ed3\u675f\r\n\r\n    raise err if err\r\n\r\n    return process_response(response)\r\n  \u7ed3\u675f\r\n\r\n  def put(endpoint, body = {})\r\n    endpoint = endpoint.gsub(\/^\\\/+\/, '\/')\r\n    if endpoint[0] != '\/'\r\n      endpoint = '\/' + endpoint\r\n    \u7ed3\u675f\r\n    final_url = @base_url + endpoint\r\n    uri = URI.parse(final_url)\r\n    request = Net::HTTP::Put.new(uri)\r\n    req_options = {\r\n      use_ssl: uri.scheme == \"https\"\u3001\r\n    }\r\n    request.basic_auth('api', @api_key)\r\n    request['Content-Type'] = \"application\/json\r\n    request.body = body.to_json\r\n\r\n    \u54cd\u5e94 = nil\r\n    err = nil\r\n    \u5f00\u59cb\r\n      response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|\r\n        response = http.request(request)\r\n      \u7ed3\u675f\r\n    \u6551\u63f4 =&gt; e\r\n      err = RequestError.new(e.message)\r\n    \u7ed3\u675f\r\n\r\n    raise err if err\r\n\r\n    return process_response(response)\r\n  \u7ed3\u675f\r\n\r\n  \u79c1\u6709\r\n\r\n  def process_response(response)\r\n    \u5982\u679c response.code == '200'\r\n      err = nil\r\n      res = begin\r\n        if is_json_response?(response)\r\n          \u5219 JSON.parse\uff08response.body\uff09\r\n        \u5426\u5219\r\n          \u54cd\u5e94\u6b63\u6587\r\n        \u7ed3\u675f\r\n      \u6551\u63f4 =&gt; e\r\n        err = ResponseParseError.new(e.message)\r\n      \u7ed3\u675f\r\n      \u5982\u679c\u51fa\u73b0 err\uff0c\u5219\u5f15\u53d1 err\r\n      \u8fd4\u56de res\r\n    \u5426\u5219\r\n      if is_json_response?(response)\r\n        b = JSON.parse(response.body) \u8fd4\u56de nil\r\n        \u5982\u679c b\r\n          ex = ResponseError.new(\"Received code #{response.code} from server: #{b['error']}\")\r\n          ex.code = response.code.to_i\r\n          \u5f15\u53d1 ex\r\n        \u5426\u5219\r\n          ex = ResponseError.new(\"Received code #{response.code} from server, but failed to parse JSON: #{response.body}\")\r\n          ex.code = response.code.to_i\r\n          \u5f15\u53d1 ex\r\n        \u7ed3\u675f\r\n      \u5426\u5219\r\n        ex = ResponseError.new(\"Received code #{response.code} from server: #{response.body}\")\r\n        ex.code = response.code.to_i\r\n        \u5f15\u53d1 ex\r\n      \u7ed3\u675f\r\n    \u7ed3\u675f\r\n  \u7ed3\u675f\r\n\r\n  def is_json_response?(response)\r\n    response['Content-Type'].to_s.split(';').each do |part|\r\n      \u5982\u679c part == 'application\/json' \u5219\u8fd4\u56de true\r\n    \u7ed3\u675f\r\n    \u8fd4\u56de false\r\n  \u7ed3\u675f\r\n\u7ed3\u675f<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Golang + stdlib&lt;\/strong&gt;\">\n<div>\n<div class=\"tab-content\">\n<div id=\"golang_common_code\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre># \u6587\u4ef6\u540d proxy_api.rb\r\nrequire 'net\/http\r\n\u9700\u8981 'uri\r\n\u9700\u8981 'json\r\n\r\n\u7c7b ProxyAPIException &lt; StandardError\r\n\u7ed3\u675f\r\n\r\nclass RequestError &lt; ProxyAPIException\r\n\u7ed3\u675f\r\n\r\n\u7c7b ResponseError &lt; \u4ee3\u7406 APIException\r\n  attr_accessor :code\r\n\u7ed3\u675f\r\n\r\n\u7c7b ResponseParseError  e\r\n      err = RequestError.new(e.message)\r\n    \u7ed3\u675f\r\n\r\n    raise err if err\r\n\r\n    return process_response(response)\r\n  \u7ed3\u675f\r\n\r\n  def put(endpoint, body = {})\r\n    endpoint = endpoint.gsub(\/^\\\/+\/, '\/')\r\n    if endpoint[0] != '\/'\r\n      endpoint = '\/' + endpoint\r\n    \u7ed3\u675f\r\n    final_url = @base_url + endpoint\r\n    uri = URI.parse(final_url)\r\n    request = Net::HTTP::Put.new(uri)\r\n    req_options = {\r\n      use_ssl: uri.scheme == \"https\"\u3001\r\n    }\r\n    request.basic_auth('api', @api_key)\r\n    request['Content-Type'] = \"application\/json\r\n    request.body = body.to_json\r\n\r\n    \u54cd\u5e94 = nil\r\n    err = nil\r\n    \u5f00\u59cb\r\n      response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|\r\n        response = http.request(request)\r\n      \u7ed3\u675f\r\n    \u6551\u63f4 =&gt; e\r\n      err = RequestError.new(e.message)\r\n    \u7ed3\u675f\r\n\r\n    raise err if err\r\n\r\n    return process_response(response)\r\n  \u7ed3\u675f\r\n\r\n  \u79c1\u6709\r\n\r\n  def process_response(response)\r\n    \u5982\u679c response.code == '200'\r\n      err = nil\r\n      res = begin\r\n        if is_json_response?(response)\r\n          \u5219 JSON.parse\uff08response.body\uff09\r\n        \u5426\u5219\r\n          \u54cd\u5e94\u6b63\u6587\r\n        \u7ed3\u675f\r\n      \u6551\u63f4 =&gt; e\r\n        err = ResponseParseError.new(e.message)\r\n      \u7ed3\u675f\r\n      \u5982\u679c\u51fa\u73b0 err\uff0c\u5219\u5f15\u53d1 err\r\n      \u8fd4\u56de res\r\n    \u5426\u5219\r\n      if is_json_response?(response)\r\n        b = JSON.parse(response.body) \u8fd4\u56de nil\r\n        \u5982\u679c b\r\n          ex = ResponseError.new(\"Received code #{response.code} from server: #{b['error']}\")\r\n          ex.code = response.code.to_i\r\n          \u5f15\u53d1 ex\r\n        \u5426\u5219\r\n          ex = ResponseError.new(\"Received code #{response.code} from server, but failed to parse JSON: #{response.body}\")\r\n          ex.code = response.code.to_i\r\n          \u5f15\u53d1 ex\r\n        \u7ed3\u675f\r\n      \u5426\u5219\r\n        ex = ResponseError.new(\"Received code #{response.code} from server: #{response.body}\")\r\n        ex.code = response.code.to_i\r\n        \u5f15\u53d1 ex\r\n      \u7ed3\u675f\r\n    \u7ed3\u675f\r\n  \u7ed3\u675f\r\n\r\n  def is_json_response?(response)\r\n    response['Content-Type'].to_s.split(';').each do |part|\r\n      \u5982\u679c part == 'application\/json' \u5219\u8fd4\u56de true\r\n    \u7ed3\u675f\r\n    \u8fd4\u56de false\r\n  \u7ed3\u675f\r\n\u7ed3\u675f<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div><\/div><\/div>\n<hr \/>\n<h2>\u83b7\u53d6\u8ba2\u9605\u5217\u8868<\/h2>\n<div>\n<div class=\"pre-parent\">\n<div class=\"pre-description\">\u8be5\u7aef\u70b9\u5141\u8bb8\u83b7\u53d6\u6240\u6709\u8ba2\u9605\u7684\u5217\u8868\u3002<\/div>\n<div class=\"pre-params\">\n<table class=\"table table-condensed table-bordered\">\n<tbody>\n<tr>\n<td>\u7ec8\u70b9<\/td>\n<td>\/package_subscriptions<\/td>\n<\/tr>\n<tr>\n<td>\u65b9\u6cd5<\/td>\n<td>\u83b7\u53d6<\/td>\n<\/tr>\n<tr>\n<td>\u53c2\u6570<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>\u67e5\u8be2\u53c2\u6570<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>JSON \u53c2\u6570<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"su-tabs su-tabs-style-default su-tabs-mobile-stack\" data-active=\"6\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-tabs-nav\"><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>\u5728 *nix shell \u4e2d\u4f7f\u7528 curl<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Python 3 + \u8bf7\u6c42<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>PHP + libcurl<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Node.js + stdlib<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Ruby + stdlib<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\">Golang + stdlib<\/span><\/div><div class=\"su-tabs-panes\"><div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;curl in *nix shell&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"curl_get_subscriptions_list\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>curl -u api:08c5fa8dd63c8adc4b08803df5f68f9d https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<pre>[\r\n  {\r\n    \"id\":8644\u3001\r\n    \"\u7c7b\u578b\": \"Backconnect\"\u3001\r\n    \"\u5305\": \"Backconnect \u5165\u95e8 (200K \u8bf7\u6c42)\"\u3001\r\n    \"\u6d3b\u52a8\":false\r\n  },\r\n  {\r\n    \"id\":8643\u3001\r\n    \"\u7c7b\u578b\": \"\u4ee3\u7406\"\u3001\r\n    \"package\": \"3 Private Proxies\"\u3001\r\n    \"\u6d3b\u52a8\":true\r\n  }\r\n]<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Python 3 + requests&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"python_get_subscriptions_list\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>\u4ece proxy_api \u5bfc\u5165 *\r\n\r\napi = ProxyAPI(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\")\r\ntry\uff1a\r\n  result = api.get(\"\/package_subscriptions\")\r\n  pprint.PrettyPrinter(indent=2).pprint(result)\r\nexcept ProxyAPIException as e\uff1a\r\n  print(str(e))<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<pre>[\r\n  {\r\n    \"id\":8644\u3001\r\n    \"\u7c7b\u578b\": \"Backconnect\"\u3001\r\n    \"\u5305\": \"Backconnect \u5165\u95e8 (200K \u8bf7\u6c42)\"\u3001\r\n    \"\u6d3b\u52a8\":false\r\n  },\r\n  {\r\n    \"id\":8643\u3001\r\n    \"\u7c7b\u578b\": \"\u4ee3\u7406\"\u3001\r\n    \"package\": \"3 Private Proxies\"\u3001\r\n    \"\u6d3b\u52a8\":true\r\n  }\r\n]<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;PHP + libcurl&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"php_get_subscriptions_list\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>get(\"\/package_subscriptions\"))\uff1b\r\n} catch(ProxyAPIException $e) {\r\n  echo $e\uff1b\r\n}<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<pre>[\r\n  {\r\n    \"id\":8644\u3001\r\n    \"\u7c7b\u578b\": \"Backconnect\"\u3001\r\n    \"\u5305\": \"Backconnect \u5165\u95e8 (200K \u8bf7\u6c42)\"\u3001\r\n    \"\u6d3b\u52a8\":false\r\n  },\r\n  {\r\n    \"id\":8643\u3001\r\n    \"\u7c7b\u578b\": \"\u4ee3\u7406\"\u3001\r\n    \"package\": \"3 Private Proxies\"\u3001\r\n    \"\u6d3b\u52a8\":true\r\n  }\r\n]<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Node.js + stdlib&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"nodejs_get_subscriptions_list\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>const proxy_api = require('.\/proxy_api')\uff1b\r\n\r\nasync \u51fd\u6570 main() {\r\n  const res = await proxy_api.get('https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions', '08c5fa8dd63c8adc4b08803df5f68f9d')\uff1b\r\n  if (res instanceof Error) {\r\n    console.log(\"Error:\")+ res.toString())\uff1b\r\n  } else {\r\n    console.log(res)\uff1b\r\n  }\r\n}\r\n\r\nmain()\uff1b<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<pre>[\r\n  {\r\n    \"id\":8644\u3001\r\n    \"\u7c7b\u578b\": \"Backconnect\"\u3001\r\n    \"\u5305\": \"Backconnect \u5165\u95e8 (200K \u8bf7\u6c42)\"\u3001\r\n    \"\u6d3b\u52a8\":false\r\n  },\r\n  {\r\n    \"id\":8643\u3001\r\n    \"\u7c7b\u578b\": \"\u4ee3\u7406\"\u3001\r\n    \"package\": \"3 Private Proxies\"\u3001\r\n    \"\u6d3b\u52a8\":true\r\n  }\r\n]<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Ruby + stdlib&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"ruby_get_subscriptions_list\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>require_relative '.\/proxy_api\r\n\r\n\u5f00\u59cb\r\n  api = ProxyAPI.new(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\")\r\n  puts(api.get(\"\/package_subscriptions\").inspect)\r\nrescue ProxyAPIException =&gt; e\r\n  puts e.message\r\n\u7ed3\u675f<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<pre>[\r\n  {\r\n    \"id\":8644\u3001\r\n    \"\u7c7b\u578b\": \"Backconnect\"\u3001\r\n    \"\u5305\": \"Backconnect \u5165\u95e8 (200K \u8bf7\u6c42)\"\u3001\r\n    \"\u6d3b\u52a8\":false\r\n  },\r\n  {\r\n    \"id\":8643\u3001\r\n    \"\u7c7b\u578b\": \"\u4ee3\u7406\"\u3001\r\n    \"package\": \"3 Private Proxies\"\u3001\r\n    \"\u6d3b\u52a8\":true\r\n  }\r\n]<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"Golang + stdlib\">\n<div class=\"tab-content\">\n<div id=\"golang_get_subscriptions_list\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>\u4e3b\u5305\r\n\r\n\u5bfc\u5165 (\r\n  \"\u7f16\u7801\/json\"\r\n  \"fmt\"\r\n  \"net\/http\"\r\n)\r\n\r\n\u7c7b\u578b subscriptionEl struct {\r\n  ID int `json: \"id\"`\r\n  \u7c7b\u578b\u5b57\u7b26\u4e32 `json: \"type\"`\r\n  Package string `json: \"package\"`\r\n  \u6d3b\u52a8 bool `json: \"active\"`\r\n}\r\n\r\n\u7c7b\u578b subscriptionsList []*subscriptionEl\r\n\r\nfunc main() {\r\n  api := NewProxyAPI(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\", &amp;http.Client{})\r\n\r\n  resp, isJSON, err := api.Get(\"\/package_subscriptions\", nil)\r\n  if err != nil {\r\n    fmt.Println(err)\r\n  } else {\r\n    if isJSON {\r\n      var subscriptions subscriptionsList\r\n      json.Unmarshal([]byte(resp), &amp;subscriptions)\r\n      for _, v := range subscriptions {\r\n        fmt.Println(v)\r\n      }\r\n    } else {\r\n      fmt.Println(resp)\r\n    }\r\n  }\r\n}<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<pre>[\r\n  {\r\n    \"id\":8644\u3001\r\n    \"\u7c7b\u578b\": \"Backconnect\"\u3001\r\n    \"\u5305\": \"Backconnect \u5165\u95e8 (200K \u8bf7\u6c42)\"\u3001\r\n    \"\u6d3b\u52a8\":false\r\n  },\r\n  {\r\n    \"id\":8643\u3001\r\n    \"\u7c7b\u578b\": \"\u4ee3\u7406\"\u3001\r\n    \"package\": \"3 Private Proxies\"\u3001\r\n    \"\u6d3b\u52a8\":true\r\n  }\r\n]<\/pre>\n<\/div><\/div><\/div>\n<hr \/>\n<h2>\u83b7\u53d6\u8ba2\u9605<\/h2>\n<div>\n<div class=\"pre-parent\">\n<div class=\"pre-description\">\u901a\u8fc7\u8be5\u7aef\u70b9\uff0c\u60a8\u53ef\u4ee5\u83b7\u53d6\u7279\u5b9a\u7684\u8ba2\u8d2d\u4fe1\u606f\uff0c\u5982\u8ba1\u8d39\u5468\u671f\u7684\u5f00\u59cb\u548c\u7ed3\u675f\u65e5\u671f\uff0c\u6216\u5f53\u524d\u8ba1\u8d39\u5468\u671f\u5185 backconnect \u5957\u9910\u7684\u8bf7\u6c42\u6570\u3002<\/div>\n<div class=\"pre-params\">\n<table class=\"table table-condensed table-bordered\">\n<tbody>\n<tr>\n<td>\u7ec8\u70b9<\/td>\n<td>\/package_subscriptions\/:id<\/td>\n<\/tr>\n<tr>\n<td>\u65b9\u6cd5<\/td>\n<td>\u83b7\u53d6<\/td>\n<\/tr>\n<tr>\n<td>\u53c2\u6570<\/td>\n<td>id - \u8ba2\u9605\u7684 id<\/td>\n<\/tr>\n<tr>\n<td>\u67e5\u8be2\u53c2\u6570<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>JSON \u53c2\u6570<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"su-tabs su-tabs-style-default su-tabs-mobile-stack\" data-active=\"6\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-tabs-nav\"><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>\u5728 *nix shell \u4e2d\u4f7f\u7528 curl<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Python 3 + \u8bf7\u6c42<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>PHP + libcurl<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Node.js + stdlib<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Ruby + stdlib<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Golang + stdlib<\/strong><\/span><\/div><div class=\"su-tabs-panes\"><div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;curl in *nix shell&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"curl_get_subscription\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>curl -u api:08c5fa8dd63c8adc4b08803df5f68f9d https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions\/1<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u4ee3\u7406\u8ba2\u9605<\/th>\n<th>\u8ba2\u9605 Backconnect<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>{\r\n  \"id\":8643\u3001\r\n  \"\u7c7b\u578b\": \"\u4ee3\u7406\r\n  \"\u76ee\u7684\": \"\u8c37\u6b4c\"\u3001\r\n  \"\u56fd\u5bb6\": \"\u4efb\u4f55\u56fd\u5bb6\r\n  \"ip_type\": \"proxy\"\u3001\r\n  \u5305\": \"3 \u4e2a\u79c1\u4eba\u4ee3\u7406\"\u3001\r\n  \"price_cents\":900\u3001\r\n  \"billing_cycle_start\":1599563902,\r\n  \"billing_cycle_end\":1602155902,\r\n  \"last_invoice_amount_cents\":900\u3001\r\n  \"\u4ed8\u6b3e\u65b9\u5f0f\": \"\u5361\"\u3001\r\n  \"IP_count\":3\r\n}<\/pre>\n<\/td>\n<td>\n<pre>{\r\n  \"id\":8644\u3001\r\n  \"\u7c7b\u578b\": \"backconnect\"\u3001\r\n  \"\u76ee\u7684\": \"\u8c37\u6b4c\"\u3001\r\n  \"country\": \"Any\"\u3001\r\n  \"ip_type\": \"proxy\"\u3001\r\n  \"\u8f6f\u4ef6\u5305\": \"Backconnect \u521d\u7ea7\uff0820 \u4e07\u6b21\u8bf7\u6c42\uff09\"\u3001\r\n  \"price_cents\":5900\u3001\r\n  \"billing_cycle_start\":1599563939,\r\n  \"billing_cycle_end\":1602155939,\r\n  \"last_invoice_amount_cents\":5900\u3001\r\n  \"\u4ed8\u6b3e\u65b9\u5f0f\": \"\u5361\"\u3001\r\n  \"requests_limit\":200000,\r\n  \"port_count\":5\u3001\r\n  \"connection_limit\":1000,\r\n  \"billing_cycle_requests\":15749\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Python 3 + requests&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"python_get_subscription\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>\u4ece proxy_api \u5bfc\u5165 *\r\n\r\napi = ProxyAPI(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\")\r\ntry\uff1a\r\n  result = api.get(\"\/package_subscriptions\/1\")\r\n  pprint.PrettyPrinter(indent=2).pprint(result)\r\nexcept ProxyAPIException as e\uff1a\r\n  print(str(e))<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u4ee3\u7406\u8ba2\u9605<\/th>\n<th>\u8ba2\u9605 Backconnect<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>{\r\n  \"id\":8643\u3001\r\n  \"\u7c7b\u578b\": \"\u4ee3\u7406\r\n  \"\u76ee\u7684\": \"\u8c37\u6b4c\"\u3001\r\n  \"\u56fd\u5bb6\": \"\u4efb\u4f55\u56fd\u5bb6\r\n  \"ip_type\": \"proxy\"\u3001\r\n  \u5305\": \"3 \u4e2a\u79c1\u4eba\u4ee3\u7406\"\u3001\r\n  \"price_cents\":900\u3001\r\n  \"billing_cycle_start\":1599563902,\r\n  \"billing_cycle_end\":1602155902,\r\n  \"last_invoice_amount_cents\":900\u3001\r\n  \"\u4ed8\u6b3e\u65b9\u5f0f\": \"\u5361\"\u3001\r\n  \"IP_count\":3\r\n}<\/pre>\n<\/td>\n<td>\n<pre>{\r\n  \"id\":8644\u3001\r\n  \"\u7c7b\u578b\": \"backconnect\"\u3001\r\n  \"\u76ee\u7684\": \"\u8c37\u6b4c\"\u3001\r\n  \"country\": \"Any\"\u3001\r\n  \"ip_type\": \"proxy\"\u3001\r\n  \"\u8f6f\u4ef6\u5305\": \"Backconnect \u521d\u7ea7\uff0820 \u4e07\u6b21\u8bf7\u6c42\uff09\"\u3001\r\n  \"price_cents\":5900\u3001\r\n  \"billing_cycle_start\":1599563939,\r\n  \"billing_cycle_end\":1602155939,\r\n  \"last_invoice_amount_cents\":5900\u3001\r\n  \"\u4ed8\u6b3e\u65b9\u5f0f\": \"\u5361\"\u3001\r\n  \"requests_limit\":200000,\r\n  \"port_count\":5\u3001\r\n  \"connection_limit\":1000,\r\n  \"billing_cycle_requests\":15749\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;PHP + libcurl&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"php_get_subscription\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>get(\"\/package_subscriptions\/1\"))\uff1b\r\n} catch(ProxyAPIException $e) {\r\n  echo $e\uff1b\r\n}<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u4ee3\u7406\u8ba2\u9605<\/th>\n<th>\u8ba2\u9605 Backconnect<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>{\r\n  \"id\":8643\u3001\r\n  \"\u7c7b\u578b\": \"\u4ee3\u7406\r\n  \"\u76ee\u7684\": \"\u8c37\u6b4c\"\u3001\r\n  \"\u56fd\u5bb6\": \"\u4efb\u4f55\u56fd\u5bb6\r\n  \"ip_type\": \"proxy\"\u3001\r\n  \u5305\": \"3 \u4e2a\u79c1\u4eba\u4ee3\u7406\"\u3001\r\n  \"price_cents\":900\u3001\r\n  \"billing_cycle_start\":1599563902,\r\n  \"billing_cycle_end\":1602155902,\r\n  \"last_invoice_amount_cents\":900\u3001\r\n  \"\u4ed8\u6b3e\u65b9\u5f0f\": \"\u5361\"\u3001\r\n  \"IP_count\":3\r\n}<\/pre>\n<\/td>\n<td>\n<pre>{\r\n  \"id\":8644\u3001\r\n  \"\u7c7b\u578b\": \"backconnect\"\u3001\r\n  \"\u76ee\u7684\": \"\u8c37\u6b4c\"\u3001\r\n  \"country\": \"Any\"\u3001\r\n  \"ip_type\": \"proxy\"\u3001\r\n  \"\u8f6f\u4ef6\u5305\": \"Backconnect \u521d\u7ea7\uff0820 \u4e07\u6b21\u8bf7\u6c42\uff09\"\u3001\r\n  \"price_cents\":5900\u3001\r\n  \"billing_cycle_start\":1599563939,\r\n  \"billing_cycle_end\":1602155939,\r\n  \"last_invoice_amount_cents\":5900\u3001\r\n  \"\u4ed8\u6b3e\u65b9\u5f0f\": \"\u5361\"\u3001\r\n  \"requests_limit\":200000,\r\n  \"port_count\":5\u3001\r\n  \"connection_limit\":1000,\r\n  \"billing_cycle_requests\":15749\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Node.js + stdlib&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"nodejs_get_subscription\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>const proxy_api = require('.\/proxy_api')\uff1b\r\n\r\nasync \u51fd\u6570 main() {\r\n  const res = await proxy_api.get('https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions\/1', '08c5fa8dd63c8adc4b08803df5f68f9d')\uff1b\r\n  if (res instanceof Error) {\r\n    console.log(\"Error:\")+ res.toString())\uff1b\r\n  } else {\r\n    console.log(res)\uff1b\r\n  }\r\n}\r\n\r\nmain()\uff1b<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u4ee3\u7406\u8ba2\u9605<\/th>\n<th>\u8ba2\u9605 Backconnect<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>{\r\n  \"id\":8643\u3001\r\n  \"\u7c7b\u578b\": \"\u4ee3\u7406\r\n  \"\u76ee\u7684\": \"\u8c37\u6b4c\"\u3001\r\n  \"\u56fd\u5bb6\": \"\u4efb\u4f55\u56fd\u5bb6\r\n  \"ip_type\": \"proxy\"\u3001\r\n  \u5305\": \"3 \u4e2a\u79c1\u4eba\u4ee3\u7406\"\u3001\r\n  \"price_cents\":900\u3001\r\n  \"billing_cycle_start\":1599563902,\r\n  \"billing_cycle_end\":1602155902,\r\n  \"last_invoice_amount_cents\":900\u3001\r\n  \"\u4ed8\u6b3e\u65b9\u5f0f\": \"\u5361\"\u3001\r\n  \"IP_count\":3\r\n}<\/pre>\n<\/td>\n<td>\n<pre>{\r\n  \"id\":8644\u3001\r\n  \"\u7c7b\u578b\": \"backconnect\"\u3001\r\n  \"\u76ee\u7684\": \"\u8c37\u6b4c\"\u3001\r\n  \"country\": \"Any\"\u3001\r\n  \"ip_type\": \"proxy\"\u3001\r\n  \"\u8f6f\u4ef6\u5305\": \"Backconnect \u521d\u7ea7\uff0820 \u4e07\u6b21\u8bf7\u6c42\uff09\"\u3001\r\n  \"price_cents\":5900\u3001\r\n  \"billing_cycle_start\":1599563939,\r\n  \"billing_cycle_end\":1602155939,\r\n  \"last_invoice_amount_cents\":5900\u3001\r\n  \"\u4ed8\u6b3e\u65b9\u5f0f\": \"\u5361\"\u3001\r\n  \"requests_limit\":200000,\r\n  \"port_count\":5\u3001\r\n  \"connection_limit\":1000,\r\n  \"billing_cycle_requests\":15749\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Ruby + stdlib&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"ruby_get_subscription\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>require_relative '.\/proxy_api\r\n\r\n\u5f00\u59cb\r\n  api = ProxyAPI.new(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\")\r\n  puts(api.get(\"\/package_subscriptions\/1\").inspect)\r\nrescue ProxyAPIException =&gt; e\r\n  puts e.message\r\n\u7ed3\u675f<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u4ee3\u7406\u8ba2\u9605<\/th>\n<th>\u8ba2\u9605 Backconnect<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>{\r\n  \"id\":8643\u3001\r\n  \"\u7c7b\u578b\": \"\u4ee3\u7406\r\n  \"\u76ee\u7684\": \"\u8c37\u6b4c\"\u3001\r\n  \"\u56fd\u5bb6\": \"\u4efb\u4f55\u56fd\u5bb6\r\n  \"ip_type\": \"proxy\"\u3001\r\n  \u5305\": \"3 \u4e2a\u79c1\u4eba\u4ee3\u7406\"\u3001\r\n  \"price_cents\":900\u3001\r\n  \"billing_cycle_start\":1599563902,\r\n  \"billing_cycle_end\":1602155902,\r\n  \"last_invoice_amount_cents\":900\u3001\r\n  \"\u4ed8\u6b3e\u65b9\u5f0f\": \"\u5361\"\u3001\r\n  \"IP_count\":3\r\n}<\/pre>\n<\/td>\n<td>\n<pre>{\r\n  \"id\":8644\u3001\r\n  \"\u7c7b\u578b\": \"backconnect\"\u3001\r\n  \"\u76ee\u7684\": \"\u8c37\u6b4c\"\u3001\r\n  \"country\": \"Any\"\u3001\r\n  \"ip_type\": \"proxy\"\u3001\r\n  \"\u8f6f\u4ef6\u5305\": \"Backconnect \u521d\u7ea7\uff0820 \u4e07\u6b21\u8bf7\u6c42\uff09\"\u3001\r\n  \"price_cents\":5900\u3001\r\n  \"billing_cycle_start\":1599563939,\r\n  \"billing_cycle_end\":1602155939,\r\n  \"last_invoice_amount_cents\":5900\u3001\r\n  \"\u4ed8\u6b3e\u65b9\u5f0f\": \"\u5361\"\u3001\r\n  \"requests_limit\":200000,\r\n  \"port_count\":5\u3001\r\n  \"connection_limit\":1000,\r\n  \"billing_cycle_requests\":15749\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Golang + stdlib&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"golang_get_subscription\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>\u4e3b\u5305\r\n\r\n\u5bfc\u5165 (\r\n  \"\u7f16\u7801\/json\"\r\n  \"fmt\"\r\n  \"net\/http\"\r\n)\r\n\r\n\u7c7b\u578b \u8ba2\u9605 \u7ed3\u6784 {\r\n  ID int `json: \"id\"`\r\n  \u7c7b\u578b\u5b57\u7b26\u4e32 `json: \"type\"`\r\n  \u76ee\u7684\u5b57\u7b26\u4e32 `json: \"purpose\"`\r\n  \u56fd\u5bb6\u5b57\u7b26\u4e32 `json: \"country\"`\r\n  IPType string `json: \"IP_type\"`\r\n  \u5305\u88c5\u5b57\u7b26\u4e32 `json: \"package\"`\r\n  PriceCents int `json: \"price_cents\"`\r\n  BillingCycleStart uint64 `json: \"billing_cycle_start\"`\r\n  BillingCycleEnd uint64 `json: \"billing_cycle_end\"`\r\n  LastInvoiceAmountCents int `json: \"last_invoice_amount_cents\"`\r\n  \u4ed8\u6b3e\u65b9\u5f0f\u5b57\u7b26\u4e32 `json: \"payment_method\"`\r\n\r\n  \/\/ \u4ec5\u4ee3\u7406\r\n  IPCount int `json: \"IP_count\"`\r\n\r\n  \/\/ \u4ec5\u53cd\u5411\u8fde\u63a5\r\n  RequestsLimit int `json: \"requests_limit\"`\r\n  PortCount int `json: \"port_count\"`\r\n  ConnectionLimit int `json: \"connection_limit\"`\r\n  BillingCycleRequests int `json: \"billing_cycle_requests\"`\r\n}\r\n\r\nfunc main() {\r\n  api := NewProxyAPI(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\", &amp;http.Client{})\r\n\r\n  resp, isJSON, err := api.Get(\"\/package_subscriptions\/1\", nil)\r\n  if err != nil {\r\n    fmt.Println(err)\r\n  } else {\r\n    if isJSON {\r\n      \u5b50\u8ba2\u9605\r\n      json.Unmarshal([]byte(resp), &amp;sub)\r\n      fmt.Println(sub)\r\n    } else {\r\n      fmt.Println(resp)\r\n    }\r\n  }\r\n}<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u4ee3\u7406\u8ba2\u9605<\/th>\n<th>\u8ba2\u9605 Backconnect<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>{\r\n  \"id\":8643\u3001\r\n  \"\u7c7b\u578b\": \"\u4ee3\u7406\r\n  \"\u76ee\u7684\": \"\u8c37\u6b4c\"\u3001\r\n  \"\u56fd\u5bb6\": \"\u4efb\u4f55\u56fd\u5bb6\r\n  \"ip_type\": \"proxy\"\u3001\r\n  \u5305\": \"3 \u4e2a\u79c1\u4eba\u4ee3\u7406\"\u3001\r\n  \"price_cents\":900\u3001\r\n  \"billing_cycle_start\":1599563902,\r\n  \"billing_cycle_end\":1602155902,\r\n  \"last_invoice_amount_cents\":900\u3001\r\n  \"\u4ed8\u6b3e\u65b9\u5f0f\": \"\u5361\"\u3001\r\n  \"IP_count\":3\r\n}<\/pre>\n<\/td>\n<td>\n<pre>{\r\n  \"id\":8644\u3001\r\n  \"\u7c7b\u578b\": \"backconnect\"\u3001\r\n  \"\u76ee\u7684\": \"\u8c37\u6b4c\"\u3001\r\n  \"country\": \"Any\"\u3001\r\n  \"ip_type\": \"proxy\"\u3001\r\n  \"\u8f6f\u4ef6\u5305\": \"Backconnect \u521d\u7ea7\uff0820 \u4e07\u6b21\u8bf7\u6c42\uff09\"\u3001\r\n  \"price_cents\":5900\u3001\r\n  \"billing_cycle_start\":1599563939,\r\n  \"billing_cycle_end\":1602155939,\r\n  \"last_invoice_amount_cents\":5900\u3001\r\n  \"\u4ed8\u6b3e\u65b9\u5f0f\": \"\u5361\"\u3001\r\n  \"requests_limit\":200000,\r\n  \"port_count\":5\u3001\r\n  \"connection_limit\":1000,\r\n  \"billing_cycle_requests\":15749\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div><\/div><\/div>\n<hr \/>\n<h2>IP\/Port \u5217\u8868<\/h2>\n<div>\n<div class=\"pre-parent\">\n<div class=\"pre-description\">\u8be5\u7aef\u70b9\u5141\u8bb8\u83b7\u53d6\u8f6f\u4ef6\u5305\u7684\u4ee3\u7406\/\u540e\u8fde\u63a5\u7f51\u5173 IP \u5217\u8868\u3002<\/div>\n<div class=\"pre-params\">\n<table class=\"table table-condensed table-bordered\">\n<tbody>\n<tr>\n<td>\u7ec8\u70b9<\/td>\n<td>\/package_subscriptions\/:id\/ips<\/td>\n<\/tr>\n<tr>\n<td>\u65b9\u6cd5<\/td>\n<td>\u83b7\u53d6<\/td>\n<\/tr>\n<tr>\n<td>\u53c2\u6570<\/td>\n<td>id - \u8ba2\u9605\u7684 id<\/td>\n<\/tr>\n<tr>\n<td>\u67e5\u8be2\u53c2\u6570<\/td>\n<td>hide_auth - \u5982\u679c\u5b58\u5728\uff0c\u4ece\u5217\u8868\u4e2d\u9690\u85cf\u8bc1\u4e66<br \/>\nhide_port - \u9690\u85cf\u7aef\u53e3\uff08\u4ec5\u9650\u9759\u6001\u8f6f\u4ef6\u5305\uff09<br \/>\n\u7aef\u53e3 - \u663e\u793a\u4e0d\u540c\u7684\u7aef\u53e3\uff0c\u53ef\u7528\u503c\u4e3a 2534\u30013389\u30015432 \u548c 5433\uff0c\u9ed8\u8ba4\u503c\u4e3a 5432\uff08\u4ec5\u9650\u9759\u6001\u8f6f\u4ef6\u5305\uff09<\/td>\n<\/tr>\n<tr>\n<td>JSON \u53c2\u6570<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"su-tabs su-tabs-style-default su-tabs-mobile-stack\" data-active=\"6\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-tabs-nav\"><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>\u5728 *nix shell \u4e2d\u4f7f\u7528 curl<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Python 3 + \u8bf7\u6c42<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>PHP + libcurl<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Node.js + stdlib<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Ruby + stdlib<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Golang + stdlib<\/strong><\/span><\/div><div class=\"su-tabs-panes\"><div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;curl in *nix shell&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"curl_ip_list\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>curl -u api:08c5fa8dd63c8adc4b08803df5f68f9d https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions\/1\/ips<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u65e0 hide_auth<\/th>\n<th>\u4f7f\u7528 hide_auth<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>1.1.1.1:5432:login:password\r\n2.2.2.2:5432:login:password\r\n3.3.3.3:5432:login:password<\/pre>\n<\/td>\n<td>\n<pre>1.1.1.1:5432\r\n2.2.2.2:5432\r\n3.3.3.3:5432<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Python 3 + requests&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"python_ip_list\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>\u4ece proxy_api \u5bfc\u5165 *\r\n\r\napi = ProxyAPI(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\")\r\ntry\uff1a\r\n  result = api.get(\"\/package_subscriptions\/1\/ips\")\r\n  pprint.PrettyPrinter(indent=2).pprint(result)\r\n  result = api.get(\"\/package_subscriptions\/1\/ips\", query_params={'hide_auth': ''})\r\n  pprint.PrettyPrinter(indent=2).pprint(result)\r\nexcept ProxyAPIException as e\uff1a\r\n  print(str(e))<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u65e0 hide_auth<\/th>\n<th>\u4f7f\u7528 hide_auth<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>1.1.1.1:5432:login:password\r\n2.2.2.2:5432:login:password\r\n3.3.3.3:5432:login:password<\/pre>\n<\/td>\n<td>\n<pre>1.1.1.1:5432\r\n2.2.2.2:5432\r\n3.3.3.3:5432<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;PHP + libcurl&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"php_ip_list\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>get(\"\/package_subscriptions\/1\/ips\"))\uff1b\r\n  var_dump($api-&gt;get(\"\/package_subscriptions\/1\/ips\", [\r\n    \"hide_auth\" =&gt; \"\"\r\n  ]));\r\n} catch(ProxyAPIException $e) {\r\n  echo $e\uff1b\r\n}<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u65e0 hide_auth<\/th>\n<th>\u4f7f\u7528 hide_auth<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>1.1.1.1:5432:login:password\r\n2.2.2.2:5432:login:password\r\n3.3.3.3:5432:login:password<\/pre>\n<\/td>\n<td>\n<pre>1.1.1.1:5432\r\n2.2.2.2:5432\r\n3.3.3.3:5432<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Node.js + stdlib&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"nodejs_ip_list\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>const proxy_api = require('.\/proxy_api')\uff1b\r\n\r\nasync \u51fd\u6570 main() {\r\n  const res = await proxy_api.get('https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions\/1\/ips', '08c5fa8dd63c8adc4b08803df5f68f9d')\uff1b\r\n  if (res instanceof Error) {\r\n    console.log(\"Error:\")+ res.toString())\uff1b\r\n  } else {\r\n    console.log(res)\uff1b\r\n  }\r\n  const res2 = await proxy_api.get('https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions\/1\/ips', '08c5fa8dd63c8adc4b08803df5f68f9d', {\r\n    \"hide_auth\"\uff1a\"\"\r\n  });\r\n  if (res2 instanceof Error) {\r\n    console.log(\"Error:\")+ res2.toString())\uff1b\r\n  } else {\r\n    console.log(res2)\uff1b\r\n  }\r\n}\r\n\r\nmain()\uff1b<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u65e0 hide_auth<\/th>\n<th>\u4f7f\u7528 hide_auth<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>1.1.1.1:5432:login:password\r\n2.2.2.2:5432:login:password\r\n3.3.3.3:5432:login:password<\/pre>\n<\/td>\n<td>\n<pre>1.1.1.1:5432\r\n2.2.2.2:5432\r\n3.3.3.3:5432<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Ruby + stdlib&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"ruby_ip_list\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>require_relative '.\/proxy_api\r\n\r\n\u5f00\u59cb\r\n  api = ProxyAPI.new(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\")\r\n  puts(api.get(\"\/package_subscriptions\/1\/ips\").inspect)\r\n  puts(api.get(\"\/package_subscriptions\/1\/ips\", hide_auth: '').inspect)\r\nrescue ProxyAPIException =&gt; e\r\n  puts e.message\r\n\u7ed3\u675f<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u65e0 hide_auth<\/th>\n<th>\u4f7f\u7528 hide_auth<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>1.1.1.1:5432:login:password\r\n2.2.2.2:5432:login:password\r\n3.3.3.3:5432:login:password<\/pre>\n<\/td>\n<td>\n<pre>1.1.1.1:5432\r\n2.2.2.2:5432\r\n3.3.3.3:5432<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Golang + stdlib&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"golang_ip_list\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>\u4e3b\u5305\r\n\r\n\u5bfc\u5165 (\r\n  \"fmt\"\r\n  \"net\/http\"\r\n)\r\n\r\nfunc main() {\r\n  api := NewProxyAPI(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\", &amp;http.Client{})\r\n\r\n  resp, _, err := api.Get(\"\/package_subscriptions\/1\/ips\", nil)\r\n  if err != nil {\r\n    fmt.Println(err)\r\n  } else {\r\n    fmt.Println(resp)\r\n  }\r\n\r\n  resp\uff0c_\uff0cerr = api.Get(\"\/package_subscriptions\/1\/ips\"\uff0cmap[string]string{\"hide_auth\": \"\"})\r\n  if err != nil {\r\n    fmt.Println(err)\r\n  } else {\r\n    fmt.Println(resp)\r\n  }\r\n}<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u65e0 hide_auth<\/th>\n<th>\u4f7f\u7528 hide_auth<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>1.1.1.1:5432:login:password\r\n2.2.2.2:5432:login:password\r\n3.3.3.3:5432:login:password<\/pre>\n<\/td>\n<td>\n<pre>1.1.1.1:5432\r\n2.2.2.2:5432\r\n3.3.3.3:5432<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div><\/div><\/div>\n<hr \/>\n<h2>\u83b7\u53d6\u8ba2\u9605\u8bbe\u7f6e<\/h2>\n<div>\n<div class=\"pre-parent\">\n<div class=\"pre-description\">\u8be5\u7aef\u70b9\u5141\u8bb8\u83b7\u53d6\u8f6f\u4ef6\u5305\u7684\u7279\u5b9a\u8bbe\u7f6e\uff0c\u5982\u6388\u6743 ips \u548c\u4ea4\u6362\u95f4\u9694\uff08\u7528\u4e8e backconnect\uff09\u3002<\/div>\n<div class=\"pre-params\">\n<table class=\"table table-condensed table-bordered\">\n<tbody>\n<tr>\n<td>\u7ec8\u70b9<\/td>\n<td>\/package_subscriptions\/:id\/settings<\/td>\n<\/tr>\n<tr>\n<td>\u65b9\u6cd5<\/td>\n<td>\u83b7\u53d6<\/td>\n<\/tr>\n<tr>\n<td>\u53c2\u6570<\/td>\n<td>id - \u8ba2\u9605\u7684 id<\/td>\n<\/tr>\n<tr>\n<td>\u67e5\u8be2\u53c2\u6570<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>JSON \u53c2\u6570<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"su-tabs su-tabs-style-default su-tabs-mobile-stack\" data-active=\"6\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-tabs-nav\"><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>\u5728 *nix shell \u4e2d\u4f7f\u7528 curl<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\">Python 3 + \u8bf7\u6c42<\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>PHP + libcurl<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Node.js + stdlib<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Ruby + stdlib<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Golang + stdlib<\/strong><\/span><\/div><div class=\"su-tabs-panes\"><div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;curl in *nix shell&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"curl_get_package_settings\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>curl -u api:08c5fa8dd63c8adc4b08803df5f68f9d https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions\/1\/settings<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u4ee3\u7406\u8ba2\u9605<\/th>\n<th>\u8ba2\u9605 Backconnect<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>{\r\n  \"authorized_ips\":[\r\n    \"15.25.5.11\"\r\n  ]\r\n}<\/pre>\n<\/td>\n<td>\n<pre>{\r\n  \"authorized_ips\":[\r\n    \"15.25.5.11\",\r\n    \"1.1.1.1\"\r\n  ],\r\n  \"swap_interval\":120\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"Python 3 + requests\">\n<div class=\"tab-content\">\n<div id=\"python_get_package_settings\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>\u4ece proxy_api \u5bfc\u5165 *\r\n\r\napi = ProxyAPI(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\")\r\ntry\uff1a\r\n  result = api.get(\"\/package_subscriptions\/1\/settings\")\r\n  pprint.PrettyPrinter(indent=2).pprint(result)\r\nexcept ProxyAPIException as e\uff1a\r\n  print(str(e))<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u4ee3\u7406\u8ba2\u9605<\/th>\n<th>\u8ba2\u9605 Backconnect<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>{\r\n  \"authorized_ips\":[\r\n    \"15.25.5.11\"\r\n  ]\r\n}<\/pre>\n<\/td>\n<td>\n<pre>{\r\n  \"authorized_ips\":[\r\n    \"15.25.5.11\",\r\n    \"1.1.1.1\"\r\n  ],\r\n  \"swap_interval\":120\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;PHP + libcurl&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"php_get_package_settings\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>get(\"\/package_subscriptions\/1\/settings\"))\uff1b\r\n} catch(ProxyAPIException $e) {\r\n  echo $e\uff1b\r\n}<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u4ee3\u7406\u8ba2\u9605<\/th>\n<th>\u8ba2\u9605 Backconnect<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>{\r\n  \"authorized_ips\":[\r\n    \"15.25.5.11\"\r\n  ]\r\n}<\/pre>\n<\/td>\n<td>\n<pre>{\r\n  \"authorized_ips\":[\r\n    \"15.25.5.11\",\r\n    \"1.1.1.1\"\r\n  ],\r\n  \"swap_interval\":120\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Node.js + stdlib&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"nodejs_get_package_settings\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>const proxy_api = require('.\/proxy_api')\uff1b\r\n\r\nasync \u51fd\u6570 main() {\r\n  const res = await proxy_api.get('https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions\/1\/settings', '08c5fa8dd63c8adc4b08803df5f68f9d')\uff1b\r\n  if (res instanceof Error) {\r\n    console.log(\"Error:\")+ res.toString())\uff1b\r\n  } else {\r\n    console.log(res)\uff1b\r\n  }\r\n}\r\n\r\nmain()\uff1b<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u4ee3\u7406\u8ba2\u9605<\/th>\n<th>\u8ba2\u9605 Backconnect<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>{\r\n  \"authorized_ips\":[\r\n    \"15.25.5.11\"\r\n  ]\r\n}<\/pre>\n<\/td>\n<td>\n<pre>{\r\n  \"authorized_ips\":[\r\n    \"15.25.5.11\",\r\n    \"1.1.1.1\"\r\n  ],\r\n  \"swap_interval\":120\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Ruby + stdlib&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"ruby_get_package_settings\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>require_relative '.\/proxy_api\r\n\r\n\u5f00\u59cb\r\n  api = ProxyAPI.new(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\")\r\n  puts(api.get(\"\/package_subscriptions\/1\/settings\").inspect)\r\nrescue ProxyAPIException =&gt; e\r\n  puts e.message\r\n\u7ed3\u675f<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u4ee3\u7406\u8ba2\u9605<\/th>\n<th>\u8ba2\u9605 Backconnect<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>{\r\n  \"authorized_ips\":[\r\n    \"15.25.5.11\"\r\n  ]\r\n}<\/pre>\n<\/td>\n<td>\n<pre>{\r\n  \"authorized_ips\":[\r\n    \"15.25.5.11\",\r\n    \"1.1.1.1\"\r\n  ],\r\n  \"swap_interval\":120\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Golang + stdlib&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"golang_get_package_settings\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>\u4e3b\u5305\r\n\r\n\u5bfc\u5165 (\r\n  \"\u7f16\u7801\/json\"\r\n  \"fmt\"\r\n  \"net\/http\"\r\n)\r\n\r\n\u7c7b\u578b packageSettings struct {\r\n  \u6388\u6743 IPs []string `json: \"authorized_ips\"`\r\n\r\n  \/\/\u4ec5\u56de\u8fde\r\n  \u4ea4\u6362\u95f4\u9694 int `json: \"swap_interval\"`\r\n}\r\n\r\nfunc main() {\r\n  api := NewProxyAPI(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\", &amp;http.Client{})\r\n\r\n  resp, _, err := api.Get(\"\/package_subscriptions\/1\/settings\", nil)\r\n  if err != nil {\r\n    fmt.Println(err)\r\n  } else {\r\n    var ps packageSettings\r\n    json.Unmarshal([]byte(resp), &amp;ps)\r\n    fmt.Println(ps)\r\n  }\r\n}<\/pre>\n<\/div>\n<\/div>\n<p>\u7b54\u590d\u793a\u4f8b\uff1a<\/p>\n<table class=\"table\">\n<tbody>\n<tr>\n<th>\u4ee3\u7406\u8ba2\u9605<\/th>\n<th>\u8ba2\u9605 Backconnect<\/th>\n<\/tr>\n<tr>\n<td>\n<pre>{\r\n  \"authorized_ips\":[\r\n    \"15.25.5.11\"\r\n  ]\r\n}<\/pre>\n<\/td>\n<td>\n<pre>{\r\n  \"authorized_ips\":[\r\n    \"15.25.5.11\",\r\n    \"1.1.1.1\"\r\n  ],\r\n  \"swap_interval\":120\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div><\/div><\/div>\n<hr \/>\n<h2>\u8bbe\u7f6e\u8ba2\u9605\u8bbe\u7f6e<\/h2>\n<div>\n<div class=\"pre-parent\">\n<div class=\"pre-description\">\u8be5\u7aef\u70b9\u5141\u8bb8\u8bbe\u7f6e\u8f6f\u4ef6\u5305\u7684\u7279\u5b9a\u8bbe\u7f6e\uff0c\u5982\u6388\u6743 ips \u6216\u4ea4\u6362\u95f4\u9694\uff08\u7528\u4e8e backconnect\uff09\u3002<\/div>\n<div class=\"pre-params\">\n<table class=\"table table-condensed table-bordered\">\n<tbody>\n<tr>\n<td>\u7ec8\u70b9<\/td>\n<td>\/package_subscriptions\/:id<\/td>\n<\/tr>\n<tr>\n<td>\u65b9\u6cd5<\/td>\n<td>\u8f93\u5165<\/td>\n<\/tr>\n<tr>\n<td>\u5fc5\u8981\u7684 HTTP \u6807\u5934<\/td>\n<td>Content-Type: \u5e94\u7528\u7a0b\u5e8f\/json<\/td>\n<\/tr>\n<tr>\n<td>\u53c2\u6570<\/td>\n<td>id - \u8ba2\u9605\u7684 id<\/td>\n<\/tr>\n<tr>\n<td>\u67e5\u8be2\u53c2\u6570<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>JSON \u53c2\u6570<\/td>\n<td>authorized_ips - \u5217\u8868 - \u5141\u8bb8\u65e0\u51ed\u8bc1\u8bbf\u95ee\u4ee3\u7406\u7684\u6388\u6743 IP \u5730\u5740<br \/>\nswap_interval - \u6574\u6570 &gt;= 0 - \u4e3a\u53cd\u5411\u8fde\u63a5\u4ee3\u7406\u66f4\u6362 IP \u7684\u9891\u7387\uff0c0 \u8868\u793a\u6bcf\u6b21\u8bf7\u6c42\u90fd\u66f4\u6362\u3002\u666e\u901a\u4ee3\u7406\u8f6f\u4ef6\u5305\u5ffd\u7565\u4e0d\u8ba1\u3002<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"su-tabs su-tabs-style-default su-tabs-mobile-stack\" data-active=\"6\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-tabs-nav\"><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>\u5728 *nix shell \u4e2d\u4f7f\u7528 curl<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Python 3 + \u8bf7\u6c42<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>PHP + libcurl<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Node.js + stdlib<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Ruby + stdlib<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\">Golang + stdlib<\/span><\/div><div class=\"su-tabs-panes\"><div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;curl in *nix shell&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"curl_set_package_settings\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>curl -X PUT -H \"Content-Type: application\/json\" -u api:08c5fa8dd63c8adc4b08803df5f68f9d --data '{\"swap_interval\"\uff1a180, \"authorized_ips\":[\"1.1.1.1\"]}' https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions\/1<\/pre>\n<\/div>\n<\/div>\n<p>\u6210\u529f\u65f6 {\"success\":true}\u5c06\u8fd4\u56de JSON \u6587\u4ef6\uff0c\u9519\u8bef\u65f6\uff0c\u54c8\u5e0c\u503c\u4e2d\u7684 success \u5c06\u4e3a false\uff0cerror \u5c06\u5305\u542b\u4efb\u4f55\u9519\u8bef\uff1a<\/p>\n<pre>{\r\n  \"success\": false\u3001\r\n  \"error\"\uff1a\"Authorized ips contain invalid IP 441.2.3.4 on line 1, Swap interval must be greater than or equal to 0\" (\u6388\u6743\u7684 ips \u5728\u7b2c 1 \u884c\u5305\u542b\u65e0\u6548 IP 441.2.3.4\uff0c\u4ea4\u6362\u95f4\u9694\u5fc5\u987b\u5927\u4e8e\u6216\u7b49\u4e8e 0)\r\n}<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Python 3 + requests&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"python_set_package_settings\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>\u4ece proxy_api \u5bfc\u5165 *\r\n\r\napi = ProxyAPI(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\")\r\ntry\uff1a\r\n  result = api.put(\"\/package_subscriptions\/1\", body = {'swap_interval': 180, 'authorized_ips'\uff1a['1.2.3.4', '2.5.6.7']})\r\n  print(result)\r\n  result = api.put(\"\/package_subscriptions\/1\", body = {'swap_interval': -180, 'authorized_ips'\uff1a['441.2.3.4']})\r\n  print(result)\r\nexcept ProxyAPIException as e\uff1a\r\n  print(str(e))<\/pre>\n<\/div>\n<\/div>\n<p>\u6210\u529f\u65f6 {\"success\":true}\u5c06\u8fd4\u56de JSON \u6587\u4ef6\uff0c\u9519\u8bef\u65f6\uff0c\u54c8\u5e0c\u503c\u4e2d\u7684 success \u5c06\u4e3a false\uff0cerror \u5c06\u5305\u542b\u4efb\u4f55\u9519\u8bef\uff1a<\/p>\n<pre>{\r\n  \"success\": false\u3001\r\n  \"error\"\uff1a\"Authorized ips contain invalid IP 441.2.3.4 on line 1, Swap interval must be greater than or equal to 0\" (\u6388\u6743\u7684 ips \u5728\u7b2c 1 \u884c\u5305\u542b\u65e0\u6548 IP 441.2.3.4\uff0c\u4ea4\u6362\u95f4\u9694\u5fc5\u987b\u5927\u4e8e\u6216\u7b49\u4e8e 0)\r\n}<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;PHP + libcurl&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"php_set_package_settings\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>put(\"\/package_subscriptions\/1\", [\r\n    \"authorized_ips\" =&gt; [\"1.5.4.4\", \"1.5.6.7\"]\u3001\r\n    \"swap_interval\" =&gt; 3600\r\n  ]));\r\n  var_dump($api-&gt;put(\"\/package_subscriptions\/1\", [\r\n    \"authorized_ips\" =&gt; [\"1.5.4.444\", \"1.5.6.7\"]\u3001\r\n    \"swap_interval\" =&gt; -3600\r\n  ]));\r\n} catch(ProxyAPIException $e) {\r\n  echo $e\uff1b\r\n}<\/pre>\n<\/div>\n<\/div>\n<p>\u6210\u529f\u65f6 {\"success\":true}\u5c06\u8fd4\u56de JSON \u6587\u4ef6\uff0c\u9519\u8bef\u65f6\uff0c\u54c8\u5e0c\u503c\u4e2d\u7684 success \u5c06\u4e3a false\uff0cerror \u5c06\u5305\u542b\u4efb\u4f55\u9519\u8bef\uff1a<\/p>\n<pre>{\r\n  \"success\": false\u3001\r\n  \"error\"\uff1a\"Authorized ips contain invalid IP 441.2.3.4 on line 1, Swap interval must be greater than or equal to 0\" (\u6388\u6743\u7684 ips \u5728\u7b2c 1 \u884c\u5305\u542b\u65e0\u6548 IP 441.2.3.4\uff0c\u4ea4\u6362\u95f4\u9694\u5fc5\u987b\u5927\u4e8e\u6216\u7b49\u4e8e 0)\r\n}<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Node.js + stdlib&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"nodejs_set_package_settings\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>const proxy_api = require('.\/proxy_api')\uff1b\r\n\r\nasync \u51fd\u6570 main() {\r\n  const res = await proxy_api.put(\r\n    'https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions\/1'\u3001\r\n    '08c5fa8dd63c8adc4b08803df5f68f9d',\r\n    {\r\n      \"authorized_ips\"\uff1a[\"77.66.55.44\", \"1.87.31.3\"],\r\n      \"swap_interval\"\uff1a1200\r\n    }\r\n  );\r\n  if (res instanceof Error) {\r\n    console.log(\"Error:\")+ res.toString())\uff1b\r\n  } else {\r\n    console.log(res)\uff1b\r\n  }\r\n}\r\n\r\nmain()\uff1b<\/pre>\n<\/div>\n<\/div>\n<p>\u6210\u529f\u65f6 {\"success\":true}\u5c06\u8fd4\u56de JSON \u6587\u4ef6\uff0c\u9519\u8bef\u65f6\uff0c\u54c8\u5e0c\u503c\u4e2d\u7684 success \u5c06\u4e3a false\uff0cerror \u5c06\u5305\u542b\u4efb\u4f55\u9519\u8bef\uff1a<\/p>\n<pre>{\r\n  \"success\": false\u3001\r\n  \"error\"\uff1a\"Authorized ips contain invalid IP 441.2.3.4 on line 1, Swap interval must be greater than or equal to 0\" (\u6388\u6743\u7684 ips \u5728\u7b2c 1 \u884c\u5305\u542b\u65e0\u6548 IP 441.2.3.4\uff0c\u4ea4\u6362\u95f4\u9694\u5fc5\u987b\u5927\u4e8e\u6216\u7b49\u4e8e 0)\r\n}<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Ruby + stdlib&lt;\/strong&gt;\">\n<div class=\"tab-content\">\n<div id=\"ruby_set_package_settings\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>require_relative '.\/proxy_api\r\n\r\n\u5f00\u59cb\r\n  api = ProxyAPI.new(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\")\r\n  puts(api.put(\"\/package_subscriptions\/1\", authorized_ips: ['1.2.3.2'], swap_interval: 30).inspect)\r\n  puts(api.put(\"\/package_subscriptions\/1\", authorized_ips\uff1a[412.2.3.2'], swap_interval: -30).inspect)\r\nrescue ProxyAPIException =&gt; e\r\n  puts e.message\r\n\u7ed3\u675f<\/pre>\n<\/div>\n<\/div>\n<p>\u6210\u529f\u65f6 {\"success\":true}\u5c06\u8fd4\u56de JSON \u6587\u4ef6\uff0c\u9519\u8bef\u65f6\uff0c\u54c8\u5e0c\u503c\u4e2d\u7684 success \u5c06\u4e3a false\uff0cerror \u5c06\u5305\u542b\u4efb\u4f55\u9519\u8bef\uff1a<\/p>\n<pre>{\r\n  \"success\": false\u3001\r\n  \"error\"\uff1a\"Authorized ips contain invalid IP 441.2.3.4 on line 1, Swap interval must be greater than or equal to 0\" (\u6388\u6743\u7684 ips \u5728\u7b2c 1 \u884c\u5305\u542b\u65e0\u6548 IP 441.2.3.4\uff0c\u4ea4\u6362\u95f4\u9694\u5fc5\u987b\u5927\u4e8e\u6216\u7b49\u4e8e 0)\r\n}<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"Golang + stdlib\">\n<div class=\"tab-content\">\n<div id=\"golang_set_package_settings\" class=\"tab-pane tab-padding active\" role=\"tabpanel\">\n<pre>\u4e3b\u5305\r\n\r\n\u5bfc\u5165 (\r\n  \"fmt\"\r\n  \"net\/http\"\r\n  \"\u5b57\u7b26\u4e32\r\n)\r\n\r\nfunc main() {\r\n  api := NewProxyAPI(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\", &amp;http.Client{})\r\n\r\n  ips := strings.Join([]string{\"1.2.3.1\", \"1.3.1.2\", \"1.1.1.1\"}, \"\\\",\\\"\")\r\n  settings := fmt.Sprintf(\"{\\\"authorized_ips\\\": [\\\"%s\\\"], \\\"swap_interval\\\": 4242}\", ips)\r\n\r\n  resp, _, err := api.Put(\"\/package_subscriptions\/1\", settings)\r\n  if err != nil {\r\n    fmt.Println(err)\r\n  } else {\r\n    fmt.Println(resp)\r\n  }\r\n\r\n  ips = strings.Join([]string{\"1.2.3.1\", \"1.3.1.2\", \"1.1.1.1000\"}, \"\\\",\\\"\")\r\n  settings = fmt.Sprintf(\"{\\\"authorized_ips\\\": [\\\"%s\\\"], \\\"swap_interval\\\": -4242}\", ips)\r\n\r\n  resp, _, err = api.Put(\"\/package_subscriptions\/1\", settings)\r\n  if err != nil {\r\n    fmt.Println(err)\r\n  } else {\r\n    fmt.Println(resp)\r\n  }\r\n}<\/pre>\n<\/div>\n<\/div>\n<p>\u6210\u529f\u65f6 {\"success\":true}\u5c06\u8fd4\u56de JSON \u6587\u4ef6\uff0c\u9519\u8bef\u65f6\uff0c\u54c8\u5e0c\u503c\u4e2d\u7684 success \u5c06\u4e3a false\uff0cerror \u5c06\u5305\u542b\u4efb\u4f55\u9519\u8bef\uff1a<\/p>\n<pre>{\r\n  \"success\": false\u3001\r\n  \"error\"\uff1a\"Authorized ips contain invalid IP 441.2.3.4 on line 1, Swap interval must be greater than or equal to 0\" (\u6388\u6743\u7684 ips \u5728\u7b2c 1 \u884c\u5305\u542b\u65e0\u6548 IP 441.2.3.4\uff0c\u4ea4\u6362\u95f4\u9694\u5fc5\u987b\u5927\u4e8e\u6216\u7b49\u4e8e 0)\r\n}<\/pre>\n<\/div><\/div><\/div>\n<hr \/>\n<h2>\u6dfb\u52a0\u6388\u6743 IP<\/h2>\n<div>\n<div class=\"pre-parent\">\n<div class=\"pre-description\">\u8be5\u7aef\u70b9\u5141\u8bb8\u5728\u6388\u6743 IP \u5217\u8868\u4e2d\u6dfb\u52a0\u65b0\u7684\u6388\u6743 IP\uff0c\u800c\u4e0d\u4f1a\u4e3a\u4e86\u65b9\u4fbf\u800c\u5217\u51fa\u6240\u6709 IP\u3002<\/div>\n<div class=\"pre-params\">\n<table class=\"table table-condensed table-bordered\">\n<tbody>\n<tr>\n<td>\u7ec8\u70b9<\/td>\n<td>\/package_subscriptions\/:id\/add_authorized_ip<\/td>\n<\/tr>\n<tr>\n<td>\u65b9\u6cd5<\/td>\n<td>\u8f93\u5165<\/td>\n<\/tr>\n<tr>\n<td>\u5fc5\u8981\u7684 HTTP \u6807\u5934<\/td>\n<td>Content-Type: \u5e94\u7528\u7a0b\u5e8f\/json<\/td>\n<\/tr>\n<tr>\n<td>\u53c2\u6570<\/td>\n<td>id - \u8ba2\u9605\u7684 id<\/td>\n<\/tr>\n<tr>\n<td>\u67e5\u8be2\u53c2\u6570<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>JSON \u53c2\u6570<\/td>\n<td>ip - \u5b57\u7b26\u4e32 - \u8981\u6dfb\u52a0\u7684 IP \u5730\u5740<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"su-tabs su-tabs-style-default su-tabs-mobile-stack\" data-active=\"6\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-tabs-nav\"><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>\u5728 *nix shell \u4e2d\u4f7f\u7528 curl<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Python 3 + \u8bf7\u6c42<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>PHP + libcurl<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Node.js + stdlib<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Ruby + stdlib<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Golang + stdlib<\/strong><\/span><\/div><div class=\"su-tabs-panes\"><div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;curl in *nix shell&lt;\/strong&gt;\">\n<pre>curl -X PUT -H \"Content-Type: application\/json\" -u api:08c5fa8dd63c8adc4b08803df5f68f9d --data '{\"ip\"\uff1a\"1.1.1.1\"}' https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions\/1\/add_authorized_ip<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Python 3 + requests&lt;\/strong&gt;\">\n<pre>\u4ece proxy_api \u5bfc\u5165 *\r\n\r\napi = ProxyAPI(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\")\r\ntry\uff1a\r\n  result = api.put(\"\/package_subscriptions\/1\/add_authorized_ip\", body = {'ip': '121.23.1.25'})\r\n  print(result)\r\n  result = api.put(\"\/package_subscriptions\/1\/add_authorized_ip\", body = {'ip': '266.1.2.3'})\r\n  print(result)\r\nexcept ProxyAPIException as e\uff1a\r\n  print(str(e))<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;PHP + libcurl&lt;\/strong&gt;\">\n<pre>put(\"\/package_subscriptions\/1\/add_authorized_ip\", [\r\n    \"ip\" =&gt; \"7.7.7.7\" [ \"ip\" =&gt; \"7.7.7.7\"\r\n  ]));\r\n} catch(ProxyAPIException $e) {\r\n  echo $e\uff1b\r\n}<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Node.js + stdlib&lt;\/strong&gt;\">\n<pre>const proxy_api = require('.\/proxy_api')\uff1b\r\n\r\nasync \u51fd\u6570 main() {\r\n  const res = await proxy_api.put(\r\n    'https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions\/1\/add_authorized_ip'\u3001\r\n    '08c5fa8dd63c8adc4b08803df5f68f9d',\r\n    {\r\n      \"ip\"\uff1a\"1.2.3.4\"\r\n    }\r\n  );\r\n  if (res instanceof Error) {\r\n    console.log(\"Error:\")+ res.toString())\uff1b\r\n  } else {\r\n    console.log(res)\uff1b\r\n  }\r\n}\r\n\r\nmain()\uff1b<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Ruby + stdlib&lt;\/strong&gt;\">\n<pre>require_relative '.\/proxy_api\r\n\r\n\u5f00\u59cb\r\n  api = ProxyAPI.new(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\")\r\n  puts(api.put(\"\/package_subscriptions\/1\/add_authorized_ip\", ip: '1.2.3.2').inspect)\r\n  puts(api.put(\"\/package_subscriptions\/1\/add_authorized_ip\", ip: '412.2.3.2').inspect)\r\nrescue ProxyAPIException =&gt; e\r\n  puts e.message\r\n\u7ed3\u675f<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Golang + stdlib&lt;\/strong&gt;\">\n<pre>\u4e3b\u5305\r\n\r\n\u5bfc\u5165 (\r\n  \"fmt\"\r\n  \"net\/http\"\r\n)\r\n\r\nfunc main() {\r\n  api := NewProxyAPI(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\", &amp;http.Client{})\r\n\r\n  ip := \"{\\\"ip\\\"\uff1a\\\"1.7.2.5\\\"}\"\r\n  resp, _, err := api.Put(\"\/package_subscriptions\/1\/add_authorized_ip\", ip)\r\n  if err != nil {\r\n    fmt.Println(err)\r\n  } else {\r\n    fmt.Println(resp)\r\n  }\r\n}<\/pre>\n<\/div><\/div><\/div>\n<hr \/>\n<h2>\u5220\u9664\u6388\u6743 IP<\/h2>\n<div>\n<div class=\"pre-parent\">\n<div class=\"pre-description\">\u4e3a\u65b9\u4fbf\u8d77\u89c1\uff0c\u8be5\u7aef\u70b9\u5141\u8bb8\u5220\u9664\u6388\u6743 IP\uff0c\u800c\u65e0\u9700\u5217\u51fa\u6240\u6709 IP\u3002\u5982\u679c\u6ca1\u6709\u63d0\u4f9b IP\uff0c\u8be5\u7aef\u70b9\u5c06\u8fd4\u56de\u9519\u8bef\u4fe1\u606f\uff0c\u5426\u5219\u5373\u4f7f\u6ca1\u6709\u5220\u9664 IP\uff0c\u4e5f\u4f1a\u6210\u529f\u5220\u9664\u3002<\/div>\n<div class=\"pre-params\">\n<table class=\"table table-condensed table-bordered\">\n<tbody>\n<tr>\n<td>\u7ec8\u70b9<\/td>\n<td>\/package_subscriptions\/:id\/remove_authorized_ip<\/td>\n<\/tr>\n<tr>\n<td>\u65b9\u6cd5<\/td>\n<td>\u8f93\u5165<\/td>\n<\/tr>\n<tr>\n<td>\u5fc5\u8981\u7684 HTTP \u6807\u5934<\/td>\n<td>Content-Type: \u5e94\u7528\u7a0b\u5e8f\/json<\/td>\n<\/tr>\n<tr>\n<td>\u53c2\u6570<\/td>\n<td>id - \u8ba2\u9605\u7684 id<\/td>\n<\/tr>\n<tr>\n<td>\u67e5\u8be2\u53c2\u6570<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>JSON \u53c2\u6570<\/td>\n<td>ip - \u5b57\u7b26\u4e32 - \u8981\u5220\u9664\u7684 IP \u5730\u5740<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"su-tabs su-tabs-style-default su-tabs-mobile-stack\" data-active=\"6\" data-scroll-offset=\"0\" data-anchor-in-url=\"no\"><div class=\"su-tabs-nav\"><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>\u5728 *nix shell \u4e2d\u4f7f\u7528 curl<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Python 3 + \u8bf7\u6c42<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>PHP + libcurl<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Node.js + stdlib<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Ruby + stdlib<\/strong><\/span><span class=\"\" data-url=\"\" data-target=\"blank\" tabindex=\"0\" role=\"button\"><strong>Golang + stdlib<\/strong><\/span><\/div><div class=\"su-tabs-panes\"><div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;curl in *nix shell&lt;\/strong&gt;\">\n<pre>curl -X PUT -H \"Content-Type: application\/json\" -u api:08c5fa8dd63c8adc4b08803df5f68f9d --data '{\"ip\"\uff1a\"1.1.1.1\"}' https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions\/1\/remove_authorized_ip<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Python 3 + requests&lt;\/strong&gt;\">\n<pre>\u4ece proxy_api \u5bfc\u5165 *\r\n\r\napi = ProxyAPI(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\")\r\ntry\uff1a\r\n  result = api.put(\"\/package_subscriptions\/1\/remove_authorized_ip\", body = {'ip'\uff1a'121.23.1.25'})\r\n  print(result)\r\nexcept ProxyAPIException as e\uff1a\r\n  print(str(e))<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;PHP + libcurl&lt;\/strong&gt;\">\n<pre>put(\"\/package_subscriptions\/1\/remove_authorized_ip\", [\r\n    \"ip\" =&gt; \"7.7.7.7\" [ \"ip\" =&gt; \"7.7.7.7\"\r\n  ]));\r\n} catch(ProxyAPIException $e) {\r\n  echo $e\uff1b\r\n}<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Node.js + stdlib&lt;\/strong&gt;\">\n<pre>const proxy_api = require('.\/proxy_api')\uff1b\r\n\r\nasync \u51fd\u6570 main() {\r\n  const res = await proxy_api.put(\r\n    'https:\/\/app.privateproxy.me\/api\/v1\/package_subscriptions\/1\/remove_authorized_ip'\u3001\r\n    '08c5fa8dd63c8adc4b08803df5f68f9d',\r\n    {\r\n      \"ip\"\uff1a\"1.2.3.4\"\r\n    }\r\n  );\r\n  if (res instanceof Error) {\r\n    console.log(\"Error:\")+ res.toString())\uff1b\r\n  } else {\r\n    console.log(res)\uff1b\r\n  }\r\n}\r\n\r\nmain()\uff1b<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Ruby + stdlib&lt;\/strong&gt;\">\n<pre>require_relative '.\/proxy_api\r\n\r\n\u5f00\u59cb\r\n  api = ProxyAPI.new(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\")\r\n  puts(api.put(\"\/package_subscriptions\/1\/add_authorized_ip\", ip: '11.22.33.212').inspect)\r\nrescue ProxyAPIException =&gt; e\r\n  puts e.message\r\n\u7ed3\u675f<\/pre>\n<\/div>\n<div class=\"su-tabs-pane su-u-clearfix su-u-trim\" data-title=\"&lt;strong&gt;Golang + stdlib&lt;\/strong&gt;\">\n<pre>\u4e3b\u5305\r\n\r\n\u5bfc\u5165 (\r\n  \"fmt\"\r\n  \"net\/http\"\r\n)\r\n\r\nfunc main() {\r\n  api := NewProxyAPI(\"https:\/\/app.privateproxy.me\/api\/v1\", \"08c5fa8dd63c8adc4b08803df5f68f9d\", &amp;http.Client{})\r\n\r\n  ip := \"{\\\"ip\\\"\uff1a\\\"1.7.2.5\\\"}\"\r\n  resp, _, err := api.Put(\"\/package_subscriptions\/1\/remove_authorized_ip\", ip)\r\n  if err != nil {\r\n    fmt.Println(err)\r\n  } else {\r\n    fmt.Println(resp)\r\n  }\r\n}<\/pre>\n<\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>\u60a8\u77e5\u9053\u5982\u4f55\u4f7f\u7528 PrivateProxy.me API \u5417\uff1f\u8fd9\u662f\u6765\u81ea PrivateProxy.me \u5b98\u65b9\u7684\u6700\u5168\u9762\u4ecb\u7ecd\u3002\u57fa\u672c\u4fe1\u606f API \u9700\u8981\u6fc0\u6d3b\u8f6f\u4ef6\u5305 ...<\/p>\n<p class=\"read-more\"> <a class=\"ast-button\" href=\"https:\/\/proxysp.com\/zh\/how-to-use-privateproxy-me-api\/\"> <span class=\"screen-reader-text\">\u5982\u4f55\u4f7f\u7528 PrivateProxy.me API<\/span> \u67e5\u770b\u5168\u6587 \"<\/a><\/p>","protected":false},"author":3,"featured_media":10984,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[120],"tags":[],"modified_by":"proxysp","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/proxysp.com\/wp-content\/uploads\/2023\/02\/How-to-Use-PrivateProxy.me-API.png","_links":{"self":[{"href":"https:\/\/proxysp.com\/zh\/wp-json\/wp\/v2\/posts\/10980"}],"collection":[{"href":"https:\/\/proxysp.com\/zh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/proxysp.com\/zh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/proxysp.com\/zh\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/proxysp.com\/zh\/wp-json\/wp\/v2\/comments?post=10980"}],"version-history":[{"count":3,"href":"https:\/\/proxysp.com\/zh\/wp-json\/wp\/v2\/posts\/10980\/revisions"}],"predecessor-version":[{"id":10983,"href":"https:\/\/proxysp.com\/zh\/wp-json\/wp\/v2\/posts\/10980\/revisions\/10983"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/proxysp.com\/zh\/wp-json\/wp\/v2\/media\/10984"}],"wp:attachment":[{"href":"https:\/\/proxysp.com\/zh\/wp-json\/wp\/v2\/media?parent=10980"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/proxysp.com\/zh\/wp-json\/wp\/v2\/categories?post=10980"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/proxysp.com\/zh\/wp-json\/wp\/v2\/tags?post=10980"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}