WebサイトからFaviconを抜き出すAPIがあったので早速使ってみました。
・Favatar
https://favatar.mention.net/
※ 下記マクロはAPIキーが必須になりますので、「Start using Favatar now!」からAPIキーを事前に取得してください(取得後コード内の”ApiKey”の値を変更)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | Option Explicit Public Sub Sample() MsgBox "処理が終了しました。" End Sub Private Sub GetFavicon( ByVal Target As String , ByVal SaveFolderPath As String ) 'Favicon取得 Dim url As String Dim js As String Dim mimeType, data '表示用ダミー Const ApiKey As String = "your_key" 'APIキー url = "http://favatar.mention.net/image?format=json&api_key=" & ApiKey & "&url=" & EncodeURL(Target) js = "" '初期化 On Error Resume Next With CreateObject( "MSXML2.XMLHTTP" ) .Open "GET" , url, False .send If .Status = 200 Then js = .responseText End With On Error GoTo 0 If Len(js) > 0 Then If LCase$(Trim$(js)) <> "null" Then js = "(" & js & ")" With CreateObject( "ScriptControl" ) .Language = "JScript" If Right$(SaveFolderPath, 1) <> Application.PathSeparator Then SaveFolderPath = SaveFolderPath & Application.PathSeparator SaveFavicon SaveFolderPath & GetDomainName(Target) & "." & GetExtension(.CodeObject.eval(js).mimeType), .CodeObject.eval(js).data End With End If End If End Sub Private Sub SaveFavicon( ByVal SaveFilePath As String , ByVal base64dat As String ) 'Favicon保存 Dim dat() As Byte If Len(Dir$(SaveFilePath)) > 0 Then Kill SaveFilePath 'ファイルを事前に削除 With CreateObject( "Microsoft.XMLDOM" ).createElement( "base64-node" ) .DataType = "bin.base64" .Text = base64dat dat = .nodeTypedValue End With With CreateObject( "ADODB.Stream" ) .Type = 1 .Open .Write dat .SaveToFile SaveFilePath .Close End With End Sub Private Function GetDomainName( ByVal url As String ) As String 'ドメイン名取得 Dim v As Variant Else End If GetDomainName = v(LBound(v)) End Function Private Function GetExtension( ByVal mimeType As String ) As String '拡張子取得(変換テーブルは適当) Dim ret As String Select Case mimeType Case "image/x-icon" : ret = "ico" Case "image/png" , "image/x-png" : ret = "png" Case "image/gif" : ret = "gif" Case "image/jpeg" : ret = "jpg" Case "image/bmp" , "image/x-MS-bmp" : ret = "bmp" Case "image/tiff" : ret = "tif" Case "image/x-emf" : ret = "emf" Case "image/x-wmf" : ret = "wmf" Case Else : ret = "ico" End Select GetExtension = ret End Function Private Function EncodeURL( ByVal sWord As String ) As String With CreateObject( "ScriptControl" ) .Language = "JScript" EncodeURL = .CodeObject.encodeURIComponent(sWord) End With End Function |
上記GetFaviconプロシージャは、引数として対象URLとFaviconの保存先フォルダを指定すると、指定したフォルダにFaviconファイルを保存するもので、Base64エンコードされたFaviconファイルを元のバイナリファイルに変換する処理を行っています。
VBAでBase64デコードする処理を書いたことが無かったので試しに書いてみましたが、正直同様のサービスである「getFavicon.org」を利用した方が楽にFaviconファイルを保存できます。
1 2 3 4 5 6 7 8 9 10 11 | Option Explicit Private Declare Function URLDownloadToFileA Lib "urlmon" ( ByVal pCaller As Long , ByVal szURL As String , ByVal szFileName As String , ByVal dwReserved As Long , ByVal lpfnCB As Long ) As Long Public Sub Sample2() GetFavicon "//www.ka-net.org/blog" , "C:\Test\", 16, " ico" End Sub Private Sub GetFavicon( ByVal Target As String , ByVal SaveFolderPath As String , Optional ByVal Size As Long = 16, Optional ByVal Ext As String = "ico" ) URLDownloadToFileA 0&, "http://www.getfavicon.org/?url=" & Target & "/favicon." & Size & "." & Ext, SaveFolderPath & "favicon." & Ext, 0&, 0& End Sub |
こちらはFavatarと違ってファイル形式やサイズを指定することができますが、私が試した限りではFavatarの方が対応サイトが多いように思います。
VBAマクロでFaviconをダウンロードする機会もそうそう無いかと思いますが、興味がある方は一度試してみてはいかがでしょうか。
(上記コードはエラー処理を行っていませんので、実装する際は適宜処理を追加してください。)
この記事へのコメントはありません。