using Sgml;
using System;
using System.Collections .Generic ;
using System.IO ;
using System.Linq ;
using System.Net ;
using System.Text ;
using System.Text .RegularExpressions ;
using System.Xml .Linq ;
// SgmlReaderに依存しています (https://w...content-available-to-author-only...t.org/packages/SgmlReader/)
// グラフ作成にはイーグラフを使用しています (https://e...content-available-to-author-only...h.com/)
// AILEくん大好き
namespace ConsoleApplication1
{
class Program
{
static XDocument ParseHtml( Uri url)
{
using ( var stream = new WebClient( ) .OpenRead ( url) )
using ( var reader = new StreamReader( stream, Encoding.GetEncoding ( "EUC-JP" ) ) )
using ( var sgmlReader = new SgmlReader { DocType = "HTML" , CaseFolding = CaseFolding.ToLower , IgnoreDtd = true , InputStream = reader } )
{
return XDocument.Load ( sgmlReader) ;
}
}
static IEnumerable< Uri> ParseThread( Uri url)
{
var baseUrl = new Uri( "http://j...content-available-to-author-only...a.net" ) ;
var pattern = "^(/bbs/read.cgi/|/internet/20196/storage/)" ;
return ParseHtml( url)
.Descendants ( "a" )
.Select ( x => x.Attribute ( "href" ) .Value )
.Where ( x => Regex.IsMatch ( x, pattern) )
.Select ( x => new Uri( baseUrl, x) ) ;
}
static DateTime ParseDateTime( Uri url)
{
var unixtime = new DateTime( 1970 , 1 , 1 , 0 , 0 , 0 , DateTimeKind.Utc ) ;
var
time = url.
Segments [ 1 ] == "bbs/" ? Regex.Match ( url.Segments [ 5 ] , @"^(\d+)/$" )
: Regex.Match ( url.Segments [ 4 ] , @"^(\d+).html$" ) ;
var second
= Int32.
Parse ( time .
Groups [ 1 ] .
ToString ( ) ) ; return unixtime.AddSeconds ( second) ;
}
static void Main( string[ ] args)
{
var subject = new Uri( "http://j...content-available-to-author-only...a.net/bbs/subject.cgi/internet/20196/" ) ;
var storage = new Uri( "http://j...content-available-to-author-only...a.net/bbs/storage.cgi/internet/20196/" ) ;
var times = ParseThread( subject)
.Concat ( ParseThread( storage) )
.Select ( ParseDateTime)
.OrderBy ( x => x)
.GroupBy ( x => x.Date )
.Select ( x => new { Date = x.Key , Count = x.Count ( ) } ) ;
var path = @"../../../../time.tsv" ;
using ( var stream = File.Open ( path, FileMode.Create ) )
using ( var writer = new StreamWriter( stream, Encoding.GetEncoding ( "shift-jis" ) ) )
{
writer.WriteLine ( "\t スレ数" ) ;
foreach
( var
time in times
) {
if ( time .
Date .
Year == 1970 ) writer.
WriteLine ( "削除\t {0}" , time .
Count ) ; else
writer.
WriteLine ( "{0}\t {1}" , time .
Date .
ToString ( "M/d" ) , time .
Count ) ; }
}
}
}
}
dXNpbmcgU2dtbDsKdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLklPOwp1c2luZyBTeXN0ZW0uTGlucTsKdXNpbmcgU3lzdGVtLk5ldDsKdXNpbmcgU3lzdGVtLlRleHQ7CnVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKdXNpbmcgU3lzdGVtLlhtbC5MaW5xOwoKLy8gU2dtbFJlYWRlcuOBq+S+neWtmOOBl+OBpuOBhOOBvuOBmSAoaHR0cHM6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi50Lm9yZy9wYWNrYWdlcy9TZ21sUmVhZGVyLykKLy8g44Kw44Op44OV5L2c5oiQ44Gr44Gv44Kk44O844Kw44Op44OV44KS5L2/55So44GX44Gm44GE44G+44GZIChodHRwczovL2UuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmguY29tLykKLy8gQUlMReOBj+OCk+Wkp+WlveOBjQoKbmFtZXNwYWNlIENvbnNvbGVBcHBsaWNhdGlvbjEKewoJY2xhc3MgUHJvZ3JhbQoJewoJCXN0YXRpYyBYRG9jdW1lbnQgUGFyc2VIdG1sKFVyaSB1cmwpCgkJewoJCQl1c2luZyAodmFyIHN0cmVhbSA9IG5ldyBXZWJDbGllbnQoKS5PcGVuUmVhZCh1cmwpKQoJCQl1c2luZyAodmFyIHJlYWRlciA9IG5ldyBTdHJlYW1SZWFkZXIoc3RyZWFtLCBFbmNvZGluZy5HZXRFbmNvZGluZygiRVVDLUpQIikpKQoJCQl1c2luZyAodmFyIHNnbWxSZWFkZXIgPSBuZXcgU2dtbFJlYWRlciB7IERvY1R5cGUgPSAiSFRNTCIsIENhc2VGb2xkaW5nID0gQ2FzZUZvbGRpbmcuVG9Mb3dlciwgSWdub3JlRHRkID0gdHJ1ZSwgSW5wdXRTdHJlYW0gPSByZWFkZXIgfSkKCQkJewoJCQkJcmV0dXJuIFhEb2N1bWVudC5Mb2FkKHNnbWxSZWFkZXIpOwoJCQl9CgkJfQoKCQlzdGF0aWMgSUVudW1lcmFibGU8VXJpPiBQYXJzZVRocmVhZChVcmkgdXJsKQoJCXsKCQkJdmFyIGJhc2VVcmwgPSBuZXcgVXJpKCJodHRwOi8vai4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYS5uZXQiKTsKCQkJdmFyIHBhdHRlcm4gPSAiXigvYmJzL3JlYWQuY2dpL3wvaW50ZXJuZXQvMjAxOTYvc3RvcmFnZS8pIjsKCQkJcmV0dXJuIFBhcnNlSHRtbCh1cmwpCgkJCQkuRGVzY2VuZGFudHMoImEiKQoJCQkJLlNlbGVjdCh4ID0+IHguQXR0cmlidXRlKCJocmVmIikuVmFsdWUpCgkJCQkuV2hlcmUoeCA9PiBSZWdleC5Jc01hdGNoKHgsIHBhdHRlcm4pKQoJCQkJLlNlbGVjdCh4ID0+IG5ldyBVcmkoYmFzZVVybCwgeCkpOwoJCX0KCgkJc3RhdGljIERhdGVUaW1lIFBhcnNlRGF0ZVRpbWUoVXJpIHVybCkKCQl7CgkJCXZhciB1bml4dGltZSA9IG5ldyBEYXRlVGltZSgxOTcwLCAxLCAxLCAwLCAwLCAwLCBEYXRlVGltZUtpbmQuVXRjKTsKCQkJdmFyIHRpbWUgPSB1cmwuU2VnbWVudHNbMV0gPT0gImJicy8iCgkJCQk/IFJlZ2V4Lk1hdGNoKHVybC5TZWdtZW50c1s1XSwgQCJeKFxkKykvJCIpCgkJCQk6IFJlZ2V4Lk1hdGNoKHVybC5TZWdtZW50c1s0XSwgQCJeKFxkKykuaHRtbCQiKTsKCQkJdmFyIHNlY29uZCA9IEludDMyLlBhcnNlKHRpbWUuR3JvdXBzWzFdLlRvU3RyaW5nKCkpOwoJCQlyZXR1cm4gdW5peHRpbWUuQWRkU2Vjb25kcyhzZWNvbmQpOwoJCX0KCgkJc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQoJCXsKCQkJdmFyIHN1YmplY3QgPSBuZXcgVXJpKCJodHRwOi8vai4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYS5uZXQvYmJzL3N1YmplY3QuY2dpL2ludGVybmV0LzIwMTk2LyIpOwoJCQl2YXIgc3RvcmFnZSA9IG5ldyBVcmkoImh0dHA6Ly9qLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5hLm5ldC9iYnMvc3RvcmFnZS5jZ2kvaW50ZXJuZXQvMjAxOTYvIik7CgoJCQl2YXIgdGltZXMgPSBQYXJzZVRocmVhZChzdWJqZWN0KQoJCQkJLkNvbmNhdChQYXJzZVRocmVhZChzdG9yYWdlKSkKCQkJCS5TZWxlY3QoUGFyc2VEYXRlVGltZSkKCQkJCS5PcmRlckJ5KHggPT4geCkKCQkJCS5Hcm91cEJ5KHggPT4geC5EYXRlKQoJCQkJLlNlbGVjdCh4ID0+IG5ldyB7IERhdGUgPSB4LktleSwgQ291bnQgPSB4LkNvdW50KCkgfSk7CgoJCQl2YXIgcGF0aCA9IEAiLi4vLi4vLi4vLi4vdGltZS50c3YiOwoJCQl1c2luZyAodmFyIHN0cmVhbSA9IEZpbGUuT3BlbihwYXRoLCBGaWxlTW9kZS5DcmVhdGUpKQoJCQl1c2luZyAodmFyIHdyaXRlciA9IG5ldyBTdHJlYW1Xcml0ZXIoc3RyZWFtLCBFbmNvZGluZy5HZXRFbmNvZGluZygic2hpZnQtamlzIikpKQoJCQl7CgkJCQl3cml0ZXIuV3JpdGVMaW5lKCJcdOOCueODrOaVsCIpOwoJCQkJZm9yZWFjaCAodmFyIHRpbWUgaW4gdGltZXMpCgkJCQl7CgkJCQkJaWYgKHRpbWUuRGF0ZS5ZZWFyID09IDE5NzApCgkJCQkJCXdyaXRlci5Xcml0ZUxpbmUoIuWJiumZpFx0ezB9IiwgdGltZS5Db3VudCk7CgkJCQkJZWxzZQoJCQkJCQl3cml0ZXIuV3JpdGVMaW5lKCJ7MH1cdHsxfSIsIHRpbWUuRGF0ZS5Ub1N0cmluZygiTS9kIiksIHRpbWUuQ291bnQpOwoJCQkJfQoJCQl9CgkJfQoJfQp9Cg==
compilation info
prog.cs(1,7): error CS0246: The type or namespace name `Sgml' could not be found. Are you missing a using directive or an assembly reference?
prog.cs(9,18): error CS0234: The type or namespace name `Linq' does not exist in the namespace `System.Xml'. Are you missing an assembly reference?
Compilation failed: 2 error(s), 0 warnings
stdout