這幾天車子跟別人撞了,水箱撞稀爛了,要坐一個星期的公車
實在太無聊,就抽時間搞了這么個APP出來,打發公車上的時光
(開發者頭條里的新聞專業性太強,公車上實在無法靜心研讀)
我經常看的也就博客園、infoq、36kr、開源中國的新聞
現在只做了博客園和infoq,接下來打算做36kr和開源中國的新聞(這個工作今天早上已經完成了),如果大家有什么好建議也可以在評論里提
數據都是准實時的取來的,以后爭取做到你去刷就有新聞給你看
todo:新聞的分享、收藏、標簽、分類等功能,當然這要看大家的熱情程度啦!
ps:你如果看了我寫的采集代碼,就不會問為什么不用rss這種東西了
更新:又增加了51cto的采集程序
廢話少說,先來上圖

接着上APK的下載連接(大家熱情的話,蘋果版也會有的)
https://github.com/xland/DeveloperNews/blob/master/DeveloperNews.apk?raw=true
接着公布源碼
https://github.com/xland/DeveloperNews
關鍵源碼講解:
采集程序的源碼
static void cnblogs()
{
CQ doc;
try
{
var client = new RestClient("http://www.cnblogs.com/news/");
var resq = new RestRequest(Method.GET);
var resp = client.Execute(resq);
doc = resp.Content;
}
catch (Exception ex)
{
Thread.Sleep(GetWaitTime());
cnblogs();
return;
}
var arr = doc[".post_item_body"].ToList();
var dataList = new List<allen_news>();
var db = dbFactory.Open();
foreach (var item in arr)
{
var str = item.InnerText;
var strArr = str.Split(Environment.NewLine.ToCharArray(),StringSplitOptions.RemoveEmptyEntries);
var data = new allen_news();
data.news_title = strArr[0];
if (checkTitle(data.news_title))
{
break;
}
data.news_summary = strArr[1].Trim();
data.author = strArr[2].Split("發布於".ToCharArray(),StringSplitOptions.RemoveEmptyEntries)[0];
data.add_time = DateTime.Now;
data.from_site_flag = 0;
data.news_url = ((CQ)item.InnerHTML)["h3 a"].Attr("href");
dataList.Insert(0, data);
}
if(dataList.Count >0)
{
db.InsertAll<allen_news>(dataList);
}
db.Dispose();
Console.WriteLine("增加了{0}條文章0", dataList.Count);
Thread.Sleep(GetWaitTime());
cnblogs();
}
采集程序用到了CsQuery和RestSharp和ServiceStack.OrmLite三個開源程序
GetWaitTime()隨機等1分鍾到10分鍾之間的一個時間長度,不要頻繁的采,不要有規律的采,避免目標主機封鎖采集程序所在的IP
再來看WEB服務的關鍵代碼
protected void Page_Load(object sender, EventArgs e)
{
dbFactory = new OrmLiteConnectionFactory(ConfigurationManager.AppSettings["dbConnStr"], MySqlDialect.Provider);
var action = Request["Action"];
var id = Request["Id"];
List<allen_news> result = null;
if (action == "PullDown")
{
var db = dbFactory.Open();
result = db.SelectFmt<allen_news>("select * from allen_news where news_id > {0} order by news_id desc limit 0,30",id);
db.Dispose();
}
else if(action == "PullUp")
{
var db = dbFactory.Open();
result = db.SelectFmt<allen_news>("select * from allen_news where news_id < {0} order by news_id desc limit 0,30", id);
db.Dispose();
}
else if(action == "CheckVersion")
{
Response.Write("1.0.0");
Response.End();
return;
}
else
{
var db = dbFactory.Open();
result = db.Select<allen_news>("select * from allen_news order by news_id desc limit 0,30");
db.Dispose();
}
Response.Write(JsonConvert.SerializeObject(result));
Response.End();
}
APK客戶端的代碼,沒有什么特殊的,大家可以自己去看吧
OK,就這些啦,喜歡的請給我點個贊,或者到github上給我顆星
多謝各位啦
