Custom RSS Feeder Dengan Menggunakan Go - CRUDPRO

Custom RSS Feeder Dengan Menggunakan Go

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.

Custom RSS Feeder Dengan Menggunakan Go

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:

Custom RSS Feeder Dengan Menggunakan Go

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:

Custom RSS Feeder Dengan Menggunakan Go