[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.167 amazonの広告コード UTF-8を探る(keywordを作る)

amazonの広告コード UTF-8を探る(keywordを作る)

メルマガの記事で自作関数を作ったけど、下記の方が簡単かも・・・
VBAからJavaScriptを使う方法を載せます。

スクリプト コントロールの概要
https://www.microsoft.com/japan/msdn/scripting/scriptcontrol/scoverview.htm
↑MSのサイトだけど、httpとhttpsが混在してると警告が出るけどビックリしないでね。
頭の例は、MSが大好きなVBScriptだけど、.Language = "JScript" も可能と途中で書いてありました・・・。
なんて↑へんな日本語で書くよりコード↓を見た方が伝わりやすいですよね。
Sub JavaScript_Test() 'VBA から VavaScriptを使うテスト

    '検索文字を入力
    Dim strMOJI As String
    strMOJI = InputBox("キーワード=", "入力", "三流")

    '検索文字をJavaScriptのencodeURI関数で作る
    Dim strPARA As String  'パラメーター
    Dim sc As Object
    Set sc = CreateObject("ScriptControl")
    sc.Language = "Jscript"  'JavaScriptを指定(書き間違えないでね)
    strPARA = sc.CodeObject.encodeURI(strMOJI) 'encodeURI関数を呼ぶ
    Set sc = Nothing
    Debug.Print strPARA
    
    '手抜きで Shell でWebページを表示する
    Dim strURL As String
    strURL = "http://www.google.co.jp/search?hl=ja&ie=UTF-8&q=" & strPARA
    Call Shell("explorer.exe """ & strURL & """", vbNormalFocus)

End Sub
↑こんな感じで、使えるので、活用してみてください。VBAからJavaScriptが使えるとは・・・
※※上記で解決なのですが、下記、メルマガで書いた自作関数です。


概要:
IE操作にはあまり関係ないのですが、
amazonの広告コード UTF-8でkeywordを作ってみました。
※SJISをUTF-8に変換してみました。

リンク 分類: [Document(文章)からデータを取得] / [Form入力処理] / [Linkリンク情報] / [Image画像情報] / [Frameフレーム処理] サンプル: [IEを使ったVBAのサンプル] / [小さなVBAでIE操作のコード]

メルマガ発行内容

やっと、下記、メルマガで発行した内容です。何かの参考となれば幸いです。
過去のメルマガ[IE操作系の記事一覧]もヨロシクです。

amazonの広告コード UTF-8を探る(keywordを作る)

どうも、三流プログラマーのKen3です。

今回は、
本の通信販売、amazon.comで使用している、
UTF-8のkeywordコードを作ってみたいと思います。

/* * 1.今回のキッカケ */

前回、都道府県別のhtmlファイルを作成しました。 目的は、旅行の広告ページを作ることです。 そこで、旅行の申し込み広告の下にガイドブックの広告を表示して、 ガイドブックをついでに買ってもらう or 旅行の申し込み無くても興味あるターゲットに本を売ろう と考えました。 本の通信販売、有名なamazon.comでキーワードリンクがあるので、 神奈川ガイドと都道府県にガイドを付けてキーワードにしてみたいと思います。 手作業で作ると、 keyword=%E7%A5%9E%E5%A5%88%E5%B7%9D+%E3%82%AC%E3%82%A4%E3%83%89&mode=blended となり、keywordに%E7%A5%9E%E5%A5%88%E5%B7%9Dなど、コードが指定されています。 このコードが聞き慣れないUTF-8のコードです。

/* * 2.UTF-8のデータ構造を調べてみた */

ASP系のメルマガとかぶってしまうのですが(流用なのですが、) http://www.ken3.org/cgi-bin/cnt/log100.asp で、リンク元などを確認してます。 リンク元をみてみると、googleからの検索で http://www.google.co.jp/search?q=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB などのkeywordコードが保存されてます。 q=が検索文字列だと思うのですが、 %E3 %83 %95ってなんだ?どうしても変換方法が見つかりませんでした また、別のログデータからコード体系らしい部分を見ると、 ie=utf8&oe=utf8&querytime=8TuE& このUTF8ってのが怪しそうです。 何を見たか?下記のようなコードの表を見ました。 http://www.asahi-net.or.jp/~CI5M-NMR/w3/rfc2279.txt より UCS-4 range (hex.) UTF-8 octet sequence (binary) 0000 0000-0000 007F 0xxxxxxx 0000 0080-0000 07FF 110xxxxx 10xxxxxx 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx と、変換表(規則)が書いてあった。 ※binaryの単語で引っかかったと思う。 これを見て、手で変換してみた。 http://www.google.co.jp/search?q=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB が検索単語の ファイル を指定してます。 %E3%83%95 フ %E3%82%A1 ァ %E3%82%A4 イ %E3%83%AB ル とUTF-8でコード付けされてます。 ファイルの[フ]がE3 83 95かぁこれを2進数に直すと。 E 3 8 3 9 5 1110 0011 1000 0011 1001 0101 となります。 ここから、 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx の規則でxxxxの実データを取り出すと(1110 10 10は固定のコードなので) E 3 8 3 9 5 1110 0011 1000 0011 1001 0101 xxxx xx xxxx xx xxxx から xの部分を取り出すと、 0011 00 0011 01 0101 となり、わかりやすく、 0011 0000 1101 0101 として16進に直すと 30D5となるが、これはUNICODEらしい。 これをシフトJISから変換できれば、 UTF-8のデータを作り出せそうです。 ※SJISとUTF-8のやり取りができそうです。

/* * 3.UNICODEと言われてもなぁ ASCW関数で単純に変換してみた */

UNICODEと言われてもなぁ、どうやって変換するんだろう? 悩んでいたら、ASCWとCHRWがUnicode コード ポイントをやり取りするみたいです。 ASCとASCW関数 http://www.microsoft.com/japan/msdn/library/ja/vblr7/html/vafctasc.asp CHRとCHRW関数 http://www.microsoft.com/japan/msdn/library/ja/vblr7/html/vafctchr.asp に書いてありました。 ASC関数とASCW関数の違いを見るために、 下記の確認プログラムをASPのVBScriptで作ってみました。 単純にASCとASCWで変換しただけですが。 三流君ASPを変換すると、下記でテストすると、 http://www.ken3.org/cgi-bin/test/test097-1.asp?DATA=%8EO%97%AC%8CNASP n文字目 調査する文字 ASC結果(16進) ASCW結果(16進) 1 三 8E4F 4E09 2 流 97AC 6D41 3 君 8C4E 541B と変換されます。 おっと、確認したいのは、ファイルのフのユニコードだった、 http://www.ken3.org/cgi-bin/test/test097-1.asp?DATA=%83t%83@%83C%83%8B で確認すると、 n文字目 調査する文字 ASC結果(16進) ASCW結果(16進) 1 フ 8374 30D5 2 ァ 8340 30A1 3 イ 8343 30A4 4 ル 838B 30EB と表示されました。 30D5のコードにやっとたどり着きました。

/* * 4.SJISをUTF-8に直す */

さてと、 では、本題の何も意識しないで使用しているシフトJISをUTF-8に直してみます。 SJISをASCW関数でUNICODEに変換してから、 そのコードを2進数に直す。 2進数を固定のビットを立てたコードに当てはめて、 再び16進数に戻す。そのとき%を付けた文字列にする。 なんか、かったるいけど、チャレンジしてみます。 ASP VBScriptで作ったサンプルは、下記のサンプルです。 儲かる http://www.ken3.org/cgi-bin/test/test097-3.asp?DATA=%96%D7%82%A9%82%E9 娘。 http://www.ken3.org/cgi-bin/test/test097-3.asp?DATA=%96%BA%81B 転職 http://www.ken3.org/cgi-bin/test/test097-3.asp?DATA=%93%5D%90E で、終わるとさびしいので、VBAのファイル作成処理に追加してみます。 ソースは長いけど、 下記のような感じです。 ポイントは、ASCWでUNICODEにして、2進数に変換後、 変換した16ビットを 'xxxx xxxx xxxx xxxx を下記に割り当てる '1110xxxx 10xxxxxx 10xxxxxx と、指定位置に割り当てただけです。
Function MAKE_AMAZON_KEYWORD(strMOTO As String)

    Dim n As Integer
    Dim strRET As String
    Dim strCHK As String
    Dim strCODE As String
    Dim strUNICODE As String
    Dim strUTF8 As String
    
    strRET = ""   'リターン値を初期化する
    
    For n = 1 To Len(strMOTO)
        strCHK = Mid(strMOTO, n, 1) '一文字取り出す
        strCODE = Hex(Asc(strCHK))  'その文字コードを16進文字列にする
        If Len(strCODE) <= 2 Then  '半角か?
            If Asc(strCHK) <= &H20 Then
                '制御コードか?
                strRET = strRET & "%" & Right("0" & strCODE, 2)
            Else
                '英数はそのまま+する
                strRET = strRET & strCHK
            End If
        Else   '全角文字の時は、UTF-8にする
          strUNICODE = Hex(AscW(strCHK))  'まずUNICODEに変換する
          strUTF8 = UNItoUTF8(strUNICODE) '次にUNICODEをUTF8に変換する

          '%を付けて格納
          strRET = strRET & "%" & Mid(strUTF8, 1, 2)
          strRET = strRET & "%" & Mid(strUTF8, 3, 2)
          strRET = strRET & "%" & Mid(strUTF8, 5, 2)
        End If
    Next n

    'リターン値をセットして終わる
    MAKE_AMAZON_KEYWORD = strRET
    
End Function
'UNIコードの文字列を受け取り、UTF-8コードの文字列を返す(%付けない)
Function UNItoUTF8(strUNICODE As String) As String

    Dim strWORK As String
    Dim strUTF8 As String

    'JISコードを2進にする
    strWORK = HEX16toSTR2(strUNICODE)
    
    '切り取って、UTF8の2進数を作成する
    'xxxx xxxx xxxx xxxx を下記に割り当てる
    '1110xxxx 10xxxxxx 10xxxxxx
    strUTF8 = "1110" & Mid(strWORK, 1, 4)
    strUTF8 = strUTF8 & "10" & Mid(strWORK, 5, 6)
    strUTF8 = strUTF8 & "10" & Mid(strWORK, 11, 6)

    '作成した2進数を16進数文字列に再度戻してリターン値とする
    UNItoUTF8 = STR2toHEX16(strUTF8)

End Function
'HEX16進文字列を受け取り2進文字列を返す
Function HEX16toSTR2(strHEX As String) As String

    Dim n As Integer      'ループカウンタ
    Dim i As Integer      'ループのカウンタ
    Dim n8421 As Integer  '8 4 2 1の数値計算用
    Dim str2STR As String
    
    Dim nCHK As Integer
    
    str2STR = ""  '結果のエリアを初期化する

    '文字数分ループする
    For n = 1 To Len(strHEX)
        nCHK = CInt("&h" & Mid(strHEX, n, 1)) 'n文字目を数値変換
        n8421 = 8  '初期値に8を代入する(上からチェックしたいので)
        For i = 1 To 4  '4回まわるよ
            If (nCHK And n8421) = 0 Then 'Andでビットをチェックする
                str2STR = str2STR & "0"  'ビットは立ってないよ
            Else
                str2STR = str2STR & "1"  'ビットは立ってるよ
            End If
            '次のビットをチェックしたいので2で割る
            n8421 = n8421 / 2
        Next i
     Next n

     'リターン値をセットして終了
     HEX16toSTR2 = str2STR

End Function
'2進文字列を受け取り16進文字列を返す
Function STR2toHEX16(ByVal str2 As String) As String

    Dim strHEX As String
    Dim n As Integer      'ループカウンタ
    Dim i As Integer      'ループのカウンタ
    Dim n8421 As Integer  '8 4 2 1の数値計算用
    Dim nBYTE As Integer

    '頭4文字単位かチェックする
    n = Len(str2) Mod 4      '足りない文字数を計算する
    If n <> 0 Then
       str2 = String(4 - n, "0") & str2 '頭に文字0を追加する
    End If

    strHEX = ""   '結果のエリアを初期化する

    '文字数分ループする
    For n = 1 To Len(str2) Step 4  '4文字(1バイト)単位にループを作る
        n8421 = 8  '初期値に8を代入する(上から計算したいので)
        nBYTE = 0  '1バイト計算用変数を初期化
        For i = 0 To 3  '4回まわるよ(4ビット分)
            'ビットが立っているかチェックする
            If Mid(str2, n + i, 1) = "1" Then
                nBYTE = nBYTE + n8421   'ビットに対応した数値を+する
            End If
            '次のビットを計算したいので2で割る
            n8421 = n8421 / 2
        Next i
        '計算して、1倍との数値が完成したので16進文字にしてセットする
        strHEX = strHEX & Hex(nBYTE)
     Next n

     'リターン値をセットして関数を抜ける
     STR2toHEX16 = strHEX

End Function
テストで、 ? MAKE_AMAZON_KEYWORD("神奈川") %E7%A5%9E%E5%A5%88%E5%B7%9D と変換できました。 簡単な確認方法は、googleのq=とパラメータを追加して確認します。 ※実際に送ってみて確認する方法です。 http://www.google.co.jp/search?q=%E7%A5%9E%E5%A5%88%E5%B7%9D&hl=ja&ie=UTF-8 ↑で、無事、神奈川のキーワードが渡ったと思います。 あとは、アマゾンのキーワード、URLに埋め込んで完成です。 ※アマゾンの広告コードメルマガに載せるとはじかれるので、  ソースはカットしてます。

/* * 5.終わりの挨拶 */

今回のサンプル、 http://www.ken3.org/vba/lzh/vba167.lzh に保存しました。 解凍して都道府県.xlsを開いて、 内容を変えたりして、遊んでください。 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 三流プログラマー Ken3でした。

ページフッター リンクや広告、質問送信など

三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

[三流君 VBAでWebBrowser IEを操作する] / [三流君 VBAで楽しくプログラミング] / [AB型の変わり者 三流プログラマー Ken3 三流君Top]

大分類:[Document.Forms(入力処理)] / [Document.Links(リンク情報)] / [Document.Images(画像情報)] / [Document.Frames(フレーム処理)]
サンプル・例題:[過去のメルマガ記事一覧] / [少し大きなIE操作サンプル] / [小さなコードでIE操作の動作確認]

F1でヘルプを見たり、デバック時にDebug.Print使ったり、イミディエイト ウインドウで簡単な確認したり。
なれると当たり前に操作している方法が↓かなぁ。
[F1ヘルプ マクロ記録ほか]・・・基本のF1を押してヘルプを見る方法など
[実行時エラー、デバッグモード]・・・デバッグの流れを簡単に(ハマった時はツライけど)
[イミディエイト ウインドウ と Debug.Print]・・・プログラム作成時に便利なイミディエイト ウインドウ
[VBA ウォッチ式とSTOPを使ってみた]・・・STOPで止め、ウォッチ式でオブジェクトの中身を確認する方法など
[参照設定のお話]・・・設定すると便利な(設定しないと使えない)、参照設定のお話

項目別に↓にプログラマーの本音?それとも建て前?的な記事をまとめました。お探しのジャンルを選択してください。
[プログラムは心? spirit]・・・プログラマー 心・気質・魂
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話

項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
[VBAでIE ウェブブラウザーを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[MSアクセス から エクセル を呼ぶ Excel.Application]・・・AccessからExcelを操作したりデータの書き出しなどです
[アウトルック メールの操作 Outlook.Application]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[エクセル ユーザーフォームを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[エクセルからアクセスを操作する]・・・ExcelからAccessのマクロを起動してみました、
[エクセル関係 関数、その他]・・・その他Excel関係です

Access関係:
[アクセス ユーザーフォーム/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[アクセス レポート操作]・・・レポートを操作してみました
[アクセス クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[テキストファイルの操作(Open,Close,Print,Input)]・・・普通のテキストファイルを使ったサンプルです

Blog:[三流君の作業日記]/ [objIEを使用したサンプルコードを見る]/ 広告-[通販人気商品の足跡]

質問や要望など メッセージを送る(三流君に連絡する)

三流プログラマーのKen3 が 皆さんの質問にお答えします
と カッコつけて言っても、実力不足ですべての質問に回答することはできないのが現実なのですが、できる範囲で 三流的な逃げ手 や 解決方法 を探します(回答します)。

感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。

あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。



[トップページへ 戻る] / [VBA TOP] / [WebBrowser IEの操作 TOPへ]