如何從頭開(kāi)始使用 Golang 構(gòu)建 Twitter 機(jī)器人
正如標(biāo)題所示,您已經(jīng)知道本教程的內(nèi)容!所以,是的,我們將從頭開(kāi)始使用 Golang 構(gòu)建 Twitter 機(jī)器人。是的,我們不會(huì)使用任何第三方庫(kù)來(lái)開(kāi)發(fā)我們的演示應(yīng)用程序。本教程主要有兩個(gè)部分:Twitter 設(shè)置和編碼部分。所以,事不宜遲,讓我們開(kāi)始我們的開(kāi)發(fā)。
教程要點(diǎn):使用 Golang 構(gòu)建 Twitter 機(jī)器人
本教程將回答以下問(wèn)題:如何使用 Golang 構(gòu)建 Twitter 機(jī)器人–
如何設(shè)置 Twitter 開(kāi)發(fā)者帳戶(hù)?
為什么我們需要高級(jí)開(kāi)發(fā)者帳戶(hù)?
如何安裝 ngrok 以及為什么我們需要 ngrok?
什么是 CRC 驗(yàn)證?
什么是Webhook,如何注冊(cè)webhook,如何訂閱webhook?
使用 Golang 構(gòu)建 Twitter 機(jī)器人
先決條件
基本的 Golang 知識(shí)
Twitter 開(kāi)發(fā)者帳戶(hù)(如果您沒(méi)有,請(qǐng)繼續(xù)閱讀并創(chuàng)建帳戶(hù))
在您的系統(tǒng)上安裝 Golang
Twitter 開(kāi)發(fā)者帳戶(hù)設(shè)置
創(chuàng)建 Twitter 開(kāi)發(fā)帳戶(hù)
訪問(wèn)Twitter Developer Platform并填寫(xiě)所需信息。
您將看到以下屏幕。為您的應(yīng)用程序命名。我在這里命名為tweet_b@t。
成功完成后,您將被重定向到儀表板,如下所示。
Twitter 提供只讀權(quán)限,但對(duì)于我們的演示應(yīng)用程序,我們還需要寫(xiě)入權(quán)限。所以點(diǎn)擊申請(qǐng)?zhí)嵘?/span>。
您可以在 Apps 下看到您的應(yīng)用程序名稱(chēng)。請(qǐng)按照以下說(shuō)明操作:
單擊設(shè)置圖標(biāo)
切換 OAuth 1.0 以將其打開(kāi)
選擇讀取和寫(xiě)入推文消息
在回調(diào) URL 和網(wǎng)站 URL 中輸入您的服務(wù)器 URL
點(diǎn)擊保存
生成訪問(wèn)令牌和秘密令牌
按照說(shuō)明進(jìn)行操作:
除了設(shè)置圖標(biāo)
單擊密鑰和令牌
生成 API 密鑰和密鑰
一旦您收到提升帳戶(hù)的確認(rèn)郵件。側(cè)邊欄將在產(chǎn)品下顯示更多選項(xiàng)。
開(kāi)發(fā)、優(yōu)化和維護(hù)?合而為一——空置!
從我們這里聘請(qǐng) Golang 開(kāi)發(fā)人員并開(kāi)始開(kāi)發(fā)您的夢(mèng)想項(xiàng)目。我們擁有精通和最好的 Go 開(kāi)發(fā)人員,他們具有出色的問(wèn)題解決能力。今天聯(lián)系我們!
設(shè)置開(kāi)發(fā)環(huán)境
在 Premium 下選擇 Dev Environments 時(shí),您將看到下圖。
要設(shè)置開(kāi)發(fā)環(huán)境,請(qǐng)?zhí)顚?xiě)帳戶(hù)活動(dòng)/沙盒下的必填字段,如下所示。
因此,這是關(guān)于設(shè)置您的 Twitter 開(kāi)發(fā)者帳戶(hù)的?,F(xiàn)在。繼續(xù)編碼部分。
Golang 項(xiàng)目搭建
第一步是創(chuàng)建一個(gè)項(xiàng)目。因此,請(qǐng)運(yùn)行以下命令。你可以給它起任何名字,這里我們將使用twit_bot作為我們的項(xiàng)目名稱(chēng)。
安裝依賴(lài)
我們將使用去弄安裝以下依賴(lài)項(xiàng)-
https://github.com/dghubble/oauth1
https://github.com/gorilla/mux
https://github.com/joho/godotenv
配置 .env 文件
現(xiàn)在,在 godotenv 插件的幫助下加載你的 .env 文件。下面是格式。您可以相應(yīng)地配置您的文件。
創(chuàng)建 main.go
現(xiàn)在,讓我們開(kāi)始我們的編碼部分。創(chuàng)建main.go。您的初始文件將如下所示。
我們將編碼部分進(jìn)一步劃分為多個(gè)部分,如下所示。
CRC驗(yàn)證
Webhook 注冊(cè)
網(wǎng)絡(luò)鉤子訂閱
監(jiān)聽(tīng)事件
發(fā)送推文
服務(wù)器設(shè)置
挑戰(zhàn)-響應(yīng)-檢查 (CRC) 驗(yàn)證
Twitter 將觸發(fā) CRC 以確保您既是應(yīng)用程序的所有者又是 webhook URL。Challenge-Response-Check 不同于循環(huán)冗余校驗(yàn)。
我們需要更新func CrcCheck(){ … }以進(jìn)行 CRC 驗(yàn)證。
func CrcCheck(writer http.ResponseWriter, request *http.Request) {
writer.Header().Set("Content-Type", "application/json")
token := request.URL.Query()["crc_token"]
如果 len(令牌) < 1 {
fmt.Fprintf(writer, "沒(méi)有給出 crc_token")
返回
}
h := hmac.New(sha256.New, []byte(os.Getenv("CONSUMER_SECRET")))
h.Write([]byte(token[0]))
編碼 := base64.StdEncoding.EncodeToString(h.Sum(nil))
響應(yīng):=制作(地圖[字符串]字符串)
response["response_token"] = "sha256=" + 編碼
responseJson, _ := json.Marshal(響應(yīng))
fmt.Fprintf(編寫(xiě)器,字符串(responseJson))}
解釋
使用crc_token參數(shù) Twitter 將發(fā)出 GET 請(qǐng)求以進(jìn)行 CRC 驗(yàn)證。
根據(jù)crc_token和您應(yīng)用的Consumer Secret ,您的應(yīng)用需要您在收到 GET 請(qǐng)求時(shí)制定response_token 。response_token只是一個(gè)編碼的 JSON,在收到成功的 web hook id 后 3 秒內(nèi)返回。
上面的代碼片段執(zhí)行以下操作:
將響應(yīng)標(biāo)頭設(shè)置為 json 類(lèi)型:'application/json'
request.URL.Query()[“crc_token”]獲取crc_token參數(shù)。
在 Hmac sha256 的幫助下對(duì)其進(jìn)行加密并對(duì)其進(jìn)行編碼。不要忘記將CONSUMER_SECRET替換為您應(yīng)用程序的原始消費(fèi)者機(jī)密。
生成響應(yīng)字符串 mao
把response map轉(zhuǎn)成json然后發(fā)給writer
導(dǎo)航localhost:8080/webhook/twitter?crc_token=測(cè)試你會(huì)看到這樣的東西。
我們的 CRC 路線運(yùn)行良好!
安裝 ngrok
現(xiàn)在,我們的下一步是注冊(cè)一個(gè) webhook。但在學(xué)習(xí)如何做之前,我們需要安裝 ngrok。這背后的原因是 Twitter 有一些協(xié)議,基于它們 Twitter 不會(huì)接受以下 URL:
基于localhost的 URL
具有端口號(hào)的 URL
非 https 網(wǎng)址
因此,出于開(kāi)發(fā)目的,我們要做的是安裝 ngrok。使用以下命令使用 8080 端口安裝和啟動(dòng)服務(wù)器。
如果你做對(duì)了,你應(yīng)該看到這樣的東西 -
去.ngrok.ioURL 以查看與 localhost:9090 類(lèi)似的響應(yīng)。此外,打開(kāi).env文件并添加 URL。
Webhook 注冊(cè)
現(xiàn)在,開(kāi)始為我們的機(jī)器人注冊(cè) webhook。我們將檢查參數(shù)列表中是否存在寄存器標(biāo)志。檢查標(biāo)志后,它將函數(shù)RegisterWebhook作為 goroutine 執(zhí)行。打開(kāi)client.go,定義函數(shù)RegisterWebhook,如下所示。該函數(shù)將用于所有 Twitter 請(qǐng)求。
func RegisterWebhook() {
fmt.Println("正在注冊(cè) webhook...")
httpClient := 創(chuàng)建客戶(hù)端()
路徑 := "https://api.twitter.com/1.1/account_activity/all/" + os.Getenv("WEBHOOK_ENV") + "/webhooks.json"
值 := url.Values{}
values.Set("url", os.Getenv("APP_URL")+"/webhook/twitter")
fmt.Println(值,路徑)
resp, _ := httpClient.PostForm(path, values)
延遲 resp.Body.Close()
正文,_ := ioutil.ReadAll(resp.Body)
var data map[string]接口{}
如果錯(cuò)誤 := json.Unmarshal([]byte(body), &data); 錯(cuò)誤!=無(wú){
恐慌(錯(cuò)誤)
}
fmt.Println(數(shù)據(jù))
fmt.Println("Webhook id of " + data["id"].(string) + " 已被注冊(cè)")
訂閱Webhook()}
解釋
首先,我們創(chuàng)建了函數(shù)CreateClient()。從CreateClient()函數(shù)返回的指針可用于代表您的機(jī)器人帳戶(hù)發(fā)出所有 Twitter 請(qǐng)求。
獲取客戶(hù)端后,設(shè)置參數(shù):路徑和值。
在url.Values的幫助下,將 webhook 的 URL 作為其參數(shù)傳遞。
使用httpClient.PostForm(path, values)進(jìn)行注冊(cè) webhook 的發(fā)布響應(yīng)
解碼并讀取響應(yīng)
訂閱網(wǎng)絡(luò)鉤子
為了訂閱 webhook,我們?cè)?span style="padding: 0px; font-size: 16px; font-family: 宋體, SimSun;">client.go文件中創(chuàng)建了一個(gè)SubscribeWebhook()函數(shù)。以下函數(shù)將用于訂閱事件和檢查狀態(tài)代碼 204。
func SubscribeWebhook() {
fmt.Println("訂閱 webapp...")
客戶(hù)端:=創(chuàng)建客戶(hù)端()
路徑 := "https://api.twitter.com/1.1/account_activity/all/" + os.Getenv("WEBHOOK_ENV") + "/subscriptions.json"
resp, _ := client.PostForm(path, nil)
正文,_ := ioutil.ReadAll(resp.Body)
延遲 resp.Body.Close()
如果 resp.StatusCode == 204 {
fmt.Println("訂閱成功")
} else if resp.StatusCode != 204 {
fmt.Println("無(wú)法訂閱 webhook。響應(yīng)如下:")
fmt.Println(字符串(正文))
}}
go install 之后運(yùn)行以下命令
監(jiān)聽(tīng)事件
現(xiàn)在,是時(shí)候讓 webhook 監(jiān)聽(tīng)事件了。打開(kāi) main.go 并更新 WebhookHandler() 函數(shù)。代碼非常簡(jiǎn)單。
func WebhookHandler(writer http.ResponseWriter, request *http.Request) {
fmt.Println("Handler called")
正文,_ := ioutil.ReadAll(request.Body)
var 加載客戶(hù)端.WebhookLoad
錯(cuò)誤 := json.Unmarshal(body, &load)
如果錯(cuò)誤!=無(wú){
fmt.Println("發(fā)生錯(cuò)誤:" + err.Error())
}
如果 len(load.TweetCreateEvent) < 1 || load.UserId == load.TweetCreateEvent[0].User.IdStr {
返回
}
_, err = client.SendTweet("@"+load.TweetCreateEvent[0].User.Handle+" 你好 "+load.TweetCreateEvent[0].User.Name+", 這是推特機(jī)器人的測(cè)試推文。", load .TweetCreateEvent[0].IdStr)
如果錯(cuò)誤!=無(wú){
fmt.Println("發(fā)生錯(cuò)誤:")
fmt.Println(err.Error())
} 別的 {
fmt.Println("推文發(fā)送成功")
}}
解釋
首先,該函數(shù)將讀取推文的正文。
初始化用于 JSON 解碼的 webhook 加載對(duì)象
之后,該函數(shù)將檢查它是否是推文創(chuàng)建事件并調(diào)用SendTweet()將回復(fù)作為響應(yīng)發(fā)送到client.go中。
發(fā)送推文
函數(shù)SendTweet()將用于由機(jī)器人向用戶(hù)發(fā)送推文。如您所見(jiàn),該函數(shù)將接受從WebhookHandler()接收的兩個(gè)參數(shù)。機(jī)器人發(fā)送的回復(fù)將包含用戶(hù)的 Twitter 句柄和自動(dòng)字符串。
func SendTweet(tweet string, reply_id string) (*Tweet, error) {
fmt.Println("發(fā)送推文作為回復(fù)" + reply_id)
var responseTweet 推文
//添加參數(shù)
參數(shù) := url.Values{}
params.Set("狀態(tài)", tweet)
params.Set("in_reply_to_status_id", reply_id)
客戶(hù)端:=創(chuàng)建客戶(hù)端()
resp, err := client.PostForm("https://api.twitter.com/1.1/statuses/update.json", 參數(shù))
如果錯(cuò)誤!=無(wú){
返回零,錯(cuò)誤
}
延遲 resp.Body.Close()
正文,_ := ioutil.ReadAll(resp.Body)
fmt.Println(字符串(正文))
err = json.Unmarshal(正文, &responseTweet)
如果錯(cuò)誤!=無(wú){
返回零,錯(cuò)誤
}
返回&responseTweet,無(wú)}
服務(wù)器設(shè)置
本節(jié)將介紹在main.go中設(shè)置服務(wù)器的代碼。您可以瀏覽代碼邏輯,因?yàn)樗浅:?jiǎn)單。
功能主要(){
錯(cuò)誤 := godotenv.Load()
如果錯(cuò)誤!=無(wú){
log.Fatal("加載 .env 文件時(shí)出錯(cuò)")
fmt.Println("加載 .env 文件時(shí)出錯(cuò)")
}
fmt.Println("啟動(dòng)服務(wù)器")
m := mux.NewRouter()
m.HandleFunc("/webhook/twitter", CrcCheck).Methods("GET")
m.HandleFunc("/webhook/twitter", WebhookHandler).Methods("POST")
服務(wù)器 := &http.服務(wù)器{
處理程序:米,
}
服務(wù)器地址 = ":8080"
如果參數(shù):= os.Args;len(args) > 1 && args[1] == "-register" {
去客戶(hù)端.RegisterWebhook()
}
服務(wù)器.ListenAndServe()}
使用 Golang 運(yùn)行 Twitter 機(jī)器人
如果一切都成功完成,機(jī)器人應(yīng)該會(huì)向您的句柄發(fā)送回復(fù),如下圖所示。
Github Repsoitory:從頭開(kāi)始使用 Golang 構(gòu)建 Twitter Bot
您可以在此處找到完整的源代碼:twitter-bot-using-golang-demo。隨意克隆存儲(chǔ)庫(kù)并使用代碼。
結(jié)論
我希望您已經(jīng)了解如何使用 Golang 構(gòu)建 Twitter 機(jī)器人。那么,您還在等什么,開(kāi)始開(kāi)發(fā)您的演示應(yīng)用程序吧!如果您有任何建議、反饋或疑問(wèn),請(qǐng)給我們回信??偸菢?lè)于回答!
言鼎科技主做軟件開(kāi)發(fā),微信小程序,網(wǎng)站開(kāi)發(fā),軟件外包,手機(jī)APP開(kāi)發(fā)。如有需要記得聯(lián)系我們!