tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルWebページのタイムスタンプ取得につきまして
記事No16345
投稿日: 2017/08/30(Wed) 13:31
投稿者susu
度重ね、お世話になります。

環境
OS:Windows XP/7/8/10  IE 6/11   VB 6.0 VB歴は長いのですが詳しくはありません。

Webページのタイムスタンプ取得につきまして、ご質問致します。

概要
下記にファイルのタイムスタンプを取得する参考例(VB6)がありました。
http://jeanne.wankuma.com/tips/vb6/file/gettimestamp.html

[参照設定] ⇒「Microsoft Scripting Runtime」


Option Explicit

Private Sub Command1_Click()

' FileSystemObject (FSO) の新しいインスタンスを生成する
    Dim cFso As FileSystemObject
    Set cFso = New FileSystemObject

    ' File オブジェクトを取得する
    Dim cFile As File
    Set cFile = cFso.GetFile("C:\テスト.txt")

    ' 不要になった時点で参照を解放する (Terminate イベントを早めに起こす)
    Set cFso = Nothing

    ' 作成日時を取得する
    Dim dtCreate As Date
    dtCreate = cFile.DateCreated

    ' 更新日時を取得する
    Dim dtUpdate As Date
    dtUpdate = cFile.DateLastModified

    ' アクセス日時を取得する
    Dim dtAccess As Date
    dtAccess = cFile.DateLastAccessed

    ' 不要になった時点で参照を解放する (Terminate イベントを早めに起こす)
    Set cFile = Nothing

    ' 取得したタイムスタンプを表示する
    Call MsgBox("作成日時 : " & CStr(dtCreate))
    Call MsgBox("更新日時 : " & CStr(dtUpdate))
    Call MsgBox("アクセス日時 : " & CStr(dtAccess))

End Sub


質問
ファイル"テスト.txt"の代わりにWebページhhttps://www.goo.ne.jp/
タイムスタンプ取得をしたいのですが、VB6でも可能でしょうか。

ご教示願えますと幸いであります。

[ツリー表示へ]
タイトルRe: Webページのタイムスタンプ取得につきまして
記事No16346
投稿日: 2017/08/30(Wed) 20:20
投稿者susu
JavaScriptで解決できました。

Webページの更新日時が知りたかったのでJavaScriptで調べることができました。
アドレス欄にjavascript:alert(document.lastModified)を入力し、
Enter キーをクリックすることで更新日が取得できました。

お世話になりました。

[ツリー表示へ]
タイトルRe^2: Webページのタイムスタンプ取得につきまして
記事No16347
投稿日: 2017/09/01(Fri) 10:30
投稿者魔界の仮面弁士
>> Webページhttps://www.goo.ne.jp/のタイムスタンプ取得をしたいのですが、
静的なページと違って、goo のように動的なページの場合は
常にリクエスト時刻が得られてしまうと思います。

フレームが使われているページの場合も悩ましいところですね。


>> VB6でも可能でしょうか。
> アドレス欄にjavascript:alert(document.lastModified)を入力し、
> Enter キーをクリックすることで更新日が取得できました。

自己解決済みのようですが、一応 VB6 コードで取得する方法についても紹介しておきます。

知りたいのは最終更新日だけであり、Web ページの本体データは不要なので、
GET リクエストではなく HEAD リクエストを投げるようにしてみました。


Dim XHR As Object
Set XHR = CreateObject("WinHttp.WinHttpRequest.5.1")
XHR.Open "HEAD", "https://www.goo.ne.jp/", False
'XHR.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
XHR.Send
MsgBox XHR.GetResponseHeader("Date")
'MsgBox XHR.GetAllResponseHeaders()

上記のように、数行のコードで取得できます。

実際には、通信エラーに備えて On Error を仕掛けたり、
404 Not Found 等を判定するための XHR.Status / StatusText の
確認もした方が良いとは思います。必要であれば組み込んでみてください。


なお、Date ヘッダーの書式は RFC 1123 形式と定められているため、
上記で得られる文字列は、
 "Thu, 31 Aug 2017 23:45:01 GMT"
 "Sat, 04 Oct 2014 01:23:45 +0900"
のように、"曜日, 日 月 年 時刻 ゾーン" 形式で返されることになります。

RFC1123 から日付への変換には、
 案1) InternetTimeToSystemTime API を使う
 案2) Mid 関数で切り出して自前で変換
 案3) JScript の Date オブジェクト経由で変換
などの選択肢があります。

とりあえず案3ならこんな感じ。

"Thu, 31 Aug 2017 23:45:01 GMT" という文字列を渡すと、
戻り値として、2017/09/01 08:45:01 AM 相当の日付型の値が得られます。

Function ToVBDate(ByVal rfc1123Date As String) As Variant
    On Error GoTo Catch
    Dim sc As Object
    Set sc = CreateObject("MSScriptControl.ScriptControl")
    sc.Language = "JScript"
    ToVBDate = sc.Eval("new Date('" & rfc1123Date & "').getVarDate()")
    Exit Function
Catch:
    ToVBDate = Null
End Function

[ツリー表示へ]
タイトルRe^3: Webページのタイムスタンプ取得につきまして
記事No16348
投稿日: 2017/09/02(Sat) 09:54
投稿者susu
魔界の仮面弁士 さん

度々、返答をして頂きまして心より感謝申し上げます。

IE6アドレス欄にjavascript:alert(document.lastModified)
でしたが、IEのバージョン(IE11)によては、javascriptが受け付けませんでした。
(詳しくは分りませんがソーシャルエンジニアリングを防止する対策の為とありました)
[j]を除くavascript:alert(document.lastModified)はアドレス欄に貼り付けできました。
[j]は手入力してWebページの更新日時が表示できました。

そこで、以上のことから下記の方法で行っています。

  Option Explicit
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long

Private Sub Command1_Click()


    Dim objIE    As Object
        Set objIE = CreateObject("InternetExplorer.application")

       objIE.Visible = False
        
          objIE.navigate "hhttps://www.goo.ne.jp/"
          SetForegroundWindow (objIE.hWnd)
      
        Do While objIE.Busy = True

              DoEvents
        Loop

        objIE.navigate "javascript:alert(document.lastModified)"

End Sub



>一応 VB6 コードで取得する方法についても紹介しておきます。
>知りたいのは最終更新日だけであり、Web ページの本体データは不要なので、
>GET リクエストではなく HEAD リクエストを投げるようにしてみました。

魔界の仮面弁士 さんが、紹介して頂きました方法でこれから確かめてみます。
少し、時間がかかると思いますが、ご報告させてもらいます。また、
ご質問につきましては、宜しくお願い致します。

[ツリー表示へ]
タイトルRe^4: Webページのタイムスタンプ取得につきまして
記事No16349
投稿日: 2017/09/02(Sat) 10:15
投稿者魔界の仮面弁士
> IE6アドレス欄にjavascript:alert(document.lastModified)
> でしたが、IEのバージョン(IE11)によては、javascriptが受け付けませんでした。

ブックマークレット (bookmarklet) を使ってみてください。

たとえば IE11 なら、
 (1) [Alt]キーを押して、[表示]-[ツールバー]-[お気に入りバー]にチェック。
 (2) お気に入りバー左端の ☆⇒ アイコンで、お気に入りを追加。
 (3) 追加されたお気に入りを右クリックしてプロパティを開く。
 (4) URL 欄を「javascript:alert(document.lastModified)」に変更。
 (5) 必要に応じて、アイコンとショートカット名も変更してから [OK] で閉じる。
のようにします。Edge 等、他のブラウザーでも基本的には同じです。
https://support.microsoft.com/ja-jp/help/4028699/

以降は、任意のページでそのお気に入り(ブラウザーによってはブックマーク)を
クリックするだけで OK です。

google 等で「ブックマークレット」で検索すると、
他にも色々なサンプルが見つかるかと思います。

[ツリー表示へ]
タイトルRe^5: Webページのタイムスタンプ取得につきまして
記事No16350
投稿日: 2017/09/02(Sat) 11:47
投稿者susu
魔界の仮面弁士 さん

早速の返信ありがとうございました。

>ブックマークレット (bookmarklet) を使ってみてください。

アドレス欄にjavascript:alert(document.lastModified)を
VB6でアドレス欄に貼り付けていましたが(IE11)では
貼り付けできませんでしたのでブックマークレット (bookmarklet)
を使っては更新日時が表示できました。それと同じことをVB6で
行うと効率が良くないと思いVB6(objIE.navigate "javascript:alert(document.lastModified)")
で行いました。

本来、ボックス表示ではなくVB6フォーム内のテキストボックスに表示したかったのですが
方法が分りませんでした。下記の方法ですとデータが取り出せ編集ができますので
Mid 関数で切り出して自前での変換にしたいと思います。案1〜3の案2にします。
希望していたものができると思います。

>Dim XHR As Object
>Set XHR = CreateObject("WinHttp.WinHttpRequest.5.1")
>XHR.Open "HEAD", "hhttps://www.goo.ne.jp/", False
>'XHR.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
>XHR.Send
>MsgBox XHR.GetResponseHeader("Date")
>'MsgBox XHR.GetAllResponseHeaders()

上記の方法を使わせてもらいます。
結果がでましたら、ご報告をさせてもらいます。

いつも、ありがとうございました。

[ツリー表示へ]
タイトルRe^6: Webページのタイムスタンプ取得につきまして
記事No16351
投稿日: 2017/09/02(Sat) 14:29
投稿者susu
魔界の仮面弁士 さん

お世話になります。

訂正
勘違いにより、案3) JScript の Date オブジェクト経由で変換を採用させて頂きます。

"https://www.goo.ne.jp/"では更新日付が今日になりますので。

今日以外のwebページを探しましたら"http://www.edotatemono.com/"がありましたので
テスト用webページとしました。

Command1 2017/09/02 14:10:06
Command2 02/20/2009 12:27:57

質問

同じ"http://www.edotatemono.com/"に於いて
Command1とCommand2の更新日付が異なる違いにつきまして、ご教示願えますと幸いであります。

※Command1内の一部変更、追加しました。誤りがありましたら、大変申し訳ありませんでした。

'
'''''''''''''''''''''''''''''''''''''''''''''''
'
Option Explicit
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long

Private Sub Command1_Click()
Dim XHR As Object
Set XHR = CreateObject("WinHttp.WinHttpRequest.5.1")
XHR.Open "HEAD", "http://www.edotatemono.com/", False
'XHR.Open "HEAD", "https://www.goo.ne.jp/", False
'XHR.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
XHR.Send
'MsgBox XHR.GetAllResponseHeaders()
Call ToVBDate(XHR.GetResponseHeader("Date"))
'Call ToVBDate("Thu, 31 Aug 2017 23:45:01 GMT")

End Sub


Function ToVBDate(ByVal rfc1123Date As String) As Variant
    On Error GoTo Catch
    Dim sc As Object
    Set sc = CreateObject("MSScriptControl.ScriptControl")
    sc.Language = "JScript"
    ToVBDate = sc.Eval("new Date('" & rfc1123Date & "').getVarDate()")
    Text1.Text = ToVBDate '追加
    Exit Function
Catch:
    ToVBDate = Null
End Function


Private Sub Command2_Click()

    Dim objIE    As Object
        Set objIE = CreateObject("InternetExplorer.application")

        objIE.Visible = False
        
          objIE.navigate "http://www.edotatemono.com/"
         'objIE.navigate "https://www.goo.ne.jp/"
          SetForegroundWindow (objIE.hWnd)
      
        Do While objIE.Busy = True

              DoEvents
        Loop

        objIE.navigate "javascript:alert(document.lastModified)"

End Sub
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'

[ツリー表示へ]
タイトルRe^7: Webページのタイムスタンプ取得につきまして
記事No16352
投稿日: 2017/09/02(Sat) 19:12
投稿者YuO
> 同じ"http://www.edotatemono.com/"に於いて
> Command1とCommand2の更新日付が異なる違いにつきまして、ご教示願えますと幸いであります。

>  Call ToVBDate(XHR.GetResponseHeader("Date"))

Dateフィールドはサーバーの日付で,最終更新日はLast-Modifiedフィールドです。
Dateフィールドではなく,Last-Modifiedフィールドを使ってみてはどうでしょうか。

[ツリー表示へ]
タイトルRe^8: Webページのタイムスタンプ取得につきまして
記事No16353
投稿日: 2017/09/02(Sat) 22:03
投稿者susu
YuO さん

返答をして頂きまして、ありがとうございました。

> Dateフィールドはサーバーの日付で,最終更新日はLast-Modifiedフィールドです。
> Dateフィールドではなく,Last-Modifiedフィールドを使ってみてはどうでしょうか。
"Date" ⇒ "Last-Modified" に変更して使ってみましたら、Command1とCommand2が同じ結果になりました。
良く理解できていませんでしたので全く考えがつきませんでした。
ご指導をして頂き、感謝申し上げます。

[ツリー表示へ]
タイトルRe^9: Webページのタイムスタンプ取得につきまして
記事No16354
投稿日: 2017/09/02(Sat) 22:17
投稿者susu
魔界の仮面弁士 さん

Command1とCommand2の更新日付が異なる違いにつきましては、
YuO さんから回答をして頂きCommand1とCommand2が同じ結果になりました。

色々と、ご指導をして頂きまして感謝申し上げます。

大変、お世話になりました。ありがとうございました。

[ツリー表示へ]