热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

古城钟楼微博地支报时程序铛,100行代码实现,价值一天20万粉丝

大家最近都在热议古城钟楼的红火。不是加V号、不是官方号、不是皇冠会员。没有拟人化,没有段子、没有运营。1天之内从1万不到的粉丝新增了20多万并且还在持续传播和增长粉丝


大家最近都在热议古城钟楼的红火。不是加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相关值:


 1 using System;  2 using System.Collections.Generic;  3 using System.Text;  4 using NetDimension.Weibo;  5 using System.Timers;  6 using System.Globalization;  7  8 namespace WeiboTimer  9 {  10 class Program  11  {  12 static string AppKey = "********";  13 static string AppSecret = "*******";  14 static string CallbackUrl = "****************";  15 static Timer t = new Timer();  16 static OAuth oauth = null;  17 static Client Sina = null;  18  19 static void Main(string[] args)  20  {  21 oauth = Authorize();  22 if (!string.IsNullOrEmpty(oauth.AccessToken)){Console.Write("登录成功!");}  23  24 Sina = new Client(oauth);  25 string uid = Sina.API.Entity.Account.GetUID();  26 var entity_userInfo = Sina.API.Entity.Users.Show(uid);  27 Console.WriteLine("昵称:{0},微博地址:http://weibo.com/{1}", entity_userInfo.ScreenName, entity_userInfo.ProfileUrl);  28  29 try  30  {  31 t.Interval = 1000 * 60; //设置间隔时间为1分钟  32 t.Elapsed += new ElapsedEventHandler(TimerElapsedEvent); //到达时间的时候执行事件;   33 t.AutoReset = true; //设置是执行一次(false)还是一直执行(true);   34 t.Start(); //启动Timer对象;   35  }  36 catch (Exception ex)  37  {  38 Console.WriteLine("定时任务异常:" + ex.Message);  39  t.Stop();  40  }  41 Console.WriteLine("定时任务开始工作。。。");  42  Console.ReadKey();  43  }  44  45 static OAuth Authorize()  46  {  47 OAuth o = new OAuth(AppKey, AppSecret, CallbackUrl);  48 while (!ClientLogin(o))  49  {  50 Console.WriteLine("登录失败,请重试。");  51  }  52 return o;  53  }  54  55 private static bool ClientLogin(OAuth o)  56  {  57 Console.Write("微博账号:");  58 string account = Console.ReadLine();  59 Console.Write("登录密码:");  60 ConsoleColor originColor = Console.ForegroundColor;  61 Console.ForegroundColor = Console.BackgroundColor; //知道这里是在干啥不?其实是为了不让你们看到我的密码^_^  62 string password = Console.ReadLine();  63 Console.ForegroundColor = originColor; //恢复前景颜色。  64 return o.ClientLogin(account, password);  65  }  66  67 static void TimerElapsedEvent(object sender, ElapsedEventArgs e)  68  {  69 DateTime iNow = DateTime.Now;  70 try  71  {  72 string cOntent= makeContent(iNow.Hour, iNow.Minute);  73 if (!string.IsNullOrEmpty(content))  74  {  75 var statusInfo = Sina.API.Entity.Statuses.Update(content);  76 DateTime dtCreate = DateTime.ParseExact(statusInfo.CreatedAt, "ddd MMM dd HH:mm:ss zzz yyyy", CultureInfo.InvariantCulture);  77 Console.WriteLine("本机时间:{0}, 微博时间:{1}, 发布内容:{2}", string.Format("{0:G}", iNow), string.Format("{0:G}", dtCreate), statusInfo.Text);  78  }  79  }  80 catch (Exception ex)  81  {  82 Console.WriteLine("定时任务异常:" + ex.Message);  83  }  84  }  85  86 static string makeContent(int hour24, int minute)  87  {  88 string[] diZhi = "子|丑|寅|卯|辰|巳|午|未|申|酉|戌|亥".Split('|');  89 string extWeibo = "";  90 if (hour24 % 2 == 0 && minute == 0)  91  {  92 for (int i = 0; i <((hour24 >= 12)? (hour24 - 12): hour24); i++)  93  {  94 extWeibo += "铛~";  95  }  96 return "" + diZhi[hour24 / 2] + "时】" + extWeibo;  97  }  98 else  99  { 100 return ""; 101  } 102  } 103  } 104 }



完整程序下载:

运行前需要安装.NET Framework。 点击这里下载.NET Framework 4 并安装,这个有40多M
然后下载我的程序:guchengzhonglou.rar (已经内置Weico.iPhone了哦,亲)


推荐阅读
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • Lodop中特殊符号打印设计和预览样式不同的问题解析
    本文主要解析了在Lodop中使用特殊符号打印设计和预览样式不同的问题。由于调用的本机ie引擎版本可能不同,导致在不同浏览器下样式解析不同。同时,未指定文字字体和样式设置也会导致打印设计和预览的差异。文章提出了通过指定具体字体和样式来解决问题的方法,并强调了以打印预览和虚拟打印机测试为准。 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • 本文介绍了求解gcdexgcd斐蜀定理的迭代法和递归法,并解释了exgcd的概念和应用。exgcd是指对于不完全为0的非负整数a和b,gcd(a,b)表示a和b的最大公约数,必然存在整数对x和y,使得gcd(a,b)=ax+by。此外,本文还给出了相应的代码示例。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 电销机器人作为一种人工智能技术载体,可以帮助企业提升电销效率并节省人工成本。然而,电销机器人市场缺乏统一的市场准入标准,产品品质良莠不齐。创业者在代理或购买电销机器人时应注意谨防用录音冒充真人语音通话以及宣传技术与实际效果不符的情况。选择电销机器人时需要考察公司资质和产品品质,尤其要关注语音识别率。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
author-avatar
mobiledu2502876597
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有