首先,英语是我的外语。 在 C# 下,我试图将 POST http 请求发送到 forvo.com(带有单词发音的银行)以获取带有某个单词发音的音频文件(流)。例如,我想单击button1并听从forvo.com网站获得的单词“stack”的发音。为此我有一个代码:
using (var wb = new WebClient())
{
var data = new NameValueCollection();
data["LANGUAGE_ID"] = "39";
data["WORD"] = "someword"; //this tag doesnt make effect to request
//var response = wb.UploadValues("http://www.forvo.com/search/", "POST", data);
byte[] responseArray = wb.UploadValues("http://www.forvo.com/search/data", "POST", data);
File.WriteAllBytes(Path.GetDirectoryName(Application.ExecutablePath) + "\\fi2le.html", responseArray);
}
通过这些操作,我试图获取音频文件的链接。查看 file.html 后,我看到这些字符串
<a href="/word/data/#en" title="Listen data pronunciation" onclick="Play(38630,'ODk3NTU5NS8zOS84OTc1NTk1XzM5XzE3MjNfMjI4MjAubXAz','ODk3NTU5NS8zOS84OTc1NTk1XzM5XzE3MjNfMjI4MjAub2dn');return false;" rel="nofollow"><img src="/_presentation/img/ico_play.gif" alt="data pronunciation" id="play_38630" width="23" height="23" /></a><a href="/word/data/#en" title="data pronunciations">data</a> and others looking similiar.
我可以用这些 js 函数做什么或者它是什么?
我是网络编程新手,对js一无所知。 我知道 forvo.com 对于像我这样的任务有自己的 API,但我正在尝试在没有 API 的情况下实现它。
最佳答案
看看这里发生了什么,点击图标会触发 Javascript Play()
函数。
此函数对传递给它的基本 64 编码值进行解码,并使用它们来查找要播放的相关文件,以及您使用的浏览器是否能够理解 audio
元素 (HTML5)在其中播放它,或者,如果没有,它会创建一个 Flash 播放器在其中播放它。
如上所述,Play()
函数的第二个和第三个参数是要播放的文件的 Base-64 编码 URI。它们可以非常简单地解码,如下所示(示例是控制台应用程序):
static void Main()
{
string base64a = "ODk3NTU5NS8zOS84OTc1NTk1XzM5XzE3MjNfMjI4MjAubXAz";
string base64b = "ODk3NTU5NS8zOS84OTc1NTk1XzM5XzE3MjNfMjI4MjAub2dn";
Console.WriteLine(Encoding.Default.GetString(Convert.FromBase64String(base64a)));
Console.WriteLine(Encoding.Default.GetString(Convert.FromBase64String(base64b)));
Console.ReadKey();
}
如果你运行这个,你会发现它们转换为:
8975595/39/8975595_39_1723_22820.mp3
8975595/39/8975595_39_1723_22820.ogg
Play
函数中有一些逻辑来确定使用哪一个,但最终,我最终播放以下文件:
http://audio.forvo.com/mp3/8975595/39/8975595_39_1723_22820.mp3
这项工作需要在 Javascript 中完成,因为很大程度上取决于发出请求的浏览器或设备,如上面突出显示的(例如 HTML5 功能)
不过,我必须补充一点,虽然这有望解释正在发生的事情,但我怀疑它作为解决方案是否有任何用处;由于付费墙存在 500 个请求,我原以为他们会在一段时间内监视来自同一 IP 地址的多个请求,并会阻止任何此类避免付款的地址。
关于c# - 如何在 C# 下向网络服务器发送执行 js 功能的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25069734/