程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 實現古城鐘樓微博地支報時的程序

實現古城鐘樓微博地支報時的程序

編輯:關於C#

原文:

大家最近都在熱議古城鐘樓的紅火。不是加V號、不是官方號、不是皇冠會員。沒有擬人化,沒有段 子、沒有運營。1天之內從1萬不到的粉絲新增了20多萬並且還在持續傳播和增長粉絲。我不研究它是怎 麼紅起來的,但寫個類似的程序實現它卻很容易,程序才100行左右:

如果看不懂下面的代碼,可以去看看這個 [科普貼]古城鐘樓的微博報時是如何實現的?

先來普及一下地支時間與北京時間的對應關系:

【子時】夜半,又名子夜、中夜:十二時辰的第一個時辰。(北京時間23時至次日01時)。

【丑時】雞鳴,又名荒雞:十二時辰的第二個時辰。(北京時間01時至03時)。

【寅時】平旦,又稱黎明、早晨、日旦等:時是夜與日的交替之際。(北京時間03時至05時)。

【卯時】日出,又名日始、破曉、旭日等:指太陽剛剛露臉,冉冉初升的那段時間。(北京時間05 時至07時)。

【辰時】食時,又名早食等:古人“朝食”之時也就是吃早飯時間,(北京時間07時至 09時)。

【巳時】隅中,又名日禺等:臨近中午的時候稱為隅中。(北京時間09時至11時)。

【午時】日中,又名日正、中午等:(北京時間11時至13時)。

【未時】日昳,又名日跌、日央等:太陽偏西為日跌。(北京時間13時至15時)。

【申時】哺時,又名日鋪、夕食等:(北京時間15時至17時)。

【酉時】日入,又名日落、日沉、傍晚:意為太陽落山的時候。(北京時間17時至19時)。 

【戌時】黃昏,又名日夕、日暮、日晚等:此時太陽已經落山,天將黑未黑。天地昏黃,萬物朦胧 ,故稱黃昏。(北京時間19時至21時)。

【亥時】人定,又名定昏等:此時夜色已深,人們也已經停止活動,安歇睡眠了。人定也就是人靜 。(北京時間21時至23時)。

然後我們來分析一下它昨天發布的內容

1月8日00:00來自Weico.iPhone 【子時】

1月8日02:00來自Weico.iPhone 【丑時】铛~铛~

1月8日04:00來自Weico.iPhone 【寅時】铛~铛~铛~铛~

1月8日06:00來自Weico.iPhone 【卯時】铛~铛~铛~铛~铛~铛~

1月8日08:00來自Weico.iPhone 【辰時】铛~铛~铛~铛~铛~铛~铛~铛~

1月8日10:00來自Weico.iPhone 【巳時】铛~铛~铛~铛~铛~铛~铛~铛~铛~铛~

1月8日12:00來自Weico.iPhone 【午時】

1月8日14:00來自Weico.iPhone 【未時】铛~铛~

1月8日16:00來自Weico.iPhone 【申時】铛~铛~铛~铛~

1月8日18:00來自Weico.iPhone 【酉時】铛~铛~铛~铛~铛~铛~

1月8日20:00來自Weico.iPhone 【戌時】铛~铛~铛~铛~铛~铛~铛~铛~

1月8日22:00來自Weico.iPhone 【亥時】铛~铛~铛~铛~铛~铛~铛~铛~铛~铛~

根據上面,得出它有以下規律:

每兩個小時發布一條微博,

發布時間是偶數小時的0分,這個時間並不是地支時間的開始時間,而是正中間的那個時間點

內容是相應的地支時間,加上根據時間而變化的“铛~”的次數,

“铛~”的次數與時有關,12小時以前與小時相同,12小時以後與[小時減12]相同。

西安鐘樓裡的鐘就是這樣敲的嗎?去過鐘樓一次,沒登上去,也沒注意。

好了,開始了:
首先程序發博微得有App,古城鐘樓微博發布使用的是Weico.iPhone,這是一個公開的App了,我們自己 申請一個,定義如下:

static string AppKey = "12345678";
static string AppSecret = "7234545228a7626f7767778b1e249e6a";
static string CallbackUrl = https://www.doucube.com/oauth2/default.html;

我們使用C#來實現這個程序,利用新浪微博官方推薦的Weibo API OAuth2 C#版

第一步,就是用API登錄,下面是API中的源碼,去掉了一些冗余的東東,

static OAuth Authorize()
{
    OAuth o = new OAuth(AppKey, AppSecret, CallbackUrl);
    while (!ClientLogin(o))
    {
        Console.WriteLine("登錄失敗,請重試。");
    }
    return o;
}

在這裡實現手動填寫微博賬號和登錄密碼,同時登錄密碼不顯示(前景色和背景色相同)

private static bool ClientLogin(OAuth o)
{
    Console.Write("微博賬號:");
    string account = Console.ReadLine();
    Console.Write("登錄密碼:");
    ConsoleColor originColor = Console.ForegroundColor;
    Console.ForegroundColor = Console.BackgroundColor; //知道這裡是在干啥不?其實是為了不讓你們看到我的密碼^_^
    string password = Console.ReadLine();
    Console.ForegroundColor = originColor; 
    return o.ClientLogin(account, password);
}

登錄成功後,返回自己的uid,昵稱,證明是自己登上去了

Sina = new Client(oauth);
string uid = Sina.API.Entity.Account.GetUID();
var entity_userInfo = Sina.API.Entity.Users.Show(uid);
Console.WriteLine("昵稱:{0},微博地址:http://weibo.com/{1}", 

entity_userInfo.ScreenName, entity_userInfo.ProfileUrl);

接下來是一個比較重要的的定時任務, 我們使用一個定時器,因為要精確到分鐘,所以程序需要每 分鐘執行一次,

try
{
    t.Interval = 1000 * 60;     //設置間隔時間為1分鐘
    t.Elapsed += new ElapsedEventHandler(TimerElapsedEvent); //到達時間的時候執行事件; 
    t.AutoReset = true;         //設置是執行一次(false)還是一直執行(true); 
    t.Start();                  //啟動Timer對象; 
}
catch (Exception ex)
{
    Console.WriteLine("定時任務異常:" + ex.Message);
    t.Stop();
}

再接下來就是根據小時和分鐘判斷當前要不要“铛~”一下,根據上面的分析,寫一個 函數,傳入24小時制的時間和分鐘,如果需要“铛~”,就返回要發布的微博內容:

static string makeContent(int hour24, int minute)
{
    //地支時間做成數組
    string[] diZhi = "子|丑|寅|卯|辰|巳|午|未|申|酉|戌|亥".Split('|');
    string extWeibo = "";
        
    //當前是偶數小時且分鐘為0 
    if (hour24 % 2 == 0 && minute == 0)
    {
        //根據小時來數敲多少鐘
        for (int i = 0; i < ((hour24 >= 12)? (hour24 - 12): hour24); i++)
        {
            extWeibo += "铛~";
        }
        return "【" + diZhi[hour24 / 2] + "時】" + extWeibo;
    }
    else
    {
        return "";
    }
}

最後,如果當前需要敲鐘,就把微博發布上去,如果發現發布時間和微博時間不同步怎麼辦?
這裡把當前時間也打印出來,如果不同步,就把自己的時間調整成和微博時間一樣吧。

if (!string.IsNullOrEmpty(content))
{
    var statusInfo = Sina.API.Entity.Statuses.Update(content);
    DateTime dtCreate = DateTime.ParseExact(statusInfo.CreatedAt, "ddd MMM dd HH:mm:ss zzz yyyy", CultureInfo.InvariantCulture);
    Console.WriteLine("本機時間:{0}, 微博時間:{1}, 發布內容:{2}", 

string.Format("{0:G}", iNow), string.Format("{0:G}", dtCreate), 

statusInfo.Text);
}

查看本欄目

完整代碼如下:

需要自行修改App相關值:

using System;
using System.Collections.Generic;
using System.Text;
using NetDimension.Weibo;
using System.Timers;
using System.Globalization;
    
namespace WeiboTimer
{
    class Program
    {
        static string AppKey = "********";
        static string AppSecret = "*******";
        static string CallbackUrl = "****************";
        static Timer t = new Timer();
        static OAuth oauth = null;
        static Client Sina = null;
    
        static void Main(string[] args)
        {            
            oauth = Authorize();
            if (!string.IsNullOrEmpty(oauth.AccessToken)){Console.Write("登錄成功!");}
    
            Sina = new Client(oauth);
            string uid = Sina.API.Entity.Account.GetUID();
            var entity_userInfo = Sina.API.Entity.Users.Show(uid);
            Console.WriteLine("昵稱:{0},微博地址:http://weibo.com/{1}", entity_userInfo.ScreenName, entity_userInfo.ProfileUrl);
    
            try
            {
                t.Interval = 1000 * 60;     //設置間隔時間為1分鐘
                t.Elapsed += new ElapsedEventHandler(TimerElapsedEvent); //到達時間的時候執行事件; 
                t.AutoReset = true;         //設置是執行一次(false)還是一直執行(true); 
                t.Start();                  //啟動Timer對象; 
            }
            catch (Exception ex)
            {
                Console.WriteLine("定時任務異常:" + ex.Message);
                t.Stop();
            }
            Console.WriteLine("定時任務開始工作。。。");
            Console.ReadKey();
        }
    
        static OAuth Authorize()
        {
            OAuth o = new OAuth(AppKey, AppSecret, CallbackUrl);
            while (!ClientLogin(o))
            {
                Console.WriteLine("登錄失敗,請重試。");
            }
            return o;
        }
    
        private static bool ClientLogin(OAuth o)
        {
            Console.Write("微博賬號:");
            string account = Console.ReadLine();
            Console.Write("登錄密碼:");
            ConsoleColor originColor = Console.ForegroundColor;
            Console.ForegroundColor = Console.BackgroundColor; //知道這裡是在干啥不?其實是為了不讓你們看到我的密碼^_^
            string password = Console.ReadLine();
            Console.ForegroundColor = originColor; //恢復前景顏色。
            return o.ClientLogin(account, password);
        }
    
        static void TimerElapsedEvent(object sender, ElapsedEventArgs e)
        {
            DateTime iNow = DateTime.Now;
            try
            {
                string content = makeContent(iNow.Hour, iNow.Minute);
                if (!string.IsNullOrEmpty(content))
                {
                    var statusInfo = Sina.API.Entity.Statuses.Update(content);
                    DateTime dtCreate = DateTime.ParseExact(statusInfo.CreatedAt, "ddd MMM dd HH:mm:ss zzz yyyy", CultureInfo.InvariantCulture);
                    Console.WriteLine("本機時間:{0}, 微博時間:{1}, 發布內容:{2}", string.Format("{0:G}", iNow), string.Format("{0:G}", dtCreate), statusInfo.Text);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("定時任務異常:" + ex.Message);
            }
        }
    
        static string makeContent(int hour24, int minute)
        {
            string[] diZhi = "子|丑|寅|卯|辰|巳|午|未|申|酉|戌|亥".Split('|');
            string extWeibo = "";
            if (hour24 % 2 == 0 && minute == 0)
            {
                for (int i = 0; i < ((hour24 >= 12)? (hour24 - 12): hour24); i++)
                {
                    extWeibo += "铛~";
                }
                return "【" + diZhi[hour24 / 2] + "時】" + extWeibo;
            }
            else
            {
                return "";
            }
        }
    }
}

完整程序下載:

運行前需要安裝.NET Framework。 點擊這裡下載.NET Framework 4 並安裝,這個有 40多M
然後下載我的程序:guchengzhonglou.rar (已 經內置Weico.iPhone了哦,親)

作者:http://txw1958.cnblogs.com/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved