Ndërtoni furnizuesin tuaj të personalizuar për të marrë të dhëna nga faqet tuaja të preferuara dhe për të ngarkuar në postgres

RSS, shkurtim për Really Simple Syndication, është një teknologji që lejon përdoruesit të marrin përditësime nga faqet e tyre të internetit të preferuara në një format të standardizuar. Duke përdorur një burim RSS, mund të qëndroni të përditësuar me përmbajtjen më të fundit pa pasur nevojë të vizitoni manualisht secilën faqe interneti. Në këtë postim, ne do të shqyrtojmë se çfarë janë burimet RSS, si funksionojnë dhe si mund t'i përdorni ato për të përmirësuar konsumin tuaj të përmbajtjes në internet.

Çfarë është një furnizim RSS

Një burim RSS është një skedar që përmban një përmbledhje të përditësimeve dhe përmbajtjeve më të fundit të publikuara në një faqe interneti. Ky skedar është shkruar në XML, një gjuhë shënjimi që është e lexueshme nga njeriu dhe e lexueshme nga makina. Çdo artikull në furnizim zakonisht përfshin një titull, një përmbledhje ose përshkrim, një lidhje me përmbajtjen e plotë dhe meta të dhëna shtesë si autori dhe data e publikimit.

Si funksionojnë furnizimet RSS

Furnizimet RSS mbështeten në një model "publish-subscribe", ku ofruesit e përmbajtjes (faqet e internetit) publikojnë përditësimet e tyre në një format të standardizuar (RSS feed), dhe përdoruesit abonohen në këto burime për të marrë përditësime në aplikacionin e tyre të preferuar të lexuesit RSS. Kur një faqe interneti publikon përmbajtje të re, ajo përditëson furnizimin e saj RSS dhe lexuesi RSS merr furnizimin e përditësuar dhe shfaq përmbajtjen e re te përdoruesi.

Njihuni me gofeed

Paketa e jashtme që do të bëjë ngritje të rënda në rssfeeder tonë është https://github.com/mmcdole/gofeed. Ne nuk kemi pse ta analizojmë vetë përmbajtjen XML. Na kursen nga shumë kode. Siç përshkruhet në depon e bibliotekës:

Biblioteka gofeed është një analizues i fuqishëm i furnizimit që mbështet analizimin e burimeve "RSS", "Atom" dhe "JSON". Biblioteka ofron një gofeed.Parser universale që do të analizojë dhe konvertojë të gjitha llojet e furnizimit në një model hibrid gofeed.Feed. Ju gjithashtu keni mundësinë e përdorimit të analizuesve specifikë të furnizimit atom.Parser ose rss.Parser ose json.Parser, të cilët gjenerojnë përkatësisht atom. Feed, rss.Feed dhe json.Feed.

Pra, gofeed është një bibliotekë Golang e lehtë, me burim të hapur, e zhvilluar nga Michael McDole për analizimin e burimeve RSS dhe Atom. Ai ofron një mënyrë të thjeshtë dhe të përshtatshme për të marrë, analizuar dhe ndërvepruar me përmbajtjen e furnizimit, duke e bërë atë një zgjedhje të shkëlqyeshme për zhvilluesit që ndërtojnë aplikacione që kërkojnë grumbullim të furnizimit, përpunim ose detyra të tjera të lidhura me furnizimin.

Biblioteka është projektuar që të jetë e lehtë për t'u përdorur dhe shumë e zgjerueshme, duke i lejuar zhvilluesit të trajtojnë një gamë të gjerë të formateve të furnizimit dhe të personalizojnë procesin e analizimit. Me komunitetin e tij aktiv dhe zhvillimin e vazhdueshëm, gofeed është një zgjidhje e besueshme dhe efikase për trajtimin e burimeve RSS dhe Atom në projektet tuaja Golang.

Shikoni depon e gofeed në GitHub për më shumë informacion dhe për të filluar përdorimin e bibliotekës: https://github.com/mmcdole/gofeed

Shembull në lëvizje

Ushqyesi ynë i vogël golang do të ketë strukturën e mëposhtme:

Dhe shpjegimi i shkurtër i skedarëve go dhe përmbajtjes së tij.

rssfeeder është përgjegjës për marrjen dhe shfaqjen e artikujve më të fundit nga një burim RSS. Paketa përdor bibliotekën gofeed për të trajtuar analizimin e furnizimit RSS.

Kjo strukturë ruan gofeed.Parser, URL-në e furnizimit RSS dhe gofeed.Feed të marrë. gofeed.Parser është përgjegjës për analizimin e furnizimit RSS, ndërsa gofeed.Feed ruan të dhënat e analizuara të furnizimit.

type RSSReader struct {
	parser *gofeed.Parser
	url    string
	Feed   *gofeed.Feed
}

Zbatoni funksionin NewRSSReader: Ky funksion krijon një strukturë të re RSSReader, duke pasur parasysh një baseURL dhe një slug opsionale. Nëse ofrohet slug, ai ndërton URL-në e furnizimit duke shtuar '/feed/' dhe slugbaseURL. Përndryshe, ai shton '/feed' në 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,
	}
}

Zbatoni metodën FetchFeed: Kjo metodë merr furnizimin RSS nga URL-ja e ruajtur në strukturën RSSReader duke përdorur gofeed.Parser. Nëse ka një gabim gjatë analizimit, ai e kthen gabimin. Përndryshe, ai ruan gofeed.Feed të analizuar në strukturën RSSReader.

func (r *RSSReader) FetchFeed() error {
	feed, err := r.parser.ParseURL(r.url)
	if err != nil {
		return err
	}
	r.Feed = feed
	return nil
}

feedstore është përgjegjës për lidhjen me një bazë të dhënash PostgreSQL dhe ruajtjen e të dhënave të marra të furnizimit RSS. Paketa përdor bibliotekën pgx për të bashkëvepruar me bazën e të dhënave PostgreSQL.

Kjo strukturë ruan një referencë për një objekt pgx.Conn, i cili përfaqëson lidhjen me bazën e të dhënave PostgreSQL.

type FeedStore struct {
	conn *pgx.Conn
}

Zbatoni funksionin NewFeedStore: Ky funksion merr një varg lidhjeje PostgreSQL dhe krijon një lidhje me bazën e të dhënave. Nëse është i suksesshëm, ai kthen një tregues në një strukturë të re FeedStore me lidhjen e vendosur.

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
}

Zbatoni metodën Close: Kjo metodë mbyll lidhjen me bazën e të dhënave PostgreSQL.

func (fs *FeedStore) Close() {
	fs.conn.Close(context.Background())
}

Zbatoni metodën CreateTable: Kjo metodë ekzekuton një pyetje SQL për të krijuar tabelën feed_items në bazën e të dhënave nëse ajo nuk ekziston tashmë.

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
}

Zbatoni metodën SaveItem: Kjo metodë merr një tregues në një gofeed.Item dhe e fut atë në tabelën feed_items. Fillimisht analizon vargun e datës së publikuar në një vlerë time.Time, më pas ekzekuton një kërkesë INSERT INTO për të ruajtur artikullin në 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
}

Funksioni main në këtë kod tregon se si të përdoren paketat rssfeeder dhe feedstore për të marrë burime RSS nga Level Up Coding dhe një publikim mesatar (Programim më i mirë), printoni artikujt më të fundit dhe ruani ato në një bazë të dhënash PostgreSQL .

Merr furnizimin RSS të kodimit në nivel lart dhe printo artikujt më të fundit: Krijo një shembull prej rssfeeder.RSSReader për kodimin në nivel lart, merr furnizimin RSS dhe printo artikujt më të fundit.

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()
}

Merr publikimin mesatar (Programim më i mirë) Furnizimi RSS dhe printimi i artikujve më të fundit: Krijoni një shembull prej rssfeeder.RSSReader për publikimin "Programimi më i mirë", merrni burimin RSS dhe printoni artikujt më të fundit.

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()
}

Krijoni një shembull të feedstore.FeedStore me një varg lidhjeje PostgreSQL dhe krijoni një lidhje me bazën e të dhënave.

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()

Krijo tabelën feed_items në bazën e të dhënave PostgreSQL.

err = fs.CreateTable()
if err != nil {
	fmt.Printf("Error creating table: %v\n", err)
	return
}

Ruani artikujt e marrë në kodimin e nivelit lart dhe publikimin e mesëm në bazën e të dhënave duke përdorur shembullin feedstore.FeedStore: Përsëritni artikujt e marrë nga të dy burimet RSS dhe thirrni metodën SaveItem për të ruajtur çdo artikull në bazën e të dhënave.

for _, item := range levelUpCodingReader.Feed.Items {
	err = fs.SaveItem(item)
	if err != nil {
		fmt.Printf("Error saving item: %v\n", err)
	}
}

Duke supozuar se kemi postgres në funksionim dhe funksionim, ne mund të ekzekutojmë kodin dhe të kontrollojmë tabelën në postgres. Ne duhet të shohim artikujt më të fundit nga faqet që përcaktuam në krye. Në rastin tim kam:

Lidhja me kodin

Depoja me të gjithë kodin — duke përfshirë skedarin e kompozimit docker të përdorur për të krijuar postgres db, mund ta gjeni këtu: https://github.com/adamszpilewicz/rssfeeder/blob/main/main.go

Nëse ju pëlqen të lexoni artikuj mesatarë dhe jeni të interesuar të bëheni anëtar, do të jem i lumtur të ndaj me ju lidhjen time të referimit!

https://medium.com/@adamszpilewicz/membership