VBで作るURLチェッカー
目的
- URLが存在しているかをチェックする。
- URLが前回より更新されているかをチェックする。
プログラム作成条件
- VB標準のコントロールを使用する。
- データベースは、DAOを使用する。(MDB)
プログラムの作成
- 「新しいプロジェクト」より「標準EXE」を選択する。
- プロジェクトのオブジェクト名を「Project1」から「urlchker」とする。
|
→ |
|
- 今回DAOを使用するため、「参照設定」にて、「DAO Object Library」を追加する。
- 今回必要なコンポーネントを追加する。
|
→ |
|
- フォームに今回必要なコントロールを貼り付ける。
- ツール バー (Toolbar) コントロール
- ステータス バー (StatusBar) コントロール
- Winsock コントロール
- タイマー (Timer) コントロール
- ピクチャ ボックス (PictureBox) コントロール
- テキスト ボックス (TextBox) コントロール
- コンボ ボックス (ComboBox) コントロール
コンボ ボックス (ComboBox) コントロールは、ピクチャ ボックス (PictureBox) コントロールの中に配置する。
|
→ |
|
- ピクチャ ボックス (PictureBox) コントロールのプロパティを変更する。
- Align = 1 '上揃え
- BorderStyle = 0 'なし
|
→ |
|
- テキスト ボックス (TextBox) コントロールのプロパティを変更する。
- MultiLine = -1 'True
- ScrollBars = 3 '両方
|
→ |
|
- コントロール配置などコードを記述する。
(『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チェッカーの実行結果
- その他
参考資料[ステータス]
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チェッカー』を作成してみました。
微弱ながら本ページを参考にして、優秀なプログラムを作成するプログラマーが現れることを期待します。
|