Files
post2bsky/README.md
Guillem Hernandez Sola 8a514ed97b README and ca
2026-05-20 11:41:30 +02:00

242 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# post2bsky 🦋
Una col·lecció d'eines Python per mirar contingut automàticament a [Bluesky](https://bsky.app), incloent publicacions de Twitter/X, feeds RSS i vídeos de TikTok. Dissenyat per executar-se com a tasques programades de CI/CD (GitHub Actions o Jenkins).
---
## 📦 Scripts Disponibles
Aquesta taula resumeix les eines principals incloses en el projecte i la seva funció.
| Script | Descripció |
|---|---|
| `twitter2bsky.py` | Miralla publicacions d'un compte de Twitter/X a Bluesky |
| `rss2bsky.py` | Publica elements d'un feed RSS a Bluesky |
| `twitter_login.py` | Extreu un token d'autenticació de Twitter mitjançant un navegador headless i desa un fitxer de sessió |
| `tiktok2bsky.py` | Scrapes vídeos recents d'un perfil públic de TikTok i els publica a Bluesky |
Aquests scripts formen el nucli de l'automatització del teu contingut cap a Bluesky.
---
## ⚙️ Requisits i Instal·lació
### Sistema
- **Python:** 3.10 o superior.
- **FFmpeg:** Necessari per a la llibreria `moviepy` (per al processament de vídeo).
### Dependències Python
Instal·la tots els paquets necessaris executant el següent comandament:
```bash
pip install -r requirements.txt
```
*(Les dependències inclouen: `atproto`, `tweety-ns`, `playwright`, `playwright-stealth`, `httpx`, `arrow`, `python-dotenv`, `moviepy`, `fastfeedparser`, `beautifulsoup4`, `charset-normalizer`, `Pillow` i `grapheme`)*
### Navegador Playwright
Després d'instal·lar les dependències, cal instal·lar el binari del navegador Chromium perquè el login headless funcioni:
```bash
python -m playwright install chromium
```
---
## 🔐 Configuració de Credencials
Els scripts requereixen les següents credencials, ja sigui com a variables d'entorn, un fitxer `.env` o secrets de CI/CD.
| Variable | Utilitzada per | Descripció |
|---|---|---|
| `TWITTER_USERNAME` | `twitter2bsky.py`, `twitter_login.py` | Nom d'usuari de Twitter/X |
| `TWITTER_PASSWORD` | `twitter2bsky.py`, `twitter_login.py` | Contrasenya de Twitter/X |
| `TWITTER_EMAIL` | `twitter2bsky.py` | Correu electrònic del compte de Twitter/X |
| `TWITTER_HANDLE` | `twitter2bsky.py` | Handle de Twitter/X a mirallar (p. ex. `elmeuhandle`) |
| `BSKY_HANDLE` | `twitter2bsky.py`, `rss2bsky.py`, `tiktok2bsky.py` | Handle de Bluesky (p. ex. `jo.bsky.social`) |
| `BSKY_USERNAME` | `rss2bsky.py` | Nom d'usuari de Bluesky |
| `BSKY_APP_PASSWORD` | `twitter2bsky.py`, `rss2bsky.py`, `tiktok2bsky.py` | Contrasenya d'aplicació de Bluesky |
| `TIKTOK_HANDLE` | `tiktok2bsky.py` | Handle del perfil públic de TikTok a mirallar |
**Important:** No facis mai commit de les credencials al repositori. Utilitza un fitxer `.env` localment (ja cobert per `.gitignore`) o secrets de CI/CD en producció.
---
## 🚀 Guia d'Ús
### 1. Obtenir un token de sessió de Twitter (`twitter_login.py`)
Executa això una sola vegada per autenticar-te i desar un fitxer de sessió reutilitzable:
```bash
python twitter_login.py 'EL_TEU_USUARI' 'LA_TEVA_CONTRASENYA'
```
⚠️ **Atenció:** Utilitza sempre cometes simples al voltant de la contrasenya per evitar que la shell interpreti caràcters especials com `!`, `$` o les cometes inverses.
En cas d'èxit, es crea un fitxer `my_account_session` al directori de treball. Els scripts posteriors reutilitzaran aquesta sessió sense necessitat de tornar a iniciar sessió. Si alguna cosa va malament, es desarà un `error_screenshot.png` al directori de treball perquè puguis veure exactament què ha trobat el navegador.
### 2. Mirallar Twitter a Bluesky (`twitter2bsky.py`)
Utilitza aquest script per sincronitzar les teves publicacions:
```bash
python twitter2bsky.py \
--twitter-username "EL_TEU_USUARI" \
--twitter-password "LA_TEVA_CONTRASENYA" \
--twitter-email "EL_TEU_CORREU" \
--twitter-handle "EL_TEU_HANDLE" \
--bsky-handle "EL_TEU_HANDLE.bsky.social" \
--bsky-password "LA_TEVA_APP_PASSWORD" \
--bsky-base-url "https://bsky.social" \
--bsky-langs "ca"
```
### 3. Publicar un feed RSS a Bluesky (`rss2bsky.py`)
Per enviar contingut des d'un RSS directament al teu perfil de Bluesky:
```bash
python rss2bsky.py \
"https://example.com/feed.rss" \
"EL_TEU_BSKY_HANDLE" \
"EL_TEU_BSKY_USERNAME" \
"LA_TEVA_APP_PASSWORD" \
--service "https://bsky.social"
```
### 4. Mirallar TikTok a Bluesky (`tiktok2bsky.py`)
#### 🍪 Gestió de les cookies de TikTok
TikTok requereix cookies vàlides de sessió per poder accedir als perfils sense ser bloquejat. El fitxer `tiktok_cookies.json` conté aquestes cookies i **cal generar-lo manualment** seguint aquests passos:
1. **Obre el navegador** (Chrome o Firefox) i accedeix a [https://www.tiktok.com](https://www.tiktok.com).
2. **Inicia sessió** amb el teu compte de TikTok (o simplement navega fins que TikTok carregui correctament sense modals de cookies).
3. **Obre les DevTools** (`F12`) → pestanya **Application** (Chrome) o **Storage** (Firefox).
4. A la secció **Cookies → https://www.tiktok.com**, exporta totes les cookies.
5. Desa-les en format JSON com a `tiktok_cookies.json` al directori arrel del projecte.
Pots utilitzar extensions de navegador com [EditThisCookie](https://chrome.google.com/webstore/detail/editthiscookie) o [Cookie-Editor](https://cookie-editor.cgagnier.ca/) per exportar les cookies directament en format JSON compatible.
El fitxer ha de tenir aquest format:
```json
[
{
"name": "sessionid",
"value": "el_teu_valor",
"domain": ".tiktok.com",
"path": "/",
"httpOnly": true,
"secure": true
}
]
```
> ⚠️ **Les cookies de TikTok caduquen periòdicament.** Si el script deixa de funcionar o no troba vídeos, regenera el fitxer `tiktok_cookies.json` repetint el procés anterior.
> 🔒 **No facis mai commit del fitxer `tiktok_cookies.json`** al repositori. Ja està cobert pel `.gitignore`. En entorns CI/CD, injecta'l com a secret o artifact protegit.
#### ▶️ Execució de `tiktok2bsky.py`
Un cop tens el fitxer de cookies, executa el script així:
```bash
python tiktok2bsky.py \
--tiktok-handle "EL_HANDLE_DE_TIKTOK" \
--bsky-handle "EL_TEU_HANDLE.bsky.social" \
--bsky-app-password "xxxx-xxxx-xxxx-xxxx" \
--bsky-base-url "https://bsky.social" \
--bsky-langs "ca" \
--cookies-path "tiktok_cookies.json"
```
| Paràmetre | Descripció |
|---|---|
| `--tiktok-handle` | Handle del perfil públic de TikTok (sense `@`) |
| `--bsky-handle` | Handle de Bluesky (p. ex. `jo.bsky.social`) |
| `--bsky-app-password` | Contrasenya d'aplicació de Bluesky |
| `--bsky-base-url` | URL base del PDS (per defecte: `https://bsky.social`) |
| `--bsky-langs` | Codi d'idioma de les publicacions (p. ex. `ca`, `es`, `en`) |
| `--cookies-path` | Ruta al fitxer JSON de cookies de TikTok (per defecte: `tiktok_cookies.json`) |
#### 📋 Comportament del script
- Scrapes els **darrers 30 vídeos** del perfil públic indicat.
- Filtra vídeos de **més de 3 dies d'antiguitat** i de **més de 179 segons** de durada (límit de Bluesky).
- Desa l'estat dels vídeos ja publicats a `tiktok2bsky_state.json` per evitar duplicats.
- Els logs es guarden a `tiktok2bsky.log`.
- Gestiona automàticament els **modals de cookies i banners** de TikTok mitjançant Playwright.
- Aplica **stealth mode** (si `playwright-stealth` v1.x és instal·lat) per reduir la detecció de bots.
- Límit de mida de vídeo: **20 MB** per a `bsky.social`, **10 MB** per a PDS de tercers.
---
## 🤖 Automatització (CI/CD)
Tots els scripts estan dissenyats per executar-se de forma programada sense intervenció manual.
### GitHub Actions
Els fitxers de workflow ja estan inclosos a la carpeta `.github/workflows/`.
| Fitxer de workflow | Script | Programació |
|---|---|---|
| `.github/workflows/twitter2bsky.yml` | `twitter2bsky.py` | Cada 30 minuts |
| `.github/workflows/rss2bsky.yml` | `rss2bsky.py` | Cada 30 minuts |
| `.github/workflows/tiktok2bsky.yml` | `tiktok2bsky.py` | Cada 30 minuts |
Recorda afegir els secrets necessaris a **Settings → Secrets and variables → Actions**.
### Jenkins
També es proporcionen `Jenkinsfiles` per a totes les pipelines. Tots utilitzen:
- Trigger cron `H/30 * * * *`
- `disableConcurrentBuilds()`
- Credencials injectades mitjançant `withCredentials`
---
## 🗂️ Estructura del Projecte
```
post2bsky/
├── twitter2bsky.py # Script de mirroring Twitter → Bluesky
├── rss2bsky.py # Script de mirroring RSS → Bluesky
├── tiktok2bsky.py # Script de mirroring TikTok → Bluesky
├── twitter_login.py # Login headless de Twitter
├── tiktok_cookies.json # Cookies de sessió de TikTok (NO fer commit!)
├── tiktok2bsky_state.json # Estat dels vídeos publicats (generat automàticament)
├── requirements.txt
├── .env # Credencials locals (NO fer commit!)
├── .gitignore
├── .github/
│ └── workflows/
│ ├── twitter2bsky.yml
│ ├── rss2bsky.yml
│ └── tiktok2bsky.yml
└── Jenkinsfile
```
---
## 👤 Autor
[Guillem Hernández Sola](https://www.linkedin.com/in/guillemhs/)
## 📄 Llicència
Aquest codi és alliberat al domini públic per [Guillem Hernández Sola](https://www.linkedin.com/in/guillemhs/) sota llicència Creative Commons Reconeixement-NoComercial 4.0 Internacional (CC BY-NC 4.0).
El README ha estat redactat per a aquest repositori i segueix la mateixa llicència.
Per a més informació o contacte, consulta el perfil de lautor al repositori.
Si necessiteu més informació, podeu contactar amb [Guillem Hernández Sola](https://www.linkedin.com/in/guillemhs/).
## Contacte
Per dubtes o col·laboració: obre una issue al repositori o contacta amb en [Guillem Hernández Sola](https://www.linkedin.com/in/guillemhs/)