playwright icon indicating copy to clipboard operation
playwright copied to clipboard

[Feature] Support socks5 proxy with authentication

Open viponedream opened this issue 4 years ago • 23 comments

Playwright version

lastest

Operating system

No response

What browsers are you seeing the problem on?

No response

Other information

No response

What happened? / Describe the bug

  _proxy = {
        "server": f"{proxy.scheme}://{proxy.ip}:{proxy.port}",
        "username": f"{proxy.username}",
        "password": f"{proxy.password}"
    }

this proxy is correct, i can use it via requests. but in playwright, it doesnt work . the doc says it support http or socks, how to use socks5 proxy ? thank yoy.

Code snippet to reproduce your bug

_proxy = {
            "server": f"{proxy.scheme}://{proxy.ip}:{proxy.port}",
            "username": f"{proxy.username}",
            "password": f"{proxy.password}"
        }

this proxy is correct, i can use it via requests. but in playwright, it doesnt work .
the doc says it support http or socks, 
how to use socks5 proxy ?
thank yoy.

Relevant log output

No response

viponedream avatar Nov 26 '21 17:11 viponedream

What kind of socks5 proxy are you using? Could you provide us e.g. a squid proxy configuration so we can repro?


Looking at the ecosystem:

  • Chromium doesn't support it: https://issues.chromium.org/issues/40323993
  • Firefox doesn't support it: https://bugzilla.mozilla.org/show_bug.cgi?id=122752
  • WebKit networking stack for linux: libsoup seems to support it
  • WebKit networking stack for Windows: libcurl seems to support it
  • WebKit networking stack for macOS: cfnetwork seems to support it: kCFStreamPropertySOCKSUser

I think the dependency on this issue is Firefox and Chromium support. Without that its hard for us to drive this forward. I recommend having maybe a proxy between you and the actual proxy in the meantime.

mxschmitt avatar Nov 28 '21 14:11 mxschmitt

Socks5 proxy w/ auth is not supported but major browsers or infrastructures. Could you share your use case?

pavelfeldman avatar Nov 29 '21 17:11 pavelfeldman

import asyncio import requests from playwright.async_api import async_playwright

username = 'usertestme888' password = 'usertestme888' ip = '47.241.238.22' port = '2333'

async def mytest():

url = 'http://httpbin.org/ip'

proxies = {
    'http': f'socks5://{username}:{password}@{ip}:{port}',
    'https': f'socks5://{username}:{password}@{ip}:{port}'
}

res = requests.get(url, proxies=proxies,  verify=False)
print(res.text)

async def main(): proxy = { "server": f'https://{ip}:{port}', "username": f"{username}", "password": f"{password}" }

user_data_dir = ''

playwright = await async_playwright().start()
browser = await playwright.chromium.launch_persistent_context(
    user_data_dir,
    proxy=proxy,
    timeout=300000,
    headless=False,
)
page = await browser.new_page()
await page.goto('https://baidu.com')
pass

if name == 'main':

asyncio.run(mytest())
asyncio.run(main())
pass

viponedream avatar Dec 01 '21 19:12 viponedream

Let's see if others upvote this.

pavelfeldman avatar Dec 02 '21 22:12 pavelfeldman

Any update on adding this functionality?

dstampher avatar Jan 12 '22 23:01 dstampher

Really need socks5 proxy authentication

cyberfuhrer avatar Jul 06 '22 12:07 cyberfuhrer

socks5 with auth is ok?

colinsarah avatar Aug 23 '22 16:08 colinsarah

still need socks5 proxy with credentials auth

TurboKach avatar Feb 20 '23 13:02 TurboKach

still need socks5 with auth

igorank avatar Mar 29 '23 10:03 igorank

still need socks5 with auth

AbelLin1214 avatar Apr 06 '23 04:04 AbelLin1214

still need socks5 with auth

tecbr avatar Jul 12 '23 13:07 tecbr

still need socks5 with auth

georgycus avatar Aug 07 '23 16:08 georgycus

still need socks5 with auth

Lucas-Bruschi avatar Aug 17 '23 21:08 Lucas-Bruschi

to those who keep posting the same comment - please just upvote the post at the top

for something productive here - I tried to bump the 'proxy-authorization' header, but ofcourse this triggers net::ERR_INVALID_ARGUMENT from inside puppeteer because overriding some headers is not supported

            if self.proxy and self.proxy.get('server', '').lower().startswith('socks5://'):
                import base64
                auth_str = base64.b64encode(f"{self.proxy['username']}:{self.proxy['password']}".encode('utf8')).decode('ascii')
                self.proxy['username'] = ''
                self.proxy['password'] = ''
                request_headers['proxy-authorization']= f"Basic {auth_str}"

https://github.com/puppeteer/puppeteer/issues/676 https://cri.dev/posts/2020-03-30-How-to-solve-Puppeteer-Chrome-Error-ERR_INVALID_ARGUMENT

However an interesting work-around is to use a local SOCKS proxy chain, so you bounce a local request to localhost socks server off to the real server, because SOCKS chains very well due to its low-level TCP socket type arrangement

https://medium.com/apifier-blog/how-to-make-headless-chrome-and-puppeteer-use-a-proxy-server-with-authentication-249a21a79212

I also tried self.page.evaluate('const aHandle = page.authenticate({"xxxx", "pppp"});') but that didnt work (unsure why) SyntaxError: Unexpected string at eval (<anonymous>) at UtilityScript.evaluate (<anonymous>:201:30) at UtilityScript.<anonymous> (<anonymous>:1:44)

dgtlmoon avatar Oct 09 '23 10:10 dgtlmoon

still need socks5 proxy with credentials auth

phantridungdz avatar Apr 30 '24 16:04 phantridungdz

I require socks5 Auth to use my premium proxy provider

hangrybear666 avatar May 05 '24 05:05 hangrybear666

still need socks5 with auth

NotFiliberto avatar Jul 10 '24 14:07 NotFiliberto

1+

Muno459 avatar Aug 17 '24 09:08 Muno459

+1

ftcmnc avatar Aug 22 '24 11:08 ftcmnc

++

mightatnight avatar Aug 31 '24 13:08 mightatnight

++

fancy45daddy avatar Sep 26 '24 04:09 fancy45daddy

++

andriyshevchenko avatar Sep 29 '24 15:09 andriyshevchenko