================================================================================
  マルチサービス ADIF アップローダー  readme.txt
================================================================================

  複数の ADIF ファイルを eQSL.cc / Club Log / HamQTH / LoTW / QRZ.com へ
  自動アップロードするツールです。各転送先の利用は個別に設定できます。
  起動アイコンまたはEXEファイルをダブルクリックするだけで動作します。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  1. ファイル構成
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  同じフォルダに以下のファイルを置いて使用します。

  任意のフォルダ/
  ├── adif_uploader.exe    ← 本プログラム（実行ファイル）
  ├── config.ini           ← 設定ファイル
  ├── readme.txt           ← この説明書
  └── *.adi / *.adif       ← アップロードしたい ADIF ファイル
                              （別フォルダに置く場合は config.ini で指定）

  ※ LoTW を使う場合は、別途 ARRL 公式の TQSL（TrustedQSL）アプリケーションが
    インストールされ、コールサイン証明書が設定済みである必要があります。
    本ツールは TQSL を呼び出すだけで、TQSL 自体は同梱していません。

  ※ QRZ.com を使う場合は、QRZ.com の XML レベル以上の有効なサブスクリプション
    （有料会員）が必要です。無料会員はこの機能を利用できません。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  2. はじめての起動（初期設定）
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  【手順 1】adif_uploader.exe をダブルクリックして起動します。

    config.ini が存在しない場合、自動的にサンプルの config.ini が生成されて
    プログラムが終了します。（同梱の config.ini を使う場合はこの手順は不要です）
    
   ※ ショートカットアイコンの作成方法は、exeファイルを右クリックして
    「その他のオプションを確認」→「ショートカットの作成(S)」です。


  【手順 2】config.ini をメモ帳などのエディタで開いて編集します。

    使いたいサービスのセクションで enabled = true に変更し、認証情報を書き込みます。
    （詳細は次項を参照）

    ※ メモ帳で保存するとき、文字コードは「UTF-8」を選択してください。

  【手順 3】もう一度 adif_uploader.exe をダブルクリックします。

    設定が正しければ、有効化したサービスへ順番にアップロードが開始されます。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  3. config.ini の設定項目
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  config.ini は以下のセクションで構成されています。
  # で始まる行はコメントです。


  ─── [files] セクション ── アップロード対象ファイルの指定 ─────

  directory（任意）
    ADIF ファイルが入っているフォルダを指定します。
    フォルダ内の *.adi および *.adif がすべて対象になります。
    ・空欄にすると、EXE と同じフォルダを自動的に検索します。
    ・相対パス／絶対パスのどちらも使用できます。

  files（任意）
    ファイルを個別に指定します。複数ある場合はカンマ（,）区切り、directory と
    files の両方を指定した場合は両方がアップロード対象になります。


  ─── [eQSL] セクション ────────────────────────

  enabled
    true にすると eQSL.cc へのアップロードを行います。

  username（必須・enabled=true の場合）
    eQSL に登録したコールサイン。

  password（必須・enabled=true の場合）
    eQSL のパスワード。大文字小文字を区別します。

  qth_nickname（任意）
    複数の QTH（ロケーション）を登録している場合の送信先ニックネーム。


  ─── [ClubLog] セクション ──────────────────────

  enabled
    true にすると Club Log へのアップロードを行います。

  api_key（必須・enabled=true の場合）
    Club Log に申請して発行してもらう API キーです。
    申請先 https://clublog.org/requestapikey.php

  email（必須・enabled=true の場合）
    Club Log に登録した「メールアドレス」。
    ※ コールサインではなくメールアドレスである点に注意してください。

  password（必須・enabled=true の場合）
    Club Log の「アプリケーションパスワード」。
    通常ログイン用のパスワードとは別に、Club Log のサイト上
    （Settings > Application Passwords）で発行する専用パスワードです。

  callsign（任意）
    アップロード先のコールサイン。空欄にするとアカウントの
    主コールサインが使われます。

  clear_existing（任意・デフォルト false）
    true にすると、アップロード前に Club Log 側の既存ログを
    消去してから新しいログを取り込みます。通常は false のままに
    してください。


  ─── [HamQTH] セクション ───────────────────────

  enabled
    true にすると HamQTH へのアップロードを行います。

  username（必須・enabled=true の場合）
    HamQTH に登録したコールサイン。

  password（必須・enabled=true の場合）
    HamQTH のパスワード。

  callsign（任意）
    アップロード先のコールサイン。空欄にすると username と
    同じ値が使われます。

  ※ 重要な注意：
    HamQTH は「部分アップロード」に対応していません。本プログラムは、
    対象となった全ファイルの QSO レコードを 1 つの ADIF にまとめてから
    1 回だけ送信します。アップロードしたログは HamQTH 側でリアルタイム
    には取り込まれず、バックグラウンドで処理されます。取り込み結果は
    後ほど登録メールアドレス宛に送られます。


  ─── [LoTW] セクション ────────────────────────

  enabled
    true にすると LoTW（Logbook of the World）へのアップロードを行います。

    ※ 利用するには、事前に以下が完了している必要があります。
      1. ARRL 公式の TQSL（TrustedQSL）アプリケーションをインストール
      2. ご自身のコールサイン証明書（Callsign Certificate）を TQSL に設定
      3. TQSL で Station Location（運用地情報）を設定

  tqsl_path（任意）
    tqsl.exe の絶対パス。空欄にすると、以下の標準インストール先を自動的に
    探します。
      C:\Program Files (x86)\TrustedQSL\tqsl.exe
      C:\Program Files\TrustedQSL\tqsl.exe

  station_location（任意）
    TQSL で複数の Station Location を設定している場合に、使用したいロケー
    ション名を指定します。

  callsign（任意）
    署名に使うコールサイン証明書のコールサインを指定します。

  cert_password（任意）
    TQSL の証明書にパスフレーズ（パスワード）を設定している場合に入力します。
    設定していない場合は空欄のままにしてください。


  ─── [QRZ] セクション ────────────────────────

  enabled
    true にすると QRZ.com へのアップロードを行います。

    ※ 重要：QRZ.com の Logbook API（アップロード機能）は、XML レベル以上
      の有効な「QRZ.com サブスクリプション」を持つ会員専用の機能です。
      無料会員のアカウントでは利用できません。サブスクリプション未契約の
      場合は enabled を false のままにしてください。

  api_key（必須・enabled=true の場合）
    QRZ.com の Logbook 設定ページ（My Logbooks の API タブなど）で確認で
    きる「ログブックごとの API キー」です。ログブック単位で発行されるキー
    のため、複数のコールサインを運用している場合は使用するログブックのキー
    を指定してください。

  station_callsign（任意だが強く推奨）
    送信局（自局）のコールサインです。QRZ.com は QSO ごとにSTATION_CALLSIGN
    フィールドが入っていることを必須としています。
    お使いのロギングソフトが出力する ADIF に STATION_CALLSIGN が含まれてい
    ない場合、ここで指定した値を自動的に補完します。
    空欄のままで ADIF にも STATION_CALLSIGN が無い場合、その QSOログのアッ
    プロード はエラーになります。

  replace_duplicates（任意・デフォルト false）
    true にすると、QRZ.com 側に同じ QSOログが既に存在する場合、新しい内容
    で上書き（置き換え）します。false の場合、重複した QSOログはエラー
    （失敗）として報告されます。

  ※ 重要な注意：
    QRZ.com には「ファイルを丸ごとアップロードする」API がありません。
    本プログラムは ADIF ファイルを 1 QSO ずつに分解し、QSO の数だけ個別に
    リクエストを送信します。QSO 数が多いファイルほど時間がかかります。
    （数百〜数千件規模の場合、数分以上かかることがあります）


  ─── [options] セクション ── 動作オプション ────────────

  dry_run（デフォルト false）
    true にすると、実際にはアップロードせず内容確認のみ行います。テストモード

  split_records（デフォルト true）
    true にすると、QSO レコードが多いファイルを自動分割します。
    ※ eQSL のみに適用されます。QRZ.com は元々 1 QSO ごとに送信するため、
       この設定の影響を受けません。

  max_records_per_upload（デフォルト 1000）
    1 回のアップロードで送信する最大 QSO レコード数（eQSL 用）。

  verbose（デフォルト false）
    true にすると、通信や TQSL 呼び出しの詳細なログを表示します。
    QRZ.com を使う場合、verbose = true にすると 1 件ごとの結果がすべて表示
    されます。（false の場合は失敗のみ表示し、最後に件数のサマリーのみ表示
    します）

  max_retries（デフォルト 3）
    通信エラー時のリトライ回数。（LoTW には適用されません）

  retry_delay_seconds（デフォルト 5）
    リトライするまでの待機時間（秒）。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  4. 通常の使い方
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  【毎回の手順】

    1. アップロードしたい ADIF ファイルを、config.ini で設定した
       フォルダ（directory）に入れます。

    2. 起動アイコンまたは adif_uploader.exe をダブルクリックします。

    3. 有効化されているサービスへ順番にアップロードが行われ、結果がコマンド
       プロンプト画面に表示されます。
       
      ※コマンドプロンプト画面の縦横幅を調整する方法
        コマンドプロンプト画面のタイトルバーを右クリックします。
       「設定」→「起動サイズ」60x30 程度にするとよい。
        次回起動時から反映されます。

    4. 「Enter キーを押すと終了します...」と表示されたら、
       内容を確認してから Enter キーを押してください。

  【初めて使う場合のお勧め手順】

    1. config.ini で dry_run = true に設定します。
    2. プログラムを起動して、ファイルが正しく検出されるか、
       想定したサービスが有効化されているかを確認します。
    3. 問題がなければ dry_run = false に戻して本番アップロードします。
    4. QSO 数の少ないテスト用ファイルでまず試すことをお勧めします。
       特に QRZ.com は 1 件ずつのリクエストになるため、少数の QSOログで
       正しく動作するか確認してから、件数の多いファイルを試してください。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  5. 実行結果の見方
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  実行中は以下のような画面が表示されます（QRZ.com 部分の例）。

  ────────────────────────────────────
    📤 QRZ.com へアップロード
  ────────────────────────────────────
    ※ QRZ.com は 1 QSO ごとに個別リクエストを送信します。
      QSO 数が多い場合、完了まで時間がかかります。
    📂 2024_log.adi (3 レコード)
       ✅ 3 件中 3 件成功

  verbose = true の場合は、1 件ごとに詳細が表示されます。

    📂 2024_log.adi (3 レコード)
       ✅ 1/3 (JA1XX): 成功: レコードを追加しました（LOGID=12345678）
       ✅ 2/3 (JA2YY): 成功: レコードを追加しました（LOGID=12345679）
       ❌ 3/3 (JA3ZZ): エラー（FAIL）: duplicate record


  各アイコンの意味:
    ✅  アップロード成功
    ❌  アップロード失敗またはエラー
    ⚠️  スキップ（QSO レコードなし、など）
    📂  処理中のファイル
    📤  アップロード処理の開始


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  6. 各サービスについての注意点
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  ■ eQSL.cc
    ・ファイルごとに、必要に応じて自動分割してアップロードします。
    ・最も安定して動作する想定です。

  ■ Club Log
    ・正式な API キー方式でアップロードします。
    ・アップロードは即座に反映されず、キュー処理を経て取り込まれます。

  ■ HamQTH
    ・ログ全体を毎回アップロードする仕様のため、複数ファイルがある場合は
      自動的に 1 つにまとめてから送信します。
    ・「成功」表示は送信が受理されたことを示すものであり、内容が正しく取
      り込まれたことを保証するものではありません。

  ■ LoTW
    ・HTTP API ではなく TQSL という公式アプリケーションを経由します。
    ・ファイルごとに TQSL を呼び出すため、1 ファイルにつき 1 回の署名・
      アップロード処理が行われます。
    ・「成功」表示は TQSL による送信が完了したことを示すものであり、
       LoTW 側でのコンファーム成立を意味するものではありません。

  ■ QRZ.com
    ・有料の XML レベル以上のサブスクリプションが必要です。
    ・他の 4 サービスと異なり、ファイル単位ではなく「QSO 1 件ごと」に
      個別リクエストを送信する仕組みです。そのため処理に時間がかかる点、
      また 1 件ごとに成功・失敗が分かれる点が特徴です。
    ・STATION_CALLSIGN（自局コールサイン）が ADIF に含まれていない場合
      は失敗します。config.ini の station_callsign に指定しておくと自動的
      に補完されます。
    ・同じ QSO が既に QRZ.com に存在する場合、replace_duplicates が false
      だとエラーになります。上書きしたい場合は true に設定してください。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  7. よくある質問 / トラブルシューティング
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  ■ 起動するとすぐ画面が閉じてしまう
    → config.ini が存在しない場合、生成後に自動終了します。
      生成された config.ini を編集してから再度起動してください。

  ■ 「どのサービスも有効化されていません」と表示される
    → config.ini の [eQSL] / [ClubLog] / [HamQTH] / [LoTW] / [QRZ] のいずれ
    かで enabled = true に設定してください。

  ■ Club Log で認証エラーになる
    → api_key・email・password（アプリケーションパスワード）が正しいか確認し
    てください。

  ■ HamQTH で「Wrong username or password」と表示される
    → username / password を再確認してください。

  ■ LoTW で「tqsl.exe が見つかりません」と表示される
    → TQSL がインストールされているか確認してください。標準的でない場所に
    インストールしている場合は tqsl_path にフルパスを指定してください。

  ■ LoTW で「証明書のパスフレーズが必要、または誤っています」と表示される
    → config.ini の [LoTW] cert_password を確認してください。

  ■ QRZ.com で「認証エラー（AUTH）」と表示される
    → api_key が正しいか確認してください。また、ログブックの所有者が XML 
    レベル以上の有効なサブスクリプションを持っているか確認してください。
    無料会員のアカウントではこの機能自体が使えません。

  ■ QRZ.com で「エラー（FAIL）: duplicate」のような表示が出る
    → QRZ.com 側に既に同じ QSO が登録されています。上書きしたい場合は
     config.ini の [QRZ] replace_duplicates を true に設定してください。

  ■ QRZ.com で「unable to parse ADIF record」のような表示が出る
    → ADIF の該当レコードに、QRZ.com が必須としているフィールド
      （送信局・受信局のコールサイン、日時、バンド、モードなど）が欠けている
      可能性があります。verbose = true にして該当レコードの内容を確認してく
      ださい。

  ■ QRZ.com のアップロードがとても時間がかかる
    → QRZ.com は 1 QSO ごとに個別の通信を行う仕様のため、QSO 数が多い
    ファイルほど時間がかかります。これは仕様による制約であり、短縮するための
    設定はありません。

  ■ 「エラー: eQSL API のレスポンスではありません」と表示される
    → username / password、ネットワーク接続、ファイアウォール設定を確認して
    ください。verbose = true で詳細ログを確認できます。

  ■ config.ini を保存したら文字化けした
    → 保存時の文字コードを「UTF-8」にしてください。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  8. 注意事項
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  ・config.ini にはパスワードや API キーが平文で保存されます。
    共有フォルダやクラウドの公開フォルダには置かないでください。

  ・本ツールは各サービスの公開 API（LoTW は公式アプリケーション TQSL）を
    使用しています。サービス側の仕様変更により、予告なく動作しなくなる場合
    があります。

  ・QRZ.com の Logbook API は有料サブスクリプション専用の機能です。
    サブスクリプションを解約・変更した場合、本ツールでのアップロードも使用
    できなくなります。

  ・LoTW へのアップロードは、署名・送信が完了しても、実際にコンファームされ
    るまでには時間がかかります。

  ・ADIF ファイルの文字コードは UTF-8 を推奨します。

================================================================================
  
  このプログラムは生成AIで作成されています。
  プログラムの改変、配布は自由です。
  
  2026/6/20
  JA3WUI/Tonaru
  https://tonaru.net/details7.html#radio-40

================================================================================
