Virtual Judge 系統開發二:提交模組

來源:互聯網
上載者:User
這次我們談談提交模組。

在寫這篇文章之前瀏覽網路的過程中,我有看到有人討論過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國際許可協議進行許可

可自由轉載、引用,但需署名作者且註明文章出處

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.