ソフト開発塾

KONDO-NETサーチ(KLSH)
- 新着 - VB - VC - Perl - PHP - カテゴリに登録 -

VBで作るURLチェッカー

目的
  • URLが存在しているかをチェックする。
  • URLが前回より更新されているかをチェックする。
プログラム作成条件
  • VB標準のコントロールを使用する。
  • データベースは、DAOを使用する。(MDB)
プログラムの作成
  • 「新しいプロジェクト」より「標準EXE」を選択する。
  • プロジェクトのオブジェクト名を「Project1」から「urlchker」とする。
    新規の状態 変更後のプロジェクト
  • 今回DAOを使用するため、「参照設定」にて、「DAO Object Library」を追加する。
  • 今回必要なコンポーネントを追加する。
    • Winsock
    • Windows Common
    コンポーネントを追加前 コンポーネントを追加後
  • フォームに今回必要なコントロールを貼り付ける。
    • ツール バー (Toolbar) コントロール
    • ステータス バー (StatusBar) コントロール
    • Winsock コントロール
    • タイマー (Timer) コントロール
    • ピクチャ ボックス (PictureBox) コントロール
    • テキスト ボックス (TextBox) コントロール
    • コンボ ボックス (ComboBox) コントロール
    コンボ ボックス (ComboBox) コントロールは、ピクチャ ボックス (PictureBox) コントロールの中に配置する。
    新規のフォーム コントロール配置後のフォーム
  • ピクチャ ボックス (PictureBox) コントロールのプロパティを変更する。
    • Align = 1 '上揃え
    • BorderStyle = 0 'なし
    PictureBoxコントロールのプロパティの変更前 PictureBoxコントロールのプロパティの変更後
  • テキスト ボックス (TextBox) コントロールのプロパティを変更する。
    • MultiLine = -1 'True
    • ScrollBars = 3 '両方
    TextBoxコントロールのプロパティの変更前 TextBoxコントロールのプロパティの変更後
  • コントロール配置などコードを記述する。
    (『URLチェッカー』本体にあまり関係無いため省略)
  • メニューエディタでメニューを追加する。
    (『URLチェッカー』本体にあまり関係無いため省略)
  • (General)(Declarations)に記述する。
    Option Explicit
    
    Const URLCHKERMDBNAME = "urlchker.mdb"
    
    Dim m_db_name       As String
    Dim m_dbs           As Database
    Dim m_open_flag     As Long
    Dim m_close_flag    As Long
    Dim time_count      As Long         ' タイマ処理カウント
    Dim TimeOut_Time    As Integer      ' タイムアウト(待ち時間)
    
  • タイマー (Timer) コントロールのイベントに対するコードを記述する。
    Private Sub Timer1_Timer()
        time_count = time_count + 1
    End Sub
    
  • Winsock コントロールのイベントに対するコードを記述する。
    • Close
      Private Sub Winsock1_Close()
          m_close_flag = 1
      End Sub
      
    • Connect
      Private Sub Winsock1_Connect()
          m_open_flag = 1
      End Sub
    • DataArrival
      Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
         Dim strData As String
         
         Winsock1.GetData strData, vbString
         
         Me.Text1.Text = Text1.Text & strData
      
      End Sub
  • コンボ ボックス (ComboBox) コントロールのイベントに対するコードを記述する。
    • Click
      Private Sub Combo1_Click()
          Me.Combo1.Enabled = False
          
          ' urlを分解
          ' 例:
          '   Me.Combo1.Text = http://www.kondo-net.gr.jp/softca/
          '   の場合
          '   url_ps_host = www.kondo-net.gr.jp
          '   url_ps_path = /softca/
          Dim url_ps_host As String, url_ps_path As String
          url_split Me.Combo1.Text, url_ps_host, url_ps_path
          
          ' 保管されている?GMTを取得
          Dim gmt As String
          gmt = get_url_gmt(Me.Combo1.Text)
          start_chker url_ps_host, url_ps_path, gmt
          ' GMTを保管
          save_gmt Me.Combo1.Text, Me.Text1.Text
          
          Me.Combo1.Enabled = True
      End Sub
      
    • KeyPress
      Private Sub Combo1_KeyPress(KeyAscii As Integer)
          On Error Resume Next
          If KeyAscii = vbKeyReturn Then
              Combo1_Click
          End If
      End Sub
  • Winsock コントロールによるURLのチェック処理
    Public Sub start_chker(ByVal url_ps_host As String, ByVal url_ps_path As String,
     ByVal gmt As String)
        Dim modi_since As String
        If gmt <> "" Then
            modi_since = "If-Modified-Since: " & gmt & " GMT" & vbCrLf
        End If
        
        m_open_flag = 0
        m_close_flag = 0
        Me.Text1 = ""
        '
        time_count = 0
        Timer1.Interval = 100
        Timer1.Enabled = True
        With Me.Winsock1
            .Connect url_ps_host, "80"
            time_count = 0
            Do While m_open_flag = 0
                If time_count > TimeOut_Time Then Exit Do
                DoEvents
            Loop
            Dim SendMsg As String
            SendMsg = "HEAD " & url_ps_path & " HTTP/1.1" & vbCrLf & _
                        "HOST: " & url_ps_host & vbCrLf & _
                        "USER-AGENT: URLCHKER" & vbCrLf & _
                        modi_since & _
                        "Connection: close" & vbCrLf & vbCrLf
            .SendData SendMsg
            time_count = 0
            Do While m_close_flag = 0
                If time_count > TimeOut_Time Then Exit Do
                DoEvents
            Loop
            .Close
        End With
        Timer1.Enabled = False
    End Sub
    
  • URLチェッカーの実行結果
    URLチェッカーの実行結果
  • その他
    参考資料[ステータス]
    200正常
    304変更無し
    403アクセスできない
    404ファイルが見つからない
  • 最後に
    今回のstart_chkerでは、ヘッダー情報のみ取得している。
            SendMsg = "HEAD " & url_ps_path & " HTTP/1.1" & vbCrLf & _
                        "HOST: " & url_ps_host & vbCrLf & _
                        "USER-AGENT: URLCHKER" & vbCrLf & _
                        modi_since & _
                        "Connection: close" & vbCrLf & vbCrLf
    
            SendMsg = "GET " & url_ps_path & " HTTP/1.1" & vbCrLf & _
                        "HOST: " & url_ps_host & vbCrLf & _
                        "USER-AGENT: URLCHKER" & vbCrLf & _
                        modi_since & _
                        "Connection: close" & vbCrLf & vbCrLf
    
    に変えると、HTMLも取得できる。しかし、Shift_JIS以外のエンコードでかかれた、HTML文章は、当然文字化けを起こす。
    また、この例では、USER-AGENTを「URLCHKER」としている、無くすことも可能だが、誰が何の目的でアクセスしているのかを示すなり、 アクセス拒否の連絡先がわかるような記述が望ましいと思う。
    ヘッダー情報の取得だけあれば、インターネット トランスファ (Inet) コントロールを使用することもできるが、 インターネット トランスファ (Inet) コントロールで、USER-AGENTを記述できない (できないと思っているだけかもしれない)ため、Winsock コントロールを使用して『URLチェッカー』を作成してみました。
    微弱ながら本ページを参考にして、優秀なプログラムを作成するプログラマーが現れることを期待します。

ソフト開発塾
 

本ホームページの転載・複製を禁じます。承諾無しに複製を行った場合、複製者のIPアドレス等公開します。
--- KONDO-NET.GR.JP ---