Compétence CLI PikPak
Opérez le stockage cloud PikPak via l'outil en ligne de commande pikpak.
Installer pikpak
Choisissez une méthode d'installation selon votre système d'exploitation :
macOS / Linux :
curl -fsSL https://download.mypikpak.com/cli/install.sh | bash
Windows (PowerShell) :
irm https://download.mypikpak.com/cli/install.ps1 | iex
Homebrew :
brew install pikcloud/tap/pikpak-cli
Après installation, exécutez pikpak version pour vérifier.
Avec un code d'invitation — l'installeur l'enregistre pour le prochain
pikpak auth register sur cette machine, sans contacter l'API d'invitation :
curl -fsSL https://download.mypikpak.com/cli/install.sh | bash -s -- --affiliate <code>
$env:PIKPAK_AFFILIATE="<code>"; irm https://download.mypikpak.com/cli/install.ps1 | iex
brew install pikcloud/tap/pikpak-cli && pikpak auth register --affiliate <code>
Les installeurs sauvegardent le code dans un fichier affiliate séparé en texte clair ; aucun analyseur
Python ou JSON n'est nécessaire, et settings.json n'est jamais lu ni modifié. Un échec d'écriture
émet un avertissement mais n'échoue pas l'installation ni n'écrase le code précédent.
Dans ce cas, passez le code avec pikpak auth register --affiliate <code>.
pikpak skill install écrit ce document dans le répertoire des compétences de chaque
agent de codage IA sur la machine (Claude Code, Codex, Gemini CLI, opencode,
Cursor, goose, iFlow, Qwen Code, ...). Exécutez-le après pikpak update si ce document
entre jamais en conflit avec le binaire installé ; pikpak skill ls montre où
il est installé et s'il est à jour.
Variables d'environnement
| Variable | Description | Défaut |
|---|---|---|
PIKPAK_DIR | Répertoire des identifiants | ~/.pikpak |
PIKPAK_CREDENTIALS | Chemin complet vers le fichier d'identifiants OAuth | ~/.pikpak/.credentials.json |
PIKPAK_TOKEN | Jeton d'accès personnel ; prime sur tout identifiant sauvegardé | non défini |
PIKPAK_PAT_PATH | Chemin complet vers le fichier PAT sauvegardé par auth token | ~/.pikpak/.pat.json |
PIKPAK_VERSION | Version spécifiée lors de l'installation | Dernière |
PIKPAK_INSTALL_DIR | Répertoire d'installation | ~/.local/bin (macOS/Linux), %USERPROFILE%\.pikpak (Windows) |
PIKPAK_NO_UPDATE_NOTIFIER | Mettre à 1 pour désactiver les vérifications et rappels automatiques de mise à jour ; version --check et update explicites fonctionnent toujours | non défini |
PIKPAK_NO_LOG | Mettre à une valeur non vide (ex. 1) pour écraser config log et ne jamais enregistrer le journal de diagnostic | non défini |
PIKPAK_NO_SKILL_SYNC | Mettre à une valeur non vide pour empêcher pikpak update de rafraîchir les compétences d'agent installées | non défini |
PIKPAK_AFFILIATE | Code d'invitation lu par install.sh / install.ps1 lors de l'installation (le CLI lui-même ne le lit pas) | non défini |
Priorité des identifiants : PIKPAK_TOKEN → PAT sauvegardé par pikpak auth token → identifiants OAuth de pikpak auth login.
Identité de l'appareil : le CLI conserve un ID d'appareil stable par installation dans ~/.pikpak/.device.json
(X-Device-Id). Il est réutilisé pour chaque méthode de connexion et survit à la rotation des jetons et à auth logout ;
le supprimer fait ressembler la machine à un tout nouvel appareil aux yeux du contrôle des risques de PikPak.
Authentification
La plupart des commandes nécessitent une connexion préalable. Les identifiants sont stockés dans ~/.pikpak/.credentials.json.
pikpak auth login # Détection automatique de la méthode de connexion (navigateur si disponible, flux d'appareil sinon)
pikpak auth login -m browser # Connexion OAuth par navigateur (ouvre le navigateur, 30s sans réponse -> bascule vers le flux d'appareil)
pikpak auth login -m browser --no-launch-browser # Connexion OAuth par navigateur (affiche l'URL, pas d'ouverture automatique)
pikpak auth login -m device # Flux d'appareil (code QR + URL de vérification + interrogation automatique)
pikpak auth login -m device -F json # Flux d'appareil : sortie des infos d'authentification en JSON et quitte (pas d'interrogation, pour IA)
pikpak auth login --continue <device_code> # Interroge le statut du code d'appareil une fois et quitte (utiliser avec -F json)
pikpak auth login --force # Re-connexion même si déjà authentifié
pikpak auth login -l "ma-session" # Définir un libellé de session personnalisé
pikpak auth login --scope files:manage,cloud_download # Pré-sélectionner les périmètres OAuth (séparés par des virgules)
pikpak auth register # Enregistrer un nouveau compte (mêmes flux navigateur/appareil que login)
pikpak auth register --affiliate <code> # Enregistrer avec un code d'affiliation / d'invitation
pikpak auth register --affiliate= # Ignorer le code sauvegardé par l'installeur pour cet enregistrement
pikpak auth register -m device # Forcer le flux d'appareil pour l'enregistrement
pikpak auth token <token> # Sauvegarder un jeton d'accès personnel pour une utilisation non interactive
pikpak auth logout # Effacer la session locale ; fonctionne hors ligne et sur des identifiants cassés/expirés (ne peut pas supprimer PIKPAK_TOKEN de l'environnement)
pikpak auth status # Statut de connexion + panneau de compte : identité, VIP, quota de stockage (ajouter -F json pour les scripts)
Identifiants --scope pris en charge : files:read, files:write, files:manage, files:purge,
cloud_download, share, invite, account. Omettre --scope n'envoie aucun périmètre et laisse le
serveur d'autorisation appliquer ses valeurs par défaut.
Guide de connexion pour agent IA : La connexion par mot de passe n'est plus prise en charge. Pour les environnements non interactifs/IA, utilisez le flux d'appareil :
- Exécutez
pikpak auth login -m device -F jsonpour obtenirdevice_code,verification_uri,user_code,expires_in,interval- Montrez à l'utilisateur l'URL de vérification et le code (ou le code QR)
- Interrogez avec
pikpak auth login --continue <device_code> -F jsonjusqu'à ce questatussoitsuccessSi l'environnement prend en charge un navigateur (macOS/Linux avec interface graphique),
pikpak auth login(détection automatique) oupikpak auth login -m browserfonctionne sans aucun indicateur. La connexion vérifie d'abord les identifiants existants ; utilisez--forcepour créer une nouvelle session.Alternative entièrement non interactive :
pikpak auth token <PAT>, ou exportezPIKPAK_TOKEN=<PAT>.Mise en garde sur l'enregistrement :
pikpak auth register -F jsonaffichesignup_uri,handoff_code,qr_png_path,expires_in(etaffiliatesi un code est en jeu — indicateur ou enregistré) et quitte — il ne retourne pas dedevice_code, donc il ne peut pas être interrogé avec--continue. Pour un enregistrement piloté par IA, exécutezpikpak auth registersans-F(il interroge interactivement), ou demandez à l'utilisateur de s'enregistrer dans le navigateur, puis utilisezpikpak auth login.
Référence des commandes
Navigation dans les fichiers
L'ID du répertoire racine est une chaîne vide "", pas / ni /root.
pikpak ls # Lister le répertoire racine
pikpak ls <folderID> # Lister le dossier spécifié (positionnel)
pikpak ls -p <folderID> # Pareil, via indicateur (l'argument positionnel gagne si les deux sont donnés)
pikpak ls --type file # Afficher uniquement les fichiers (filtre de type côté serveur, fonctionne aussi avec --raw)
pikpak ls --type folder # Afficher uniquement les dossiers (filtre de type côté serveur, fonctionne aussi avec --raw)
pikpak ls -l 50 # Éléments par page (--limit, défaut 100 ; le serveur arrondit les valeurs inférieures à 10)
pikpak ls -t <token> # Pagination (--token, depuis la sortie ls précédente)
pikpak ls -F json # Sortie JSON (préféré pour IA : id, parent_id, name, kind, size, mime_type, file_category, modified, hash ; mime_type/file_category sont omis pour les dossiers et pour les fichiers que le service n'a pas classifiés)
pikpak ls --raw # JSON API non modifié pour l'ensemble du listing : ajoute params.duration/width/height, params.url, audit, thumbnail_link, spell_name, apps ; taille en octets
Seuls les fichiers non supprimés et entièrement traités sont listés. Un ls est une page : lisez next_page_token
dans la sortie et repassez-le avec -t pour continuer. -l est une demande de taille de page, pas une limite
stricte — le service renvoie 10 éléments pour toute valeur inférieure, et une page peut aussi revenir avec moins
de -l éléments lorsque le dossier se termine.
Recherche de fichiers (indisponible)
La commande search est désactivée dans cette version car l'API de recherche
côté serveur est indisponible. Ne suggérez pas et n'exécutez pas pikpak search ; localisez les fichiers en
parcourant les dossiers avec pikpak ls (éventuellement -F json).
Détails des fichiers
pikpak get <fileID> # Informations de base
pikpak get <fileID> --url-type download # Inclure l'URL de téléchargement
pikpak get <fileID> --url-type play # Inclure l'URL de lecture
pikpak get <fileID> --url-type all # Inclure toutes les URLs
pikpak get <fileID> --raw # JSON API non modifié (usage=ALL ; url_type ignoré)
Champs de get -F json : id, name, type (file/folder), size, mime, hash, created,
modified, phase, plus download_url, play_url, play_resolution quand --url-type le demande.
Notez que les noms diffèrent de ls : type/mime ici contre kind/mime_type là.
Les URLs ne sont renvoyées que pour les fichiers — --url-type sur un dossier ne donne que des métadonnées.
--raw contourne entièrement cette forme réduite — voir Sortie API brute ci-dessous.
Sortie API brute (--raw)
pikpak ls --raw et pikpak get <fileID> --raw affichent le corps de réponse de l'API drive PikPak
textuellement (seulement ré-indenté). Utilisez-les à chaque fois que le champ dont vous avez besoin n'est pas dans les formes réduites ls /
get ci-dessus.
pikpak ls --raw # Listing complet, tous les champs que l'API renvoie
pikpak ls --raw -p <folderID> -l 500 # Mêmes indicateurs de filtrage/pagination que ls simple
pikpak get <fileID> --raw # Un fichier, usage=ALL
pikpak ls --raw -F yaml # Même corps converti en YAML
Ce que --raw ajoute (par fichier, au-delà des 9 champs de ls -F json) :
| Champ brut | Signification | Pourquoi c'est important |
|---|---|---|
params.duration | Durée de lecture en secondes, sous forme de chaîne ("1420") | La seule source de durée vidéo — absent à la fois de ls et de la sortie par défaut de get |
params.width / params.height | Dimensions en pixels, sous forme de chaînes ("1920" / "1080") | Filtrage par résolution ; get --url-type play ne donne qu'une étiquette comme 1080p |
params.url | D'où vient le fichier : magnet:?xt=urn:btih:… pour les torrents, une URL http(s) pour les téléchargements de liens | Le seul enregistrement de la source d'un téléchargement hors ligne |
params.task_id | ID de la tâche hors ligne qui a produit le fichier | Relie un fichier à pikpak task get <taskID> |
params.db_modify_time, params.platform, params.platform_icon, params.original_share_id | Métadonnées côté service, présentes sur chaque élément | Provenance |
size | Octets bruts sous forme de chaîne ("392927574") | Les formats de sortie par défaut le formatent (375 Mo) et ne peuvent pas être comparés numériquement |
created_time / modified_time / user_modified_time | RFC3339 avec décalage horaire | La sortie par défaut est du texte local tronqué AAAA-MM-JJ HH:MM |
medias[] | Tableau complet : media_id, media_name, resolution_name, link.url, video.{width,height,duration,bit_rate,frame_rate,video_codec,audio_codec,hdr_type}, audio.{artist,album,sample_rate,…} | Chaque variante lisible plus les métadonnées réelles de codec/HDR, pas seulement celle que play choisit |
audit | {status, message, title} | Détecter les ressources bloquées/en révision |
apps, spell_name, tags, reference_events, thumbnail_link, icon_link, web_content_link, phase, starred, trashed, writable, folder_type, revision, user_id | Champs API restants | Tout ce que la forme réduite omet, y compris les champs ajoutés par les futures versions de l'API |
Sémantique — lisez ceci avant de l'utiliser :
- Textuel. Le corps n'est pas ré-encodé : l'ordre des champs est celui de l'API, et
&dans les liens signés reste un&littéral (jamais\u0026). Sans danger à fournir directement àjq. - Toujours structuré.
--rawimplique une sortie JSON même sans-F;-F yamlconvertit le même corps. Il n'y a pas de tableau lisible par l'humain dans ce mode. ls --rawest une requête par page, pas par fichier. Mêmes indicateurs-p/-l/-t/--typeet les mêmes filtres côté serveur (non supprimés,PHASE_TYPE_COMPLETE) quelssimple. La pagination est inchangée : liseznext_page_tokendu corps brut et repassez-le avec-t. Augmentez-l(ex.-l 500) pour couvrir un grand dossier en un seul appel au lieu de boucler surget.--typese combine avec--raw. C'est un filtrekindcôté serveur (drive#file/drive#folder), donc le corps transmis contient déjà uniquement le type demandé et une page contient toujours jusqu'à-léléments. Un filtrage côté client avecjqsur.files[] | select(.kind == …)n'est plus nécessaire.get --rawdemande toujoursusage=ALL— la réponse la plus complète — donc--url-typeest ignoré et n'est plus nécessaire :medias[].link.urletweb_content_linksont déjà dans le corps. Il saute également la sonde de validité de l'URL de téléchargement, donc il reste une seule requête de lecture et n'ajoute jamais les clés dérivéesdownload_url/play_url/play_resolution.- Les noms diffèrent des formes réduites. Le brut utilise les propres clés de l'API :
kindestdrive#file/drive#folder(pasfile/folder),modified_time(pasmodified),starred(passtar). - La présence des champs n'est pas garantie.
paramsest absent ou partiel pour les dossiers et les fichiers non multimédias ;mediasest souvent[]jusqu'à ce que le serveur termine le transcodage. Protégez avecselect(.params.duration != null)ou des valeurs par défaut// "0". - Ne filtrez pas la sortie brute sur
file_category, et ne vous fiez pas non plus àmime_type. L'API omet fréquemmentfile_categorymême pour les vidéos (la forme réduitels -F jsonle dérive), etmime_typerevient comme""sur une bonne partie des fichiers multimédias, doncselect(.file_category == "video"etselect(.mime_type | startswith("video"))suppriment silencieusement de vraies vidéos. Le test vidéo fiable dans la sortie brute est la présence deparams.duration.
Recettes :
# Vidéos de plus d'une heure (UN SEUL appel API — ne bouclez jamais `get` sur un dossier)
pikpak ls --raw | jq -r '.files[] | select((.params.duration // "0" | tonumber) > 3600)
| "\(.name)\t\(.params.duration)s"'
# Fichiers 4K
…
[contenu tronqué pour la traduction]