{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "9015772e",
   "metadata": {},
   "outputs": [],
   "source": [
    "import requests\n",
    "import time\n",
    "import tqdm\n",
    "import pandas as pd\n",
    "\n",
    "test_file_1000 = \"https://speedtest-ny.turnkeyinternet.net/1000mb.bin\"\n",
    "test_file_100 = \"https://speedtest-ny.turnkeyinternet.net/100mb.bin\"\n",
    "\n",
    "US_PROXY = (\n",
    "     \"http://brd-customer-hl_98887cab-zone-us_proxy-route_err-block-country-us:\" +\n",
    "     \"3if5he8elfe7@zproxy.lum-superproxy.io:22225\"\n",
    ")\n",
    "# pass_dyn\n",
    "# US_PROXY = (\n",
    "#      \"http://brd-customer-hl_98887cab-zone-us_proxy-route_err-block:\" +\n",
    "#      \"3if5he8elfe7@zproxy.lum-superproxy.io:22225\"\n",
    "# )\n",
    "REQUEST_PROXIES = {\n",
    "   \"http\": US_PROXY,\n",
    "   \"https\": US_PROXY,\n",
    "}\n",
    "\n",
    "with open(\"ips-us_proxy.txt\") as f:\n",
    "    ip_list = f.read().strip().split(\"\\n\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "b795bb47",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████| 10/10 [08:23<00:00, 50.39s/it]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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hAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkEZYAABphAUAkKaqsFi2bFkcdthh0dLSEi0tLTFz5sy4++67a7U3AKDBVBUWkydPjquuuirWrl0ba9eujeOOOy5OPfXUePzxx2u1PwCggYyoZvEpp5zS7/IVV1wRy5Yti4ceeigOOeSQ1I0BAI2nqrD4V9u3b49bbrkltm3bFjNnztzpunK5HOVyue9yV1dXRERUKpWoVCq7evP99J6nNKxIOV89Zc2gHsy5fnr322j7bjTmXD9mXR+1nPNgz9lUFEVV9xIbN26MmTNnxttvvx177rlnLF++PE4++eSdrm9vb48lS5YMOL58+fIYPXp0NTcNAAyR7u7umDdvXnR2dkZLS8tO11UdFu+8805s3rw53nzzzbj11lvjl7/8ZaxatSoOPvjgHa7f0SMWbW1tsWXLlvfcWDUqlUp0dHTEj9YOi3JPU8o56+Wx9pOGeguDZs710zvr2bNnR3Nz81BvZ7dlzvVj1vVRyzl3dXVFa2vr+4ZF1U+FjBw5Mj72sY9FRMSMGTNizZo18eMf/zh+8Ytf7HB9qVSKUqk04Hhzc3P6F13uaYry9sa6w2vEHzBzrp9a/JwwkDnXj1nXRy3mPNjzfeC/Y1EURb9HJACA/15VPWJx8cUXx5w5c6KtrS22bt0aK1asiJUrV8Y999xTq/0BAA2kqrB45ZVX4uyzz46XXnopxo0bF4cddljcc889MXv27FrtDwBoIFWFxQ033FCrfQAAuwHvFQIApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApBEWAEAaYQEApKkqLJYuXRpHHXVUjB07NiZMmBCnnXZaPPnkk7XaGwDQYKoKi1WrVsXChQvjoYceio6Ojnj33XfjxBNPjG3bttVqfwBAAxlRzeJ77rmn3+Ubb7wxJkyYEOvWrYtjjjkmdWMAQOOpKiz+XWdnZ0RE7L333jtdUy6Xo1wu913u6uqKiIhKpRKVSuWD3Hyf3vOUhhUp56unrBnUgznXT+9+G23fjcac68es66OWcx7sOZuKotile4miKOLUU0+NN954Ix544IGdrmtvb48lS5YMOL58+fIYPXr0rtw0AFBn3d3dMW/evOjs7IyWlpadrtvlsFi4cGH8/ve/jwcffDAmT56803U7esSira0ttmzZ8p4bq0alUomOjo740dphUe5pSjlnvTzWftJQb2HQzLl+emc9e/bsaG5uHurt7LbMuX7Muj5qOeeurq5obW1937DYpadCzjvvvLjzzjtj9erV7xkVERGlUilKpdKA483NzelfdLmnKcrbG+sOrxF/wMy5fmrxc8JA5lw/Zl0ftZjzYM9XVVgURRHnnXde3H777bFy5cqYMmXKLm0OANg9VRUWCxcujOXLl8dvfvObGDt2bLz88ssRETFu3LjYY489arJBAKBxVPV3LJYtWxadnZ0xa9as2Hffffs+br755lrtDwBoIFU/FQIAsDPeKwQASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0wgIASCMsAIA0VYfF6tWr45RTTolJkyZFU1NT3HHHHTXYFgDQiKoOi23btsXhhx8e1157bS32AwA0sBHVfsKcOXNizpw5tdgLANDgqg6LapXL5SiXy32Xu7q6IiKiUqlEpVJJuY3e85SGFSnnq6esGdSDOddP734bbd+Nxpzrx6zro5ZzHuw5m4qi2OV7iaamprj99tvjtNNO2+ma9vb2WLJkyYDjy5cvj9GjR+/qTQMAddTd3R3z5s2Lzs7OaGlp2em6mofFjh6xaGtriy1btrznxqpRqVSio6MjfrR2WJR7mlLOWS+PtZ801FsYNHOun95Zz549O5qbm4d6O7stc66fRp31tPb/N9RbqEppWBH/Z0ZPTebc1dUVra2t7xsWNX8qpFQqRalUGnC8ubk5/Ysu9zRFeXtj3eE10g9YL3Oun1r8nDCQOddPo8260f6t61WLOQ/2fP6OBQCQpupHLN5666145pln+i5v2rQpNmzYEHvvvXfsv//+qZsDABpL1WGxdu3aOPbYY/suL168OCIi5s+fH7/61a/SNgYANJ6qw2LWrFnxAX7fEwDYjfkdCwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgjbAAANIICwAgzS6Fxc9+9rOYMmVKjBo1KqZPnx4PPPBA9r4AgAZUdVjcfPPNsWjRorjkkkti/fr18T//8z8xZ86c2Lx5cy32BwA0kKrD4uqrr45vfvOb8a1vfSsOOuiguOaaa6KtrS2WLVtWi/0BAA1kRDWL33nnnVi3bl1cdNFF/Y6feOKJ8ac//WmHn1Mul6NcLvdd7uzsjIiI119/PSqVSrX73aFKpRLd3d0xojIstvc0pZyzXl577bWh3sKgmXP99M76tddei+bm5qHezm7LnOunUWc94t1tQ72FqozoKaK7u6cmc966dWtERBRF8d57qOakW7Zsie3bt8c+++zT7/g+++wTL7/88g4/Z+nSpbFkyZIBx6dMmVLNTe+2Wv/vUO/gv4M5A/8t5tX4/Fu3bo1x48bt9PqqwqJXU1P//1stimLAsV4/+MEPYvHixX2Xe3p64vXXX4/x48fv9HOq1dXVFW1tbfHcc89FS0tLyjkZyJzrx6zrw5zrx6zro5ZzLooitm7dGpMmTXrPdVWFRWtrawwfPnzAoxOvvvrqgEcxepVKpSiVSv2OfehDH6rmZgetpaXFN2wdmHP9mHV9mHP9mHV91GrO7/VIRa+qfnlz5MiRMX369Ojo6Oh3vKOjIz772c9WtzsAYLdT9VMhixcvjrPPPjtmzJgRM2fOjOuuuy42b94cCxYsqMX+AIAGUnVYnH766fHaa6/FZZddFi+99FJMmzYt7rrrrjjggANqsb9BKZVKcemllw54yoVc5lw/Zl0f5lw/Zl0f/wlzbire73UjAACD5L1CAIA0wgIASCMsAIA0wgIASNPwYeEt3HMtXbo0jjrqqBg7dmxMmDAhTjvttHjyySf7rSmKItrb22PSpEmxxx57xKxZs+Lxxx8foh3vHpYuXRpNTU2xaNGivmPmnOeFF16Is846K8aPHx+jR4+OI444ItatW9d3vVnnePfdd+OHP/xhTJkyJfbYY4+YOnVqXHbZZdHT09O3xqyrt3r16jjllFNi0qRJ0dTUFHfccUe/6wcz03K5HOedd160trbGmDFj4otf/GI8//zztdlw0cBWrFhRNDc3F9dff33xxBNPFOeff34xZsyY4tlnnx3qrTWsk046qbjxxhuLxx57rNiwYUMxd+7cYv/99y/eeuutvjVXXXVVMXbs2OLWW28tNm7cWJx++unFvvvuW3R1dQ3hzhvXI488UnzkIx8pDjvssOL888/vO27OOV5//fXigAMOKL72ta8VDz/8cLFp06bivvvuK5555pm+NWad4/LLLy/Gjx9f/O53vys2bdpU3HLLLcWee+5ZXHPNNX1rzLp6d911V3HJJZcUt956axERxe23397v+sHMdMGCBcV+++1XdHR0FI8++mhx7LHHFocffnjx7rvvpu+3ocPiU5/6VLFgwYJ+xw488MDioosuGqId7X5effXVIiKKVatWFUVRFD09PcXEiROLq666qm/N22+/XYwbN674+c9/PlTbbFhbt24tPv7xjxcdHR3F5z//+b6wMOc8F154YXH00Ufv9HqzzjN37tziG9/4Rr9jX/rSl4qzzjqrKAqzzvDvYTGYmb755ptFc3NzsWLFir41L7zwQjFs2LDinnvuSd9jwz4V0vsW7ieeeGK/4+/1Fu5Ur/dt7vfee++IiNi0aVO8/PLL/eZeKpXi85//vLnvgoULF8bcuXPjhBNO6HfcnPPceeedMWPGjPjKV74SEyZMiCOPPDKuv/76vuvNOs/RRx8df/jDH+Kpp56KiIg///nP8eCDD8bJJ58cEWZdC4OZ6bp166JSqfRbM2nSpJg2bVpN5r5L7276n2BX3sKd6hRFEYsXL46jjz46pk2bFhHRN9sdzf3ZZ5+t+x4b2YoVK+LRRx+NNWvWDLjOnPP8/e9/j2XLlsXixYvj4osvjkceeSS+853vRKlUinPOOcesE1144YXR2dkZBx54YAwfPjy2b98eV1xxRZxxxhkR4fu6FgYz05dffjlGjhwZe+2114A1tbi/bNiw6FXNW7hTnXPPPTf+8pe/xIMPPjjgOnP/YJ577rk4//zz4957741Ro0btdJ05f3A9PT0xY8aMuPLKKyMi4sgjj4zHH388li1bFuecc07fOrP+4G6++ea46aabYvny5XHIIYfEhg0bYtGiRTFp0qSYP39+3zqzzrcrM63V3Bv2qZBdeQt3Bu+8886LO++8M+6///6YPHly3/GJEydGRJj7B7Ru3bp49dVXY/r06TFixIgYMWJErFq1Kn7yk5/EiBEj+mZpzh/cvvvuGwcffHC/YwcddFBs3rw5InxPZ/r+978fF110UXz1q1+NQw89NM4+++z47ne/G0uXLo0Is66Fwcx04sSJ8c4778Qbb7yx0zWZGjYsvIV7bRRFEeeee27cdttt8cc//jGmTJnS7/opU6bExIkT+839nXfeiVWrVpl7FY4//vjYuHFjbNiwoe9jxowZceaZZ8aGDRti6tSp5pzkc5/73ICXTD/11FN9b5zoezpPd3d3DBvW/25l+PDhfS83Net8g5np9OnTo7m5ud+al156KR577LHazD3910HrqPflpjfccEPxxBNPFIsWLSrGjBlT/OMf/xjqrTWsb3/728W4ceOKlStXFi+99FLfR3d3d9+aq666qhg3blxx2223FRs3bizOOOMMLxdL8K+vCikKc87yyCOPFCNGjCiuuOKK4umnny5+/etfF6NHjy5uuummvjVmnWP+/PnFfvvt1/dy09tuu61obW0tLrjggr41Zl29rVu3FuvXry/Wr19fRERx9dVXF+vXr+/70wqDmemCBQuKyZMnF/fdd1/x6KOPFscdd5yXm+7MT3/60+KAAw4oRo4cWXzyk5/se1kkuyYidvhx44039q3p6ekpLr300mLixIlFqVQqjjnmmGLjxo1Dt+ndxL+HhTnn+e1vf1tMmzatKJVKxYEHHlhcd911/a436xxdXV3F+eefX+y///7FqFGjiqlTpxaXXHJJUS6X+9aYdfXuv//+Hf67PH/+/KIoBjfTf/7zn8W5555b7L333sUee+xRfOELXyg2b95ck/1623QAIE3D/o4FAPCfR1gAAGmEBQCQRlgAAGmEBQCQRlgAAGmEBQCQRlgAAGmEBQCQRlgAAGmEBQCQRlgAAGn+P+CZyyfP95MKAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "l = []\n",
    "for n in tqdm.tqdm(range(10)):\n",
    "    t0 = time.time()\n",
    "    out = requests.get(test_file_100, proxies=REQUEST_PROXIES)\n",
    "    l.append(round(time.time() - t0, 1))\n",
    "# ~0.3MB/s - 100MB/s\n",
    "(100 / pd.Series(l)).hist(bins=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4c698365",
   "metadata": {},
   "outputs": [],
   "source": [
    "# test if it goes to all of them"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "19caaf1b",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████| 10/10 [00:57<00:00,  5.75s/it]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "l2 = []\n",
    "for n in tqdm.tqdm(range(10)):\n",
    "    t0 = time.time()\n",
    "    out = requests.get(test_file_1000)\n",
    "    l2.append(round(time.time() - t0, 1))\n",
    "# ~175MB/s\n",
    "(1000 / pd.Series(l2)).hist(bins=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "44a46c1c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "b906537f",
   "metadata": {},
   "outputs": [],
   "source": [
    "from contextlib import contextmanager\n",
    "import signal\n",
    "\n",
    "class TimeoutException(Exception): \n",
    "    pass\n",
    "\n",
    "@contextmanager\n",
    "def time_limit(seconds):\n",
    "    seconds = int(round(seconds))\n",
    "    def signal_handler(signum, frame):\n",
    "        raise TimeoutException(\"Function call timed out!\")\n",
    "    signal.signal(signal.SIGALRM, signal_handler)\n",
    "    signal.alarm(seconds)\n",
    "    try:\n",
    "        yield\n",
    "    finally:\n",
    "        signal.alarm(0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "id": "cd6a1890",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████| 5/5 [01:19<00:00, 15.89s/it]\n"
     ]
    }
   ],
   "source": [
    "with open(\"ips-us_proxy.txt\") as f:\n",
    "    ip_list = f.read().strip().split(\"\\n\")\n",
    "\n",
    "l = []\n",
    "for s in tqdm.tqdm(ip_list[:5]):\n",
    "    ip_s = s.split(\"-ip-\")[-1].split(\":\")[0]\n",
    "    proxy_s = (\n",
    "        f\"http://brd-customer-hl_98887cab-zone-us_proxy-route_err-block-country-us-ip-{ip_s}-session-rand39484:\" +\n",
    "#          f\"3if5he8elfe7@zproxy.lum-superproxy.io:22225\"\n",
    "        f\"3if5he8elfe7@45.76.7.69:22225\"\n",
    "    )\n",
    "    proxies = {\n",
    "       \"http\": proxy_s,\n",
    "       \"https\": proxy_s,\n",
    "    }\n",
    "    headers = {\n",
    "        \"User-Agent\": (\n",
    "            \"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36\"\n",
    "        )\n",
    "    }\n",
    "    t0 = time.time()\n",
    "    try:\n",
    "        with time_limit(20):\n",
    "            _ = requests.get(test_file_100, proxies=proxies, headers=headers)\n",
    "        b_worked = True\n",
    "    except:\n",
    "        b_worked = False\n",
    "    l.append((ip_s, round(time.time() - t0, 1), b_worked))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7f3e1c7b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "88225825",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f105c278",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "354ac8b6",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
