前面兩個例子分別是需登入與非登入的上傳。接著要介紹一個也是需登入的上傳,但它是屬郵空類型~

當然,這篇也是擋修,而且擋的非常的嚴重喔~


這空間的登入,有一個叫版本的下拉選項。其中我要示範的是"极速" 這個版本~ (因為极速以上的粉夭壽、极速以下 又粉沒水準,所以就選极速囉    )

http://www.126.com/

好,那登入一樣用PostData 來寫就好了~    【03-網頁控制類】

GetACcount()
IFNo:end
postdata:postdata:http://entry.mail.126.com/cgi/login?hid=10010102&lightweight=1&language=0&style=1?
domain=126.com&language=0&bCookie=&user=***LoginID***&pass=***LoginPW***&style=1&enter.x=%B5%C7+%C2%BC

接著就是來加一個是否成功登入的偵錯~

這裏我們發現,它會先有個畫面來顯示登入進度,然後才會進入郵件的畫面~

所以我們得預防因為這個加載中畫面出來會被NT 判定為 PostData  指令已完成而將程序往下走!!

所以我們可以採用下面的方式來寫~

GetACcount()
IFNo:end
postdata:postdata:http://entry.mail.126.com/cgi/login?hid=10010102&lightweight=1&language=0&style=1?
domain=126.com&language=0&bCookie=&user=***LoginID***&pass=***LoginPW***&style=1&enter.x=%B5%C7+%C2%BC
sleep(3)
WaitWebText:退出,5,begin

先給它三秒來跑那個載入中的畫面,接著在給五秒預防~ 偵錯的字串以登入後,才會出現的"退出"為關鍵字~

假設八秒內還無法登入,那就再重新登入一次!! (基本上用極速的版本來登入是粉快的,頂多三秒就粉夠了)

 

好,成功登入後。那就要來按"写信"了~

那一樣開DEBUG 看,就會看到欄位訊息了~ (若你看不到簡體字,就先安裝 字型補完計畫  。建議用2.45版的比較不會與Office 衝到 )

所以要按這個鈕就用其value 來當參數即可~     【03-網頁控制類】

ClickButton:写信

 

進信件頁面後,就是要來填 收信者、信件主題、信件內容與填上附件檔,最後就是按下送出就是囉~

本來我們會先在格子填上中文字,再用DEBUG 來自動生成指令。但你會發現,除了收信者與主題外,其它都看不懂 @@"

所以我改用DEBUG 控制項選INPUT 的方式來自已看~

如上圖 (有點小亂),我們從左而右,由上而下看起~

先看发送~

它有兩個地方可按,一個是在 INPUT 8 的地方,另一個是在 INPUT 32 的地方。兩個的VALUE 都一樣,只差在第二個有name值而已~

所以我們可以用 ClickButton:发送    【03-網頁控制類】

再看 附件~

圖中一樣有兩個地方可按,不過我們只在 INPUT 10 的地方有看到。另一個就該是用SCRIPT 來按了~

那二話不說,挑軟的下手…

ClickButtonNext:附件    【03-網頁控制類】 

( 另一個附件的按法:      runscriptnext:indexFrame.fGoto('add')      請參考附錄一 )       

好,會按後,突然現現一件事!!  在未按下附件前,上圖中是沒有檔案欄位的 !! (可開DEBUG 選INPUT 下去看,沒一個欄位的TYPE 是 file 的 )

這下挫賽了,這欄位肯定又是動態生成的了…

不知大家是否還記得在基礎教學2 曾舉過的例子,  http://www.mediafire.com/ ,它的 file 那欄也是動態生成的~

不過這個空間可不是那麼簡單~  它這格是屬陣列型的,不像 mediafire 是由SERVER 生成固定死死的一格,而是可由USER即時動態增減的…

如下圖,當我有動到前一次即時生成的FILE 那欄後,它在Name 的部份就會變動,變成是 ATTACHFILE?

如此一來,當我們寫信頁面不是一次開成或要寫強迫上傳時,就會發生FILE 這格的欄位名稱不固定的情形!!

所以變成說,我們也得配合它的設計方式,在按下附件後,也即時去得到它成生的欄位名!!

唉,真是粉厚工!! 不過, 這也只是悲慘的剛開始而已啦…  後面還有你受的…

 

好!抱怨完後,教學還是要繼續寫!  要即時取得欄位的資訊,那想到的就該是  WebStrToVariable:  吧!!   【03-網頁控制類】

那大家應該還記得前面有教過,這個指令的兩個參數,得以NT偵測到的原始檔為主吧!! (忘記的人請回頭重修)

所以,我們就按下NT 的【檢視原始檔鈕】來看!!   不看還好,一看就完全傻眼…  這是啥米鬼東西… 一個中文字也沒有~

原因是出在我們檢視到是該網頁中的最頂層,即父層!! ( 此觀念請參考 附錄一 )

所以自然只會看到一大堆框架組而已… XD

那就先在頁面按右鍵,看它的網址,然後再用go 來看就行了~ ( 你應該想的跟我一樣,只過是白作工了)

當我下了 GO:http://mimg.126.com/jsstyle/html/gblank0611020945.htm 後,它出現了幾個錯誤訊息後,就卡在下面的頁面了… (看來這空間有下了某種防護機制!!)

這下真的麻煩大了!!  只能靠基本功了~!

好,那WebStrToVariable: 的參數要如何下呢?

首先因為 ATTACHFILE 是固定的,所以可以用它來當第一個參數,再來第二個參數,就用 ">"   ( 因為 網頁標籤是固定的格式 < INPUT … > )

WebStrToVariable:ATTACHFILE,>,***Variable2*** 

就會取到如下的值~

 2 type=file size=52 name=attachfile2 

所以我再把第一個參數改成 name=attachfile

WebStrToVariable:name=attachfile,>,***Variable2***

這次就正確取到了2 這個數字了!!

 

好,搞定即時取得欄位名稱的麻煩後,接下來就是套填入FILE 欄位的指令了~!

GetFile()
IFNo:end
WebStrToVariable:name=attachfile,>,***Variable2***
SetFileValue:ATTACHFILE***Variable2***=***File***

此時你會發現一個問題,跳出一個訊息如下圖:

看到這,我心裏就有底了。這空間該是下了某種防範…

因為它出現的是 存取被拒,而非找不到控制項!!! 所以並非是我們欄名下錯,而是安全性出了問題!!     

所以  SetFileValue 這指令在這空間是失效了…  

那我們只好自已來模擬 SetFileValue 這個指令了!!!  (愈來愈悲情了 )

 

大家應該還記得上傳的第一篇中,我有特地把 SetFileValue 這個指令的執行流程給列出來~ (忘記的人請回頭去看麻蛙上傳篇)

SetFileValue 指令的執行流程:

程式置頂 --> 把焦點移至參數一的欄位名稱上 ---> 用sendkey 的方式把參數二填上 (即鍵盤的 ctrl+v) ---> 失焦 ---> 比對參數一之值是否與參數二之值一樣 (若不符合則重新回到程式置頂繼續重覆) ----> 比對完成,將程序移往下一行

那我們就一步一步來模擬!!

程式置頂:

runscriptnext:self.focus();                【參考附錄一】

把焦點移至參數一的欄位名稱上:

有關焦點的指令,應該就是 SetTextFocus 或 SetFieldFocus 了!! 【03-網頁控制類】

不過這兩個指令並不支援框架頁~   

所以,我們只好再下scirpt 了!!   【參考附錄一】

runscriptnext:self.focus();var k1=indexFrame.document.all.tags('INPUT');for(i=0;i<k1.length;i++) if(k1.item(i).type=='file'){k1.item(i).focus();break;}     

用sendkey 的方式把參數二填上 (即鍵盤的 ctrl+v):

那當然是用 SendKeys: 這個指令囉…         【 08-其它指令】

SendKeys:***File***

不過要特別注意,用以上的方式填入,其值是累加上而非是覆蓋喔!!   

失焦:

runscriptnext:self.blur();      【參考附錄一】

比對參數一之值是否與參數二之值一樣:

這裏,我先把 ***File*** 的值填入郵件主題那格中,然後再來比對一下是否與 檔案欄位那格的值一樣!! 若一樣,就在主題那格填入"搞定"。

然後再下一個偵錯的指令,當頁面中出現"搞定"的時候,就算是比對成功!! 否則程序移往 re-input 的定位點,再重覆填入的動作!!

SetFieldValue:subject=***File***
runscriptnext:if(k1.item(i).value == indexFrame.document.all('subject').value){indexFrame.document.all('subject').value='搞定'}
FindWebText:搞定
IFNo:re-input

這裏定位點 re-input 就相當重要!! 因為當比對失敗時,得要清空檔案那格!! 下次填入時才不會又累加上去!!

所以re-input 必需設在 ClickButton:写信 的前面才行!! (前面費了番功夫去即時取得動態生成的欄名也就是為了這個偵錯)

 

整個模擬 SetFileValue 指令執行的流程如下:

GetFile()
IFNo:end
Label:re-input
ClickButton:写信
ClickButtonNext:附件
sleep()
SetFieldValue:subject=***File***
runscriptnext:self.focus();var k1=indexFrame.document.all.tags('INPUT');for(i=0;i<k1.length;i++) if(k1.item(i).type=='file'){k1.item(i).focus();break;}
SendKeys:***File***
runscriptnext:self.blur();
runscriptnext:if(k1.item(i).value == indexFrame.document.all('subject').value){indexFrame.document.all('subject').value='搞定'}
sleep()
FindWebText:搞定
IFNo:re-input

 

好,搞定附件後,接著便來看收信者與信件主題 !!

SetFieldValue:TO=收信址
SetFieldValue:subject=***FileName***

其中收信者要如何設計則等最後再說明~

先看郵件主題!! 這裏會填入檔案名稱是為了將來用DSL 或SMG、 GDL 下載時,可以有一個標誌可辦識~

以DSL或SMG 來說,在下載時可以勾【選擇郵件】,此時會列出信件標題,若我們是以檔案名稱為作為信件標題,那便會一目了然~ 直接選你缺的檔下即可~

以GDL來說,為了可以在信件列表頁就一次取完所有的附件連結,那信件標題為附件名稱是必要條件!! (相關原理請參考下一篇)

 

那最後就剩下信件內容這格了!!

這格非常的麻煩…  照理說,多行的就該是屬於 TEXTAREA ~

但你會發現我們在那格隨便填上比如"我愛小美"的字眼後,再切到DEBUG 中來看,沒有一個欄位的值是叫"我愛小美"的!!

好,那我們再回頭來看一下它!!

如圖,這格實在是太花俏了吧!!  與我們認識的 TEXTAREA  完全不像!!  ( 感覺不出來的回頭去基礎教學1重修吧)

所以,要用正規的指令來填入是不可能了,只能下 SCRIPT !!

因為這種格子粉常出現在需BLOG或郵件空間的本文上,所以我就再稍微解釋一下為何用正規的指令會填不上!!

<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0 height:287px>
<TBODY>
<TR>
<TD style="BORDER-RIGHT: #c5c5c5 1px solid; BORDER-TOP: #c5c5c5 0px solid; BORDER-LEFT: #c5c5c5 1px solid; BORDER-BOTTOM: #c5c5c5 1px solid">
<IFRAME class=HtmlEditor id=HtmlEditor style="WIDTH: 100%; HEIGHT: 286px" name=HtmlEditor src="blankpage.htm" frameBorder=0></IFRAME>
</TD></TR></TBODY></TABLE></DIV>
<SCRIPT language=JavaScript>
<!--
if(document.all){
document.write('<textarea ID="sourceEditor" style="height:280px;width:100%;display:none">');
}
//-->
</SCRIPT>
<TEXTAREA id=sourceEditor style="DISPLAY: none; WIDTH: 100%; HEIGHT: 280px" rows="1" cols="20">&lt;/body&gt;
&lt;/html&gt;
</TEXTAREA>

從上面這段來看就知,當寫信頁面(htmlletter)內的框架頁(HtmlEditor) 載入完成( document.all )時~

那段script 便會動態生成我們要輸入的信件內容那格元素(sourceEditor) !! 而且它有一個屬性style ,裏面有 display:none  的語法~

所以sourceEditor這個元素在整個 document flow中就會不存在!!  它會這樣設計的目的主要就是要用來搭css ,才可以讓這格 變的粉花俏點~

結果自然也就導致我們無法直接用   SetFieldValue:sourceEditor=信件內容    來填入!! 因為那格被蓋住了嘛 !!

既然用指定value 的方式來填值是不可行的!!  那就改用非正式的方法:直接更改BODY的innerText 即可!!

 runscriptnext:indexFrame.htmlletter.HtmlEditor.document.all.tags('BODY').item(0).innerText="我出運啦!"+"\n"+"教學總算快寫完了"

 

千辛萬苦,終於到了信件送出後的偵錯了~

如下,按下發送後,它會跳出一個對郵件掃瞄的訊息,最後成功後,會有如圖中右下的訊息!!

所以,大家應該都知道那個訊息可能會要命了吧!!  (不知道的人回頭重修)

GetFile()
IFNo:end
//--- 模擬 SetFileValue:attachfile***Variable2***=***File***
Label:re-input
ClickButton:写信
ClickButtonNext:附件
sleep()
SetFieldValue:subject=***File***
runscriptnext:self.focus();var k1=indexFrame.document.all.tags('INPUT');for(i=0;i<k1.length;i++) if(k1.item(i).type=='file'){k1.item(i).focus();break;}
SendKeys:***File***
runscriptnext:self.blur();
runscriptnext:if(k1.item(i).value == indexFrame.document.all('subject').value){indexFrame.document.all('subject').value='搞定'}
sleep()
FindWebText:搞定
IFNo:re-input
//--- 收信者與信件主題
SetFieldValue:TO=收信址
SetFieldValue:subject=***FileName***
//--- 信件內容
runscriptnext:indexFrame.htmlletter.HtmlEditor.document.all.tags('BODY').item(0).innerText="我出運啦!"+"\n"+"教學總算快寫完了"
//--- 送出
ClickButton:发送
sleep(3)
Label:next_wait_
WaitWebText:邮件发送成功,5,next_wait
GoLabel:send_ok
Label:next_wait
WaitWebText:失败,5,next_wait_
GoLabel:re-input
Label:send_ok

這裏,那個三秒是給一個緩衝,偵錯主要是下在後面的那段~

每五秒檢查一次是否已上傳成功 !! 若有找到成功字眼就往 send_ok 的定位點移動 !!  沒有的話則再以五秒的時間檢查是否失敗!!

其間若找到失敗字眼,則移往 re-input 的定位點重新再一次上傳程序!! 五秒後若沒有找到失敗,則再回到 next_wait 重覆循環檢驗檔案上傳結果~ 

 

以上是單個附件上傳的流程。但是現在的信箱容量,動不動都上G了,所以單信箱要寄多封信的設計是一定要的啦!!

大家還記得麻蛙上傳篇教過的帳號、檔案清單中分隔符的觀念吧!! (沒印象的人請回頭重修)

套用在這裏也是同樣的意思~  麻蛙裏一個分享帳號就等同是我們欲寄往的一個收信群組(可以是複數型態)!!

而我們用來登入126的郵空帳號代表的是寄信平台,與我們要傳送之目的信箱(分享郵件帳號)不同喔!!

那何謂收信群組呢??  就是單封多址的意思!

 這也是郵空上傳的最大優勢,只要在收信者那同時填入多個收信地址,上傳一次就同時會寄往每個收信地址!!!

 

那再以【檔案清單】來說,以分隔符來表示每個麻蛙帳號內欲上傳的檔案數N,就等同於欲傳送N封信件至每個寄信群組的意思~

有了以上觀念後,就可以開始來設計流程了!!

例如:我們此次目的信箱為 Xuite_Mail !!

一個信箱要塞10封信(每封信裏有一個附檔為15MB),五載點分享,所以寄信群組就是複數型態的5 ~

【郵件清單】就是以5個為一列來作分割 !!      MailBreakByPoint(5)              【00-清單處理類】

【檔案清單】以10作分割!!                                 可在檔案加入時處理,或手動至檔案清單處理,或  FileBreak(10)   【00-清單處理類】

註:這裏要注意,xuite分享帳號要以 ftp://id:pw@xuite.net 或是 id:pw@xuite.net 的格式放入【郵件清單】喔~!

MailBreakByPoint(5)
Label:begin
//--- 隨機取得寄信平台之帳密
SpotStrToVariable:user=126帳號1&pass=126密碼1|user=126帳號2&pass=126密碼2|user=126帳號3&pass=126密碼3,***Variable64***
//--- 登入126郵空
postdata:postdata:http://entry.mail.126.com/cgi/login?hid=10010102&lightweight=1&language=0&style=1?
domain=126.com&language=0&bCookie=&***Variable64***&style=1&enter.x=%B5%C7+%C2%BC
sleep(3)
WaitWebText:退出,5,begin

 

這樣的處理方式,***MailUrl*** 可用來存放寄信群組(即收信址),***Mail*** 則 可用來記錄寄信完成後的多載點pop3分享連結。

寄信平台則建議放個幾十組126郵空的帳密。除可分散上傳流量外,也可防止因為過於集中而被目的信箱認定該126郵空帳號為廣告信平台!!

 

接著再來看後面的部份~ 

Label:get_file
GetFile()
IFNo:end
//--- 模擬 SetFileValue:attachfile***Variable2***=***File***
Label:re-input
ClickButton:写信
ClickButtonNext:附件
sleep()
SetFieldValue:subject=***File***
runscriptnext:self.focus();var k1=indexFrame.document.all.tags('INPUT');for(i=0;i<k1.length;i++) if(k1.item(i).type=='file'){k1.item(i).focus();break;}
SendKeys:***File***
runscriptnext:self.blur();
runscriptnext:if(k1.item(i).value == indexFrame.document.all('subject').value){indexFrame.document.all('subject').value='搞定'}
sleep()
FindWebText:搞定
IFNo:re-input
//--- 收信者與信件主題
SetFieldValue:TO=***MailUrl***
SetFieldValue:subject=***FileName***
//--- 信件內容
runscriptnext:indexFrame.htmlletter.HtmlEditor.document.all.tags('BODY').item(0).innerText="我出運啦!"+"\n"+"教學總算快寫完了"
//--- 送出
ClickButton:发送
sleep(3)
Label:next_wait_
WaitWebText:邮件发送成功,5,next_wait
GoLabel:send_ok
Label:next_wait
WaitWebText:失败,5,next_wait_
GoLabel:re-input
Label:send_ok
FileBreakLoop:recode_share-link
FileLoop:get_file
Label:recode_share-link
//--- 記錄每個檔案的寄信名細
AddMail:***FileName*** 於 ***Date*** ***Time*** 寄往 ***Variable36***
//--- 將分享連結以pop3的格式輸出至【輸出清單】中
ReplaceVariable:***Mail***,ftp://,pop3://,***Variable67***
ReplaceVariable:***Variable67***,xuite.net,smtp.mail.xuite.net,***Variable67***
output:***Variable67***
AccountLoop:get_mlu-mail
Label:end
EXIT()

這個流程要考慮的比較多,大家要仔細看!!

當程序走到 FileBreakLoop:recode_share-link 時,會檢查【檔案清單】當下的資料是否為分隔符  #BreakFile !!

若是的話,就表示10個郵件附檔都已傳送完了!! 就跳到 recode_share-link 這個定位點!! 反之則再檢查【檔案清單】內是否還有資料~

若全沒了,那程序往下走,一樣是走到 recode_share-link 這個定位點 。(這情形是指不會剛好每個寄信群組都是十封信,或許最後一組只有八封信而已)

若【檔案清單】內還有資料,那就表示還沒寄到十封,則程序再往get_file 這個定位點走,繼續讀檔用同一個寄信群組來寄信~

好,當程序走到recode_share-link 後,就表示可以記錄上傳資訊了!!

這裏我在【郵件清單】中 把每個檔案於何時寄出於何地,清楚的記錄下來。方便將來補檔時可以快速查看。

而【輸出清單】內,則是記錄以pop3格式的分享連結~

這裏   ***Mail***    是如右的格式     ftp://id1:pw1@xuite.net,ftp://id2:pw2@xuite.net,ftp://id3:pw3@xuite.net,ftp://id4:pw4@xuite.net,ftp://id5:pw5@xuite.net

所以我們可以把 ftp:// 改用 pop3:// 來取代,接著再把 xuite.net 用 smtp.mail.xuite.net 來取代,這樣子就會是pop3 的分享格式了~

 

那最後要如何把分類各載點的連結分出來呢??

粉簡單的,以逗號為分隔,由下而下的整個區塊資料即是一個載點!!

建議可將輸出清單存成一個文書檔,再用UltraEdit 來開啟,選列模式~ 就可清鬆把各載點分類出來囉~

當然,以上的分類也可以直接利用GDL 完成的!!  這個就留給大家當課後習題囉~ XD


後記:

其實郵空上傳沒有像這篇這麼麻煩的!! 我是為了教學才特地挑它出來磨一下大家的~ (結果累到我自已  )

此篇重點是要大家能感受一下碰到困難時該如何去運用現有的指令來克服~

建議你可以試著去寫寫yahoo郵空,相信信心馬上會回來的喔~ ^^   

Free Web Hosting