部落格搬家其實就是抓取資料,然後再提交資料,如果是自己辦的網站,比如說,sohu要把sina的部落格搬過來,那就更加簡單了。
手動搬是很累的,全自動的處理方法則是,由使用者提交資料,然後,伺服器程式等待事件觸發,然後跑完整個搬家過程。半自動的方法則有兩種,1,資料抓取到用戶端,而後上傳給伺服器;2,有用戶端控制,在伺服器實行抓取。
全自動還不錯,不過,一般來說搬家工具不是萬能的,比如能抓sina的,未必能抓163的。因此,我個人認為還是有用戶端控制,在伺服器實行抓取最不錯。
用戶端設計來說,非常簡單。要涉及,要搬家的部落格網站,和在現在部落格網站的使用者,還有文章搬到現在網站的哪個分類。有些網站讀取分頁很麻煩,可以直接指定。
服務端,隨便跑個dos視窗程序就行了。
首先設計一套簡單的協議,比如
傳輸資料要求以 blogIntro開頭,以blogend結尾,例如:blogIntro000000xizhen/partent/xizhen/sorts/0/0blogend
000000的地方放置包的長度,後面依次就是表單的資訊,不用加密了,不過為了避免出現問題,資料最好url編碼一下,就不會和分隔字元'/'衝突了。
服務端監聽,比如80000連接埠
TcpListener listener = null;
try
{
if (server.ipadd == null)
listener = new TcpListener(server.port); //server.port就是8000連接埠啦
else
listener = new TcpListener(server.ipadd, server.port);
listener.Start();
}
catch (Exception e) { Console.WriteLine(e.Message); Console.Read(); return; }
進入接收資料模式while (true)
{
Console.WriteLine("\n等待串連");
TcpClient client = listener.AcceptTcpClient();
Console.WriteLine("成功建立串連.");
//給用戶端回點資訊
string buff = "成功建立串連\r\n";
byte[] b = System.Text.Encoding.Default.GetBytes(buff);
client.Client.Send(b);
NetworkStream myNetworkStream = client.GetStream();
byte[] bytes = new byte[1024];
int bytesRead = myNetworkStream.Read(bytes, 0, bytes.Length);
string getstr = Encoding.Default.GetString(bytes, 0, bytesRead);
Console.WriteLine("收到資料:\n\n" + getstr);
string buff1 = "成功接收資料\r\n";
byte[] b1 = System.Text.Encoding.Default.GetBytes(buff1);
client.Client.Send(b1);
//收到資料下面就是做點事情了,怎麼做,就要自己定義了。我想抓不通的部落格,用個反射比較好
}
listener.Stop();
用戶端發送就簡單了,最好用個線程 void SCAction()
{
Socket sc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
Modules.ServerSet server = ReadConfig.getServer();
try
{
sc.Connect(server.ipadd, server.port);
int bytesRec = sc.Receive(bytes);
string resstr = Encoding.Default.GetString(bytes, 0, bytesRec);
q.Enqueue(resstr);
if (resstr.IndexOf("<success>") > -1)
bt1Stat = false;
}
catch
{
q.Enqueue("無法串連遠程伺服器,很可能是由於服務端軟體未啟動引起");
sc.Close();
return;
}
string buff = msg;
byte[] b = System.Text.Encoding.Default.GetBytes(buff);
sc.Send(b);
while (sc.Connected)
{
if (systemClose)
break;
try
{
int bytesRec = sc.Receive(bytes);
string resstr = Encoding.Default.GetString(bytes, 0, bytesRec);
q.Enqueue(resstr);
if (resstr.IndexOf("<eof>") > -1)
{
q.Enqueue("****************************************************\r\n");
break;
}
}
catch { break; }
}
sc.Close();
bt1Stat = true;
}
操作密碼自然是讓指定的人用了,預先MD5下再發就好了。