I Really Follow this Blog

你確定要離開這個網頁瀏覽?ㄚ琪發現了程式無法真正的成為別人Goolge Friend Connect的朋友,ㄚ琪苦惱了很多天,頭髮可能又多掉了幾根,這幾天不但很虔誠地做禱告,而且讀經文也很用心,主要是為了個人的智慧目前不足以克服程式的問題,終於經過了3天的祈禱,聖靈給了我一個靈感,要我再細讀一次我所Google到的這一篇c# webbrowser跨域存取iframe的方法,裡頭所帶出的一篇原文 When IHTMLWindow2.document throws UnauthorizedAccessException,ㄚ琪首先碰到的第一個問題就是,Google Blogger裡頭有很深的Ajax程式內嵌在頁面中,每個Gadget(小工具)裡頭可能都會有javascript、Ajax跟iframe的元素標籤在裡面執行著,這讓採礦的程式很難挖,因為ㄚ琪的程式一開始無法挖到iframe裡頭的資料,而這個癥結點在於微軟的webbrowser的元件無法跨網域的處理frame內的資料,一開始看這篇文章時,因為我沒有"Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))"這樣的錯誤,所以就放棄閱讀了,但是到最後去看微軟的MSDN才發現到原來跨網域的frame處理學問很大,牽涉到安全的問題,所以不開放讓你用,而且Goolge的時候,也很難找到處理的方法,說真的,可能這一篇是唯一的解法。

我直接拿了原始碼來用:

using System.Reflection;
using mshtml;
HtmlDocument main_formDoc = webBrowser1.Document;
IHTMLDocument2 main_mshtmlIHTMLDoc = (IHTMLDocument2)main_formDoc.DomDocument;
Object frame_index = 1;
IHTMLWindow2 target_mshtmlIHTMLWindow = (IHTMLWindow2)main_mshtmlIHTMLDoc.frames.item(ref frame_index);
IHTMLDocument2 target_mshtmlIHTMLDoc = CodecentrixSample.CrossFrameIE.GetDocumentFromWindow(target_mshtmlIHTMLWindow);

再加上CodeCentrix所附的http://www.codecentrix.com/blog/wnd2doc_csharp/GetDocumentFromWindowCsharp.zip裡頭編譯的Interop.SHDocVw.dll跟CodecentrixSample.dll來用,後來我發現我不會用,索性直接拿他的程式碼來改,Yes!終於可行,呼,這一個鐵板,ㄚ琪弄到昨天才做好,花了很多天,很累,挫折感也很大,不可天可憐見,還是克服了這個難題!

再來就是要模擬點擊Follow這個看起來是按鈕,可是它其實是用javascript跟Ajax產生的

<div jstcache="0" class="gfc-icon">Follow</div>

的這樣語法,你可以參考Friend Connect的API說明可以瞭解,ㄚ琪一開始沒辦法模擬點擊這個按鈕,所以改採點擊Sign in的連結,這一次處理的時間較短,很快就可以點擊出另一個視窗,注意這個連結也不是真的連結,而是

帶有 <a jstcache="57" href="javascript:void(0);" jscontent="MSG_SIGN_IN" jsvalues="$h:handle(this,’signin’)">Sign in</a>,這樣的Javascript跟Ajax的語法,但是還好mshtml.IHTMLElement可以處理。

接下來的挑戰就是處理點擊連結所跳出來的視窗,ㄚ琪不知這個視窗是否程式也可以控制,很快地Google到【.NET菜鳥自救會】 的[C#]透過 SHDocVw 與 GetForegroundWindow 取得正在使用的 Internet Explorer 網址給ㄚ琪這隻C#菜鳥很大的幫助,直接參考這段程式碼:

this.lbURL.Items.Clear();

// 取得目前 Shell 的所有視窗
SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindowsClass();
foreach (SHDocVw.InternetExplorer ie in shellWindows)
{
    // 判斷視窗是否為 iexplore
    if (Path.GetFileNameWithoutExtension(ie.FullName).ToLower().Equals("iexplore"))
    {
        this.lbURL.Items.Add(ie.LocationURL);
    }
}

賓果可以控制這個新彈出的視窗,而且馬上可以用程式來關閉,太帥了!

今天終於可以翹起腿來休息看電視了,好久沒看瘋台灣了,ㄚ琪再細修一下程式應該就可以結案了!

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *