我的脚本将有关比特币价格的每日警报发送到我的收件箱。我正在使用CoinDesks API和以下库:

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)


评论

您如何/何时运行这样的脚本?我正在学习,但是我假设您运行.py并保持IDE打开?它不是“运行和完成”类型的程序,对吧?

@BruceWayne我不会通过IDE保持运行,而是打开终端并保持运行。不过,老实说,这个特定的脚本是作为演示而制作的,我只是想看看可以改进什么。如果要真正设置它,我将在这里使用nohup。

令人惊讶的是,这几行代码

您可以从cron调度脚本,而不是将调度逻辑嵌入到脚本中。

享受Python,@ Keatinge :)

#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