Ich habe einen Twitter-Bot mit Go x Qiita API x Lambda erstellt

Einführung

Ich lerne Go, aber wenn ich nach Informationen von mir selbst suche, ist das natürlich, aber ich kann nur die Informationen bekommen, die ich will. Ich denke, es ist notwendig, verschiedene Artikel zu lesen, um das Gesamtwissen zu erweitern, aber es ist ziemlich schwer. Also habe ich einen Twitter-Bot erstellt, der Artikel mit Qiitas Go-Tag twittert!

@BotQiita ↑ Folge mir.

die Architektur

Es ist eine Struktur, die Sie verstehen können, auch wenn Sie sie in Sätzen erklären, aber ich habe ein Architekturdiagramm erstellt. architecture.png

Es ist genauso wie das.

Code

Zunächst von der Twitter-Authentifizierung. Ich habe https://github.com/ChimeraCoder/anaconda verwendet.

package auth

import (
    "os"

	"github.com/ChimeraCoder/anaconda"	
)

type Credentials struct {
	ConsumerKey       string
	ConsumerSecret    string
	AccessToken       string
	AccessTokenSecret string
}

// GetTwitterAPI gets twitter client
func GetTwitterAPI() *anaconda.TwitterApi {
	creds := Credentials{
		ConsumerKey:       os.Getenv("CONSUMER_KEY"),
		ConsumerSecret:    os.Getenv("CONSUMER_SECRET"),
		AccessToken:       os.Getenv("ACCESS_TOKEN"),
		AccessTokenSecret: os.Getenv("ACCESS_TOKEN_SECRET"),
	}

	anaconda.SetConsumerKey(creds.ConsumerKey)
	anaconda.SetConsumerSecret(creds.ConsumerSecret)
	api := anaconda.NewTwitterApi(creds.AccessToken, creds.AccessTokenSecret)

	return api
}

Klicken Sie dann auf die Qiita-API, um den Artikel zu erhalten. Klicken Sie hier, um die Qiita-API-Spezifikationen anzuzeigen → https://qiita.com/api/v2/docs#%E6%8A%95%E7%A8%BF

package qiita

import (
	"encoding/json"
	"errors"
	"io/ioutil"
	"net/http"
	"net/url"
	"time"
)

type Client struct {
	Endpoint  string
	CreatedAt string
	Tag       string
}

type Article struct {
	Title     string    `json:"title"`
	URL       string    `json:"url"`
	CreatedAt time.Time `json:"created_at"`
}

//URL erstellen
func createUrl(u *url.URL, c *Client) string {
	q := u.Query() //Generieren Sie den Kartentyp der Abfrageparameter
	q.Set("page", "1") //Abfrageparameter festlegen
	q.Set("per_page", "10")
	q.Set("query", "tag:"+c.Tag+" created:>="+c.CreatedAt)
	u.RawQuery = q.Encode() //Abfrageparameter codieren
	return u.String()
}

func (c *Client) GetQiitaArticles() (*[]Article, error) {
	e, err := url.Parse(c.Endpoint) //URL analysieren
	if err != nil {
		return nil, err
	}

	u := createUrl(e, c) //URL nach dem Festlegen der Abfrageparameter
	req, err := http.NewRequest(http.MethodGet, u, nil) //Methode, URL, Körper einstellen
	if err != nil {
		return nil, err
	}

	resp, err := http.DefaultClient.Do(req) //Ausstellung anfordern
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return nil, errors.New(resp.Status)
	}

	body, err := ioutil.ReadAll(resp.Body) //Lesen Sie die Antwort
	if err != nil {
		return nil, err
	}

	var articles []Article
	if err := json.Unmarshal(body, &articles); err != nil {
		return nil, err
	}
	return &articles, nil
}

Referenz

Schließlich ist es Haupt. Da die Lambda-Funktion jede Stunde ausgeführt wird, erhält sie jedes Mal die Zeit vor einer Stunde und twittert, wenn der erhaltene Artikel später ist.

package main

import (
	"fmt"
	"os"
	"time"

	"github.com/Le0tk0k/qiita-twitter-bot/auth"
	"github.com/Le0tk0k/qiita-twitter-bot/qiita"
	"github.com/aws/aws-lambda-go/lambda"
)

var tag = "go"

func post() {
	c := qiita.Client{
		Endpoint:  "https://qiita.com/api/v2/items",
		CreatedAt: time.Now().Format("2006-01-02"),
		Tag:       tag,
	}

	api := auth.GetTwitterAPI()
	articles, err := c.GetQiitaArticles()
	if err != nil {
		fmt.Fprintln(os.Stderr, "Error:", err)
		os.Exit(1)
	}

	t := time.Now().Add(time.Duration((-1) * time.Hour))

	for _, i := range *articles {
		if i.CreatedAt.After(t) {
			_, err = api.PostTweet(i.Title+"\n#golang\n"+i.URL, nil)
			if err != nil {
				fmt.Fprintln(os.Stderr, err)
				os.Exit(1)
			}
		}
	}
}

func main() {
	lambda.Start(post)
}

Das war's für den Code. Generieren Sie anschließend eine Zip-Datei mit dem folgenden Befehl und laden Sie sie in die Lambda-Funktion hoch.

$ GOOS=linux GOARCH=amd64 go build -o post
$ zip handler.zip ./post

Schließlich

Eigentlich war es das erste Mal für AWS, aber es war überraschend reibungslos! Ich möchte von nun an nach und nach lernen.

Bitte folgen Sie uns! @BotQiita

Recommended Posts

Ich habe einen Twitter-Bot mit Go x Qiita API x Lambda erstellt
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
Ich habe einen Stempelersatzbot mit Linie gemacht
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
Ich habe einen LINE Bot mit Serverless Framework erstellt!
Mattermost Bot mit Python gemacht (+ Flask)
Python Qiita API Wrapper "qiipy" gemacht
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
Ich habe mit LINE Bot ein Haushaltsbuch für Bot erstellt
Ich habe einen Bot erstellt, um ihn auf Twitter zu posten, indem ich mit AWS Lambda eine dynamische Site im Internet abgekratzt habe (Fortsetzung).
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Ich habe einen Zwietrachtbot gemacht
[AWS] Ich habe BOT mit LINE WORKS (Implementierung) in Erinnerung gerufen.
Ich habe einen Wikipedia Gacha Bot gemacht
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
Ich habe ein Skript geschrieben, um mit AWS Lambda + Python 2.7 schnell eine Entwicklungsumgebung für Twitter Bot zu erstellen
Ich habe einen Twitter-Bot erstellt, der das von #PokemonGO gefangene Pokemon murmelt
Ich habe ChatOps mit Slack x API Gateway x Lambda (Python) x RDS ausprobiert
Ich habe mit Python einen Zeichenzähler erstellt
Ich habe mit Python eine Hex-Map erstellt
Ich habe ein Lebensspiel mit Numpy gemacht
Ich habe einen Hanko-Generator mit GAN gemacht
Machen wir einen Twitter-Bot mit Python!
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe eine WEB-Bewerbung bei Django gemacht
Ich habe mit Python einen Neuronensimulator erstellt
Ich habe versucht, schlechte Tweets regelmäßig mit der AWS Lambda + Twitter API zu löschen
Erstellen Sie einen Twitter-BOT-Dienst mit der GAE / P + Tweepy + RIOT-API! (Teil 1)
Erstellen Sie einen Twitter-BOT-Dienst mit der GAE / P + Tweepy + RIOT-API! (Teil 2)
Ich habe einen Slack-Bot geschrieben, der Verzögerungsinformationen mit AWS Lambda benachrichtigt
Ich habe einen Musik-Bot mit discord.py und der Google Drive-API erstellt (getestet mit Docker → bereitgestellt für Heroku).
Twittern Sie regelmäßig mit der Twitter-API in Go-Sprache
Ich habe versucht, die Qiita-API von Anfang an zu aktivieren
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Machen Sie Twitter Trend Bot mit Heroku + Python
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Ich habe meinen Hund "Monaka Bot" mit Line Bot gemacht
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
LINE BOT mit Python + AWS Lambda + API Gateway
Ich habe eine einfache Brieftasche aus Bitcoin mit Pycoin gemacht
Schritte zum Erstellen eines Twitter-Bots mit Python
Ich habe mit Numpy eine Grafik mit Zufallszahlen erstellt
Ich habe mit Python ein Bin-Picking-Spiel gemacht
Ich habe einen LINE BOT erstellt, der mithilfe der Flickr-API ein Bild von Reis-Terroristen zurückgibt
Versuchen Sie, einen Cisco Spark Bot mit AWS Lambda + Amazon API Gateway (Python) zu implementieren.
Ich habe eine Burgsuch-API mit Elasticsearch + Sudachi + Go + Echo erstellt
Ich habe eine Twitter-App erstellt, die die Zeichen der Vorverbindung mit Heroku entschlüsselt (Fehler).
〇✕ Ich habe ein Spiel gemacht
Ich habe mit Play with Docker einen gebrauchsfertigen Syslog-Server erstellt
Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht
Ich habe mit Tkinter ein Fenster für die Protokollausgabe erstellt
Ich habe mit Python eine App für die Benachrichtigung über Netznachrichten erstellt
[Life Hack] Anna-Unterstützungsbot für Frauen mit Twitter-API
[Piyopiyokai # 1] Lass uns mit Lambda spielen: Holen Sie sich einen Twitter-Account