1

我想在我的 C#-Program 中从 streamcloud 中提取下载 url。因此,我必须等待 10 秒钟,单击一个按钮,然后单击播放器。然后我可以从页面源中提取下载 url。

我的问题:

我有两种方法可以做到这一点:

  1. 自动:我必须在 10 秒后模拟单击按钮。但我的 HtmlElement 始终为空。

  2. 手动:我创建了一个带有 WebBrowser 控件的表单。但是这个控件没有显示例如按钮。我认为 WebBrowser 控件正在阻止所有 jscript 内容。有没有办法让 WebBrowser 显示所有内容?

还是有其他方法可以获取下载地址?

4

2 回答 2

1

如果您想在安装了浏览器(IE 或 Firefox)的机器上执行此操作,您可以使用任何框架进行自动化测试。WatiN是一个很好的选择。

像这样的东西:

using (var browser = new IE("http://www.streamcloud.com/YOUR_VIDEO_URL"))
{
    browser.Button(Find.ByName("Play")).Click();
    // wait for 10 seconds, or better use some WatiN functionality like WaitUntilExists
    System.Threading.Thread.Sleep(10000);
    // extract URL
    var element = browser.Element(Find.ById("URL_CONTAINER_ID"));
    string videoUrl = element.Text;
}
于 2012-12-10T19:16:13.027 回答
0

只需使用 httpwebrequest 或 webclient:

public string ResolveStreamcloud(string url)
{
    var client = new WebClient();
    var reqParams = new NameValueCollection();

    var response = client.DownloadString(url);

    var regexObj = new Regex("<input.*?name=\"(.*?)\".*?value=\"(.*?)\">", RegexOptions.Singleline);
    var matchResults = regexObj.Match(response);
    while (matchResults.Success)
    {
        reqParams.Add(matchResults.Groups[1].Value, matchResults.Groups[2].Value);
        matchResults = matchResults.NextMatch();
    }

    Thread.Sleep(10500);

    byte[] responsebytes = client.UploadValues(url, "POST", reqParams);
    string responsebody = Encoding.UTF8.GetString(responsebytes);

    string resolved = Regex.Match(responsebody, "file: \"(.+?)\",", RegexOptions.Singleline).Groups[1].Value;

    if (!String.IsNullOrEmpty(resolved))
    {
        return resolved;
    }
    else
    {
        throw new Exception("File not found!");
    }

}
于 2014-07-01T16:14:12.527 回答