前言

我看过一个街头访问!十个人至少有一半是不记得自己的爸妈生日的,如果是女朋友的那十个里面至少九个都记得!当然这也说明不了啥。其实父母生日不用送特别贵重的东西啥的,一般的父母都只要你这个做子女的记得,送上一两句祝福他们就满足了!为什么今天突然想到写这样的一篇技术文呢,因为前两天是我老爸的生日,在之前我都记着的,可是前两天特别忙!就忘记打电话回家了!然后就被我的女朋友责怪!!所以我写了这么一个能提醒我和帮助我发祝福的一个软件!

因为我们那边的习俗其实是过阴历的!比如说中秋节今年是9月20号,阴历就算是八月十五!过这个日历的!不知道你们的习俗是不是也一样!

​废话不多说:在本教程中,我们将创建一个精确的端到端系统.我们会用Twilio的WhatsAppAPI为了发送消息,用于web服务器的Flask web框架,我们将使用以下方法定期运行消息传递作业APScheduler。我们还将将Flask应用程序部署到AWS,以便能够灵活和大规模地部署它。

必要条件

  • 一个Twilio账户。(与此链接签约,并获得额外的10美元的信用。)
  • 安装在手机上的WhatsApp应用程序
  • 激活WhatsApp Sandbox(请务必遵循安装说明)。
  • 你的帐户SIDAuth令牌,在你的Twilio帐户仪表板如下所示:

关于使用WhatsApp的特别说明

WhatsApp必须正式批准您的帐户,然后才能在生产能力内与WhatsApp一起发送消息,甚至是用于个人项目。这并不意味着你必须等待开始建设,尽管!WhatsApp的TwilioSandbox允许您在开发人员环境中测试应用程序。您将能够使用Sandbox完成本教程,但您需要您的WhatsApp帐户的批准,以使生日智慧运行24/7。这是因为WhatsAppSandbox会话在3天后到期,必须重新启用。

创建Python虚拟环境

在命令提示符中为该项目创建一个名为

WhatsApp-生日

,然后导航到这个新目录:

$ mkdir whatsapp-birthday-wisher
$ cd whatsapp-birthday-wisher

我们将创造一个新的虚拟环境对于这个项目,我们需要安装的依赖项不会干扰计算机上的全局设置。若要创建名为“env”的新环境,请运行以下命令:

$ python3 -m venv env
$ source env/bin/activate

在获取虚拟环境之后,您将看到命令提示符的输入行以环境名称(“env”)开头。Python创建了一个名为

环境/在

WhatsApp-生日

目录,您可以通过运行ls命令在您的命令提示符中。如果使用git作为版本控制系统,则应添加以下新的

环境/

目录到

.gitignore

这样git就不知道跟踪它了。若要创建

.gitignore

文件中的

WhatsApp-生日-睿智

目录中,运行以下命令:

(env) $ touch .gitignore

打开

.gitignore

文件在您选择的文本编辑器中,然后添加

环境/

文件夹到.gitignore文件的内容:

env/

安全地存储环境变量

您需要使用本教程开始时所定位的帐户SID和Auth令牌,以便与TwilioAPI进行交互。这两个环境变量应该保持私有,这意味着我们不应该将它们的值放在代码中。相反,我们可以将它们存储在

.env

文件并列出

.env

在我们的

.gitignore

这样git就不会追踪它了。一个

.env

每当需要将环境变量提供给操作系统时,都会使用文件。

注意,

环境/

由Python为虚拟环境创建的文件夹与

.env

为存储机密而创建的文件。

首先,创建

.env

档案:

(env) $ touch .env

接下来,打开

.env

在您喜欢的文本编辑器中添加以下行,用自己的值替换随机字符串占位符值:

export ACCOUNT_SID=AzLdMHvYEn0iKSJz
export AUTH_TOKEN=thFGzjqudVwDJDga

来源

.env

文件以使其可供操作系统使用,然后将环境变量值打印到控制台以确认它们是成功来源的:

(env) $ source .env
(env) $ echo $ACCOUNT_SID
(env) $ echo $AUTH_TOKEN

安装Python依赖项

项目所需的Python包是:

  • Twilio-提供了对什么应用程序API的访问
  • pandas-使生日更容易处理
  • AP调度器-在特定时间运行我们的功能
  • Flask-为我们的项目提供web服务器

Python项目所需的依赖项通常列在一个名为

Requirements.txt

。创建一个

Requirements.txt

文件中的

WhatsApp-生日

目录:

(env) $ touch requirements.txt

将此Python包列表复制并粘贴到您的

Requirements.txt

使用首选文本编辑器的文件:

twilio
flask
pandas
apscheduler

使用以下命令安装所有依赖项,确保您的虚拟环境(“env”)仍然来源于:

(env) $ pip install -r requirements.txt

使用Python发送WhatsApp消息

使用TwilioAPI时,用Python脚本发送消息很简单。首先,创建一个

App.py

文件中的

WhatsApp-生日

目录:

(env) $ touch app.py

复制并粘贴下面的起始代码到

App.py

档案:

import osfrom twilio.rest import Clientaccount_sid = os.environ.get('ACCOUNT_SID')
auth_token = os.environ.get('AUTH_TOKEN')
client = Client(account_sid, auth_token)

在第1行和第3行,我们导入Python的内置os库中的客户端对象。twilioPython包,它方便了与TwilioAPI的通信。在第5和第6行中,插入您在先决条件本教程中单引号之间的部分。在第7行中,使用Account SID和Auth令牌实例化客户端对象。

现在我们可以使用客户对象访问Twilio的API。在最初的几行代码之后,只需要一个对象方法就可以发送WhatsApp消息。在下面的示例中,从…WhatsApp号码是在你的TwilioWhatsAppSandbox中提供的。替换WhatsApp号码现在有你自己的号码,包括国家代码。您还可以自定义与体体变量如果你想的话。

复制并粘贴此代码到

App.py

文件,在其他代码下面:

client.messages.create(body='Hello!',from_='whatsapp:+14155238886',  # This is the Twilio Sandbox number. Don't change it.to='whatsapp:+19876543210'  # Replace this with your WhatsApp number
)

在命令提示符中,从

WhatsApp-生日

目录(其中

App.py

)来运行代码段:

(env) $ python3 app.py

您将在WhatsApp聊天中看到来自Twilio Sandbox的新消息。这是TwilioAPI提供的强大和可伸缩性的一个很好的例子!

通过WhatsApp发送生日祝福

让我们在上一节提供的代码的基础上,创建一个可以向您所爱的人发送生日愿望的函数。首先,删除

Client.messages.create()

函数从上一节调用。然后,将以下示例代码复制并粘贴到您的

App.py

您已经拥有的代码下面的文件。继续阅读,了解代码的功能。

def send_birthday_wish(client, recipient_number, recipient_name):"""Send a birthday wish to a recipient using their WhatsApp number.Args:client (object): An instantiation of the Twilio API's Client objectrecipient_number (str): The number associated with the recipient's WhatsApp account,including the country code, and prepended with '+'. For example, '+14155238886'.recipient_name (str): The recipient's nameReturns:True if successful, otherwise returns False"""birthday_wish = """Hey {}, this is Ashutosh's personal birthday wisher.Happy Birthday to you! I wish you all the happiness that you deserve.I am so proud of you.""".format(recipient_name)try:message = client.messages.create(body=birthday_wish,from_='whatsapp:+14155238886',  # This is the Twilio Sandbox number. Don't change it.to='whatsapp:' + recipient_number)print("Birthday wish sent to", recipient_name, "on WhatsApp number", recipient_number)return Trueexcept Exception as e:print("Something went wrong. Birthday message not sent.")print(repr(e))return Falsesend_birthday_wish(client, '+19876543210, 'Ashutosh')

在新函数中,我们首先定义生日愿望变量作为多行字符串。请随意定制这个!然后,我们定义讯息变量,使用与Twilio的语法相同的语法进行交互。客户对象。为了测试目的,使用Twilio Sandbox WhatsApp编号作为从__数。

在示例代码的最后一行中,函数将被调用,您将把自己的WhatsApp编号作为测试用的号码和你自己的名字。

注意,负责发送消息的代码包装在try/except封锁。这将确保如果发生了错误并且消息没有发送,您将在控制台中获得有用的输出。

若要测试该功能,请运行

App.py

再次存档:

(env) $ python3 app.py

你应该收到你手机上的WhatsApp消息。到目前为止干得不错!

将出生日期存储在CSV文件中

我们现在可以发送生日信息,但我们不会存储我们所爱的人的出生日期在任何地方。为了保持简单,我们可以将出生日期信息存储在逗号分隔值(CSV)文件中,如下所示:

​CSV文件将包含与收件人姓名、出生日期和WhatsApp编号相对应的3列。每一行代表一个人,您可以添加任意多的行。如果你将来交了新朋友(或者新的家庭成员出生了!)您可以简单地更新CSV文件。

中创建一个新的CSV文件。

WhatsApp-生日-睿智

使用以下命令的目录:

(env) $ touch birth_dates.csv

在首选文本编辑器中打开该文件。复制并粘贴下面所示的两个示例行。将日期和月份更改为今天的日期,并使用您自己的WhatsApp编号,以便您可以测试该功能。注意,数据点之间没有空格,只有逗号。尽可能多地添加行。

Name,Birth Date,WhatsApp Number
Alfred,09-08-1997,+15055543332

将CSV文件转换为pandas数据

我们现在可以将CSV文件导入到

App.py

文件使用pandas我们之前安装的库。Pandas库将帮助我们将CSV文件中的信息转换为所谓的数据格式(Dataframe)。

首先,导入日期时间和Pandas库。请注意,将内置Python库的导入与带有空行的第三方包导入分开是很常见的。(如果您从您自己的项目中导入模块,这些模块将位于第三方包的下面,并以另一个空白行与它们分开。)

from datetime import datetime
import osimport pandas as pd
from twilio.rest import Client

接下来,我们将创建一个名为创建生日_dataframe()...此函数将加载

出生日期

归档并返回代表生日信息的pandas数据。中已经存在的代码下面添加以下示例代码

App.py

,并删除

送生日祝福()

函数调用,它以前位于文件的最后一行。

def create_birthdays_dataframe():"""Create a pandas dataframe containing birth date information from a CSV file.Args:NoneReturns:A dataframe if successful, otherwise returns False."""try:dateparse = lambda x: datetime.strptime(x, "%m-%d-%Y")birthdays_df = pd.read_csv("birth_dates.csv",dtype=str,parse_dates=['Birth Date'],date_parser=dateparse)return birthdays_dfexcept Exception as e:print("Something went wrong. Birthdays dataframe not created.")print(repr(e))return False

在上面新引入的代码中,日期解析对象是一个Pythonlambda函数,它解析日期。这个生日df对象是一个pandas数据,它表示

出生日期

档案。与解析CSV文件中的日期相关的代码包装在try/except块,它将在出现问题时将消息打印到控制台。

您可以测试代码以确保此函数返回数据。的末尾添加一个函数调用。

App.py

create_birthdays_dataframe()

然后重新运行文件。数据文件将打印到您的控制台。

(env) $ python3 app.py

确定今天是不是某人的生日

我们添加到的代码

App.py

在上一节中,我们将CSV文件中的数据导入到脚本中,但我们还没有编写使用该数据的代码。

现在我们已经创建了一个发送消息的函数,并且在我们的

App.py

文件中,我们可以安排每天运行脚本的时间。CSV文件中任何与运行我们程序的计算机的日期相匹配的出生日期的人都会自动收到WhatsApp生日消息。如果你在世界的另一边有爱过的人,请特别注意时区!

我们将创建一个函数来检查今天的日期,并将其与CSV文件中的出生日期进行比较。如果日期匹配,其生日的人将收到WhatsApp消息。将下面所示的代码添加到

App.py档案:

def check_for_matching_dates():"""Calls the send_birthday_wish() function if today is someone's birthday.Args:NoneReturns:True if successful, otherwise returns False."""try:birthdays_df = create_birthdays_dataframe()birthdays_df["day"] = birthdays_df["Birth Date"].dt.daybirthdays_df["month"] = birthdays_df["Birth Date"].dt.monthtoday = datetime.now()for i in range(birthdays_df.shape[0]):birthday_day = birthdays_df.loc[i, "day"]birthday_month = birthdays_df.loc[i, "month"]if today.day == birthday_day and today.month == birthday_month:send_birthday_wish(client, birthdays_df.loc[i, "WhatsApp Number"], birthdays_df.loc[i, "Name"])return Trueexcept Exception as e:print("Something went wrong. Birthday check not successful.")print(repr(e))return Falsecheck_for_matching_dates(create_birthdays_dataframe())

这个新函数将CSV文件中每一行的日期和月份与今天的日期和月份进行比较。如果日期和月份都匹配,则检查匹配日期()函数通过调用送生日祝福()函数。如果两个或两个以上的人共享一个生日,他们每个人都会收到一条WhatsApp消息。

使用APScheduler计划生日检查器

让我们安排一下检查匹配日期()函数每天上午12:01分运行APScheduler。请记住,根据承载您代码的计算机,运行时间将是上午12:01分,因此您可能需要调整其时区,以更好地反映您所爱的大多数人居住的地方。

导入背景计划中的APScheduler包中的App.py

from datetime import datetime
import osfrom apscheduler.schedulers.background import BackgroundScheduler
import pandas as pd
from twilio.rest import Client

的底部,删除现有的函数调用,以检查_for_Match_DATES()。App.py。然后将下面所示的代码添加到

App.py

scheduler = BackgroundScheduler()
job = scheduler.add_job(check_for_matching_dates, 'cron', day_of_week ='mon-sun', hour=0, minute=1)
scheduler.start()

新代码创建了BackgroundScheduler调度器。我们称之为调度器对象的Add_JOB()方法,该方法定义何时以及如何运行检查匹配日期()功能。

如果我们运行App.py文件现在从我们的命令行,正如我们所做的,它将执行一次作业,然后程序将终止。我们需要一种使文件无限期运行的方法,以便脚本每天12:01分运行。为此,我们将设置一个名为Flask的轻量级Web服务器。

使用flask创建Web服务器

要使用Flask设置Web服务器,我们首先需要导入它:

from datetime import datetime
import osfrom apscheduler.schedulers.background import BackgroundScheduler
from flask import Flask
import pandas as pd
from twilio.rest import Client

然后,我们可以用3行代码实例化一个Flask应用程序!

app = Flask(__name__)
if __name__ == '__main__':app.run()

把这条线放在进口的正下方,朝向…的顶端。

App.py

from datetime import datetime
import osfrom apscheduler.schedulers.background import BackgroundScheduler
from flask import Flask
import pandas as pd
from twilio.rest import Clientapp = Flask(__name__)account_sid = os.environ.get('ACCOUNT_SID')
auth_token = os.environ.get('AUTH_TOKEN')
client = Client(account_sid, auth_token)

将其他2行烧瓶代码粘贴到

App.py

文件,在我们在上一节中添加的与调度程序相关的代码下面。

scheduler = BackgroundScheduler()
job = scheduler.add_job(check_for_matching_dates, 'cron', day_of_week ='mon-sun', hour=0, minute=1)
scheduler.start()if __name__ == '__main__':app.run()

您可以使用以下任一命令启动Flask服务器:

(env) $ python3 app.py

(env) $ flask run

这就是我们需要的全部代码!本教程的完整代码可在这个Gizub存储库 .

运行云中的Flask web服务器

为了开发目的,在本地机器上运行Flask应用程序是可以的,但这意味着您的计算机必须在24/7状态下运行,这样您的服务器就不会崩溃。而且,由于我们不想错过任何人的生日,所以我们需要一种更有弹性的方式来托管服务器。按照Twilio教程中的步骤,在AWSEC 2实例上部署一个Flask应用程序--不涉及压力! .

如果您不喜欢使用AWS,您可以使用其他流行的云提供商。

结语

祝贺你!你创造了一个自动的生日智慧,你再也不需要强调忘记某人的生日了。

在本教程中,您学习了如何:

  • 编写函数发送WhatsApp消息
  • 使用APScheduler定期运行函数
  • 使用flask创建Web服务器
  • 将您的Flask应用程序部署到您选择的云提供商

如果要扩展本教程,可以修改

送生日祝福()

功能SO在WhatsApp中获得一条提醒信息,然后你可以自己打电话给他。

我等不及要看你做什么了!

前两天老爸生日,我给整忘了!还好我有个它提醒和自动发送生日祝福!相关推荐

  1. OSChina 周四乱弹 ——前两天BUG还没改完啊?老子不改了!

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) [今日歌曲] @=clouddyy  :#每日乱弹音乐# <Safe and S ...

  2. 仅改变rowspan背景_重排96黄金一代选秀前4位!艾弗森仅第三,前两名竟然还是队友...

    重排96黄金一代选秀前4位!艾弗森仅第三,前两名竟然还是队友 1996年是NBA不平凡的一年,这一年选秀大会上诞生了众多可以改变联盟的超级巨星,96黄金一代是不输03白金一代的存在,因此1996年是N ...

  3. 阅读WPF揭秘前两章探索Silverlight运行的基本原理和RIA工作流程的密码(二)

    2.8  编译:将XAML与过程式代码混合使用 WPF允许用任何一种.NET语言完全以过程式代码编写应用程序.另外,一些简单的应用程序可以完全写在XAML中,这多亏了在第9章中提到的数据绑定特性,以及 ...

  4. 前两天去A公司面试,面试管问的题目一下子闷了。很郁闷。重新答题。在这里分享一下...

    前两天去A公司面试,面试管问的题目一下子闷了.很郁闷.重新答题.在这里分享一下. 1) 问:请问你最近做过什么项目,介绍一下大致的情况? 答:做了http://www.chinatravel.net, ...

  5. ​CSRankings年度更新,清华北大包揽AI领域前两名​ | AI日报

    CSRankings年度更新,清华北大包揽AI领域前两名,CMU第三 全球院校计算机科学领域实力排名开源项目CSRankings,更新了2020-2021年的最新数据.最新排名显示: AI(含5项细分 ...

  6. mysql每学科前两名 having_mysql 分组查询前n条数据

    今天去面试,碰到一道面试题: 有一个学生成绩表,表中有 表id.学生名.学科.分数.学生id .查询每科学习最好的两名学生的信息: 建表sql: CREATE TABLE `stuscore` ( ` ...

  7. 前两天谁要的抢红包利器,给你安排了

    前两天,TJ君记得分享过几个关于抢九价疫苗的开源项目(九价抢不到?多试试这几个GitHub上的开源项目),当时有一个小伙伴给TJ君留言说过:有没有抢红包的项目? TJ君肯定就记在了心上,这不,功夫不负 ...

  8. jquery 获取前两个table里的每个tr里面的第二个td

    jquery 获取前两个table里的每个tr里面的第二个td $("table:lt(2)>tbody>tr td:nth-child(2)) $("table:lt ...

  9. 移植fatfs上电复位前两次不能正确打开文件解决方法

    最近移植了fatfs到stm32,昨晚写进了第一个txt文件,然后就睡觉了,以为移植差不多了,今晚试了一下,发现不好用了, res = f_open(&file, "text.txt ...

最新文章

  1. 对象引用未保存的瞬态实例-在刷新之前保存瞬态实例
  2. JavaScript中的作用域,闭包和上下文
  3. 搞定系统设计 02:估算的一些方法
  4. Leet Code OJ 8. String to Integer (atoi) [Difficulty: Easy]
  5. Qt QSS知识点记录
  6. react实现简单的表单
  7. 设计模式学习笔记0——概念
  8. DBA一族九阳神功秘籍
  9. EasyRecovery如何恢复系统镜像
  10. c 语言申明头文件和实现分开简单例子
  11. C#移除对象中的属性(model类或集合等)JObject
  12. matlab创建wps服务器,wps设置云服务器地址(wps放到服务器)
  13. Win10电脑卡顿原因和解决方法
  14. Oracle 中的各种读
  15. zabbix报警功能(邮件报警)---触发器/动作
  16. Web系统测试中的重点
  17. TRECA 崔佧智能低代码开发使用说明
  18. LQ0198 圆周率【程序填空】
  19. 想自学软件测试?一般人我还是劝你算了吧。。。
  20. 创建Java Web工程

热门文章

  1. win10 看不到局域网其他电脑怎么解决
  2. java 发送html格式的邮件(包含附件)
  3. 商家转账到零钱场景申请模板有吗
  4. Goblintown.wtf project research report
  5. mysql数据库与mysqli_通过 PHP Mysqli 扩展与 MySQL 数据库交互
  6. sojson jsjiami.com.v6 爬虫js逆向
  7. vert.x+java入门_从Vert.x开始_Java API 版本的Vert.x Core 手册_w3cschool
  8. vux-upload组件
  9. matlab车头时距,教你如何判断车头与前车的距离?so easy!
  10. FPGA时序约束与分析 (3)--- 虚拟时钟约束