原文:
大家最近都在熱議古城鐘樓的紅火。不是加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/