Communitygithub.com

pikcloud/skills

CLI de stockage cloud PikPak (pikpak). Effectuez toutes les opérations cloud depuis la ligne de commande : parcourir et rechercher des fichiers, télécharger des aimants/torrents/liens depuis le cloud, gérer les tâches de téléchargement, streamer des vidéos, téléverser des fichiers et dossiers locaux, télécharger sur le disque, partager des fichiers et restaurer les partages d'autres, déplacer/copier/renommer/supprimer, créer des comptes et gérer les jetons d'accès.

Qu'est-ce que skills ?

Cette compétence permet de contrôler PikPak, un service de stockage cloud, entièrement via la ligne de commande. Elle est utile pour les développeurs et les utilisateurs d'agents IA qui souhaitent automatiser la gestion de leur cloud, des téléchargements de liens/torrents au partage de fichiers. La compétence est basée sur l'outil `pikpak`, qui peut être installé sur macOS, Linux et Windows via des scripts ou Homebrew. Les commandes couvrent l'authentification (OAuth, flux d'appareil, jetons PAT), la navigation dans les fichiers (`pikpak ls`), les téléchargements cloud, les téléversements locaux, le streaming vidéo, la gestion des tâches, et les partages. Elle supporte les agents IA comme Claude Code, Cursor, et Codex, avec une sortie JSON pour faciliter le traitement automatisé. L'installation locale (`pikpak skill install`) intègre la documentation dans les répertoires de compétences de ces agents.

Compatible avec✓Claude Code✓Codex CLI✓Cursor✓Gemini CLI✓OpenCode
npx skills add https://github.com/pikcloud/skills/tree/HEAD/skills/pikpak-cli

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

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

VariableDescriptionDéfaut
PIKPAK_DIRRépertoire des identifiants~/.pikpak
PIKPAK_CREDENTIALSChemin complet vers le fichier d'identifiants OAuth~/.pikpak/.credentials.json
PIKPAK_TOKENJeton d'accès personnel ; prime sur tout identifiant sauvegardénon défini
PIKPAK_PAT_PATHChemin complet vers le fichier PAT sauvegardé par auth token~/.pikpak/.pat.json
PIKPAK_VERSIONVersion spécifiée lors de l'installationDernière
PIKPAK_INSTALL_DIRRépertoire d'installation~/.local/bin (macOS/Linux), %USERPROFILE%\.pikpak (Windows)
PIKPAK_NO_UPDATE_NOTIFIERMettre à 1 pour désactiver les vérifications et rappels automatiques de mise à jour ; version --check et update explicites fonctionnent toujoursnon défini
PIKPAK_NO_LOGMettre à une valeur non vide (ex. 1) pour écraser config log et ne jamais enregistrer le journal de diagnosticnon défini
PIKPAK_NO_SKILL_SYNCMettre à une valeur non vide pour empêcher pikpak update de rafraîchir les compétences d'agent installéesnon défini
PIKPAK_AFFILIATECode 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 :

  1. Exécutez pikpak auth login -m device -F json pour obtenir device_code, verification_uri, user_code, expires_in, interval
  2. Montrez à l'utilisateur l'URL de vérification et le code (ou le code QR)
  3. Interrogez avec pikpak auth login --continue <device_code> -F json jusqu'à ce que status soit success

Si l'environnement prend en charge un navigateur (macOS/Linux avec interface graphique), pikpak auth login (détection automatique) ou pikpak auth login -m browser fonctionne sans aucun indicateur. La connexion vérifie d'abord les identifiants existants ; utilisez --force pour créer une nouvelle session.

Alternative entièrement non interactive : pikpak auth token <PAT>, ou exportez PIKPAK_TOKEN=<PAT>.

Mise en garde sur l'enregistrement : pikpak auth register -F json affiche signup_uri, handoff_code, qr_png_path, expires_in (et affiliate si un code est en jeu — indicateur ou enregistré) et quitte — il ne retourne pas de device_code, donc il ne peut pas être interrogé avec --continue. Pour un enregistrement piloté par IA, exécutez pikpak auth register sans -F (il interroge interactivement), ou demandez à l'utilisateur de s'enregistrer dans le navigateur, puis utilisez pikpak 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 brutSignificationPourquoi c'est important
params.durationDuré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.heightDimensions 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.urlD'où vient le fichier : magnet:?xt=urn:btih:… pour les torrents, une URL http(s) pour les téléchargements de liensLe seul enregistrement de la source d'un téléchargement hors ligne
params.task_idID de la tâche hors ligne qui a produit le fichierRelie un fichier à pikpak task get <taskID>
params.db_modify_time, params.platform, params.platform_icon, params.original_share_idMétadonnées côté service, présentes sur chaque élémentProvenance
sizeOctets 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_timeRFC3339 avec décalage horaireLa 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_idChamps API restantsTout 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é. --raw implique une sortie JSON même sans -F ; -F yaml convertit le même corps. Il n'y a pas de tableau lisible par l'humain dans ce mode.
  • ls --raw est une requête par page, pas par fichier. Mêmes indicateurs -p / -l / -t / --type et les mêmes filtres côté serveur (non supprimés, PHASE_TYPE_COMPLETE) que ls simple. La pagination est inchangée : lisez next_page_token du 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 sur get.
  • --type se combine avec --raw. C'est un filtre kind cô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 avec jq sur .files[] | select(.kind == …) n'est plus nécessaire.
  • get --raw demande toujours usage=ALL — la réponse la plus complète — donc --url-type est ignoré et n'est plus nécessaire : medias[].link.url et web_content_link sont 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ées download_url / play_url / play_resolution.
  • Les noms diffèrent des formes réduites. Le brut utilise les propres clés de l'API : kind est drive#file / drive#folder (pas file / folder), modified_time (pas modified), starred (pas star).
  • La présence des champs n'est pas garantie. params est absent ou partiel pour les dossiers et les fichiers non multimédias ; medias est souvent [] jusqu'à ce que le serveur termine le transcodage. Protégez avec select(.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équemment file_category même pour les vidéos (la forme réduite ls -F json le dérive), et mime_type revient comme "" sur une bonne partie des fichiers multimédias, donc select(.file_category == "video" et select(.mime_type | startswith("video")) suppriment silencieusement de vraies vidéos. Le test vidéo fiable dans la sortie brute est la présence de params.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]

Skills associés