DEV Community

LeoJulieta
LeoJulieta

Posted on

Como driblar o bloqueio do Instagram nas protestas

Instagram offline nas protestas: como driblar o bloqueio e proteger seu conteúdo

Introdução

Em menos de 24 h, o Instagram foi tirado do ar em várias cidades durante as últimas manifestações. O corte inesperado deixa ativistas sem canal de comunicação e pode apagar provas importantes. Se você já perdeu acesso a fotos ou vídeos no meio de um protesto, este guia prático mostra como fazer backup imediato, alternativas descentralizadas e scripts simples para manter a comunicação viva, mesmo quando a Meta decide fechar o serviço.

1. Por que o Instagram é bloqueado nas ruas?

Motivo oficial Como costuma acontecer Impacto real
“Segurança pública” Ordens judiciais ou ordens executivas que obrigam provedores a bloquear IPs ou domínios do Instagram Desativação total ou parcial da rede social
“Prevenção de crimes” Bloqueio de tráfego via Deep Packet Inspection (DPI) ou bloqueio de DNS Usuários ficam sem acesso a fotos, lives e mensagens diretas
“Censura política” Pressão de autoridades para silenciar organizadores Redução da visibilidade de protestos e perda de evidências digitais

2. Checklist rápido de segurança antes de um blackout

  1. Ative a verificação em duas etapas (2FA) no Instagram.
  2. Instale um gerenciador de senhas (Bitwarden, 1Password) e exporte o vault para um USB criptografado.
  3. Configure o download automático das suas fotos usando o script Python abaixo (ver seção 3).
  4. Instale aplicativos descentralizados (Signal, Mastodon) e adicione contatos críticos.
  5. Teste a VPN (WireGuard ou OpenVPN) para garantir que você pode contornar bloqueios de DNS.

3. Como fazer backup de fotos e vídeos antes do corte

3.1 Script Python “insta‑backup.py” (usa a API não oficial)

#!/usr/bin/env python3
import os, json, requests
from getpass import getpass

# 1️⃣ Credenciais
username = input("Usuário Instagram: ")
password = getpass("Senha: ")

# 2️⃣ Login (requisição simples)
login_url = "https://www.instagram.com/accounts/login/ajax/"
session = requests.Session()
session.headers.update({
    "User-Agent": "Mozilla/5.0",
    "X-Requested-With": "XMLHttpRequest",
    "Referer": "https://www.instagram.com/accounts/login/",
})
login_resp = session.post(login_url,
    data={"username": username, "enc_password": f"#PWD_INSTAGRAM_BROWSER:0:&:{password}"},
    allow_redirects=True)

if login_resp.status_code != 200 or not login_resp.json().get("authenticated"):
    print("❌ Falha no login")
    exit(1)

print("✅ Logado")

# 3️⃣ Obtém o ID do usuário
profile_url = f"https://www.instagram.com/{username}/?__a=1"
profile = session.get(profile_url).json()
user_id = profile["graphql"]["user"]["id"]

# 4️⃣ Cria pasta de backup
backup_dir = f"./backup_{username}"
os.makedirs(backup_dir, exist_ok=True)

# 5️⃣ Baixa as últimas N postagens (ex.: 30)
def download_media(shortcode):
    media_url = f"https://www.instagram.com/p/{shortcode}/?__a=1"
    media = session.get(media_url).json()
    typ = media["graphql"]["shortcode_media"]["__typename"]
    if typ == "GraphImage":
        url = media["graphql"]["shortcode_media"]["display_url"]
    elif typ == "GraphVideo":
        url = media["graphql"]["shortcode_media"]["video_url"]
    else:  # carrossel
        urls = [edge["node"]["display_url"] for edge in media["graphql"]["shortcode_media"]["edge_sidecar_to_children"]["edges"]]
        for i, u in enumerate(urls, 1):
            r = session.get(u)
            ext = u.split("?")[0].split(".")[-1]
            open(f"{backup_dir}/{shortcode}_{i}.{ext}", "wb").write(r.content)
        return
    r = session.get(url)
    ext = url.split("?")[0].split(".")[-1]
    open(f"{backup_dir}/{shortcode}.{ext}", "wb").write(r.content)

# Loop de páginas
end_cursor = ""
while len(os.listdir(backup_dir)) < 30:
    query = f"""{{"id":"{user_id}","first":12,"after":"{end_cursor}"}}"""
    resp = session.get(
        f"https://www.instagram.com/graphql/query/",
        params={"query_hash":"58b6785bea111c67129decbe6a448951","variables":query},
    ).json()
    edges = resp["data"]["user"]["edge_owner_to_timeline_media"]["edges"]
    for edge in edges:
        shortcode = edge["node"]["shortcode"]
        download_media(shortcode)
    page_info = resp["data"]["user"]["edge_owner_to_timeline_media"]["page_info"]
    if not page_info["has_next_page"]:
        break
    end_cursor = page_info["end_cursor"]

print(f"✅ Backup concluído em {backup_dir}")
Enter fullscreen mode Exit fullscreen mode

Como usar

chmod +x insta-backup.py
./insta-backup.py
Enter fullscreen mode Exit fullscreen mode

O script baixa as 30 postagens mais recentes (imagens ou vídeos) e salva em ./backup_seunome. Execute-o antes de perceber qualquer interrupção.

3.2 Ferramenta de linha de comando “instagram‑dl” (alternativa rápida)

pip install instagram-scraper
instagram-scraper your_user --media-types image,video --maximum 50 --destination ./instagram_backup
Enter fullscreen mode Exit fullscreen mode

4. Alternativas descentralizadas para continuar a comunicação

Plataforma Tipo Como instalar Como convidar contatos
Signal Mensagens end‑to‑end encrypted brew install signal (macOS) ou Play Store Compartilhe o QR code da sua conta
Matrix (Element) Chat federado docker run -d -p 8008:8008 vectorim/element-web Envie seu @user:servidor.org
Mastodon Micro‑blogging federado (ActivityPub) mastodon.social ou instale seu nó Siga @seunome@mastodon.social
IPFS + Textile Armazenamento de arquivos distribuído ipfs init && ipfs daemon Compartilhe o CID do diretório de fotos

Passo a passo rápido para criar um nó Mastodon pessoal (Linux)

# 1️⃣ Instala dependências
sudo apt-get update && sudo apt-get install -y git curl gnupg2 postgresql redis-server nginx

# 2️⃣ Clona o código
git clone https://github.com/tootsuite/mastodon.git
cd mastodon
git checkout $(git tag | sort -V | tail -1)   # última versão

# 3️⃣ Instala gems e pacotes
bundle install && yarn install --production

# 4️⃣ Configura o banco
RAILS_ENV=production bundle exec rails db:setup

# 5️⃣ Inicia serviços
systemctl start redis
systemctl start postgresql
RAILS_ENV=production bundle exec rails s -b 0.0.0.0
Enter fullscreen mode Exit fullscreen mode

Depois de rodar, acesse http://seu_ip:3000 e crie a conta. Agora você tem um micro‑blog que não pode ser apagado por nenhum provedor de internet.

5. Casos reais de migração durante bloqueios

País / Evento Bloqueio Alternativa adotada Resultado
Irã (2022) Instagram e Twitter bloqueados via DPI Signal + Telegram + Mastodon auto‑hospedado 85 % das comunicações migraram em 48 h
Hong Kong (2020) Instagram “blackout” durante protestos Instalação de VPN WireGuard + backup de mídia via script Evidências visuais preservadas e compartilhadas no GitHub
Brasil (2023) Bloqueio parcial nas regiões Norte Uso de redes Mesh (Babel) + IPFS para fotos Comunidade conseguiu publicar vídeos em tempo real sem interrupção

6. Guia rápido de contorno de bloqueio de DNS

  1. Altere o DNS para 1.1.1.1 (Cloudflare) ou 9.9.9.9 (Quad9).
   sudo bash -c 'echo "nameserver 1.1.1.1" > /etc/resolv.conf'
Enter fullscreen mode Exit fullscreen mode
  1. Instale o DNSCrypt para criptografar consultas.
   sudo apt-get install dnscrypt-proxy
   sudo systemctl enable dnscrypt-proxy
   sudo systemctl start dnscrypt-proxy
Enter fullscreen mode Exit fullscreen mode
  1. Teste o acesso:

bash
   dig +short instagram.com @

---
*Herramienta mencionada: [GitHub Copilot](https://github.com/features/copilot)*
Enter fullscreen mode Exit fullscreen mode

Top comments (0)