# ProxyStr
[](https://t.me/bots_forge)
An analogue of [better-proxy](https://github.com/alenkimov/better_proxy) by [alenkimov](https://github.com/alenkimov), but with string-like behavior, support for mobile proxies, and proxy checking functions. ProxyStr is heavier than *better-proxy* and requires **httpx** but if you need proxies, you will likely need this library anyway.
```python
isinstance(Proxy('127.0.0.1:3001'), str) # --> True
```
```bash
pip install proxystr
```
Full list of depencies: `pydantic, httpx, httpx-socks`
## Supports various proxy formats
```python
from proxystr import Proxy
Proxy('host:port')
Proxy('host:port:login:password')
Proxy('login:password@host:port')
Proxy('login:password|host:port')
Proxy('http://login:password@host:port')
...
```
- for **mobile proxy** you can add a refresh (rotation) url
```python
Proxy('host:port:login:password[https://rotate.my-proxy.io?api_key=your_api_key]')
Proxy('http://login:password@host:port[https://rotate.my-proxy.io?api_key=your_api_key]')
...
```
P.S. The string parsing method was copied from [better-proxy](https://github.com/alenkimov/better_proxy).
## New in v 2.0:
- both `requests` and `aiohttp` changed to one lib `httpx`
- new methods `Proxy.check()` and `Proxy.acheck()`
- proxy checking functions got a new parameter `raise_on_error` defaults to False
- now it is possible to inherit from the Proxy class and pass the new class to the Pydantic BaseModel without an error
- `check_proxy()` now is fully sync
- `check_proxies()` can be called with arg `use_async=False` (not recommended but if u really need this u can use it)
- tests added
- a lot of small fixes
### New in v 2.1:
- `Client` and `AsyncClient` added
- new methods `Proxy.get_client()` and `Proxy.get_async_client()`
## Common use cases
- **aiohttp**
```python
import aiohttp
from proxystr import Proxy
proxy = Proxy("login:password@210.173.88.77:3001")
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url, proxy=proxy.url) as response:
return await response.text()
```
- **aiohttp-socks**
```python
import aiohttp
from aiohttp_socks import ProxyConnector
from proxystr import Proxy
proxy = Proxy("socks5://login:password@210.173.88.77:3001")
async def fetch(url):
connector = ProxyConnector.from_url(proxy.url)
async with aiohttp.ClientSession(connector=connector) as session:
async with session.get(url) as response:
return await response.text()
```
- **requests**
```python
import requests
from proxystr import Proxy
proxy = Proxy("login:password@210.173.88.77:3001")
def fetch(url):
response = requests.get(url, proxies=proxy.dict)
return response.text
```
- **httpx**
```python
import httpx
from proxystr import Proxy
proxy = Proxy("login:password@210.173.88.77:3001")
async def fetch(url):
async with httpx.AsyncClient(proxy=proxy.url, follow_redirects=True) as client:
response = await client.get(url)
return response.text
# or
def sync_fetch(url):
with httpx.Client(proxy=proxy.url, follow_redirects=True) as client:
return client.get(url).text
# or
def simple_fetch(url):
return httpx.get(url, proxy=proxy.url, follow_redirects=True).text
```
- **httpx-socks**
```python
import httpx
from httpx_socks import AsyncProxyTransport, SyncProxyTransport
from proxystr import Proxy
proxy = Proxy("socks5://login:password@210.173.88.77:3001")
async def fetch(url):
transport = AsyncProxyTransport.from_url(proxy.url)
async with httpx.AsyncClient(transport=transport, follow_redirects=True) as client:
response = await client.get(url)
return response.text
# or
def sync_fetch(url):
transport = SyncProxyTransport.from_url(proxy.url)
with httpx.Client(transport=transport, follow_redirects=True) as client:
return client.get(url).text
```
- **httpx wrapped by proxystr**
```python
from proxystr import Proxy, Client, AsyncClient
proxy = Proxy("log:pass@210.173.88.77:3001") # or "socks5://log:pass@210.173.88.77:3001"
async def fetch(url):
async with AsyncClient(proxy=proxy) as client:
response = await client.get(url)
return response.text
# or
async with proxy.get_async_client() as client:
response = await client.get(url)
return response.text
# or
def sync_fetch(url):
with Client(proxy=proxy) as client:
return client.get(url).text
# or
with proxy.get_client() as client:
return client.get(url).text
```
- **playwright**
```python
from playwright.async_api import async_playwright, Playwright
from proxystr import Proxy
proxy = Proxy("login:password@210.173.88.77:3001")
async def fetch(playwright: Playwright, url):
chromium = playwright.chromium
browser = await chromium.launch(proxy=proxy.playwright)
...
```
P.S. Playwright communication was copied from [better-proxy](https://github.com/alenkimov/better_proxy).
## Object representation
```python
import json
from proxystr import Proxy
proxy = Proxy("login:password@210.173.88.77:3001")
print(proxy) # according to Proxy.default_pattern
print(json.dumps(proxy))
print({'proxy': proxy})
print(proxy.url)
print(proxy.dict)
print(proxy.json())
print(proxy.playwright())
```
Output:
```
login:password@210.173.88.77:3001
"login:password@210.173.88.77:3001"
{'proxy': Proxy(http://login:password@210.173.88.77:3001)}
http://login:password@210.173.88.77:3001
{'http': 'http://login:password@210.173.88.77:3001', 'https': 'http://login:password@210.173.88.77:3001'}
{'protocol': 'http', 'username': 'login', 'password': 'password', 'ip': '210.173.88.77', 'port': 3001, 'rotation_url': None}
{'server': 'http://210.173.88.77:3001', 'password': 'password', 'username': 'login'}
```
- **You can change default pattern**
```python
import json
from proxystr import Proxy
Proxy.set_default_pattern('protocol://ip:port:username:password[rotation_url]')
proxy = Proxy("login:password@210.173.88.77:3001[https://rotate.my-proxy.io?api_key=your_api_key]")
print(proxy)
print(json.dumps(proxy))
print({'proxy': proxy})
```
Output:
```
http://210.173.88.77:3001:login:password[https://rotate.my-proxy.io/?api_key=your_api_key]
"http://210.173.88.77:3001:login:password[https://rotate.my-proxy.io/?api_key=your_api_key]"
{'proxy': Proxy(http://login:password@210.173.88.77:3001)}
```
## Proxy checking
```python
from proxystr import Proxy, check_proxies, read_proxies
proxies = [
Proxy("login:password@210.173.88.77:3001"),
Proxy("login:password@210.173.88.78:3002")
]
good_proxies, bad_proxies = check_proxies(proxies)
# or in raw str format:
good_proxies, bad_proxies = check_proxies(["log:pass@210.173.88.77:3001", "log:pass@210.173.88.78:3002"])
# or read from file and check
good_proxies, bad_proxies = check_proxies(read_proxies('proxies.txt'))
# or for single proxy:
proxy = Proxy("login:password@210.173.88.77:3001")
if proxy.check():
'''do_something'''
```
Another available functions: `check_proxy` for single proxy, `acheck_proxy` and `acheck_proxies` for async use cases
Note that sync `check_proxies()` by default just wraps async `acheck_proxies()`
- **You can get a proxy info while checking it**
```python
from proxystr import Proxy, check_proxies
proxies = [
Proxy("login:password@210.173.88.77:3001"),
Proxy("login:password@210.173.88.78:3002")
]
good_proxies, bad_proxies = check_proxies(proxies, with_info=True)
for proxy, info in good_proxies:
print(info)
# or for single proxy:
proxy = Proxy("login:password@210.173.88.77:3001")
print(proxy.get_info())
```
output
```
{'country': 'Germany', 'countryCode': 'DE', 'city': 'Frankfurt am Main', 'query': '210.173.88.77'}
{'country': 'Germany', 'countryCode': 'DE', 'city': 'Frankfurt am Main', 'query': '210.173.88.78'}
```
>You can add yours `fields` argument to get another info. More details on [ip-api.com](https://ip-api.com/docs/api:json)
>Another simple way to get info is a sync method `proxy.get_info() -> Dict` or async `await proxy.aget_info() -> Dict`
## Pydantic compatibility
```python
from proxystr import Proxy
from pydantic import BaseModel
class Account(BaseModel):
number: int
proxy: Proxy | None = None
for account in [
Account(number=1, proxy=Proxy('login:password@210.173.88.77:3001')),
Account(number=2, proxy='login:password@210.173.88.77:3001')
]:
print(account)
print(account.model_dump())
```
output
```
number=1 proxy=Proxy(http://login:password@210.173.88.77:3001)
{'number': 1, 'proxy': Proxy(http://login:password@210.173.88.77:3001)}
number=2 proxy=Proxy(http://login:password@210.173.88.77:3001)
{'number': 2, 'proxy': Proxy(http://login:password@210.173.88.77:3001)}
```
## Set and equal support
```python
from proxystr import Proxy
p1 = Proxy('login:password@210.173.88.77:3001')
p2 = Proxy('210.173.88.77:3001:login:password')
print(p1 == '210.173.88.77:3001:login:password') # --> True
print(p1 == p2) # --> True
print(p1 is p2) # --> False
print(set((p1, p2))) # --> {Proxy(http://login:password@210.173.88.77:3001)}
```
## Available properties and functions
class `Proxy`
| name | type | returns | description |
| ------ | ------ | ------ | ------ |
| ip | attribute | str | |
| host | property | str | same as `ip` |
| port | attribute | int | |
| username | attribute | str | |
| login | property | str | same as `username` |
| password | attribute | str | |
| rotation_url | attribute | str | for mobile proxy |
| refresh_url | property | str | same as `rotation_url` |
| url | property | str | protocol://login:password@ip:port |
| dict | property | dict | urls for requests session|
| proxies | property | dict | same as `dict` |
| server | property | str | protocol://host:port |
| playwright | property | TypedDict | |
| json() | method | dict | all attributes |
| get_info() | method | dict | info like country etc. |
| aget_info() | method | dict | async version of `get_info()` |
| check() | method | bool | simple proxy check |
| acheck() | method | bool | async version of `check()` |
| set_default_pattern() | classmethod | None | changes `__str__` pattern |
| rotate() | method | bool | sync function to rotate mobile proxy |
| arotate() | method | bool | async version of `rotate()` |
| refresh() | method | bool | same as rotate |
| arefresh() | method | bool | same as arotate |
| get_client() | method | httpx.Client | with proxy included |
| get_async_client() | method | httpx.AsyncClient | with proxy included |
module `proxystr`
| name | input | output | description |
| ------ | ------ | ------ | ------ |
| Proxy | str | Proxy object (str) | |
| Client | **kwargs | httpx.Client object | arg `proxy` takes http and socks proxy |
| AsyncClient | **kwargs | httpx.AsyncClient object | arg `proxy` takes http and socks proxy |
| check_proxy() | Proxy | Tuple[Proxy, bool] | |
| check_proxies() | Sequence[Proxy] | Tuple[List[Proxy], List[Proxy]] | returns good and failed proxies |
| acheck_proxy() | -- | -- | async version of `check_proxy()` |
| acheck_proxies() | -- | -- | async version of `check_proxies()` |
| read_proxies() | str('filepath') | List[Proxy] | read proxies from file |
## Support
Developed by `MrSmith06`: [telegram](https://t.me/Mr_Smith06) | [gtihub](https://github.com/MrSmith06)
If you find this project helpful, feel free to leave a tip!
- EVM address (metamask): `0x6201d7364F01772F8FbDce67A9900d505950aB99`
Raw data
{
"_id": null,
"home_page": "https://github.com/BotsForge/proxystr",
"name": "proxystr",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.8",
"maintainer_email": null,
"keywords": null,
"author": "MrSmith06",
"author_email": "sletars@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/4a/f7/b7fe0a7842c2cef334368ca2d7e3d9e5f5dab7595bc226ec2568972b10bf/proxystr-2.1.3.tar.gz",
"platform": null,
"description": "# ProxyStr\n[](https://t.me/bots_forge)\n\nAn analogue of [better-proxy](https://github.com/alenkimov/better_proxy) by [alenkimov](https://github.com/alenkimov), but with string-like behavior, support for mobile proxies, and proxy checking functions. ProxyStr is heavier than *better-proxy* and requires **httpx** but if you need proxies, you will likely need this library anyway.\n```python\nisinstance(Proxy('127.0.0.1:3001'), str) # --> True\n```\n```bash\npip install proxystr\n```\nFull list of depencies: `pydantic, httpx, httpx-socks`\n## Supports various proxy formats\n```python\nfrom proxystr import Proxy\nProxy('host:port')\nProxy('host:port:login:password')\nProxy('login:password@host:port')\nProxy('login:password|host:port')\nProxy('http://login:password@host:port')\n...\n```\n- for **mobile proxy** you can add a refresh (rotation) url\n```python\nProxy('host:port:login:password[https://rotate.my-proxy.io?api_key=your_api_key]')\nProxy('http://login:password@host:port[https://rotate.my-proxy.io?api_key=your_api_key]')\n...\n```\nP.S. The string parsing method was copied from [better-proxy](https://github.com/alenkimov/better_proxy).\n\n## New in v 2.0:\n- both `requests` and `aiohttp` changed to one lib `httpx`\n- new methods `Proxy.check()` and `Proxy.acheck()`\n- proxy checking functions got a new parameter `raise_on_error` defaults to False\n- now it is possible to inherit from the Proxy class and pass the new class to the Pydantic BaseModel without an error\n- `check_proxy()` now is fully sync\n- `check_proxies()` can be called with arg `use_async=False` (not recommended but if u really need this u can use it)\n- tests added\n- a lot of small fixes\n### New in v 2.1:\n- `Client` and `AsyncClient` added\n- new methods `Proxy.get_client()` and `Proxy.get_async_client()`\n\n## Common use cases\n- **aiohttp**\n```python\nimport aiohttp\nfrom proxystr import Proxy\n\nproxy = Proxy(\"login:password@210.173.88.77:3001\")\n\nasync def fetch(url):\n async with aiohttp.ClientSession() as session:\n async with session.get(url, proxy=proxy.url) as response:\n return await response.text()\n```\n\n- **aiohttp-socks**\n```python\nimport aiohttp\nfrom aiohttp_socks import ProxyConnector\nfrom proxystr import Proxy\n\nproxy = Proxy(\"socks5://login:password@210.173.88.77:3001\")\n\nasync def fetch(url):\n connector = ProxyConnector.from_url(proxy.url)\n async with aiohttp.ClientSession(connector=connector) as session:\n async with session.get(url) as response:\n return await response.text()\n```\n\n- **requests**\n```python\nimport requests\nfrom proxystr import Proxy\n\nproxy = Proxy(\"login:password@210.173.88.77:3001\")\n\ndef fetch(url):\n response = requests.get(url, proxies=proxy.dict) \n return response.text\n```\n\n- **httpx**\n```python\nimport httpx\nfrom proxystr import Proxy\n\nproxy = Proxy(\"login:password@210.173.88.77:3001\")\n\nasync def fetch(url):\n async with httpx.AsyncClient(proxy=proxy.url, follow_redirects=True) as client:\n response = await client.get(url)\n return response.text\n# or\ndef sync_fetch(url):\n with httpx.Client(proxy=proxy.url, follow_redirects=True) as client:\n return client.get(url).text\n# or\ndef simple_fetch(url):\n return httpx.get(url, proxy=proxy.url, follow_redirects=True).text\n```\n\n- **httpx-socks**\n```python\nimport httpx\nfrom httpx_socks import AsyncProxyTransport, SyncProxyTransport\nfrom proxystr import Proxy\n\nproxy = Proxy(\"socks5://login:password@210.173.88.77:3001\")\n\nasync def fetch(url):\n transport = AsyncProxyTransport.from_url(proxy.url)\n async with httpx.AsyncClient(transport=transport, follow_redirects=True) as client:\n response = await client.get(url)\n return response.text\n# or\ndef sync_fetch(url):\n transport = SyncProxyTransport.from_url(proxy.url)\n with httpx.Client(transport=transport, follow_redirects=True) as client:\n return client.get(url).text\n```\n- **httpx wrapped by proxystr**\n```python\nfrom proxystr import Proxy, Client, AsyncClient\n\nproxy = Proxy(\"log:pass@210.173.88.77:3001\") # or \"socks5://log:pass@210.173.88.77:3001\"\n\nasync def fetch(url):\n async with AsyncClient(proxy=proxy) as client:\n response = await client.get(url)\n return response.text\n # or\n async with proxy.get_async_client() as client:\n response = await client.get(url)\n return response.text\n \n# or\ndef sync_fetch(url):\n with Client(proxy=proxy) as client:\n return client.get(url).text\n # or\n with proxy.get_client() as client:\n return client.get(url).text\n```\n\n- **playwright**\n```python\nfrom playwright.async_api import async_playwright, Playwright\nfrom proxystr import Proxy\n\nproxy = Proxy(\"login:password@210.173.88.77:3001\")\n\nasync def fetch(playwright: Playwright, url):\n chromium = playwright.chromium\n browser = await chromium.launch(proxy=proxy.playwright)\n ...\n```\nP.S. Playwright communication was copied from [better-proxy](https://github.com/alenkimov/better_proxy).\n\n## Object representation\n```python\nimport json\nfrom proxystr import Proxy\n\nproxy = Proxy(\"login:password@210.173.88.77:3001\")\nprint(proxy) # according to Proxy.default_pattern\nprint(json.dumps(proxy))\nprint({'proxy': proxy})\nprint(proxy.url)\nprint(proxy.dict)\nprint(proxy.json())\nprint(proxy.playwright())\n```\nOutput:\n```\nlogin:password@210.173.88.77:3001\n\"login:password@210.173.88.77:3001\"\n{'proxy': Proxy(http://login:password@210.173.88.77:3001)}\nhttp://login:password@210.173.88.77:3001\n{'http': 'http://login:password@210.173.88.77:3001', 'https': 'http://login:password@210.173.88.77:3001'}\n{'protocol': 'http', 'username': 'login', 'password': 'password', 'ip': '210.173.88.77', 'port': 3001, 'rotation_url': None}\n{'server': 'http://210.173.88.77:3001', 'password': 'password', 'username': 'login'}\n```\n- **You can change default pattern**\n```python\nimport json\nfrom proxystr import Proxy\n\nProxy.set_default_pattern('protocol://ip:port:username:password[rotation_url]')\n\nproxy = Proxy(\"login:password@210.173.88.77:3001[https://rotate.my-proxy.io?api_key=your_api_key]\")\nprint(proxy)\nprint(json.dumps(proxy))\nprint({'proxy': proxy})\n```\nOutput:\n```\nhttp://210.173.88.77:3001:login:password[https://rotate.my-proxy.io/?api_key=your_api_key]\n\"http://210.173.88.77:3001:login:password[https://rotate.my-proxy.io/?api_key=your_api_key]\"\n{'proxy': Proxy(http://login:password@210.173.88.77:3001)}\n```\n\n## Proxy checking\n```python\nfrom proxystr import Proxy, check_proxies, read_proxies\n\nproxies = [\n Proxy(\"login:password@210.173.88.77:3001\"),\n Proxy(\"login:password@210.173.88.78:3002\")\n]\ngood_proxies, bad_proxies = check_proxies(proxies)\n# or in raw str format:\ngood_proxies, bad_proxies = check_proxies([\"log:pass@210.173.88.77:3001\", \"log:pass@210.173.88.78:3002\"])\n# or read from file and check\ngood_proxies, bad_proxies = check_proxies(read_proxies('proxies.txt'))\n\n# or for single proxy:\nproxy = Proxy(\"login:password@210.173.88.77:3001\")\nif proxy.check():\n '''do_something'''\n```\nAnother available functions: `check_proxy` for single proxy, `acheck_proxy` and `acheck_proxies` for async use cases\nNote that sync `check_proxies()` by default just wraps async `acheck_proxies()`\n- **You can get a proxy info while checking it**\n```python\nfrom proxystr import Proxy, check_proxies\n\nproxies = [\n Proxy(\"login:password@210.173.88.77:3001\"),\n Proxy(\"login:password@210.173.88.78:3002\")\n]\ngood_proxies, bad_proxies = check_proxies(proxies, with_info=True)\nfor proxy, info in good_proxies:\n print(info)\n\n# or for single proxy:\nproxy = Proxy(\"login:password@210.173.88.77:3001\")\nprint(proxy.get_info())\n```\noutput\n```\n{'country': 'Germany', 'countryCode': 'DE', 'city': 'Frankfurt am Main', 'query': '210.173.88.77'}\n{'country': 'Germany', 'countryCode': 'DE', 'city': 'Frankfurt am Main', 'query': '210.173.88.78'}\n```\n>You can add yours `fields` argument to get another info. More details on [ip-api.com](https://ip-api.com/docs/api:json)\n\n>Another simple way to get info is a sync method `proxy.get_info() -> Dict` or async `await proxy.aget_info() -> Dict`\n## Pydantic compatibility\n```python\nfrom proxystr import Proxy\nfrom pydantic import BaseModel\n\nclass Account(BaseModel):\n number: int\n proxy: Proxy | None = None\n\nfor account in [\n Account(number=1, proxy=Proxy('login:password@210.173.88.77:3001')),\n Account(number=2, proxy='login:password@210.173.88.77:3001')\n]:\n print(account)\n print(account.model_dump())\n```\noutput\n```\nnumber=1 proxy=Proxy(http://login:password@210.173.88.77:3001)\n{'number': 1, 'proxy': Proxy(http://login:password@210.173.88.77:3001)}\nnumber=2 proxy=Proxy(http://login:password@210.173.88.77:3001)\n{'number': 2, 'proxy': Proxy(http://login:password@210.173.88.77:3001)}\n```\n## Set and equal support\n```python\nfrom proxystr import Proxy\n\np1 = Proxy('login:password@210.173.88.77:3001')\np2 = Proxy('210.173.88.77:3001:login:password')\n\nprint(p1 == '210.173.88.77:3001:login:password') # --> True\nprint(p1 == p2) # --> True\nprint(p1 is p2) # --> False\nprint(set((p1, p2))) # --> {Proxy(http://login:password@210.173.88.77:3001)}\n```\n## Available properties and functions\nclass `Proxy`\n| name | type | returns | description |\n| ------ | ------ | ------ | ------ |\n| ip | attribute | str | |\n| host | property | str | same as `ip` |\n| port | attribute | int | |\n| username | attribute | str | |\n| login | property | str | same as `username` |\n| password | attribute | str | |\n| rotation_url | attribute | str | for mobile proxy |\n| refresh_url | property | str | same as `rotation_url` |\n| url | property | str | protocol://login:password@ip:port |\n| dict | property | dict | urls for requests session|\n| proxies | property | dict | same as `dict` |\n| server | property | str | protocol://host:port |\n| playwright | property | TypedDict | |\n| json() | method | dict | all attributes |\n| get_info() | method | dict | info like country etc. |\n| aget_info() | method | dict | async version of `get_info()` |\n| check() | method | bool | simple proxy check |\n| acheck() | method | bool | async version of `check()` |\n| set_default_pattern() | classmethod | None | changes `__str__` pattern |\n| rotate() | method | bool | sync function to rotate mobile proxy |\n| arotate() | method | bool | async version of `rotate()` |\n| refresh() | method | bool | same as rotate |\n| arefresh() | method | bool | same as arotate |\n| get_client() | method | httpx.Client | with proxy included |\n| get_async_client() | method | httpx.AsyncClient | with proxy included |\n\nmodule `proxystr`\n| name | input | output | description |\n| ------ | ------ | ------ | ------ |\n| Proxy | str | Proxy object (str) | |\n| Client | **kwargs | httpx.Client object | arg `proxy` takes http and socks proxy |\n| AsyncClient | **kwargs | httpx.AsyncClient object | arg `proxy` takes http and socks proxy |\n| check_proxy() | Proxy | Tuple[Proxy, bool] | |\n| check_proxies() | Sequence[Proxy] | Tuple[List[Proxy], List[Proxy]] | returns good and failed proxies |\n| acheck_proxy() | -- | -- | async version of `check_proxy()` |\n| acheck_proxies() | -- | -- | async version of `check_proxies()` |\n| read_proxies() | str('filepath') | List[Proxy] | read proxies from file |\n\n## Support\nDeveloped by `MrSmith06`: [telegram](https://t.me/Mr_Smith06) | [gtihub](https://github.com/MrSmith06)\nIf you find this project helpful, feel free to leave a tip!\n- EVM address (metamask): `0x6201d7364F01772F8FbDce67A9900d505950aB99`",
"bugtrack_url": null,
"license": "MIT",
"summary": "Use a proxy as a string, but achieve broad functionality for various scenarios",
"version": "2.1.3",
"project_urls": {
"Homepage": "https://github.com/BotsForge/proxystr",
"Repository": "https://github.com/BotsForge/proxystr"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "1d50cd85c997a5f16a0e9971e9a6e59c025a7bfce5cb3d0381726161a374e079",
"md5": "517792a9a2000b9894fbf87f2305770e",
"sha256": "4782add5cbe9a623fc0983b77e094c3b1e250c94677a0f4cf4dad6c4b2a17094"
},
"downloads": -1,
"filename": "proxystr-2.1.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "517792a9a2000b9894fbf87f2305770e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.8",
"size": 10466,
"upload_time": "2024-12-09T07:10:49",
"upload_time_iso_8601": "2024-12-09T07:10:49.237564Z",
"url": "https://files.pythonhosted.org/packages/1d/50/cd85c997a5f16a0e9971e9a6e59c025a7bfce5cb3d0381726161a374e079/proxystr-2.1.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "4af7b7fe0a7842c2cef334368ca2d7e3d9e5f5dab7595bc226ec2568972b10bf",
"md5": "ae7e7a6460d8678837ad9ca634298ad4",
"sha256": "d6da2c2dc1b8860059aaba049ab29bcd665437936fa7684fb637b962f542fff3"
},
"downloads": -1,
"filename": "proxystr-2.1.3.tar.gz",
"has_sig": false,
"md5_digest": "ae7e7a6460d8678837ad9ca634298ad4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.8",
"size": 9390,
"upload_time": "2024-12-09T07:10:51",
"upload_time_iso_8601": "2024-12-09T07:10:51.343421Z",
"url": "https://files.pythonhosted.org/packages/4a/f7/b7fe0a7842c2cef334368ca2d7e3d9e5f5dab7595bc226ec2568972b10bf/proxystr-2.1.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-09 07:10:51",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "BotsForge",
"github_project": "proxystr",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "pydantic",
"specs": [
[
">=",
"2.0"
]
]
},
{
"name": "httpx",
"specs": [
[
">=",
"0.27"
]
]
},
{
"name": "httpx-socks",
"specs": [
[
">=",
"0.9"
]
]
}
],
"lcname": "proxystr"
}