我创建了一个程序,它将搜索一个页面HTML源代码并返回一个指定的字符串是否存在,虽然它总是返回false,有人看看我错过了什么吗?
Private Const QUOTE As Char = """"c
Private Sub ServerStatus_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'download the page source and store it here
Dim sourceString As String = New System.Net.WebClient().DownloadString("https://support.rockstargames.com/hc/en-us/articles/200426246")
'call the source and validate a string exists, if not
If (sourceString).Contains($"<div class={QUOTE}panel-base xbl{QUOTE} style={QUOTE}background-color: RGB(236, 255, 236);{QUOTE}><div class={QUOTE}marshmallowLogo{QUOTE} id={QUOTE}xboxLogo{QUOTE}>Xbox 360</div><center><span class={QUOTE}statusSpan{QUOTE} style={QUOTE}color green;{QUOTE}>Up</span></center>") = True Then
Label1.Text = "It's there"
' if it does
ElseIf (sourceString).Contains($"<div class={QUOTE}panel-base xbl{QUOTE} style={QUOTE}background-color: RGB(236, 255, 236);{QUOTE}><div class={QUOTE}marshmallowLogo{QUOTE} id={QUOTE}xboxLogo{QUOTE}>Xbox 360</div><center><span class={QUOTE}statusSpan{QUOTE} style={QUOTE}color green;{QUOTE}>Up</span></center>") = False Then
Label1.Text = "It's not"
End If
End Sub
结束班
答案 0 :(得分:1)
所以我花了几分钟来分析页面(欢迎你),并且如评论中所示,数据是通过javascript加载的,并且不存在于原始URL返回的基本html中。我还不是100%肯定,但我想你真的想看看这个地址:
https://supportfiles.rockstargames.com/support/serverStatus.json
返回如下响应:
jsonCallbackStatus(
{
"statuses":
{
"psnUpOrDownOverride": "",
"ps4UpOrDownOverride": "",
"xboxUpOrDownOverride": "",
"xboxOneUpOrDownOverride": "",
"rgscUpOrDownOverride": "",
"psnWarningOverrideMessage": "",
"ps4WarningOverrideMessage": "",
"xboxWarningOverrideMessage": "",
"xboxOneWarningOverrideMessage": "",
"rgscWarningOverrideMessage": "",
"pcWarningOverrideMessage": "",
"pcUpOrDownOverride": "",
"giantWarningOverrideMessage": ""
},
}
);
如果我正确读到这个,每个项目旁边的空字符串意味着没有错......没有新闻是好消息。这应该比所有html更容易解析:)不要忘记查看平台的警告和上/下状态,以及giantWarningOverrideMessage
。
这样的数据几乎总是以三种方式之一:json,rss(或类似的xml)或web服务(soap)。 Web服务通常会在服务器上加载和解析,然后使用html发送,并且rss在javascript中难以解析而且最近不太流行,所以我先去了json。
我开始在chrome中打开页面。然后我打开了开发人员工具( F12 )并选择了Network
选项卡。现在,当我刷新页面时,我得到了从该页面的Web服务器下载的每个项目的列表。 1 然后我只是通过查看javascript下载(JS
来缩小列表范围。工具栏中的按钮......我正在寻找一个json响应)。这给了我一个合理数量的项目,我可以通过查看200
状态响应进一步缩小搜索范围,我只看到两个:来自这个地址。
请注意,完整地址实际上如下所示:
页面中有一个错误,因为两次callback
url参数没有任何意义,特别是具有相同的值。我只是因为_
url参数而提出这个问题。从该值中删除最后3位数字,最终得到的是与今天的日期匹配的unix时间戳。您可能希望生成包含此类时间戳的URL,因为Rockstar可能会使用服务器上的时间戳来避免提供缓存响应。你不想在一小时前收到一个缓存的响应,如果服务器现在关闭,一切都很好。
最后提醒一下:我不是100%确定这是您需要的数据。它可能来自另一个请求。但这是你得到的所有免费:)希望写下我如何得到这一点足以让你做自己的侦探工作验证结果。
当然,您也可以选择使用WebBrowser控件来运行javascript。但它的方式更慢,你回到解析丑陋的html,任何小的html更改都会破坏你的代码(而json结果可能会通过几个网站重新设计)。
Dim unixTime As ULong = (DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0)).TotalMilliSeconds
Using wc As New WebClient(),
rdr As New StreamReader(wc.OpenRead($"https://supportfiles.rockstargames.com/support/serverStatus.json?_={unixTime}"))
Dim line = rdr.ReadLine()
While line IsNot Nothing
line = line.Trim()
If line.StartsWith("""xboxUpOrDownOverride") Then
Dim parts = line.Split(":".ToCharArray())
parts(1) = Regex.Replace(parts(1), "[ "",]", "")
If parts(1).Length > 0 Then
Console.WriteLine("Up/Down Failed")
Else
Console.WriteLine("Up/Down Okay")
End If
End If
If line.StartsWith("""xboxWarningOverrideMessage") Then
Dim parts = line.Split(":".ToCharArray())
parts(1) = Regex.Replace(parts(1), "[ "",]", "")
If parts(1).Length > 0 Then
Console.WriteLine("Warning Failed")
Else
Console.WriteLine("Warning Okay")
End If
End If
If line.StartsWith("""giantWarningOverrideMessage") Then
Dim parts = line.Split(":".ToCharArray())
parts(1) = Regex.Replace(parts(1), "[ "",]", "")
If parts(1).Length > 0 Then
Console.WriteLine("Giant Warning Failed")
Else
Console.WriteLine("Giant Warning Okay")
End If
End If
line = rdr.ReadLine()
End While
您还应该考虑使用真正的json解析器(通过NuGet非常容易),因为即使是添加最小化器这样简单的事情也会通过将所有内容推入一行来破坏现有代码。
1 并且已经下载了批次。 Rockstar应该投资捆绑商,以最大限度地减少http请求,以加快页面加载速度和降低带宽,尤其是在移动设备上。
答案 1 :(得分:0)
任何不能使用VS2015(VB14)的人的参考代码:
Private Const QUOTE As Char = """"c
Private Sub ServerStatus_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'download the page source and store it here
Dim sourceString As String = New System.Net.WebClient.DownloadString("https://support.rockstargames.com/hc/en-us/articles/200426246")
'call the source and validate a string exists, if not
Label1.Text = If(sourceString.Contains(String.Format(
"<div class={0}panel-base xbl{0} style={0}background-color: RGB(236, 255, 236);{0}><div class={0}marshmallowLogo{0} id={0}xboxLogo{0}>Xbox 360</div><center><span class={0}statusSpan{0} style={0}color green;{0}>Up</span></center>",
QUOTE)),"It's there", "It's not")
End If
End Sub
End Class