Form: http://www.voidclass.com/PermaLink,guid,854ccf18-1516-4b81-9390-9187f4619d70.aspx
我有个习惯。喜欢在计算机上播放一段音乐或评书,然后躺在床上,在饱满听觉享受中进入梦香。
前一段时间我找到一个免费在线收听评书的网站。无论从内容还是速度上都比较满意,但是没有连续收听的功能。一段评书播放完了,我还没睡着呢。郁闷!! :(
于是着手解决这个网站连续播放的问题。
方法很简单,在播放器播放结束的时候,打开“下一页”超链接所指定的网址就可以进入下一段评书的播放了。
那么有三个问题需要解决:
1) 捕获播放器播放结束事件;
2) 获取“下一页”超链接所指定的地址;
3) 将我的脚本程序插入到网页中,并执行。
第一个问题:该网站使用的是RealPlayer播放器,我在Google上找了一下,关于RealPlayer的资料大多是一些如何加密和控制播放器等等。还好最后在RealNetworks官方网站找到了有RealPlayer事件捕获的资料。(Embedded RealPlayer Extended Functionality Guide)
可使用如下代码实现:
<OBJECT ID=RVOCX CLASSID="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA">
<PARAM NAME="controls" VALUE="all">
<PARAM NAME="SRC" VALUE="http://www.company.com/sample.rpm">
</OBJECT>
<P>
Status Text:
<input type="text" name="statusText">
<br>
</P>
<SCRIPT language="VBS">
Sub RVOCX_OnShowStatus(byVal text)
statusText.Value=text
End Sub
</SCRIPT>
RealPlayer并没有直接提供一个播放结束事件,但是RealPlayer提供了OnPlayStateChange和OnStateChange。通过这两个事件可以实现播放结束的捕获。
OnPlayStateChange
定义:OnPlayStateChange(int32 old_state, int32 new_state)
参数说明:
Parameter Value | Play State |
0 | Stopped |
1 | Contacting |
2 | Buffering |
3 | Playing |
4 | Seeking |
5 | Paused |
当使用ActiveX控件时,old_state参数无效。如果需要在ActiveX控件编程方式下同时使用old_state和new_state两个参数,可以使用OnStateChange事件。
OnStateChange
定义:OnStateChange(int32 old_state, int32 new_state)
参数说明:同上。
注意:OnStateChange仅适用于ActiveX控件。
第二个问题:获得“下一页”的链接。不详细说明了,就是HTML分析。
第三个问题:将我写的脚本插入网页。可以通过IE提供的insertAdjacentHTML方法来实现。
注意:在使用insertAdjacentHTML向网页中插入脚本时,一定要在<Script>元素中加入"DEFER"属性。(<SCRIPT DEFER LANGUAGE="VBS">)
Ok,所有的问题都解决了。新建一个WinForm项目,摆上一个WebBrowser,在OnDocumentComplete中写入代码。
Code:
begin
get & parse html
get "next page" link
// script
<SCRIPT DEFER LANGUAGE="VBS">
Sub (playerid)_OnStateChange(old_state, new_state)
if new_state = 0 & old_state = 3 then
goto "next page" link
End Sub
</SCRIPT>
get player object
player.insertAdjacentHTML('afterEnd', script)
end;