Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Upload para repositório Github, gerando erro 409

Olá,

Estou fazendo um script para gerenciar de forma bem simples meu repositório do Github, porém ao executar o código abaixo para inserir um arquivo em uma pasta dentro de um repositório, comecei a receber o erro 409 a partir do segundo arquivo.

import requests
import base64

arquivo = 'desafios/Python_e_APIs_Desafio_Aula_02.ipynb'

with open(f'../{arquivo}', 'rb') as  file:
    file_content = file.read()

encoded_content =base64.b64encode(file_content)

api_base_url = 'https://api.github.com'
access_token =  '<<meu token>>'
headers = {'Authorization' : 'Bearer '+ access_token,
           'X-GitHub-Api-Version': '2022-11-28'}
username = 'PRicardo27'
repo = 'python-requests'
path = 'desafios/Python_e_APIs_Desafio_Aula_02.ipynb'


url = f'{api_base_url}/repos/{username}/{repo}/contents/{path}'

print(url)

data = {
    'message':'Adicionando um novo arquivo',
    'content':encoded_content.decode('utf-8')
}

response = requests.put(url,json=data,headers=headers)

print(response.status_code)

Quando executei a primeira vez com o arquivo Python_e_APIs_Desafio_Aula_01.ipynb, executou sem problemas, até criou a pasta desafios no repositório

imagem mostrando o arquivo e pasta criada no repositório

Pelo o que vi na documentação, o código 409 se refere a conflito, imagino que seja culpa da pasta "desafios", porque na raiz do repositório consigo inserir os arquivos sem problema

4 respostas

Oi Paulo, tudo bem?

O erro 409 (Conflict) ocorre porque você está tentando criar um arquivo sem fornecer o SHA da referência (branch) atual. Quando você trabalha com a API de Conteúdos do GitHub, é necessário incluir o SHA do arquivo existente quando você está atualizando um arquivo, ou o SHA do branch quando está criando um novo arquivo em um diretório existente.

Peço que teste o seguinte código:

import requests
import base64

# Configurações
api_base_url = 'https://api.github.com'
access_token = '<<meu token>>'
username = 'PRicardo27'
repo = 'python-requests'
branch = 'main'  # ou o nome da branch

headers = {
    'Authorization': 'Bearer ' + access_token,
    'X-GitHub-Api-Version': '2022-11-28'
}

# Arquivo a ser enviado
arquivo = 'desafios/Python_e_APIs_Desafio_Aula_02.ipynb'
path_in_repo = arquivo  # caminho no repositório

# Ler conteúdo do arquivo
with open(f'../{arquivo}', 'rb') as file:
    file_content = file.read()

encoded_content = base64.b64encode(file_content)

# URL para verificar se o arquivo já existe
url = f'{api_base_url}/repos/{username}/{repo}/contents/{path_in_repo}?ref={branch}'

# Primeiro verifique se o arquivo já existe para obter o SHA (se aplicável)
response = requests.get(url, headers=headers)

data = {
    'message': 'Adicionando um novo arquivo',
    'content': encoded_content.decode('utf-8'),
    'branch': branch
}

# Se o arquivo já existe, adicione o SHA ao payload
if response.status_code == 200:
    existing_file_data = response.json()
    data['sha'] = existing_file_data['sha']

# Criar ou atualizar o arquivo
response = requests.put(url, json=data, headers=headers)

print(f"Status Code: {response.status_code}")
print(f"Response: {response.json()}")

As modificações no seu código foram:

  1. Especificação de qual branch queremos fazer a alteração.

  2. Antes de tentar criar/atualizar, verificamos se o arquivo já existe para obter seu SHA.

  3. Se o arquivo já existe, incluímos seu SHA para atualização.

Agora, se você tem certeza que está sempre criando novos arquivos (não atualizando existentes), pode simplificar adicionando apenas o parâmetro do branch:

data = {
    'message': 'Adicionando um novo arquivo',
    'content': encoded_content.decode('utf-8'),
    'branch': 'main'  # ou o nome do seu branch
}

⚠️ Atenção: Os códigos acima são sugestões. É possível que haja necessidade de fazer alterações no para obter o resultado esperado.

Os links acima estão em inglês, mas você poderá utilizar a tradução automática do navegador.

Espero ter ajudado.

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Oi Monalisa,

Obrigado pela rápida resposta, mas infelizmente a solução que você passou não funcionou. Utilizei exatamente o mesmo código que enviou, a única coisa que mudou, pelo o que vi, foi adicionar o "sha" nas infos de "data", mas que só será adicionado se for uma atualização de arquivo. Abaixo as respostas que obtive rodando o código:

url: https://api.github.com/repos/PRicardo27/python-requests/contents/desafios/Python_e_APIs_Desafio_Aula_02.ipynb?ref=main

Resposta existing file:  <Response [404]>

Info data: {'message': 'Adicionando um novo arquivo', 'content': <<arquivo codificado>>', 'branch': 'main'}

Resposta put: 
Status Code: 409
Response: {'message': 'Repository rule violations found\n\nSecret detected in content\n\n', 'metadata': {'secret_scanning': {'bypass_placeholders': [{'placeholder_id': '2zrybChxzT3299AiZc51DqnhCYt', 'token_type': 'GITHUB_PERSONAL_ACCESS_TOKEN'}]}}, 'documentation_url': 'https://docs.github.com/rest/repos/contents#create-or-update-file-contents', 'status': '409'}
Para atualizar o arquivo, adicionar o 'sha' funcionou perfeitamente, mas para adicionar um novo arquivo dentro da pasta no repositório, continuo com o mesmo retorno
solução!

Oi Paulo, tudo bem?

Obrigado por compartilhar o retorno da requisição A mensagem retornada pela API do GitHub:Status Code: 409 Message: Repository rule violations found Secret detected in content indica que o GitHub identificou dentro do conteúdo do arquivo que você está tentando enviar algo que parece ser um segredo, como uma chave de API ou um token (por exemplo: ghp_..., sk_..., eyJ..., etc).

Mesmo que esse valor seja apenas ilustrativo ou inativo, o GitHub bloqueia esse tipo de conteúdo por precaução. Esse comportamento faz parte do sistema de segurança chamado Secret Scanning.

O que você pode fazer:

  1. Abra o arquivo .ipynb.
  2. Procure por qualquer string que pareça um token ou senha, como ghp_123abc456, token = "...", etc.
  3. Substitua esses valores por algo fictício, como "SUA_CHAVE_AQUI" ou "VALOR_EXEMPLO".
  4. Salve o notebook e tente fazer o upload novamente com o mesmo código.

Espero ter ajudado e fico à disposição.

Era exatamente isso, obrigado Monalisa!