generated at
解決済み: inoue2002がpull request出してくれた Scrapbox-Duplicator を GitHub Action で使う
public
inoue2002がpull request出してくれたScrapbox-DuplicatorGitHub Actionで使う

設定していく
>Importing 5978 pages to "/***"...
> error: Uncaught (in promise) undefined when importing pages: import failed
> const error = new Error();
> ^
> at file:///home/runner/work/Scrapbox-Duplicator/Scrapbox-Duplicator/index.ts:52:19
> at eventLoopTick (ext:core/01_core.js:189:11)
> Error: Process completed with exit code 1.
なんでだろう?env系は正しそう
/tkgshn-private から引っ張ってくるところまではいけてるけど、 /tkgshn に入れることはできてないっぽい
他のプロジェクトでやってみると、動いた。
/tkgshn-stuff (ほぼページがない)から引っ張ってきて、 /tkgshn に流すのはいけたtkgshn

ちなみに、GitHub ActionでもHerokuでも同じエラーが出ている。
ローカルで実行する方法がわからなかったため、tkgshnの環境でdebugは出来ていない。
仮説としては、「importする量が多すぎる」気がする
>tkgshn既存のDESTINATION_PROJECT_NAMEと、SOURCE_PROJECT_NAMEの差分がある場合はそれを反映して、ない場合は何もしないようにコードを書き換えて欲しい。

>ChatGPT既存の DESTINATION_PROJECT_NAME SOURCE_PROJECT_NAME の差分を確認し、差分がある場合のみ反映するようにコードを変更するには、まず両方のプロジェクトからページをエクスポートして、それらを比較する機能を追加する必要があります。以下に、そのための基本的なアプローチを示します。
>
> 1. **両プロジェクトからページをエクスポート**:
> まず、 exportPages 関数を使用して、 SOURCE_PROJECT_NAME DESTINATION_PROJECT_NAME からページをエクスポートします。
>
> 2. **ページの比較**:
> エクスポートされたページを比較して、 SOURCE_PROJECT_NAME に存在し、 DESTINATION_PROJECT_NAME に存在しないページを特定します。
>
> 3. **差分のインポート**:
> 差分があるページのみを importPages 関数を使用して DESTINATION_PROJECT_NAME にインポートします。
>
> 以下は、このプロセスを実装するための疑似コードです。実際のコードには、エラーハンドリングやAPIの制限に対応するための追加のロジックが必要になる場合があります。
>
> `typescript
> // 既存のコードに追加
> async function exportProjectPages(projectName: string): Promise<Page[]> {
> const result = await exportPages(projectName, { sid, metadata: true });
> if (!result.ok) {
> // エラーハンドリング
> throw new Error( Error exporting pages from ${projectName} );
> }
> return result.value.pages;
> }
>
> async function findNewPages(sourcePages: Page[], destinationPages: Page[]): Promise<Page[]> {
> const destinationTitles = new Set(destinationPages.map(page => page.title));
> return sourcePages.filter(page => !destinationTitles.has(page.title));
> }
>
> // メインの処理
> const sourcePages = await exportProjectPages(exportingProjectName);
> const destinationPages = await exportProjectPages(importingProjectName);
>
> const newPages = await findNewPages(sourcePages, destinationPages);
>
> if (newPages.length === 0) {
> console.log("No new pages to import.");
> } else {
> console.log( Importing ${newPages.length} new pages to "${importingProjectName}"... );
> // newPages をインポートする処理
> }
> `
>
> このコードは、 SOURCE_PROJECT_NAME DESTINATION_PROJECT_NAME の両方からページをエクスポートし、タイトルを基にして新しいページを特定し、それらのページのみをインポートします。実際の実装では、ページの内容も比較する必要があるかもしれませんが、これはAPIの提供する情報と、どの程度の差分を重要とみなすかに依存します。
これを適用したかったけど、denoとかがよくわからんくてローカルで実行できていない。

あ、/blu3moでおそらく同じエラー今ぶつかってて対応中blu3mo
/blu3mo以外だと再現ができなくて困っていたので情報助かる
だよねtkgshntkgshntkgshn

まじかinoue2002
なんだろう
ソースコード自体はいじってないからなぁ
特定のpublic先に送れないってことか
特定の~というよりかは、自分の場合だと /tkgshn には入る。でも、ページ数が多いプロジェクトから引っ張ってくると(多分反映する数が多くなると)動かないtkgshn

あと今思ったんだけど、スクリプトのlogのせいで、非公開のページのタイトルもGitHubActionsで他人に見られてしまうな
消しちゃってもいいかもねinoue2002
あー、 importproject/*** になるけど、タイトルは見れるようになってるのねtkgshn

入れる枚数の問題かな? youkan-brain から inoue2002 に移動してるんだけど、非公開3700で、そこから公開しているのが300ぐらいしかないから、二人との違いでいうとそこな気がする?
そうかもしれない。具体的な解決方法のアイディアは2023/11/14#6552ccef09c5f200000f9db7に書いてみた cc @blu3motkgshn
これは試したけど違うみたいblu3mo
/blu3moの中身をコピーしたプロジェクトA → プロジェクトB」のケースでduplicatorはうまく動いた
なので、原因はページ数でもページ内容でもない

原因は部分的に分かったblu3mo
titles
[CMU](Carnegie Mellon University) -.icon [NYU](New York University) https://www.mitpressjournals.org › doi /icons/わかる.icon nota kyoto [N34.7433886,E135.7677893,Z17] https://dl.acm.org/doi/pdf/10.1145/2598153.2598170 https://www.teenvogue.com/story/digital-blackface-reaction-gifs
/blu3moの場合は、これらの8ページのうちどれかが悪さをしていた
これらのタイトルは、①何かしらのハックを狙って作ったもの ② https:// を含むURL のどちらか
なるほどtkgshntkgshntkgshntkgshntkgshn
確認したこと
これらのタイトルを持つページを今作ろうとすると、何かしらのフォーマットの処理がされる
[ ] を外すとか、 .icon を消すとか、 https:// を消すとか)
手動でexport → importした場合も同様に、何かしらの処理がされる
予想
これらのページは、昔(フォーマットの処理がscrapboxに実装するより前)に作られたillegalなタイトル
APIを叩く形でexport → importした場合に、その処理が入らない代わりにエラーが起きるのだと思う

/tkgshn-privateでの対処案
案1. https:// から始まるタイトルから https:// を削除する
blu3moが勝手に編集してそれらを削除したので、一旦まずduplicator実行してみて欲しい
ダメなら2へ
あ、そういうことか。tkgshntkgshn
案2. タイトルに [ ] が含まれるページのタイトルを編集する
この辺
消してみたtkgshn

>Uncaught (in promise) undefined when importing pages: import failed
を見るにどこか特定のページが悪さをしている説ある?
importしようとしたページがundefinde的な


追記
>error: Uncaught (in promise) TypeError: error sending request for url (https://scrapbox.io/api/page-data/import/***.json): connection closed before message completed
> const res = await fetch(
> ^
> at async mainFetch (ext:deno_fetch/26_fetch.js:277:12)
> at async fetch (ext:deno_fetch/26_fetch.js:504:7)
> at async file:///home/runner/work/Scrapbox-Duplicator/Scrapbox-Duplicator/index.ts:46:18
> Error: Process completed with exit code 1.
Scrapboxのリミットに引っかかったと思ったら、 /tkgshn には反映されていたtkgshn
これは多分問題ないはずblu3mo
なぜかconnection closedになってしまうけど、scrapbox側でのimport処理は問題なく行われているかと思うblu3mo
つまり、同じerror?tkgshn
connection closed before message completed は僕の環境でも今も発生するけど、動いているので一旦よしとするblu3mo
了解、終戦とします!!tkgshn
終戦ナイス!お疲れ様でした!inoue2002inoue2002
/blu3mo-publicの場合は問題なかった)