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

知识的领域是无限的,我们的学习也是无限期的。这篇文章主要讲述前两天老爸生日,我给整忘了!还好我有个它提醒和自动发送生日祝福!相关的知识,希望能为你提供帮助。
前言我看过一个街头访问!十个人至少有一半是不记得自己的爸妈生日的,如果是女朋友的那十个里面至少九个都记得!当然这也说明不了啥。其实父母生日不用送特别贵重的东西啥的,一般的父母都只要你这个做子女的记得,送上一两句祝福他们就满足了!为什么今天突然想到写这样的一篇技术文呢,因为前两天是我老爸的生日,在之前我都记着的,可是前两天特别忙!就忘记打电话回家了!然后就被我的女朋友责怪!!所以我写了这么一个能提醒我和帮助我发祝福的一个软件!
因为我们那边的习俗其实是过阴历的!比如说中秋节今年是9月20号,阴历就算是八月十五!过这个日历的!不知道你们的习俗是不是也一样!
?

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

文章图片
?
前两天老爸生日,我给整忘了!还好我有个它提醒和自动发送生日祝福!

文章图片

?废话不多说:在本教程中,我们将创建一个精确的端到端系统.我们会用Twilio的WhatsAppAPI为了发送消息,用于web服务器的Flask web框架,我们将使用以下方法定期运行消息传递作业APScheduler。我们还将将Flask应用程序部署到AWS,以便能够灵活和大规模地部署它。
必要条件
  • 一个Twilio账户。(与此链接签约,并获得额外的10美元的信用。)
  • 安装在手机上的WhatsApp应用程序
  • 激活WhatsApp Sandbox(请务必遵循安装说明)。
  • 你的帐户SID和Auth令牌,在你的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 object recipient_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.day birthdays_df["month"] = birthdays_df["Birth Date"].dt.month today = 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中获得一条提醒信息,然后你可以自己打电话给他。

我等不及要看你做什么了!
【前两天老爸生日,我给整忘了!还好我有个它提醒和自动发送生日祝福!】

    推荐阅读