(C#/ PHP)如何从wesbite获取信息?

时间:2016-09-19 21:08:06

标签: c# php

所以,我一直试图让我的C#代码进入网页,并在这里抓取一些东西是C#代码我试过这个:

private void Form1_Load(object sender, EventArgs e)

    {
        webBrowser1.Navigate("mywebsite.com/versioncheck.php?version=" + version"&key="+ key.Text"");
        webBrowser1.DocumentCompleted += VersionCheck;
    }
        private void VersionCheck(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            webBrowser1.DocumentCompleted -= VersionCheck;
            if (webBrowser1.DocumentText.Contains("newversion"))
            {
                MessageBox.Show("Theres a new version ready to download!");
            }
        }

但我无法使用我的PHP代码来实现它:

$version = "2.0";
if($_GET["version"] == $version) {
    echo "nonew";
} else {
    echo "newversion";
}

我试图获取C#代码转到mywebsite.com/versioncheck.php?version=XX&key=XXXXXXXXX,然后检查网站上的单词,但现在我的c#代码只返回错误我

3 个答案:

答案 0 :(得分:3)

也许如果您真的打扰阅读这些错误:

[..snip..] + version"&key="+ key. [..snip..]
                    ^---huh?

您错过了+

答案 1 :(得分:2)

这很简单,您就在附近,可以在 DocumentCompleted 处理程序

中删除此代码段

注意:您不能使用 GetElementsByName 来触发您的提交按钮,因为它没有名称属性或ID属性

var radioClick = webBrowser1.Document.GetElementsByTagName("input").GetElementsByName("chosen").OfType<HtmlElement>()
            .Where(x => x.Id == "a2").FirstOrDefault()
            .InvokeMember("Click");

var buttonClick = webBrowser1.Document.GetElementsByTagName("input").OfType<HtmlElement>()
            .Where(html => html.GetAttribute("type").Equals("submit") && html.GetAttribute("value").Equals("Next")).FirstOrDefault()
            .InvokeMember("Click");

我正在尝试让我的webbrowser1单击/选择一个单选按钮,然后单击 只需单击没有任何ID或名称的提交按钮。

但是您的HTML似乎有一个ID和名称(除了Button之外),不过我们可以使用元素的GetAttribute(“ value”)

var radioBoxValue = "1";
var submitButtonValue = "Next";

//Click Radio Box
var findRadioBox = webBrowser1.Document.GetElementsByTagName("input").OfType<HtmlElement>()
                .Where(html => html.GetAttribute("type").Equals("radio") && html.GetAttribute("value").Equals(radioBoxValue)).FirstOrDefault();
findRadioBox.InvokeMember("Click");

//Click Button
var findsubmitButton = webBrowser1.Document.GetElementsByTagName("input").OfType<HtmlElement>()
                .Where(html => html.GetAttribute("type").Equals("submit") && html.GetAttribute("value").Equals(submitButtonValue)).FirstOrDefault();
 findsubmitButton.InvokeMember("Click");

 //Unsubscribing from the document completed event, there are times when you will run into situations where documentcompelted will fire multiple times
 webBrowser1.DocumentCompleted -= webBrowser1_DocumentCompleted;

完整代码段

private async void button1_Click(object sender, EventArgs e)
{

    string url = @"https://localhost:5001/Home/Index";
    webBrowser1.AllowNavigation = true;
    webBrowser1.Navigate(url);
    this.webBrowser1.DocumentCompleted +=  webBrowser1_DocumentCompleted;

}

private async void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{

    var radioBoxValue = "1";
    var submitButtonValue = "Next";

    //Click Radio Box
    var findRadioBox = webBrowser1.Document.GetElementsByTagName("input").OfType<HtmlElement>()
                .Where(html => html.GetAttribute("type").Equals("radio") && html.GetAttribute("value").Equals(radioBoxValue)).FirstOrDefault();
    findRadioBox.InvokeMember("Click");

    //Click Button
     var findsubmitButton = webBrowser1.Document.GetElementsByTagName("input").OfType<HtmlElement>()
                .Where(html => html.GetAttribute("type").Equals("submit") && html.GetAttribute("value").Equals(submitButtonValue)).FirstOrDefault();
    findsubmitButton.InvokeMember("Click");

    //Unsubscribing from the document completed event, there are times when you will run into situations where documentcompelted will fire multiple times
    webBrowser1.DocumentCompleted -= webBrowser1_DocumentCompleted;


}

enter image description here

答案 2 :(得分:0)

您的单选按钮具有<video controls="" autoplay="" name="media"><source src="https://storage.googleapis.com/plataforma-redacao/1583013110538y2mate.com%20-%20OZZY%20OSBOURNE%20-%20Under%20The%20Graveyard%20%28Official%20Audio%29_fMAAMfHgO4Q_720p.mp4?GoogleAccessId=plataforma-redacao%40redacao-269717.iam.gserviceaccount.com&amp;Expires=1583025155&amp;Signature=bScPwZkEhJVjt8mEQMT0BeE8CdQLoqPb5CrxLd%2BLUTd%2BF6ypL3eNVe3oGSxiRM4nWpfESlA32PgsrQ417%2FZrWuT%2FxZoeyQmSxW0G4ksZjG%2FNWBnsMGBRP7D6a2nJsuS%2BYy82anismfaBKtKEhTRhF6EehC3YRQD5BqgeJ8Q4yU3u9IeI9WWwr8aeQJUt2PafWiNADGz9rk4hR%2BdWl3SHR5sj9fZf6k8%2BSyW3ZKPsd%2BzGGrX6QhpkKYXCxf%2FioedEClbFriWKYfKhpZGvkSdmYSv9ZHHUD0%2ByjiXRHWZrO8QOvIQd2kUDATC%2B6EARuHk0jcQmapOAkm2S4k6rwwolbg%3D%3D" type="video/mp4"></video>属性,您可以选择使用id查找它们。同样,要按名称获取元素,您可以使用GetElementById

但是,假设您要根据其他条件(例如,基于GetElementByNamevalue属性来查找元素,则可以通过type获取元素集合或通过得到Document.GetElementByTagName,要应用更多过滤器,您可以使用Document.All将集合强制转换为IEnumerable<HtmlElement>,然后使用linq过滤结果。

您应该在文档完成后尝试查找元素,通常应将代码放入Cast<HtmlElement>事件处理程序中。在某些情况下,例如,当页面使用ajax请求加载时,您需要稍等片刻才能使页面加载。

示例-单击单选按钮并提交

DocumentCompletet