📌

「ソースはReddit」はNG!Qiita CLIのQiitaForbiddenOrBadRequestErrorエラーへの対処

に公開

はじめに

QiitaとZennへ並行して投稿していると小さな違いに苦戦することはないでしょうか?
今回はZenn CLIでは投稿できた記事が、Qiita CLIでは「QiitaForbiddenOrBadRequestError」で失敗する原因と対処法をゆるく共有します。

発生したエラー

Qiita CLI(ver. 1.6.2)を使っていつも通り投稿を試みました。

npx qiita publish my-article.md

するとQiita APIへのリクエストに失敗しました が表示され投稿できませんでした。

このメッセージやスタックトレースのQiitaForbiddenOrBadRequestErrorからは一体何がダメなのか判断できません。ソースコード( node_modules\@qiita\qiita-cli\dist\commands\publish.js )も確認しましたがAPI側が返すエラーメッセージそのもので手がかりは見つかりません。

Qiita APIへのリクエストに失敗しました
  記事ファイルに不備がないかご確認ください
  または、Qiitaのアクセストークンが正しいかご確認ください
スタックトレース全体
QiitaForbiddenOrBadRequestError: {"message":"Forbidden","type":"forbidden"}
    at Object.publish (***\node_modules\@qiita\qiita-cli\dist\commands\publish.js:113:19)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async exec (***\node_modules\@qiita\qiita-cli\dist\commands\index.js:41:9) {
  [cause]: QiitaForbiddenError: {"message":"Forbidden","type":"forbidden"}
      at QiitaApi.request (***\node_modules\@qiita\qiita-cli\dist\qiita-api\index.js:83:23)
      at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
      at async QiitaApi.post (***\node_modules\@qiita\qiita-cli\dist\qiita-api\index.js:107:16)
      at async QiitaApi.postItem (***\node_modules\@qiita\qiita-cli\dist\qiita-api\index.js:171:16)
      at async ***\node_modules\@qiita\qiita-cli\dist\commands\publish.js:94:28
      at async Promise.all (index 0)
      at async Object.publish (***\node_modules\@qiita\qiita-cli\dist\commands\publish.js:108:9)
      at async exec (***\node_modules\@qiita\qiita-cli\dist\commands\index.js:41:9)
}
Qiita APIへのリクエストに失敗しました
  記事ファイルに不備がないかご確認ください
  または、Qiitaのアクセストークンが正しいかご確認ください

回避策と原因の特定

不思議なことに private: true に限定共有記事に設定すると投稿できました。
そのためQiitaのWeb画面で公開設定を「全体公開」に変更しようとしました。
やはりエラーにはなるのですが、手がかりとなるエラーメッセージが表示されました。

本文に投稿禁止の内容が含まれています。限定共有投稿後、サポートにお問い合わせください。
Expanded link urlsに投稿禁止の内容が含まれています。

なるほど...どうやら記事内のリンク(Expanded link urls)にQiitaの投稿ポリシーに抵触するものが含まれていた可能性があります。今回はMarkdown中のRedditのURLを記載したリンクを削除すると、CLIから全体公開で投稿できるようになりました。

ちなみに投稿に失敗したのはこちらの記事です。画像も含まれず基本的なMarkdowm記法のみですが、ページ最下部にRedditへのリンクを情報源として掲載していました。

まとめ:Qiita CLIで心当たりのないエラーが出たときのチェックリスト

  1. Qiita CLIではprivate: true にして限定共有記事として投稿してみる。
  2. 投稿に成功したらWeb画面へ移り「全体公開」へ変更してみる。
  3. 表示されたエラーメッセージを参考に修正していく。

感想

Qiitaのエラーメッセージ、Webのほうがちょっとだけ親切です。
例外処理の作り込みは本当に大変だと思います。CLIもがんばれ!
「ソースはReddit()」だったのが悔やまれますが、笑って済ませましょう。

Discussion