Contexto
Al crear un tool para generar drafts de posts para X (Twitter), necesitaba validar que el texto no exceda 280 caracteres antes de que el usuario lo copie y pegue.
Lo que aprendi
La validacion mas simple posible: len() + un warning descriptivo.
def generate_x_post(repo, description, link):
# Generar post desde template
post = f"{description}\n\n{link}\n\n#OpenSource #DevLife"
# Validar longitud
if len(post) > 280:
print(f"WARNING: Post is {len(post)} chars (max 280). Trim before posting.")
return post
El output completo del tool
$ python social_post.py --platform x \
--repo "claude-agent-patterns" \
--description "8 patterns para agentes IA autonomos" \
--link "https://github.com/user/repo"
--- DRAFT ---
8 patterns para agentes IA autonomos
https://github.com/user/repo
#OpenSource #DevLife
--- END ---
Length: 89/280 chars
Por que len() y no una regex
X cuenta caracteres Unicode, no bytes. len() en Python 3 cuenta code points, que es suficientemente preciso para la mayoria de posts. Las excepciones:
| Contenido | len() | X cuenta |
|---|---|---|
| URLs | largo real | 23 chars (t.co shortener) |
| Emojis simples | 1 | 1 |
| Emojis compuestos | 1-7 | 1 |
| CJK caracteres | 1 | 1 |
Para drafts rapidos, len() con warning es suficiente. Si necesitas precision exacta, X tiene una libreria oficial: twitter-text-python.
Pattern reutilizable
Este patron de "genera + valida + advierte" aplica a cualquier output con limites:
- SMS: 160 chars
- Meta descriptions: ~155 chars
- Git commit first line: ~72 chars
- Slack messages: 40,000 chars