Tutoriales

GitHub profile en Python

Una llamada autenticada a /api/v1/github/profile?handle=torvalds, la respuesta que devolvió, y la línea que saca un campo de ella.

Lo que necesitas

Solo biblioteca estándar — urllib y json vienen con Python 3. No hay nada que instalar con pip.

La llamada

import json
import os
import urllib.request

url = "https://honesthook.com/api/v1/github/profile?handle=torvalds"

request = urllib.request.Request(
    url,
    headers={"Authorization": "Bearer " + os.environ["HH_KEY"]},
)

with urllib.request.urlopen(request, timeout=30) as response:
    envelope = json.load(response)

print(envelope["success"], envelope["platform"], envelope["endpoint"])

Lo que volvió

{
  "success": true,
  "platform": "github",
  "endpoint": "github/profile",
  "data": {
    "author": {
      "id": "1024025",
      "handle": "torvalds",
      "name": "Linus Torvalds",
      "followers": 325402,
      "following": 0,
      "posts_count": null,
      "verified": null,
      "is_private": null
    }
  },
  "error": null,
  "cached": false
}

Respuesta registrada, capturada el 27 Sep 2026. Una llamada en vivo devuelve el valor del momento en que preguntas, no este.

Todos los campos de esa captura

En PythonTipo en esta captura
envelope["success"]boolean
envelope["platform"]string
envelope["endpoint"]string
envelope["data"]["author"]["id"]string
envelope["data"]["author"]["handle"]string
envelope["data"]["author"]["name"]string
envelope["data"]["author"]["followers"]number
envelope["data"]["author"]["following"]number
envelope["data"]["author"]["posts_count"]null
envelope["data"]["author"]["verified"]null
envelope["data"]["author"]["is_private"]null
envelope["error"]null
envelope["cached"]boolean

Un campo que no podemos leer vuelve null, nunca 0. Un cero sería una afirmación sobre la cuenta; null es un hecho sobre nuestra recolección. La lista completa de lo que esta ruta no devuelve está en github-api/profile.

Leer un campo

print(envelope["data"]["author"]["followers"])

envelope es el dict del bloque de arriba. os.environ lanza un error si la clave no está definida, lo que es mejor que enviar la palabra None como bearer token.

GitHub es el fácil. Tiene una API pública oficial, no pide token para un usuario público, y la forma que devuelve es estable. Así que la pregunta honesta sobre este endpoint es qué estás obteniendo que no pudieras obtener llamando a api.github.com por tu cuenta.

La respuesta es la normalización, y es más estrecha de lo que afirmaría una página de ventas.

Qué estás llamando

Estás llamando a nuestro endpoint, con tu clave en una cabecera Authorization. Detrás de él, la API oficial de GitHub. Lo que vuelve es la misma respuesta de ocho campos que devuelven Instagram, TikTok, Bluesky y todas las demás rutas de perfil de aquí — Hacker News es la excepción, porque responde a una búsqueda, y su bloque de autor lleva tres campos en lugar de ocho. Así que un cliente que escribes una vez las lee todas, y añadir una plataforma no significa añadir un parser.

Donde GitHub no tiene nada que dar, el campo viene null en lugar de rellenarse con un número vecino que significa otra cosa. Esa decisión es el producto, aquí.

Antes de copiar el bloque

Guarda la clave en una variable de entorno — los tres ejemplos leen HH_KEY.

Si GitHub es la única plataforma que necesitas, llama a GitHub directamente; esa es una respuesta de verdad y esta página no va a fingir lo contrario. La forma de respuesta se gana el sueldo en la segunda plataforma.

El endpoint en sí

Parámetros, el formato del handle, lo que la ruta no devuelve y lo que cuesta una llamada: github-api/profile.

La misma llamada en curl · JavaScript.

Cada ejemplo de arriba corre contra el endpoint real en cuanto tengas una clave. Sin tarjeta, y la clave llega en segundos.

Consigue una clave de API gratis: 1000 créditos al mes, sin tarjeta →

← Tutoriales · github-api · Precios