Custom RSS Feeder Dengan Menggunakan Go
RSS, singkatan dari Really Simple Syndication, ialah teknologi yang memungkinkan pengguna menerima pembaruan dari website favorite mereka dalam format standard. Dengan menggunakan RSS feed, Anda bisa terus meng ikuti content terbaru tanpa harus mengunjungi setiap website secara manual. Dalam posting ini, kami akan mengeksplorasi apa itu RSS feed, bagaimana cara kerjanya, dan bagaimana Anda bisa menggunakannya untuk streamline konsumsi content online Anda.
Apa itu RSS feed
RSS feed ialah file yang berisi rangkuman pembaruan terbaru dan content yang dipublikasikan di website. File ini ditulis dalam XML, bahasa markup yang bisa dibaca oleh manusia dan bisa dibaca oleh mesin. Setiap item dalam feed typically menyertakan judul, rangkuman atau deskripsi, link ke content lengkap, dan metadata tambahan seperti penulis dan tanggal penerbitan.
Bagaimana cara kerja RSS feed
RSS feed bergantung pada model "terbitkan-berlangganan", di mana penyedia content (website) menerbitkan pembaruan mereka dalam format standard (RSS feed), dan pengguna berlangganan feed ini untuk menerima pembaruan dalam aplikasi pembaca RSS pilihan mereka. Saat website menerbitkan content baru, itu mengupdate RSS feed-nya, dan pembaca RSS mengambil feed yang diperbarui dan menampilkan content baru ke pengguna.
Meet gofeed
Paket external yang akan melakukan pekerjaan berat di rssfeeder kami ialah https://github.com/mmcdole/gofeed. Kami tidak harus mem-parsing content XML sendiri. Ini menyelamatkan kita dari banyak code. Seperti yang dijelaskan dalam repo perpustakaan:
Pustaka gofeed
ialah parser feed tangguh yang memberikan dukungan parseran RSS feed, Atom, dan JSON. Pustaka ini menyediakan gofeed.Parser
universal yang akan meparser dan mengonversi semua jenis feed jadi model
gofeed.Feed
hibrid. Anda juga memiliki pilihan untuk menggunakan parser
atom.Parser
atau rss.Parser
atau json.Parser
khusus feed yang menghasilkan atom. Feed
, rss.Feed
dan json.Feed
masing-masing.
Jadi gofeed ialah perpustakaan Golang sumber terbuka ringan yang dikembangkan oleh Michael McDole untuk mem-parsing RSS feed dan Atom. Ini menyediakan cara simpel dan nyaman untuk mengambil, meparser, dan berinteraksi dengan content feed, menjadikannya pilihan yang sangat baik untuk pengembang yang membuat aplikasi yang memerlukan agregasi feed, pemrosesan, atau tugas terkait feed yang lain.
Pustaka ini dirancang agar mudah digunakan dan sangat bisa dikembangkan, memungkinkan pengembang untuk tangani berbagai format feed dan menyesuaikan proses parsing. Dengan komunitasnya yang aktif dan pengembangan yang berkelanjutan, gofeed ialah solusi andal dan efektif untuk menangani feed RSS dan Atom di project Golang Anda.
Lihat repositori gofeed di GitHub untuk info lebih lanjut dan untuk mulai menggunakan perpustakaan: https://github.com/mmcdole/gofeed
Example in go
Our tiny golang feeder kami akan memiliki struktur sebagai berikut:
Dan penjelasan singkat tentang go files and its contents.
rssfeeder
bertanggung jawab untuk mengambil dan menampilkan artikel terbaru dari RSS feed. Paket ini menggunakan pustaka gofeed
untuk menangani parseran RSS feed.
Struktur ini menyimpan gofeed.Parser
, URL RSS feed, dan gofeed.Feed
yang diambil. gofeed.Parser
bertanggung jawab untuk meparser RSS feed, dan gofeed.Feed
menyimpan data feed yang diparser.
type RSSReader struct {
parser *gofeed.Parser
url string
Feed *gofeed.Feed
}
Terapkan fungsi NewRSSReader
: Fungsi ini membuat struktur RSSReader
baru, diberi baseURL
dan slug
opsional. Jika slug
disediakan, URL feed akan dibuat menambahkan "/feed/" dan slug
ke baseURL
. Jika tidak, itu menambahkan "/ feed" ke baseURL
.
func NewRSSReader(baseURL, slug string) *RSSReader {
url := baseURL
if slug != "" {
url = baseURL + "/feed/" + slug
} else {
url = baseURL + "/feed"
}
return &RSSReader{
parser: gofeed.NewParser(),
url: url,
}
}
Terapkan metode FetchFeed
: Metode ini mengambil RSS feed dari URL yang disimpan di struktur RSSReader
menggunakan gofeed.Parser
. Jika ada kesalahan saat parsing, itu mengembalikan kesalahan. Bila tidak, dia akan menyimpan gofeed.Feed
yang diparser di struktur RSSReader
.
feedstore
bertanggung jawab untuk menghubungkan ke database PostgreSQL dan menyimpan data RSS feed yang diambil. Paket menggunakan perpustakaan pgx
untuk berinteraksi dengan database PostgreSQL.
Struktur ini menyimpan referensi ke object pgx.Conn
, yang merepresentasikan koneksi ke database PostgreSQL.
type FeedStore struct {
conn *pgx.Conn
}
Terapkan fungsi NewFeedStore
: Fungsi ini mengambil string koneksi PostgreSQL dan membuat koneksi ke database. Bila berhasil, itu mengembalikan pointer ke struct FeedStore
baru dengan koneksi yang dibuat.
func NewFeedStore(connString string) (*FeedStore, error) {
conn, err := pgx.Connect(context.Background(), connString)
if err != nil {
return nil, fmt.Errorf("unable to connect to database: %v", err)
}
return &FeedStore{conn: conn}, nil
}
Terapkan the Close
method: This method closes the connection to the PostgreSQL database.
func (fs *FeedStore) Close() {
fs.conn.Close(context.Background())
}
Terapkan metode CreateTable
: Metode ini mengeksekusi kueri SQL untuk membuat tabel feed_items
di database jika belum ada.
func (fs *FeedStore) CreateTable() error {
query := `
CREATE TABLE IF NOT EXISTS feed_items (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
author TEXT,
published TIMESTAMP WITH TIME ZONE,
link TEXT NOT NULL,
categories TEXT[]
)
`
_, err := fs.conn.Exec(context.Background(), query)
if err != nil {
return fmt.Errorf("unable to create table: %v", err)
}
return nil
}
Terapkan metode SaveItem
: Metode ini mengambil pointer ke gofeed.Item
dan memasukkannya ke dalam tabel feed_items
. Ini pertama-tama mem-parsing string tanggal yang diterbitkan menjadi nilai time.Time
, lalu mengeksekusi kueri INSERT INTO
untuk menyimpan item dalam tabel.
func (fs *FeedStore) SaveItem(item *gofeed.Item) error {
query := `
INSERT INTO feed_items (title, author, published, link, categories)
VALUES ($1, $2, $3, $4, $5)
`
published, _ := time.Parse(time.RFC1123, item.Published)
_, err := fs.conn.Exec(context.Background(), query, item.Title, item.Author.Name, published, item.Link, item.Categories)
if err != nil {
return fmt.Errorf("unable to save item: %v", err)
}
return nil
}
main
function dalam kode ini mendemonstrasikan cara menggunakan paket rssfeeder
dan feedstore
untuk mengambil feed RSS dari Level Up Coding dan publikasi Medium (Better Programming), mencetak artikel terbaru, dan menyimpannya di database PostgreSQL.
Ambil RSS feed Level Up Coding dan cetak artikel terbaru: Buat instance rssfeeder.RSSReader
untuk Level Up Coding, ambil RSS feed, dan cetak artikel terbaru.
levelUpCodingReader := rssfeeder.NewRSSReader(
"https://levelup.gitconnected.com", "")
err := levelUpCodingReader.FetchFeed()
if err != nil {
fmt.Printf("Error fetching Level Up Coding RSS feed: %v\n", err)
} else {
fmt.Println("Level Up Coding:")
levelUpCodingReader.PrintLatestArticles()
}
Fetch Medium publication (Better Programming) RSS feed dan cetak artikel terbaru: Buat instance rssfeeder.RSSReader
untuk publikasi Pemrograman Lebih Baik, ambil RSS feed, dan cetak artikel terbaru.
mediumPublicationReader := rssfeeder.NewRSSReader(
"https://medium.com", "better-programming")
err = mediumPublicationReader.FetchFeed()
if err != nil {
fmt.Printf("Error fetching Medium publication RSS feed: %v\n", err)
} else {
fmt.Println("Better Programming:")
mediumPublicationReader.PrintLatestArticles()
}
Buat instance feedstore.FeedStore
dengan string koneksi PostgreSQL, dan buat koneksi ke database.
connString := "user=myuser password=mypassword host=localhost " +
"port=5432 dbname=mydb sslmode=disable"
fs, err := feedstore.NewFeedStore(connString)
if err != nil {
fmt.Printf("Error creating FeedStore: %v\n", err)
return
}
defer fs.Close()
Buat tabel feed_items
di database PostgreSQL.
err = fs.CreateTable()
if err != nil {
fmt.Printf("Error creating table: %v\n", err)
return
}
Simpan artikel publikasi Level Up Coding dan Media yang diambil di database menggunakan contoh feedstore.FeedStore
: Ulangi item yang diambil dari kedua feed RSS dan panggil metode SaveItem
untuk menyimpan setiap item ke database.
for _, item := range levelUpCodingReader.Feed.Items {
err = fs.SaveItem(item)
if err != nil {
fmt.Printf("Error saving item: %v\n", err)
}
}
Dengan asumsi kita memiliki postgres aktif dan berjalan, kita dapat menjalankan kode dan memeriksa tabel di postgres. Kita harus melihat artikel terbaru dari situs yang kita definisikan di main. Dalam kasus saya, saya punya: