Usa Shifter con Go
Integra los proxies residenciales e ISP de Shifter en Go en minutos. Funciona con el net/http estándar, Resty, GoQuery, Colly y cualquier cliente que consuma un *url.URL, sin necesidad de SDK.
Inicio 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", ...}
} Características
Ejemplos
net/http estándar con sesión persistente
La opción sin dependencias externas. Construye un *http.Transport con una URL de proxy: el mismo cliente puede reutilizarse entre goroutines de forma segura.
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 (más ergonómico)
Resty envuelve net/http con un constructor fluido, reintento automático y vinculación de respuestas. Vale la pena para pipelines de scraping que necesiten un manejo limpio de errores.
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 es la biblioteca de scraping de referencia en Go. Configura el proxy con SetProxy(): cada solicitud que realice el spider se enrutará a través de 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 sin interfaz gráfica)
Controla una instancia real de Chromium a través de Shifter para objetivos con JavaScript. chromedp utiliza el protocolo CDP de Chrome, sin dependencia de 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")
} Preguntas frecuentes
Preguntas frecuentes sobre el uso de Shifter con Go.
Analiza la URL del proxy con url.Parse y pásala a un *http.Transport mediante http.ProxyURL(proxyURL). Usa ese transport en un *http.Client. El cliente puede compartirse entre goroutines de forma segura y reutiliza las conexiones automáticamente.
Llama a resty.New().SetProxy(proxyURL). Resty gestiona el transporte subyacente por ti. El formato de la URL del proxy es `http://USER:PASS@p.shifter.io:443`. También puedes encadenar SetRetryCount y SetTimeout para un scraping de nivel productivo.
Sí. Llama a c.SetProxy(proxyURL) en tu collector y Colly enrutará cada solicitud a través de Shifter. Usa SetProxyFunc para rotación en cadena entre varias sesiones, o pasa una URL de Shifter con un sid único por spider para scraping en paralelo.
Añade un ID de sesión al nombre de usuario del proxy, por ejemplo `customer-USERNAME-country-us-sid-123ABC`. Cada solicitud Go que use la misma URL de proxy reutilizará la misma IP residencial. Añade `ttl-N` para fijar esa IP durante un máximo de N segundos.
Sí. Usa chromedp con chromedp.ProxyServer en las opciones de tu ExecAllocator. Para la autenticación con usuario y contraseña, combínalo con la lista blanca de IPs de Shifter, ya que Chrome no solicita credenciales de proxy en modo headless sin una extensión auxiliar.
No se necesita ningún SDK. Shifter utiliza HTTP y SOCKS5 estándar: apunta tu transporte existente a `p.shifter.io:443`. Esto mantiene tu go.mod libre de dependencias de terceros y funciona con cualquier cliente HTTP del ecosistema.
Empieza a usar Shifter con Go
Añade los más de 205M de proxies residenciales y de ISP de Shifter a tus servicios Go en menos de 5 minutos. Compatible con net/http, Resty, Colly y chromedp.