在Web微信應(yīng)用中使用博客園RSS以及Quartz.NET實(shí)現(xiàn)博客文章內(nèi)容的定期推送功能

本篇隨筆介紹在Web微信應(yīng)用中使用博客園RSS以及Quartz.NET實(shí)現(xiàn)博客文章內(nèi)容的定期推送功能辈讶,首先對Quartz.NET進(jìn)行一個(gè)簡單的介紹和代碼分析,掌握對作業(yè)調(diào)度的處理霍弹,然后對博客園RSS內(nèi)容的處理如何獲取雇庙,并結(jié)合微信消息的群發(fā)接口進(jìn)行內(nèi)容的發(fā)送,從而構(gòu)建了一個(gè)在Web應(yīng)用中利用作業(yè)調(diào)度來進(jìn)行消息發(fā)送的業(yè)務(wù)模型然走。

Quartz.NET是一個(gè)開源的作業(yè)調(diào)度框架悍赢,非常適合在平時(shí)的工作中决瞳,定時(shí)輪詢數(shù)據(jù)庫同步,定時(shí)郵件通知泽裳,定時(shí)處理數(shù)據(jù)等瞒斩。 Quartz.NET允許開發(fā)人員根據(jù)時(shí)間間隔(或天)來調(diào)度作業(yè)。它實(shí)現(xiàn)了作業(yè)和觸發(fā)器的多對多關(guān)系涮总,還能把多個(gè)作業(yè)與不同的觸發(fā)器關(guān)聯(lián)胸囱。整合了 Quartz.NET的應(yīng)用程序可以重用來自不同事件的作業(yè),還可以為一個(gè)事件組合多個(gè)作業(yè)瀑梗。

1烹笔、Quartz.NET的使用

Quartz框架的一些基礎(chǔ)概念解釋:

Scheduler 作業(yè)調(diào)度器。

IJob 作業(yè)接口抛丽,繼承并實(shí)現(xiàn)Execute谤职, 編寫執(zhí)行的具體作業(yè)邏輯。

JobBuilder 根據(jù)設(shè)置亿鲜,生成一個(gè)詳細(xì)作業(yè)信息(JobDetail)允蜈。

TriggerBuilder 根據(jù)規(guī)則,生產(chǎn)對應(yīng)的Trigger

官方的使用案例代碼如下所示

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter { Level = Common.Logging.LogLevel.Info };

        // Grab the Scheduler instance from the Factory 
        IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();

        // and start it off
        scheduler.Start();

        // define the job and tie it to our HelloJob class
        IJobDetail job = JobBuilder.Create<HelloJob>()
            .WithIdentity("job1", "group1")
            .Build();

        // Trigger the job to run now, and then repeat every 10 seconds
        ITrigger trigger = TriggerBuilder.Create()
            .WithIdentity("trigger1", "group1")
            .StartNow()
            .WithSimpleSchedule(x => x
                .WithIntervalInSeconds(10)
                .RepeatForever())
            .Build();

        // Tell quartz to schedule the job using our trigger
        scheduler.ScheduleJob(job, trigger);

        // some sleep to show what's happening
        Thread.Sleep(TimeSpan.FromSeconds(60));

        // and last shut down the scheduler when you are ready to close your program
        scheduler.Shutdown();
    }
    catch (SchedulerException se)
    {
        Console.WriteLine(se);
    }

    Console.WriteLine("Finished");
}

啟動(dòng)定義一個(gè)HelloJOb的對象蒿柳,如下代碼所示

    public class HelloJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            Console.WriteLine("Greetings from HelloJob!");
        }
    }

2饶套、Quartz的cron表達(dá)式

cron expressions 整體上還是非常容易理解的,只有一點(diǎn)需要注意:"?"號的用法垒探,看下文可以知道“妓蛮?”可以用在 day of month 和 day of week中,他主要是為了解決如下場景圾叼,如:每月的1號的每小時(shí)的31分鐘蛤克,正確的表達(dá)式是:* 31 * 1 * 捺癞?,而不能是:* 31 * 1 * *构挤,因?yàn)檫@樣代表每周的任意一天髓介。

由7段構(gòu)成:秒 分 時(shí) 日 月 星期 年(可選)
"-" :表示范圍 MON-WED表示星期一到星期三
"," :表示列舉 MON,WEB表示星期一和星期三
"*" :表是“每”,每月儿倒,每天版保,每周,每年等
"/" :表示增量:0/15(處于分鐘段里面) 每15分鐘夫否,在0分以后開始,3/20 每20分鐘叫胁,從3分鐘以后開始
"?" :只能出現(xiàn)在日凰慈,星期段里面,表示不指定具體的值
"L" :只能出現(xiàn)在日驼鹅,星期段里面微谓,是Last的縮寫,一個(gè)月的最后一天输钩,一個(gè)星期的最后一天(星期六)
"W" :表示工作日豺型,距離給定值最近的工作日
"#" :表示一個(gè)月的第幾個(gè)星期幾,例如:"6#3"表示每個(gè)月的第三個(gè)星期五(1=SUN...6=FRI,7=SAT)

官方cron表達(dá)式實(shí)例

表達(dá)式 代表意義
0 0 12 * * ? 每天中午12點(diǎn)觸發(fā)
0 15 10 ? * * 每天上午10:15觸發(fā)
0 15 10 * * ? 每天上午10:15觸發(fā)
0 15 10 * * ? * 每天上午10:15觸發(fā)
0 15 10 * * ? 2005 2005年的每天上午10:15觸發(fā)
0 * 14 * * ? 在每天下午2點(diǎn)到下午2:59期間的每1分鐘觸發(fā)
0 0/5 14 * * ? 在每天下午2點(diǎn)到下午2:55期間的每5分鐘觸發(fā)
0 0/5 14,18 * * ? 在每天下午2點(diǎn)到2:55期間和下午6點(diǎn)到6:55期間的每5分鐘觸發(fā)
0 0-5 14 * * ? 在每天下午2點(diǎn)到下午2:05期間的每1分鐘觸發(fā)
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44觸發(fā)
0 15 10 ? * MON-FRI 周一至周五的上午10:15觸發(fā)
0 15 10 15 * ? 每月15日上午10:15觸發(fā)
0 15 10 L * ? 每月最后一日的上午10:15觸發(fā)
0 15 10 L-2 * ? Fire at 10:15am on the 2nd-to-last last day of every month
0 15 10 ? * 6L 每月的最后一個(gè)星期五上午10:15觸發(fā)
0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month
0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一個(gè)星期五上午10:15觸發(fā)
0 15 10 ? * 6#3 每月的第三個(gè)星期五上午10:15觸發(fā)
0 0 12 1/5 * ? Fire at 12pm (noon) every 5 days every month, starting on the first day of the month.
0 11 11 11 11 ? Fire every November 11th at 11:11am.

3买乃、Quartz.NET的應(yīng)用案例

我曾經(jīng)在統(tǒng)一接口的Web API后臺(tái)姻氨,使用了這個(gè)Quartz.NET來實(shí)現(xiàn)站場信息的同步處理,這樣可以把其他供應(yīng)商提供的接口數(shù)據(jù)剪验,同步到本地肴焊,可以加快數(shù)據(jù)的檢索和處理效率。

具體代碼如下所示功戚。

首先是在Global.asax的后臺(tái)代碼里面進(jìn)行同步代碼處理娶眷。

public class WebApiApplication : System.Web.HttpApplication
{
    IScheduler scheduler = null;

    protected void Application_Start()
    {
        GlobalConfiguration.Configuration.EnableCors();
        GlobalConfiguration.Configure(WebApiConfig.Register);

        //創(chuàng)建執(zhí)行同步的處理
        ISchedulerFactory sf = new StdSchedulerFactory();
        scheduler = sf.GetScheduler();

        CalendarTask();
        CreateOnceJob();

        //啟動(dòng)所有的任務(wù)
        scheduler.Start();
    }
    protected void Application_End(object sender, EventArgs e)
    {
        if(scheduler != null)
        {
            scheduler.Shutdown(true);
        }
    }

    /// <summary>
    /// 創(chuàng)建同步任務(wù)
    /// </summary>
    private void CalendarTask()
    {
        IJobDetail job = JobBuilder.Create<StationSyncJob>()
             .WithIdentity("StationSyncJob", "group1")
             .Build();

        //每天凌晨1點(diǎn)執(zhí)行一次:0 0 1 * * ?
        ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                                  .WithIdentity("trigger1", "group1")       //"0 34,36,38,40 * * * ?"
                                                  .WithCronSchedule("0 0 1 * * ?")//"0 0 1 * * ?"
                                                  .Build();

        DateTimeOffset ft = scheduler.ScheduleJob(job, trigger);
        LogTextHelper.Info(string.Format("您在 {0} 時(shí)候創(chuàng)建了Quartz任務(wù)", DateTime.Now));
    }

    private void CreateOnceJob()
    {
        IJobDetail onceJob = JobBuilder.Create<StationSyncJob>()
                             .WithIdentity("onceJob", "group1")
                             .Build();
        //啟動(dòng)的時(shí)候運(yùn)行一次
        DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, 30);
        ISimpleTrigger simpleTrigger = (ISimpleTrigger)TriggerBuilder.Create()
                                                      .WithIdentity("simpleOnce", "group1")
                                                      .StartAt(startTime)
                                                      .Build();
        DateTimeOffset ft = scheduler.ScheduleJob(onceJob, simpleTrigger);
    }

}

其中同步站場信息的Job實(shí)現(xiàn)如下所示(這里是通過調(diào)用第三方接口獲取數(shù)據(jù),然后把它們保存到本地啸臀,這個(gè)定時(shí)服務(wù)設(shè)定在每天的一個(gè)是時(shí)間點(diǎn)上執(zhí)行届宠,如凌晨1點(diǎn)時(shí)刻)。

    /// <summary>
    /// 同步站場信息
    /// </summary>
    public class StationSyncJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            LogTextHelper.Info(string.Format("您在 {0} 時(shí)候調(diào)用【同步站場信息】一次", DateTime.Now));

            StationDetailResult result = new StationDetailResult();
            try
            {
                QueryStationJson json = new QueryStationJson();//空查詢乘粒,一次性查詢所有

                BaseDataAgent agent = new BaseDataAgent();
                result = agent.QueryStationDetail(json);
                if(result != null && result.success)
                {
                    foreach(StationDetailJson detail in result.data)
                    {
                        StationInfo info = detail.ConvertInfo();
                        try
                        {
                            BLLFactory<Station>.Instance.InsertIfNew(info);
                        }
                        catch(Exception ex)
                        {
                            LogTextHelper.Error(ex);
                            LogTextHelper.Info(info.ToJson());
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                result.errmsg = ex.Message;
                result.success = false;

                LogTextHelper.Error(ex);
            }
        }
    }

4豌注、博客的RSS

原則上我們可以利用任何RSS來源來獲取響應(yīng)的博客內(nèi)容,這里我以自己博客園的RSS源進(jìn)行介紹使用谓厘,我們每個(gè)博客園的賬號都有一個(gè)如下的連接幌羞,提供我們最新的博客列表信息。



打開連接竟稳,可以看到它的內(nèi)容就是最新顯示的博客內(nèi)容属桦,如下所示



處理RSS的內(nèi)容熊痴,我們使用內(nèi)置的SyndicationFeed對象來處理即可,非常方便聂宾。
string url = "http://feed.cnblogs.com/blog/u/12391/rss";
XmlReader reader = XmlReader.Create(url);
SyndicationFeed feed = SyndicationFeed.Load(reader);
reader.Close();

上面代碼就是獲取到對應(yīng)的RSS內(nèi)容果善,然后把它們轉(zhuǎn)換為XMLReader進(jìn)行解析即可。

然后可以通過一個(gè)遍歷的處理就可以獲取到其中各個(gè)的XML節(jié)點(diǎn)內(nèi)容了系谐,非常方便巾陕。

foreach (SyndicationItem item in feed.Items)
{
    var id = item.Id;
    string subject = item.Title.Text;    
    string summary = item.Summary.Text;
 }

5、在微信應(yīng)用中發(fā)送博客內(nèi)容

通過上面的RSS讀取操作纪他,我們可以獲得對應(yīng)的博客內(nèi)容鄙煤,如果我們需要每周給客戶發(fā)送一些內(nèi)容,那么這些就可以通過上面RSS源進(jìn)行處理發(fā)送了茶袒。
關(guān)于發(fā)送文本消息的處理梯刚,可以參考我的隨筆文章《C#開發(fā)微信門戶及應(yīng)用(3)--文本消息和圖文消息的應(yīng)答
這里我就直接應(yīng)用上面的接口對內(nèi)容進(jìn)行處理發(fā)送,具體接口的邏輯就不再羅列薪寓。

/// <summary>
/// 獲取博客園文章(RSS)并發(fā)送文本給指定的用戶
/// </summary>
private void GetCnblogsArticles()
{
    string url = "http://feed.cnblogs.com/blog/u/12391/rss";
    XmlReader reader = XmlReader.Create(url);
    SyndicationFeed feed = SyndicationFeed.Load(reader);
    reader.Close();

    ICustomerApi api = new CustomerApi();
    foreach (SyndicationItem item in feed.Items)
    {
        Console.WriteLine(item.ToJson());
        var id = item.Id;
        string subject = item.Title.Text;    
        string summary = item.Summary.Text;


        var content = string.Format("<a href='{0}'>{1}</a>", id, subject);
        CommonResult result = api.SendText(token, openId, content);
        Console.WriteLine("發(fā)送內(nèi)容:" + (result.Success ? "成功" : "失敗:" + result.ErrorMessage));
    }
}

得到的界面效果如下所示亡资。



但是這樣的效果還是有點(diǎn)差強(qiáng)人意,我們知道微信里面有圖文消息的接口向叉,可以利用圖文消息的接口進(jìn)行發(fā)送锥腻,則更加美觀一些。
調(diào)整后的代碼如下所示母谎。

/// <summary>
/// 發(fā)送博客圖文消息給指定用戶
/// </summary>
private void SendBlogsNews()
{
    List<ArticleEntity> list = new List<ArticleEntity>();

    string url = "http://feed.cnblogs.com/blog/u/12391/rss";
    XmlReader reader = XmlReader.Create(url);
    SyndicationFeed feed = SyndicationFeed.Load(reader);
    reader.Close();

    int i = 0;
    foreach (SyndicationItem item in feed.Items)
    {
        list.Add(
            new ArticleEntity
            {
                Title = item.Title.Text,
                Description = item.Summary.Text,
                PicUrl = i == 0 ? "http://www.iqidi.com/Content/Images/cnblogs_whc.png" : "http://www.iqidi.com/Content/Images/frame_web.png",
                Url = item.Id
            });
        if(i >= 8)
        {
            break;
        }
        i++;
    }

    ICustomerApi customerApi = new CustomerApi();
    var result = customerApi.SendNews(token, openId, list);
}

這樣就是發(fā)送圖文消息的代碼瘦黑,需要重新構(gòu)建一個(gè)實(shí)體類集合進(jìn)行發(fā)送,得到發(fā)送的效果如下所示销睁。


整體的界面效果就是我們需要的效果了供璧,不過如果我們需要使用批量發(fā)送給訂閱用戶的話,那么我們需要使用消息的群發(fā)接口冻记,群發(fā)的消息接口封裝如需了解睡毒,可以參考文章《C#開發(fā)微信門戶及應(yīng)用(30)--消息的群發(fā)處理和預(yù)覽功能》。
整個(gè)群發(fā)消息的邏輯代碼如下所示冗栗,主要邏輯就是獲取博客文章演顾,并上傳文章的圖片,接著上傳需要群發(fā)的圖文消息資源隅居,最后調(diào)用群發(fā)接口進(jìn)行消息的發(fā)送即可钠至。

private void BatchSendBlogNews()
{
    List<NewsUploadJson> list = new List<NewsUploadJson>();

    string url = "http://feed.cnblogs.com/blog/u/12391/rss";
    XmlReader reader = XmlReader.Create(url);
    SyndicationFeed feed = SyndicationFeed.Load(reader);
    reader.Close();

    //上傳圖片獲取MediaId
    IMediaApi mediaApi = new MediaApi();
    var result1 = mediaApi.UploadTempMedia(token, UploadMediaFileType.image, @"E:\我的網(wǎng)站資料\iqidiSoftware\content\images\cnblogs_whc.png");//"http://www.iqidi.com/Content/Images/cnblogs_whc.png");
    var result2 = mediaApi.UploadTempMedia(token, UploadMediaFileType.image, @"E:\我的網(wǎng)站資料\iqidiSoftware\content\images\frame_web.png");//"http://www.iqidi.com/Content/Images/frame_web.png");
    if (result1 != null && result2 != null)
    {
        int i = 0;
        foreach (SyndicationItem item in feed.Items)
        {
            list.Add(
                new NewsUploadJson
                {
                    author = "伍華聰",
                    title = item.Title.Text,
                     content = item.Summary.Text,
                    //digest = item.Summary.Text,
                    thumb_media_id = i == 0 ? result1.media_id : result2.media_id,
                    content_source_url = item.Id,
                });
            if (i >= 8)
            {
                break;
            }
            i++;
        }
    }

    if (list.Count > 0)
    {
        UploadJsonResult resultNews = mediaApi.UploadNews(token, list);
        if (resultNews != null)
        {                    
            IMassSendApi massApi = new MassSendApi();
            var result = massApi.SendByGroup(token, MassMessageType.mpnews, resultNews.media_id, "0", true);
        }
        else
        {
            Console.WriteLine("上傳圖文消息失敗");
        }
    }
}

群發(fā)的消息在微信上看到內(nèi)容和前面的差不多,不過點(diǎn)擊并不會(huì)直接跳轉(zhuǎn)鏈接胎源,而是進(jìn)去到一個(gè)詳細(xì)內(nèi)容的頁面里面棉钧,只有單擊閱讀原文才進(jìn)行跳轉(zhuǎn)URL,如下所示涕蚤。


6.結(jié)合Quartz.NET實(shí)現(xiàn)博客文章內(nèi)容的定期推送功能

在Web微信應(yīng)用中使用博客RSS以及Quartz.NET實(shí)現(xiàn)文章內(nèi)容的定期推送功能宪卿,我們需要結(jié)合Quartz.NET的作業(yè)調(diào)度處理的诵、微信接口的內(nèi)容發(fā)送,以及博文RSS內(nèi)容的獲取處理佑钾,三者整合進(jìn)行實(shí)現(xiàn)整個(gè)功能西疤。
首先我們根據(jù)上面的代碼,設(shè)計(jì)好調(diào)度的Job內(nèi)容休溶,如下所示代赁。



然后,在Web應(yīng)用的Global.asa的后臺(tái)代碼里面兽掰,編寫代碼啟動(dòng)作業(yè)調(diào)度即可芭碍。
而根據(jù)前面Corn表達(dá)式的說明,我們要每周定時(shí)發(fā)送一次的的規(guī)則禾进,如下所示豁跑。
每周星期天凌晨1點(diǎn)實(shí)行一次: 0 0 1 ? * L
這樣我們最終的Globa.asa后臺(tái)代碼如下所示。

public class Global : HttpApplication
{
    private IScheduler scheduler = null;

    void Application_Start(object sender, EventArgs e)
    {
        // 在應(yīng)用程序啟動(dòng)時(shí)運(yùn)行的代碼
        AreaRegistration.RegisterAllAreas();
        RouteConfig.RegisterRoutes(RouteTable.Routes);

        BundleConfig.RegisterBundles(BundleTable.Bundles);


        //構(gòu)造調(diào)度對象泻云,并創(chuàng)建對應(yīng)的調(diào)度任務(wù)
        scheduler = StdSchedulerFactory.GetDefaultScheduler();
        CalendarTask();

        //啟動(dòng)所有的任務(wù)
        scheduler.Start();
    }

    protected void Application_End(object sender, EventArgs e)
    {
        if (scheduler != null)
        {
            scheduler.Shutdown(true);
        }
    }


    private void CalendarTask()
    {
        IJobDetail job = JobBuilder.Create<BlogArticleSendJob>()
             .WithIdentity("BlogArticleSendJob", "group1")
             .Build();

        //每周星期天凌晨1點(diǎn)實(shí)行一次:0 0 1 ? * L
        ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                                  .WithIdentity("trigger1", "group1")
                                                  .WithCronSchedule("0 0 1 ? * L")//0 0 1 ? * L
                                                  .Build();

        DateTimeOffset ft = scheduler.ScheduleJob(job, trigger);
        LogTextHelper.Info(string.Format("您在 {0} 時(shí)候創(chuàng)建了Quartz任務(wù)", DateTime.Now));
    }

綜合上面的思路,我們可以利用Quartz.NET做成更多的數(shù)據(jù)同步任務(wù)調(diào)度狐蜕,另外在微信應(yīng)用中宠纯,我們也可以整合很多組件或者控件,來實(shí)現(xiàn)更加彈性化的業(yè)務(wù)支持层释,如消息群發(fā)婆瓜、訪客匯總,內(nèi)容同步等處理贡羔。

以上就是我的一些組件代碼的應(yīng)用思路廉白,其實(shí)我們只要涉獵更廣一些,很多東西可以使用拿來主義乖寒,經(jīng)過自己的整合優(yōu)化猴蹂,可以為我們服務(wù)的更好。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末楣嘁,一起剝皮案震驚了整個(gè)濱河市磅轻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逐虚,老刑警劉巖聋溜,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異叭爱,居然都是意外死亡撮躁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門买雾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來把曼,“玉大人杨帽,你說我怎么就攤上這事∽S兀” “怎么了睦尽?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長型雳。 經(jīng)常有香客問我当凡,道長,這世上最難降的妖魔是什么纠俭? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任沿量,我火速辦了婚禮,結(jié)果婚禮上冤荆,老公的妹妹穿的比我還像新娘朴则。我一直安慰自己,他們只是感情好钓简,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布乌妒。 她就那樣靜靜地躺著,像睡著了一般外邓。 火紅的嫁衣襯著肌膚如雪撤蚊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天损话,我揣著相機(jī)與錄音侦啸,去河邊找鬼。 笑死丧枪,一個(gè)胖子當(dāng)著我的面吹牛光涂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拧烦,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼忘闻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屎篱?” 一聲冷哼從身側(cè)響起服赎,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎交播,沒想到半個(gè)月后重虑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秦士,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年缺厉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡提针,死狀恐怖命爬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辐脖,我是刑警寧澤饲宛,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站嗜价,受9級特大地震影響艇抠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜久锥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一家淤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瑟由,春花似錦絮重、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至殴瘦,卻和暖如春潮模,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痴施。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留究流,地道東北人辣吃。 一個(gè)月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像芬探,于是被迫代替她去往敵國和親神得。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容