【開源】開發者新聞APP+新聞Restful服務+博客園新聞採集程序+infoq新聞採集程序+36kr新聞採集程序+oschina新聞採集程序+51cto新聞採集程序+csdn新聞採集程序

這幾天車子跟別人撞了,水箱撞稀爛了,要坐一個星期的公車python

實在太無聊,就抽時間搞了這麼個APP出來,打發公車上的時光git

(開發者頭條裏的新聞專業性太強,公車上實在沒法靜心研讀)github

我常常看的也就博客園、infoq、36kr、開源中國的新聞c#

如今只作了博客園和infoq,接下來打算作36kr和開源中國的新聞(這個工做今天早上已經完成了),若是你們有什麼好建議也能夠在評論裏提ide

數據都是準實時的取來的,之後爭取作到你去刷就有新聞給你看post

todo:新聞的分享、收藏、標籤、分類等功能,固然這要看你們的熱情程度啦! url

ps:你若是看了我寫的採集代碼,就不會問爲何不用rss這種東西了spa

更新:又增長了51cto的採集程序blog

 

廢話少說,先來上圖開發

           

 

接着上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上給我顆星

多謝各位啦

相關文章
相關標籤/搜索