ChromeDriver는 Basic 인증 에이전트 → 다중 에이전트를 통해 해결할 수 없음

배경


ChromeDriver에서 IP 주소 제한이 있는 웹 사이트에 액세스하려면 Chrome 브라우저를 자동으로 조작해야 합니다.허용되는 고정 IP 주소를 가진 프록시 서버가 있기 때문에 이를 통해 사이트를 방문합니다.이 프록시 서버는 기본 인증 방법을 사용하여 인증을 해야 합니다.
그러나 크롬 드라이버는 프록시 연결 옵션이 있지만 인증 정보를 전달할 수 없는 것 같아 난국에 빠졌다.
그래서 나는 인증용 로컬 프록시 서버를 만들어서 해결하는 방법을 시도했다.
※ 코드는 Go로 작성되지만 해결 방법은 언어에 의존하지 않습니다.

필요한 물건

  • Docker(없어도 됨)
  • 코드


    많이 깎아서 간단하게 쓰면 이런 느낌이에요.agouti.
    main.go
    package main
    
    import (
        "github.com/sclevine/agouti"
        "log"
    )
    
    func main() {
        driver := agouti.ChromeDriver(agouti.ChromeOptions("args", []string{"--proxy-server=proxy.example.com:8888"}))
        if err := driver.Start(); err != nil {
            log.Fatal(err)
        }
        defer driver.Stop()
        page, err := driver.NewPage()
        if err != nil {
            log.Fatal(err)
        }
    
        // 診断くんにアクセス
        if err := page.Navigate("http://taruo.net/e/"); err != nil {
            log.Fatal(err)
        }
    }
    
    --proxy-server=proxy.example.com:8888 프록시 서버에 연결하기 위한 시작 옵션입니다.그러나 여기서 자격 증명 (사용자 이름과 암호) 을 지정할 수 없습니다.적어도 내가 조사하고 시도하는 것은 불가능하다.물론 계속 이렇게 실행하면 브라우저에서 인증 정보를 찾을 수 있습니다.

    이러면 자동화가 안 돼요.

    로컬 에이전트 인증


    브라우저에서 인증을 할 수 없기 때문에 브라우저와 프록시 서버(갑) 사이에 프록시 서버(을)를 하나 더 삽입하여 을에게 인증 정보를 불러옵니다.
    ブラウザ -> 乙 (認証情報を載せるプロキシ) -> 甲 (認証が必要なプロキシ) -> サイト
    
    따라서 을에 해당하는 로컬 프록시 서버를 구축하고 DockerSquid의 이미지 시작 용기를 설치하면 매우 빠르다(Docker가 없으면 OS에 Squid를 설치하십시오).
    docker pull sameersbn/squid:3.5.27
    
    Suquid의 설정 파일은 여기 에서 적절하게 꺼내서 ~/squid/squid.conf 잠시 저장합니다.
    squid.conf
    #defaults
    acl localnet src 10.0.0.0/8
    acl localnet src 172.16.0.0/12
    acl localnet src 192.168.0.0/16
    acl localnet src fc00::/7
    acl localnet src fe80::/10
    acl SSL_ports port 443
    acl Safe_ports port 80
    acl Safe_ports port 21
    acl Safe_ports port 443
    acl Safe_ports port 70
    acl Safe_ports port 210
    acl Safe_ports port 1025-65535
    acl Safe_ports port 280
    acl Safe_ports port 488
    acl Safe_ports port 591
    acl Safe_ports port 777
    acl CONNECT method CONNECT
    http_access allow manager localhost
    http_access deny manager
    http_access deny !Safe_ports
    http_access deny CONNECT !SSL_ports
    http_access allow localnet
    http_access allow localhost
    http_access deny all
    http_port 3128
    hierarchy_stoplist cgi-bin ?
    coredump_dir /var/spool/squid
    refresh_pattern ^ftp:       1440    20% 10080
    refresh_pattern ^gopher:    1440    0%  1440
    refresh_pattern -i (/cgi-bin/|\?) 0 0%  0
    refresh_pattern .       0   20% 4320
    
    프로필에 자격 증명을 첨부합니다.
    echo 'cache_peer {甲プロキシのホスト} parent {甲プロキシのポート番号} 0 no-query login={ユーザー名}:{パスワード}' >> ~/squid/squid.conf
    echo 'never_direct allow all' >> ~/squid/squid.conf
    
  • http://www.squid-cache.org/Versions/v3/3.5/cfgman/cache_peer.html
  • http://www.squid-cache.org/Versions/v3/3.5/cfgman/never_direct.html
  • 설정이 완료되면 Docker 컨테이너를 시작합니다.
    docker run --name squid -d \
      --publish 3128:3128 \
      --volume ~/squid/squid.conf:/etc/squid/squid.conf \
      --volume ~/squid/cache:/var/spool/squid \
      sameersbn/squid:3.5.27
    
    이렇게 localhost:3128 하면 개방적이어야 하기 때문에 코드의 시작 옵션 부분을 --proxy-server=localhost:3128 으로 변경합니다.
    프로그램을 실행할 때

    순조롭게 진행되었다.

    참고 자료

  • Capabilities & ChromeOptions - ChromeDriver - WebDriver for Chrome
  • OSX 사용자의 squild에서의 행복한 이야기 - Qiita
  • 컨테이너가 시작되지 않으면 구성 파일에 오류가 있을 수 있습니다. 

    좋은 웹페이지 즐겨찾기