【マクロ】 UWSC Part4 【シェアウェア化】
STOPFORM(true)
Dim oHttp // 通信オブジェクト
url="
http://mamono.2ch.net/newsplus/subject.txt" // スレッド一覧
conturl = "
http://mamono.2ch.net/test/read.cgi/newsplus/" // スレッド保存場所
DIM text= "2" // 投稿テキスト
oHttp = CreateOLEObj("MSXML2.XMLHTTP")
IE = CreateOLEObj("InternetExplorer.Application")
IE.visible = True
ID = HNDToID(IE.HWND)
LastModified = "Thu, 01 Jun 1970 00:00:00 GMT"
sleeptime = 1
while 1 // 監視ループ
sleep(sleeptime)
Gettime()
COM_ERR_IGN //COMエラー無視
oHttp.Open("GET", url, True )
oHttp.setRequestHeader("If-Modified-Since", LastModified);
oHttp.Send("") // スレッド一覧の取得
ifb 200 = oHttp.status Then
sleeptime = 3
else
// エラーのたびに間隔を長くして監視を継続する。
sleeptime = sleeptime + 10
continue
endif
LastModified = oHttp.getResponseHeader("Last-Modified")
ifb COM_ERR_FLG
continue
endif
COM_ERR_RET //エラー処理復帰
// ファイルの取り出し
str = DECODE(oHttp.responseBody, CODE_BYTEARRAY)
// IEウィンドウが閉じられていれば終了する。
if !IDToHND(ID) Then break
// スレッド一覧から、レスのついてないスレを検索する。
ThreadNo = 0
for TCnt = 1 to 50
str1 = token( "<#CR>", str, true, false )
Ifb 1 < Pos("(1)", str1) Then
str2 = CopyB( str1, 1, 10 )
ThreadNo = Val(str2, -1)
if -1 = ThreadNo Then continue 2
endif
next
// 新規のスレがあれば、投稿処理
Ifb ThreadNo Then
ret = Cont( IE, conturl, ThreadNo, text)
Gettime()
ifb ret Then
// 投稿したら130秒待つ。
sleeptime = 130
else
sleeptime = 5
endif
Endif
wend
>>678-679は2ゲットスクリプトの一部で、
ニュース速報+のスレッド一覧から新規スレを検出し、投稿処理を呼び出す。
以前、HTMLファイルを受信していたが、これだと混雑時に更新しないしエラーでまくり。
テキストファイルをゲットすればサイズも小さく、鯖への負担も軽いし、
何より、かなり確実に更新される。
たまに10秒くらい遅れてる感じだけど。
Subject.txtで取得したテキストは、メモ帳に送るとなぜか改行コードが消えてたので
区切りを検出できないと思ってたけど、内部で<#CR>を区切りにしてみるとちゃんと1行ずつ取得できた。
HTMLを処理するよりだいぶシンプルになった。
スレッドの番号はエポック秒(1970年1月1日を基準にした秒)なので、
GetTime()の戻り値に946652400を加えるとスレッド番号になる。
実際にはその番号のスレがあるかどうかは、取得してみないと分からないが、
逆にスレ番から946652400を引いた数値とGetTime()の戻り値を直接比較するのに便利。
たとえば、現在時刻から何秒前までのスレ番を抽出したり、
UWSCでは日付を指定して取得することもできるので何日前から何日前までのスレ番を抽出したりとかできるかと。
まあ応用は勝手にそれぞれやればいいけど、効率的な方法があるってことで。