requests == 2.18.4
schedule == 0.5.0
和gmail sender :https://github.com/paulchakravarti/gmail-sender
这是我的代码:
"""Send daily Bitcoin price alerts to inbox."""
from time import sleep
from requests import get
import schedule
from gmail import GMail, Message
def get_bitcoin_price():
"""Get current Bitcoin price in USD using Coindesk's real-time API"""
response = get('https://api.coindesk.com/v1/bpi/currentprice.json').json()
return response['bpi']['USD']['rate']
def send_email(recipient: str='walid.mujahid.dev@gmail.com'):
bitcoin_price = get_bitcoin_price()
# enter actual password, otherwise, nothing happens.
gmail = GMail('Price Alert <walid.mujahid.open@gmail.com>',
password='password')
message = Message(f'Bitcoin is at {bitcoin_price} right now!',
to=recipient,
text=f'The current Bitcoin price is {bitcoin_price}.')
gmail.send(message)
if __name__ == '__main__':
schedule.every().day.at("06:30").do(send_email)
while True:
schedule.run_pending()
sleep(1)
#1 楼
定义一些常量我会制作一些常量并将它们放在程序的顶部,因为如果您的程序变得更大,则更改它们的值将变得更加困难:
EMAIL_TIME = '06:30'
SLEEP_TIME = 1
URL = 'https://api.coindesk.com/v1/bpi/currentprice.json'
永远不要将您的凭据存储在明文中
,在这里,您用占位符替换了您的实际密码,但是如果您错误地将其提交并推送到公共git存储库,该怎么办?更多,目前,我还可以接收您的电子邮件,并发送那些不错的伟哥电子邮件。
我通常要做的是将我的凭据存储在另一个配置文件中,该配置文件也位于.gitignore中(这不是很多安全方法,但是至少您看不到它们,反正还是增加了一层额外的安全性。)作为替代方案,您可以根据需要创建环境变量以将其存储在其中。
错误处理
尝试添加一些异常处理以使用户知道其脚本是否出了问题。您甚至可以创建自己的异常类:
class RetrieveUrlException(Exception):
pass
然后可以这样调用:
...
raise RetrieveUrlException('The URL could not be accessed')
评论
\ $ \ begingroup \ $
我认为这是一个很大的假设,即“您用占位符替换了您的实际密码”。如果此“打开”帐户具有该密码,这根本不会令我感到惊讶。
\ $ \ endgroup \ $
–临时狼
18年1月4日在19:04
\ $ \ begingroup \ $
的确:)不足为奇
\ $ \ endgroup \ $
– Grajdeanu Alex
18年1月4日在19:05
#2 楼
在我看来,每天在特定时间运行特定命令比cron
守护程序的工作要多。因此,我会将脚本的可执行部分简化为:if __name__ == '__main__':
send_email()
,然后在您的
cron
配置中添加一个条目,其内容类似于 30 6 * * * /usr/bin/env python /path/to/your/script.py
评论
您如何/何时运行这样的脚本?我正在学习,但是我假设您运行.py并保持IDE打开?它不是“运行和完成”类型的程序,对吧?@BruceWayne我不会通过IDE保持运行,而是打开终端并保持运行。不过,老实说,这个特定的脚本是作为演示而制作的,我只是想看看可以改进什么。如果要真正设置它,我将在这里使用nohup。
令人惊讶的是,这几行代码
您可以从cron调度脚本,而不是将调度逻辑嵌入到脚本中。
享受Python,@ Keatinge :)