Integração

Use a Shifter com Go

Integre os proxies residenciais e de ISP do Shifter ao Go em minutos. Funciona com o net/http padrão, Resty, GoQuery, Colly e qualquer cliente que aceite um *url.URL, sem necessidade de SDK.

Início Rápido

Instalar

go get github.com/go-resty/resty/v2

Uso Básico

package main

import (
	"fmt"
	"io"
	"net/http"
	"net/url"
)

func main() {
	proxyURL, _ := url.Parse(
		"customer-USERNAME-country-us-sid-123ABC:PASSWORD@p.shifter.io:443",
	)

	client := &http.Client{
		Transport: &http.Transport{Proxy: http.ProxyURL(proxyURL)},
	}

	resp, _ := client.Get("https://ipinfo.io/json")
	defer resp.Body.Close()

	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
	// {"ip": "154.16.xxx.xxx", "city": "New York", "country": "US", ...}
}

Recursos

Suporte plug-and-play para net/http, Resty, GoQuery, Colly, fasthttp e qualquer cliente que aceite um *url.URL de proxy
Rotação por requisição por padrão, com `sid` para sessões persistentes e `ttl-N` para fixações por tempo de N segundos
Suporte a navegador headless via chromedp e Rod para destinos renderizados em JavaScript
Protocolos HTTP, HTTPS e SOCKS5 no mesmo endpoint de gateway
Geo-direcionamento em 195+ países via parâmetros de nome de usuário, sem necessidade de SDK adicional
Compatível com todas as versões do Go a partir da 1.18, incluindo módulos, go-workspaces e builds sem CGO

Exemplos

net/http padrão com Sticky Session

A opção sem dependências. Crie um *http.Transport com uma URL de proxy: o mesmo cliente pode ser reutilizado com segurança entre goroutines.

package main

import (
	"crypto/rand"
	"encoding/hex"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"time"
)

func newClient(country, city string) *http.Client {
	sidBytes := make([]byte, 4)
	rand.Read(sidBytes)
	sid := hex.EncodeToString(sidBytes)

	proxyURL, _ := url.Parse(fmt.Sprintf(
		"customer-USERNAME-country-%s-city-%s-sid-%s-ttl-300:PASSWORD@p.shifter.io:443",
		country, city, sid,
	))

	return &http.Client{
		Timeout: 30 * time.Second,
		Transport: &http.Transport{
			Proxy:                 http.ProxyURL(proxyURL),
			MaxIdleConnsPerHost:   16,
			IdleConnTimeout:       90 * time.Second,
			TLSHandshakeTimeout:   10 * time.Second,
			ResponseHeaderTimeout: 20 * time.Second,
		},
	}
}

func main() {
	c := newClient("uk", "london")

	for _, path := range []string{"/login", "/dashboard", "/orders"} {
		req, _ := http.NewRequest("GET", "https://example.co.uk"+path, nil)
		req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")

		resp, err := c.Do(req)
		if err != nil {
			fmt.Println("error:", err)
			continue
		}
		body, _ := io.ReadAll(resp.Body)
		resp.Body.Close()
		fmt.Println(path, resp.StatusCode, len(body), "bytes")
	}
}

Resty (mais ergonômico)

O Resty encapsula o net/http com um builder fluente, retry automático e vinculação de respostas. Vale a pena para pipelines de scraping que precisam de um tratamento de erros limpo.

package main

import (
	"fmt"

	"github.com/go-resty/resty/v2"
)

type Product struct {
	ID    int     `json:"id"`
	Name  string  `json:"name"`
	Price float64 `json:"price"`
}

func main() {
	client := resty.New().
		SetProxy("customer-USERNAME-country-de-sid-456DEF:PASSWORD@p.shifter.io:443").
		SetRetryCount(3).
		SetRetryWaitTime(2_000_000_000). // 2s in ns
		SetHeader("User-Agent", "Mozilla/5.0 (Macintosh) AppleWebKit/537.36")

	var products []Product
	resp, err := client.R().
		SetResult(&products).
		Get("https://api.example.de/products")

	if err != nil || !resp.IsSuccess() {
		fmt.Println("error:", err, resp.Status())
		return
	}

	for _, p := range products {
		fmt.Printf("%d %s — %.2f EUR\n", p.ID, p.Name, p.Price)
	}
}

Colly (framework de scraping)

Colly é a biblioteca de scraping de fato para Go. Configure o proxy com SetProxy(), cada requisição feita pelo spider será roteada através da Shifter.

package main

import (
	"fmt"
	"log"

	"github.com/gocolly/colly/v2"
)

func main() {
	c := colly.NewCollector(
		colly.AllowedDomains("example.com"),
		colly.UserAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"),
	)

	if err := c.SetProxy(
		"customer-USERNAME-country-fr-city-paris-sid-789GHI:PASSWORD@p.shifter.io:443",
	); err != nil {
		log.Fatal(err)
	}

	c.OnHTML("article.post", func(e *colly.HTMLElement) {
		fmt.Println(e.ChildText("h2"), "->", e.ChildAttr("a", "href"))
	})

	c.OnError(func(r *colly.Response, err error) {
		fmt.Printf("error %d: %v\n", r.StatusCode, err)
	})

	c.Visit("https://example.com/blog")
}

chromedp (Chromium headless)

Execute uma instância real de Chromium através do Shifter para alvos renderizados em JavaScript. O chromedp usa o protocolo CDP do Chrome, sem dependência do Selenium.

package main

import (
	"context"
	"fmt"
	"time"

	"github.com/chromedp/chromedp"
)

func main() {
	opts := append(chromedp.DefaultExecAllocatorOptions[:],
		chromedp.ProxyServer("http://p.shifter.io:443"),
		chromedp.Flag("headless", true),
	)

	allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
	defer cancel()

	ctx, cancel := chromedp.NewContext(allocCtx)
	defer cancel()

	ctx, cancel = context.WithTimeout(ctx, 30*time.Second)
	defer cancel()

	var html string
	err := chromedp.Run(ctx,
		// chromedp doesn't natively prompt for proxy auth — use a Chrome
		// extension or run a sidecar that injects credentials, or use
		// Shifter's IP-whitelist auth instead of user/pass.
		chromedp.Navigate("https://example.com"),
		chromedp.WaitVisible("body", chromedp.ByQuery),
		chromedp.OuterHTML("html", &html),
	)

	if err != nil {
		fmt.Println("error:", err)
		return
	}
	fmt.Println(len(html), "bytes")
}
Perguntas Frequentes

Perguntas frequentes

Perguntas comuns sobre usar o Shifter com Go.

Analise a URL do proxy com url.Parse, depois passe-a para um *http.Transport via http.ProxyURL(proxyURL). Use esse transport em um *http.Client. O client é seguro para compartilhar entre goroutines e reutiliza conexões automaticamente.

Chame resty.New().SetProxy(proxyURL). O Resty cuida do transporte subjacente para você. O formato da URL do proxy é `http://USER:PASS@p.shifter.io:443`. Você também pode encadear SetRetryCount e SetTimeout para scraping em nível de produção.

Sim. Chame c.SetProxy(proxyURL) no seu collector — o Colly roteará todas as solicitações pelo Shifter. Use SetProxyFunc para round-robin entre múltiplas sessões, ou passe uma URL do Shifter com um sid exclusivo por spider para scrapes paralelos.

Adicione um ID de sessão ao nome de usuário do proxy, por exemplo, `customer-USERNAME-country-us-sid-123ABC`. Toda requisição Go que usar a mesma URL de proxy reutilizará o mesmo IP residencial. Adicione `ttl-N` para fixar esse IP por até N segundos.

Sim. Use o chromedp com chromedp.ProxyServer nas opções do seu ExecAllocator. Para autenticação por usuário e senha, combine isso com a lista de IPs permitidos da Shifter: o Chrome não solicita credenciais de proxy no modo headless sem uma extensão auxiliar.

Nenhum SDK é necessário. A Shifter fala HTTP e SOCKS5 puro, aponte seu transporte existente para `p.shifter.io:443`. Isso mantém seu go.mod livre de dependência de fornecedor e funciona com qualquer cliente HTTP do ecossistema.

Começar

Comece a Usar o Shifter com Go

Adicione os proxies residenciais e ISP 205M+ da Shifter aos seus serviços Go em menos de 5 minutos. Funciona com net/http, Resty, Colly e chromedp.

Experimente o Shifter GratuitamenteConfigure em minutos. Cancele quando quiser.