這次我們談談提交模組。
在寫這篇文章之前瀏覽網路的過程中,我有看到有人討論過vj這種東西的合法性和道德性;不過在這篇文章裡我不會談這些,我們只關心技術。
我們是用php實現的提交,那麼我們不得不使用一種東西:curl。不過php預設是不啟用curl支援的,不管你用何種方式,總之讓他工作起來就是了,不多說,直接貼代碼:
public function POJ_DataPoster_Worker($user = "skvj01", $pass =
"forskvj", $id = "1000", $lang = "0", $code = "", $rid = "") {
if (DEBUG)
echo "[D] => $user, $pass, $id, $lang, $rid\n"; //MySQL $this->db = new dMySQL(); //Infomation $cookie_file =
tempnam("./cookie", "cookie"); $login_url = "http://poj.org/login";
$post_fields = "user_id1=".$user."&password1=".$pass."&url=/";
$this->rid = $rid; $this->pid = $id; $this->lang = $lang;
$this->user = $user; $this->pass = $pass;
//Login $curl = curl_init($login_url);
curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_COOKIEJAR,
$cookie_file); curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_fields);
$this->data = curl_exec($curl); curl_close($curl);
//Submit $hint_code = /"// ".$rid."\n"./$code; $post_fields =
'problem_id='.$id.'&language='
.$lang.'&encoded=1&source='.urlencode($hint_code);
//print_r(base64_encode($code)); $curl =
curl_init("http://poj.org/submit");
curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_COOKIEFILE,
$cookie_file); curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_fields);
$this->data = curl_exec($curl); curl_close($curl);
@unlink($cookie_file);
//Record Information $this->info = array(
'id' => $rid,
'user' => $user
);
}
這裡還是用POJ為例子,POJ提交以後立刻會有記錄產生,而HDOJ等則不然,這裡就是利用curl類比提交了一下。
$pdw = new POJ_DataPoster_Worker($oo_u, $oo_p, $list[$i]['tid'],
$list[$i]['lang'], $list[$i]['code'], $list[$i]['id']); $rrid =
$pdw->getRunID()
這裡建立執行個體並且提交代碼,然後擷取RunID,就是遠端紀錄ID。上面提到提交後就會產生紀錄,這點比較好,迅速的直接抓取就好。當然,抓取不到那就是提交錯誤,就沒有下文了。當然,抓取到,就是一個死迴圈了,不斷的查詢狀態,然後更新本地紀錄就可以了。
上面提到的抓取,有一個問題,就是如何判斷哪個紀錄是你當前提交的紀錄,這個有方案如下:
1.一個帳號是一個單獨的隊列,每次提交一個;
2.每次查詢只查詢本帳號提交的紀錄而非所有;
3.給代碼加註釋,內含一個絕對的ID,用於抓取所有源碼並匹配。
這裡3對於前兩個來說理論上是多餘的,只要抓第一個就好了。不過因為每次都是抓取一頁,所以順便就添加了這個機制,保險最重要。
文章發布時間為: May 4th , 2016 at 01:31 pm
最後編輯時間為: May 4th , 2016 at 01:55 pm
本文由SpringHack 創作,採用 知識共用署名 4.0國際許可協議進行許可
可自由轉載、引用,但需署名作者且註明文章出處