返回我希望分享知识和经验的愿望,今天我将展示一个非常酷的项目。
当时,我处于学位。尽管我喜欢大学,并认为学术界对于伟大的软件开发人员的教育非常重要(但不是强制性的),但假期是每个大学生看起来都很焦虑的时候。
这个想法ð€
然后,当时我已经在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 key和access 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
- Choose
Author from scratch
. - 放置您的机器人的名称。
- 选择语言和体系结构。
现在,要使用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事件在特定时间触发该功能。
- 选择
EventBridge (CloudWatch Events)
。 - 检查
Create a new rule
。 - 检查
Schedule Expression
。 - 放置cron表达式。
对于我的机器人,我使用此cron cron(00 09 ? * * *)
,它将每天在09:00 UTC运行,即GTM-3中的06:00。
如果在创建lambda函数时,请检查这些配置(默认配置):
Permissions
>Change default execution role
>Create a new role with basic Lambda permissions
。您不必担心Lambda访问云手表的IAM角色,AWS已经为您创建了角色lambda permissions。
帽子,请参阅twitter中的bot perfil。
希望您喜欢。
在社交网络上关注我: