windows10でCurlを使って国税庁インボイス制度適格請求書発行事業者公表サイトからcsvデータを取得する

### windows10標準で搭載されているpowershellでCurl.exeを使って国税庁インボイス制度適格請求書発行事業者公表サイトからcsvデータを取得する。

##### 国税庁インボイス制度適格請求書発行事業者公表サイトの全件データのダウンロードのページをcurlで取得し、ページ中央のCSV形式の表内のzipデータを取得するpowershell スクリプトを作成する。

<div><p style="color:red;">ご利用にあたってはくれぐれもご利用者の責任で行ってください。当方は責任を負いかねます。</p></div>


1.ブラウザの開発ツール「ctrl+shift+i」で当該のページのソースを表示して、データを取得するためのキーワードを見つけます。

2.検索すべきキーワード、今回のケースではcsv形式の表のダウンロード部分「"href="#" onclick="return doDownload('1302','2','01');"」がキーワードに該当する。（3番目の'01'がcsv、'02'がxml、'03'がjson形式のようです。）

3.法人が5分割、人格のない社団が1ファイル、個人が1ファイル（令和5年3月8日時点）なのでキーワードが7つ必要なことになります。

4.以下、実際のpowershellファイルのサンプルになります。パス関連のコマンドレットについては、ここでは割愛します。

5.powershellをキックするバッチファイルから実行すると、7つのzipファイルがダウンロードされ解凍後、dataフォルダに7つのcsvファイルが作成されます。

```
$ROOT_PATH = Convert-Path .
$WORK_FOLDER = "data"
# Join-Pathを使用
# $ROOT_PATH + "\" + $WORK_FOLDER に同じ
$WORK_PATH = Join-Path $ROOT_PATH $WORK_FOLDER
$filename="findstr.txt"
$file_path=Join-Path $ROOT_PATH $filename

#Write-Host  $WORK_PATH
Write-Host  $file_path
#フォルダを作成
#New-Item $WORK_PATH -ItemType Directory
#
if (Test-Path $WORK_PATH) {
        #Write-Host $WORK_PATH is found!
        if (Test-Path $file_path) {
            #Write-Host $filename is found!
             } else {
             Write-Host  $filename is not found!
             #ファイルを作成
             New-Item $file_path -ItemType File
             }
    } else {
        #Write-Host  $WORK_PATH is not found!
        #フォルダを作成
        New-Item $WORK_PATH -ItemType Directory
        if (Test-Path $file_path) {
            #Write-Host $filename is found!
             } else {
             Write-Host  $filename is not found!
             #ファイルを作成
             New-Item $file_path -ItemType File
             }
    }
#WEBページからダウンロードファイル名の文字検索をする。第３引数＝’01’（01：CSV形式、02：XML形式、03：JSON形式）
curl.exe "https://www.invoice-kohyo.nta.go.jp/download/zenken" | findstr /r /c:"return doDownload('[0-9][0-9][0-9][0-9]','[0-9]','01')" >$ROOT_PATH\find.txt
#1行削除して上書き
 (Get-Content find.txt | Select-Object -Skip 0) | Set-Content find.txt
#トリムを掛ける
$ftext = $ROOT_PATH + "\find.txt"
$fstrtext = $ROOT_PATH + "\findstr.txt"
Get-Content $ftext | foreach { $_.trim() }>$fstrtext
$path1 = $ROOT_PATH
#前回までのzipファイルを削除
Remove-Item $path1\*.zip
#ファイル特定のため、４桁のコード（第1引数）を取得
$f = (Get-Content $ROOT_PATH\findstr.txt) -as [string[]]
foreach ($l in $f) {
$n=$l.substring(28,4) #981
#WEBページからファイルを取得する
Invoke-WebRequest -Method Get -Body @{dlFilKanriNo=$n;type="01"}https://www.invoice-kohyo.nta.go.jp/download/zenken/dlfile? -OutFile $ROOT_PATH\$n.zip
}

#前回までに取得して解凍したファイルを削除
Remove-Item $path1\data\*.*
#今回取得したZIPファイルを全て解凍する
$list = Get-ChildItem $path1 -Filter *.zip;
foreach($str in $list){
#Write-Host $str
Expand-Archive -Path $ROOT_PATH\$str -DestinationPath $ROOT_PATH\data
}
#解凍したものから、余分なファイルを削除する
Remove-Item $path1\data\*.csv.asc

#------ csvファイル取込
# 処理対象のフォルダ
$targetFolder = $path1 + '\data\';
 
# $targetFolder内のファイル・フォルダのリストを取得する。
$itemList = Get-ChildItem $targetFolder;
foreach($item in $itemList)
{
    #ファイル or フォルダを判定
    if(!($item.PSIsContainer))
    {
        #変数の内容を表示する
        Write-Output $item
        # ファイルの場合の処理 フォルダは無視する
        #------ csvファイルを取込する前に、取込フォルダに上書きコピーする
    }
} 
```

※Windows10のPowerShellのcurl.exeは、Invoke-WebRequestのAliasが実行されています。上記では、一部Invoke-WebRequestの「Method Get」を利用しています。