Build in Public · LF-03
Cómo obtener datos de comentarios de Douyin: de la URL del vídeo al JSON con relaciones de respuesta conservadas
Comienza con los parámetros en tiempo real de douyin.comments, lee los comentarios con solicitudes mínimas, conserva la fuente del vídeo, el ID del comentario y la relación de respuesta, y gestiona los límites de cantidad, los resultados vacíos, el análisis temporal y las observaciones repetidas.
Al exportar comentarios de Douyin a JSON, se pasa por alto un detalle frecuente: una línea del archivo puede ser un comentario independiente o una respuesta a otro comentario. Tratarlos como opiniones de usuarios independientes elimina el contexto; mezclar los
Por tanto, obtener comentarios a partir de la URL de un vídeo no se limita a comprobar que la interfaz devuelve un array. El flujo de integración completo requiere confirmar el objeto de vídeo, leer los parámetros actuales, conservar la identidad del comentario y la relación de respuesta, y especificar qué cubre y qué no esta observación. Este artículo detalla el uso de EveryInfra douyin.comments paso a paso, ideal para desarrolladores que preparan la integración de comentarios en paneles de investigación, análisis de contenido o flujos de revisión manual.
La descripción de parámetros y campos de este artículo se basa en el catálogo público y el código fuente de 2026-09-04. La plantilla de solicitud no ejecuta operaciones de pago en esta ronda; el JSON sintetizado posterior solo ilustra la normalización y no constituye ninguna muestra real de vídeo, usuario o comentario.
Determina primero el tipo de interfaz que integras
Si desarrollas inicio de sesión autorizado, publicaciones u otras funcionalidades oficiales abiertas de Douyin, accede al proceso correspondiente desde la lista de interfaces de la plataforma abierta de Douyin y comprueba el tipo de aplicación y los permisos. El access_token oficial, los parámetros y los códigos de error forman parte del contrato de la interfaz oficial y no se pueden aplicar directamente a la solicitud de datos de EveryInfra en este artículo.
Este artículo solo aborda la lectura de comentarios una vez definido el objetivo del vídeo. Los detalles de vídeo, comentarios, búsqueda y transcripción de texto de EveryInfra corresponden a acciones distintas; para analizar de qué se habla en la sección de comentarios, no emplees el título del vídeo ni la transcripción de voz como sustitutos del texto de los comentarios. Tampoco des por sentado el permiso de lectura en contenidos privados, eliminados o restringidos por el simple hecho de disponer de la URL del vídeo.
Primer paso: confirma los parámetros actuales de comments
curl -fsS --max-time 30 \
'https://api.everyinfra.com/api/v1/social/catalog?platform=douyin' \
| jq -e '.capabilities[] | select(.action == "comments") | {
action, required_params, optional_params, param_meanings,
mode, available, returns_list,
default_limit, max_limit, response_fields
}'El directorio actual indica que douyin.comments requiere una url, se ejecuta de forma síncrona, devuelve una lista, establece un recuento predeterminado de 20 y un límite máximo de 100. La funcionalidad de lista admite un límite general; estos valores restringen el volumen de la solicitud y no garantizan la devolución de cien elementos ni que el vídeo contenga un máximo de cien comentarios.
La declaración actual de esta acción no expone parámetros de page, cursor o has_more para el uso del llamador, ni incluye filtros de sort públicos. No agregues sort: newest por tu cuenta para obtener los cien elementos más recientes; los parámetros compatibles con otras acciones no implican que comments también los admita. Si no puedes verificar mediante contrato la ordenación o paginación requeridas, indica claramente que el requisito no se cumple en lugar de degradar el programa en silencio a una muestra arbitraria.
El campo response_fields del directorio describe los registros de comentarios, no el protocolo de paginación. Aunque en el futuro se incorpore un campo llamado cursor en los registros, verifica primero que pertenezca al mecanismo de paginación antes de usarlo para avanzar solicitudes y evites escribir bucles basados únicamente en el nombre del campo.
Segundo paso: determina la identidad del vídeo antes de solicitarlo
La entrada debe ser el enlace de vídeo completo aceptado por esta funcionalidad. En la práctica, el equipo de operaciones puede proporcionar un texto compartible, un enlace corto o varias direcciones del mismo vídeo con distintos parámetros de consulta. Organiza el objetivo antes de llamar a la interfaz para depurar con mayor facilidad que si envías cualquier cadena arbitraria a url.
Se recomienda almacenar tres elementos en la capa de negocio: la referencia inicial enviada por el usuario, la URL de solicitud validada y el ID de vídeo identificado de forma fiable. Si no logras obtener el ID del vídeo con certeza, emplea temporalmente la referencia de origen validada para una vinculación controlada, sin adivinar el ID a partir de la longitud numérica ni tratar un código corto compartido como la identidad del vídeo.
Si un mismo vídeo aparece en múltiples listas de investigación, puedes reutilizar la misma observación autorizada, pero debes conservar su asignación a cada tarea de estudio. A la inversa, dos vídeos con el mismo título o protagonistas idénticos no deben combinarse de forma automática. El criterio de deduplicación es la identidad del contenido, no la similitud del texto.
La normalización de enlaces solo trata las diferencias de representación que ya hayas comprobado que son irrelevantes. No elimines los parámetros de consulta de forma indiscriminada; guarda por separado la entrada original y el valor enviado en la práctica. Si se producen redireccionamientos inciertos, contenido inaccesible o enlaces que apuntan a otros objetos, pásalos a revisión manual en lugar de reintentarlo de manera indefinida con formatos distintos.
Tercer paso: realiza una solicitud mínima con un solo vídeo
Supón que ya has configurado EVERYINFRA_API_KEY y EVERYINFRA_DOUYIN_VIDEO_URL de un vídeo autorizado en el servidor. Envía una única solicitud a continuación para verificar los campos con un conjunto reducido de resultados, sin habilitar reintentos automáticos ni prometer la devolución del total.
: "${EVERYINFRA_API_KEY:?configura primero la API Key}"
: "${EVERYINFRA_DOUYIN_VIDEO_URL:?configura primero la URL completa autorizada del video}"
jq -cn --arg url "${EVERYINFRA_DOUYIN_VIDEO_URL}" '{
platform: "douyin",
action: "comments",
params: {url: $url, limit: 5}
}' | curl --silent --show-error --include --max-time 180 \
'https://api.everyinfra.com/api/v1/social' \
-H "Authorization: Bearer ${EVERYINFRA_API_KEY}" \
-H 'Content-Type: application/json' \
--data-binary @-El nivel exterior del resultado síncrono describe la solicitud, mientras que los registros de comentarios se sitúan en results; asimismo, debes prestar atención a id, count, billing y otros datos. Registra el id exterior como el identificador de la solicitud de API y no lo sobrescribas con el id del comentario dentro de results. 180 segundos representa el ajuste de espera del cliente en este ejemplo, no una garantía de rendimiento de la interfaz; tras agotarse el tiempo de espera, califica el resultado como desconocido.
Durante la integración inicial, no te limites a conservar únicamente text. Comprueba que el comentario provenga del vídeo previsto, que el ID sea estable y que aparezcan los indicadores de respuesta y los campos de relación antes de integrarlo en la base de datos. Si la respuesta no es un JSON analizable o el objeto de negocio no corresponde a la lista esperada, conserva la evidencia del error y detén ese análisis, sin devolver un array vacío fingiendo éxito.
Cuarto paso: distingue el contenido de los comentarios, las interacciones y las relaciones de respuesta
curl -fsS --max-time 30 \
'https://api.everyinfra.com/api/v1/social/fields?platform=douyin&action=comments' \
| jq '{fields, undocumented}'La declaración actual incluye id, text, like_count, reply_count, author_name, author_id, ip_location, liked_by_author, is_reply, reply_to_id, posted_at y platform. Puedes agruparlos en cuatro categorías según su finalidad en lugar de forzar el llenado de todas las columnas:
- Identidad y origen: id, platform y la fuente de vídeo vinculada por la aplicación a partir de esta solicitud. El apodo del autor no actúa como la identidad del comentario.
- Contenido y tiempo: text y posted_at; además, registra observed_at para indicar el momento exacto de la observación real.
- Registro de interacciones: like_count, reply_count, liked_by_author. Un valor faltante no equivale a cero, y un "me gusta" del autor no equivale a conversión ni a valor comercial.
- Relación de respuesta: is_reply y reply_to_id. Deja las relaciones ausentes pendientes de revisión y no completes el comentario padre automáticamente basándote en la similitud del texto o la posición en el array.
El código organiza los comentarios y respuestas obtenidos en forma de lista y conserva los ID de asociación cuando existe evidencia. Por lo tanto, el array es plano en su estructura, lo que no significa que todas las filas pertenezcan semánticamente al mismo nivel. Al realizar la lectura, crea primero un índice basado en el ID del comentario y procesa después las relaciones de respuesta, sin asumir que «la fila siguiente es la respuesta a la anterior».
El campo reply_count describe información sobre la cantidad de respuestas, no una garantía sobre la longitud del array de respuestas entregadas. Un valor de is_reply en true sin reply_to_id, o un reply_to_id que apunta a un comentario inexistente en el resultado actual, pueden constituir vacíos de relación que deben conservarse. No inventes comentarios padres para completar el árbol, ni afirmes en un informe que el hilo está completo solo porque se pueda dibujar.
Quinto paso: diseña un JSON de negocio que no pierda la identidad
La fuente del vídeo debe vincularse al registro a partir del contexto de solicitud ya verificado, sin depender de que el comentario vuelva a incluir obligatoriamente una URL de vídeo. La base de datos puede emplear una clave compuesta por «plataforma + identidad del vídeo + ID del comentario»; cuando el mismo comentario aparezca de nuevo, añade una observación o actualiza los campos variables en lugar de registrarlo repetidamente como un incremento.
Se recomienda conservar los ID como cadenas de texto originales. Convertir primero un ID decimal largo a un Number de JavaScript y transformarlo de nuevo a cadena de texto puede hacer que se pierda el valor original. La especificación JSON detalla los límites de precisión en la interoperabilidad numérica; mantener los identificadores como cadenas evita conversiones numéricas sin sentido cuando no se requiere aritmética.
El código de JavaScript a continuación representa un convertidor sin conexión acotado deliberadamente: solo acepta ID de comentarios confirmados como cadenas y rechaza la inserción automática de tipos desconocidos. Este código conserva exclusivamente los campos y estados de relación requeridos por este artículo, no constituye un SDK completo ni realiza solicitudes de red. El texto sintetizado se etiqueta expresamente como «ejemplo sintetizado» y no debe emplearse como opiniones reales de usuarios.
function mapComment(row, source) {
if (!row || typeof row.id !== "string" || !row.id.trim()) {
throw new Error("string comment id required");
}
if (row.reply_to_id != null && typeof row.reply_to_id !== "string") {
throw new Error("string parent id required");
}
const parentId = row.reply_to_id || null;
const isReply = typeof row.is_reply === "boolean" ? row.is_reply : null;
const relation = isReply === true
? parentId ? "reply_with_reference" : "reply_parent_unknown"
: isReply === false && !parentId ? "top_level"
: "needs_review";
return {
platform: "douyin",
video_ref: source.video_ref,
comment_id: row.id,
text: typeof row.text === "string" ? row.text : null,
posted_at_raw: row.posted_at ?? null,
observed_at: source.observed_at,
like_count: typeof row.like_count === "number"
&& Number.isFinite(row.like_count) && row.like_count >= 0
? row.like_count : null,
reply_to_id: parentId,
relation
};
}
console.log(mapComment(
{
id: "synthetic-reply",
text: "ejemplo sintético, no una reseña real",
is_reply: true,
like_count: null
},
{
video_ref: "synthetic-video",
observed_at: "2026-09-04T00:00:00Z"
}
));Este ejemplo conserva posted_at_raw sin forzar la conversión temporal. Al realizar la inserción real en la base de datos, puedes configurar por separado el tiempo analizado, la zona horaria empleada y el estado de análisis; si no puedes confirmar la unidad o el formato, evita deducir automáticamente si se trata de segundos, milisegundos o la hora local. Del mismo modo, mantén los textos faltantes como null y evita que el modelo «complete el texto original».
reply_with_reference indica únicamente la existencia de una referencia al elemento padre, por lo que sigue siendo necesario comprobar si dicho elemento padre existe en los registros obtenidos para el mismo vídeo; si no existe, mantén la referencia como externa o no obtenida. Del mismo modo, top_level es solo una clasificación basada en los campos actuales y no demuestra que se haya restaurado por completo la estructura de discusión de la plataforma original.
Tras confirmar la unidad y el significado temporal de la fuente, registra la hora analizada según el estándar RFC 3339 y conserva la Z o el desplazamiento UTC explícito. La especificación resuelve el formato de representación, pero no determina si una serie numérica de origen corresponde a segundos o milisegundos, ni convierte una zona horaria de origen desconocida a la hora de la máquina actual.
Sexto paso: separa la observación programada de la paginación completa
La solicitud pública actual no dispone de un contrato de avance de paginación utilizable, por lo que repetir de forma continuada la misma solicitud genera múltiples observaciones, no una segunda o tercera página. Incluso si varios resultados difieren por casualidad, no deduzcas a partir de ello que se ha recorrido la sección de comentarios.
Al configurar tareas programadas, combina observaciones adyacentes según la identidad del comentario y conserva el momento de la primera y la más reciente detección. Los comentarios tardíos, las variaciones en las interacciones y las actualizaciones en las relaciones de respuesta se pueden actualizar, pero «no volver a verlo en esta ronda» no equivale a «el comentario ha sido eliminado». A menos que exista una señal de eliminación clara o un fundamento de verificación independiente, registra únicamente que no se ha observado en esta ocasión.
Si tu negocio requiere comparar dos periodos temporales, alinea previamente el conjunto de vídeos, los parámetros de llamada, la frecuencia de observación y la cobertura de éxito. Si la semana anterior se revisaron todos los objetivos y la semana posterior solo unos pocos tuvieron éxito, la cantidad de comentarios originales no debe utilizarse directamente como evidencia de un descenso en la popularidad. Explicar las diferencias de cobertura en el informe suele ser más relevante que añadir otra etiqueta de sentimiento.
Define también con precisión la unidad estadística: si cuentas líneas de comentarios, hilos de discusión o si deduplicas autores. Múltiples respuestas de varias personas en un hilo difieren estructuralmente de los mensajes continuos de un solo usuario. Los «usuarios independientes» en un informe no deben calcularse simplemente mediante el recuento de líneas; tampoco debes afirmar que has contado usuarios independientes si careces de un identificador de autor fiable.
Séptimo paso: verifica por separado los errores, los resultados vacíos y los costes
Al gestionar fallos, distingue al menos entre entradas no válidas, fallos de autenticación o permisos, cuotas insuficientes, caídas temporales del servicio, devoluciones de listas vacías y situaciones en las que el cliente no recibió una respuesta completa. Las acciones requeridas difieren en cada caso; agruparlo todo bajo «sin comentarios» confunde tanto a los usuarios como a los sistemas de monitorización.
Para 422, corrige la solicitud basándote en error.code y en las indicaciones, sin reintentar de forma indefinida sin un límite de intentos. En problemas transitorios, comprueba primero si es probable que la solicitud original se haya ejecutado antes de decidir si procede un reintento; una petición POST que haya agotado el tiempo de espera no debe asumirse por defecto como no enviada. En contenidos cuya inaccesibilidad ya se ha confirmado, detén los intentos automáticos y vuelve a verificar el ámbito, sin buscar maneras de eludir las restricciones.
La facturación también debe asociarse a la misma solicitud. Registra el valor de billing real junto con el identificador de la solicitud de API, y evita calcular el importe a pagar basándote únicamente en cuántos comentarios se han capturado. Un fallo en el análisis de datos corresponde a un error de procesamiento local y no permite inferir por sí solo que el servidor haya completado la devolución o el abono; de igual modo, si no encuentras el campo de tarificación en la respuesta, márcalo como pendiente de verificación en lugar de registrarlo de forma gratuita por cuenta propia.
Conserva el contexto y un acceso de revisión manual antes de pasar los comentarios al modelo
Conviene que la clasificación de comentarios tome como entrada hilos o fragmentos con límites claros. Si una respuesta dice únicamente «no es así», es imposible saber a qué se opone al ver esos tres términos de forma aislada; si no se ha obtenido el comentario padre, conserva el estado de contexto insuficiente en lugar de forzar una etiqueta positiva o negativa.
Guarda los resultados derivados por separado, tales como topic, sentiment, versión de las reglas de decisión, versión del modelo y correcciones manuales. No vuelvas a escribir estos campos en la columna de hechos del comentario original, ni interpretes la confianza otorgada por el modelo como una medición de la actitud real del usuario. Asegúrate de que el informe conserve suficientes asociaciones de origen para que el personal autorizado pueda consultarlas; los materiales públicos deben mostrar únicamente lo estrictamente necesario que se esté autorizado a exhibir.
Lista de comprobación antes de ampliar la escala
- Objetivo: la identidad del vídeo y la URL de solicitud coinciden, el alcance y la finalidad están confirmados, y no hay contenidos privados que eludan pasos.
- Estructura: results constituye la lista prevista, los ID de los comentarios no pierden precisión y los registros pueden vincularse de vuelta al vídeo específico.
- Relaciones: los campos de respuesta se conservan, los elementos padres ausentes y los estados desconocidos son visibles, y no se construyen hilos artificialmente.
- Observación: las ausencias no se rellenan con ceros, el tiempo de publicación y el de observación están separados, y no se proclama una cobertura total sin fundamento.
- Ejecución: los tiempos de espera agotados no provocan reenvíos automáticos, los errores y la facturación conservan el identificador de solicitud, y las observaciones repetidas no se contabilizan como nuevas.
- Almacenamiento: se guardan únicamente los campos necesarios, y el texto original y la información de los autores cuentan con control de acceso, plazos de retención y planes de eliminación.
Al redactar el esquema para el JSON de negocio adaptado, ten en cuenta que «un campo está descrito», «un campo debe aparecer» y «se permite que el valor sea null» son condiciones distintas. Las propiedades de JSON Schema no fuerzan por defecto la aparición de los campos; expresa tus requisitos mediante required y restricciones de tipo por separado, en lugar de usar una cadena vacía para resolver cualquier valor desconocido.
Lo que entregas es un conjunto de datos interpretables, no solo un archivo JSON
Un conjunto de datos de comentarios reutilizable debe permitir que quien lo reciba comprenda su ámbito de objetivos, procedencia, momento de observación, relaciones de respuesta y estado de ausencia. Gracias a esto, el JSON se integra de forma fiable en los flujos de análisis, auditoría y elaboración de informes; de lo contrario, por muchas líneas que exportes, solo estarás guardando las dudas iniciales en un formato de archivo diferente.
Comienza por un vídeo autorizado, verifica primero la estructura y las relaciones, y añade objetivos de forma progresiva. La siguiente documentación y el directorio en tiempo real te ayudarán a confirmar las capacidades actuales; no sustituyas la verificación en el momento de la integración por parámetros procedentes de artículos antiguos.