戈兰机器人算上您一生中最好的一天 - 假期
#aws #编程 #twitter #go

返回我希望分享知识和经验的愿望,今天我将展示一个非常酷的项目。

当时,我处于学位。尽管我喜欢大学,并认为学术界对于伟大的软件开发人员的教育非常重要(但不是强制性的),但假期是每个大学生看起来都很焦虑的时候。

这个想法ð€

然后,当时我已经在Go中学习了,我有一个想法,为什么不为Twitter做一个机器人呢?

一个机器人每天都有一条推文,告诉我在大学假期之前剩下多少天,对我和我的大学陪同。

项目的存储库 - > https://github.com/Luisgustavom1/go-twitter-bot

今天,这就是我要显示的,我将展示简单的机器人代码以及如何在AWS中构建Instra以自动化此过程,显然使用了免费的Tierðä。

在开始之前,我将其分为4个主要步骤ð:

  • 创建一个主要功能,该功能必须接收日期并返回到这个日期之前剩下多少天。
  • 与Twitter连接以制作推文。
  • 在AWS lambda中配置该函数。
  • 每天给出一种执行lambda功能的方式。

1.功能

此功能的代码非常简单。

我有一个函数以格式日期,另一个可以减去日期。

package main

import (
    "log"
    "math"
    "time"
)

type DaysRemaining int

func main() {
    VACATION_DATE := "2023/06/29 23:00:00 -03"

    vacationDateFormatted, err := getVacationDateFormatted(VACATION_DATE)
    if err != nil {
        log.Fatal(err)
    }
    daysToVacation := getDaysRemaining(vacationDateFormatted)

    log.Println("tweet", daysToVacation)
}

func getVacationDateFormatted(date string) (time.Time, error) {
    const shortFormat = "2006/01/02 15:04:05 -07"
    // Format date to this format and timezone 👆👆 
    dateParsed, err := time.Parse(shortFormat, date)

    if err != nil {
        return dateParsed, err
    }

    return dateParsed, nil
}

func getDaysRemaining(date time.Time) DaysRemaining {
    today := time.Now()
    duration := date.Sub(today)
    // Subtract today from vacation date 
    return DaysRemaining(math.Ceil(duration.Hours() / 24))
}

主要逻辑基本上是,在另一篇文章中,我们可以探索有关Golang及其功能的更多信息,但是今天我只想概述代码。

2.与Twitter连接

当时我使用此client library抽象Twitter API,但不幸的是它已弃用

所以今天也许不是最好的选择。您可以冒险进入twitter api

在此步骤中,我必须生成API键和访问令牌。每当我到达这一部分与第三方集成时,我都会迷失在这个秘密的地方,所以这里是Twitter api keyaccess token的秘密。

package main

import (
    "log"
    "math"
    "time"
    "os"

    "github.com/dghubble/go-twitter/twitter"
    "github.com/dghubble/oauth1"
)

func main() {
    //...
    // Initial config to oauth 1.0a
    config := oauth1.NewConfig(
        os.Getenv("API_KEY"),
        os.Getenv("API_KEY_SECRET"),
    )
    token := oauth1.NewToken(
        os.Getenv("ACCESS_TOKEN"),
        os.Getenv("ACCESS_TOKEN_SECRET"),
    )

    // Create a http client with oauth 1.0a method
    httpClient := config.Client(oauth1.NoContext, token)

    // Create the client to access twitter api methods(endpoints)
    client := twitter.NewClient(httpClient)

    //...

    daysToVacation := getDaysRemaining(vacationDateFormatted)
    messageToTweet, err := generateMessageToTweet(daysToVacation)
    if err != nil {
        log.Fatal(err)
    }

    // Method to publish a tweet
    client.Statuses.Update(messageToTweet, nil)
}

3.创建lambda功能

当时我只知道有关lambda功能的概念,因此我将在这个简单的项目中学到一项技术。

让我们https://github.com/Luisgustavom1/go-twitter-bot

  1. Choose Author from scratch.
  2. 放置您的机器人的名称。
  3. 选择语言和体系结构。

AWS dashboard to create a lambda function

现在,要使用GO与Lambda一起工作,我们必须更改代码并使用此official aws tool

因此,我们将软件包导入,将main函数重命名为Handler并创建一个新的main,该main将执行AWS工具的.Start()方法。

Handler函数是操纵事件的方法。需要main函数,是AWS Lambda运行我们的代码的切入点。

package main

import (
    // ...
    // Import the package
    "github.com/aws/aws-lambda-go/lambda"
)

type DaysRemaining int

func main() {
    // The `main` should start the Handler function
    lambda.Start(Handler)
}

// Out function that contains the logic
func Handler() {
    VACATION_DATE := "2023/06/29 23:00:00 -03"

    config := oauth1.NewConfig(
        os.Getenv("API_KEY"),
        os.Getenv("API_KEY_SECRET"),
    )
    // ...
}

如果您想开发更复杂的事件和功能,则可以访问事件名称,并在处理程序功能中使用上下文,see more

完成代码后,不要忘记将代码上传到AWS lambda,要么通过上传.zip文件或配置S3存储桶,然后在环境变量中添加Twitter键(Configuration> Environment variables)。

4.每天跑步

有人曾经告诉我

“开发人员是最懒惰的,因为他们想自动化一切”

显然我不会每天手动执行lambda,我们可以使用AWS CloudWatch事件在特定时间触发该功能。

然后让我们添加一个触发器

AWS lambda dashboard to add a trigger

  • 选择EventBridge (CloudWatch Events)
  • 检查Create a new rule
  • 检查Schedule Expression
  • 放置cron表达式。

对于我的机器人,我使用此cron cron(00 09 ? * * *),它将每天在09:00 UTC运行,即GTM-3中的06:00。
Process to create the trigger

如果在创建lambda函数时,请检查这些配置(默认配置):Permissions> Change default execution role> Create a new role with basic Lambda permissions。您不必担心Lambda访问云手表的IAM角色,AWS已经为您创建了角色lambda permissions

帽子,请参阅twitter中的bot perfil。

希望您喜欢。

在社交网络上关注我: