Dokumentasi ini menjelaskan implementasi scraping data aktivitas Strava menggunakan GoColly dalam proyek ini. Tujuannya adalah untuk mengambil informasi aktivitas pengguna dari Strava dengan cara user mengirimkan link aktivitas strava ke bot domyikado dan menyimpannya ke mongodb.
go get github.com/gocolly/colly/v2
c := colly.NewCollector(
colly.AllowedDomains(domApp, domWeb),
)
Code diatas digunakan untuk membuat objek collector dan menambahkan collector options salah satunya colly.AllowedDomains untuk membatasi akses domain hanya ke domain yang di izinkan.
c.OnHTML("a", func(e *colly.HTMLElement) {
link := e.Attr("href")
...
})
Code diatas setiap kali melakukan scraping dan menemukan tag <a> akan mengekstrak href dan menyimpan dalam variable link.
c.OnHTML("main", func(e *colly.HTMLElement) {
stravaActivity.Name = e.ChildText("h3[class^='styles_name__']")
stravaActivity.Title = e.ChildText("h1[class^='styles_name__']")
stravaActivity.TypeSport = e.ChildText("span[class^='styles_typeText__']")
e.ForEach("time[class^='styles_date__']", func(_ int, timeEl *colly.HTMLElement) {
dt := timeEl.Attr("datetime")
if dt != "" {
stravaActivity.DateTime = formatDateTimeToIndo(dt)
} else {
stravaActivity.DateTime = dt
}
})
})
Code diatas setiap kali menemukan tag <main> dan didalamnya memiliki tag, contoh h3[class^='styles_name__'], maka akan mengekstrak teks yang ada pada tag tersebut dengan menggunakan e.ChildText(). e.ForEach("time[class^='styles_date__']") akan menelusuri semua tag <time> dengan class yang di tentukan yang dimana tag tersebut berada didalam <main>, kemudian mengambil attribute datetime yang terkandung didalam tag <time>.
c.OnScraped(func(r *colly.Response) {
...
})
Event handler yang akan di panggil ketika proses scraping telah selesai di lakukan yaitu ketika c.OnHTML() sudah dipanggil semuanya. Didalam event handler ini bisa diisi dengan banyak hal, seperti validasi data, penyimpanan data ke database, logging.
err := c.Visit(link)
if err != nil {
fmt.Println("Error saat mengunjungi halaman:", err)
}
Digunakan untuk memulai proses scraping, event ini yang memicu berjalannya event c.OnHTML, c.OnScraped, dan lainnya. event c.Visit() biasanya selalu berada di paling bawah code.
StravaActivityHandler, StravaActivityUpdateIfEmptyDataHandler, StravaIdentityHandler, StravaIdentityUpdateHandlerscrapeStravaActivity, scrapeStravaActivityUpdate, scrapeStravaIdentityextractStravaLink → Mengekstrak URL dari pesan pengguna.extractContains → Mengecek link url strava dari extractStravaLink apakah menggunakan domain web atau app. Kemudian mengambil full url strava dan id activity/athelete dari url tersebut.formatDateTimeToIndo → Mengonversi format waktu Strava (UTC) ke format Indonesia (WIB).parseDistance → Mengonversi jarak dari string ke float.getConfigByPhone → Mengambil data API yang tersimpan di database.postToDomyikado → Mengirimkan data ke API yang diambil dari getConfigByPhone. Haiiii kak, *John Doe*! Berikut Progres Aktivitas kamu hari ini yaaa!! 😀
- Activity ID: 123456789
- Name: John Doe
- Title: Morning Run
- Date Time: 24 Maret 2025
- Type Sport: Run
- Distance: 5.2 KM
- Moving Time: 30 Menit
- Elevation: 10 Meter
- Status: Valid
Semangat terus, jangan lupa jaga kesehatan dan tetap semangat!! 💪🏻💪🏻💪🏻
Maaf kak, sistem hanya dapat mengambil data aktivitas jalan dan lari. Silakan share link aktivitas jalan dan lari Strava kamu.
dan/atau
Wahhh, kamu malas sekali ya, jangan malas lari terus dong kak! 😏
Satu hari minimal 3 km, masa kamu cuma 2.5 km aja 😂
xixixixiixi
Jangan lupa jaga kesehatan dan tetap semangat!! 💪🏻💪🏻💪🏻
Jangan Curang donggg! Silahkan share record aktivitas yang benar dari Strava ya kak, bukan dibikin manual kaya gitu.
Yang semangat dong... yang semangat dong...
Maaf kak, *John Doe*! Kamu sudah pernah share aktivitas ini sebelumnya pada tanggal 18 Mar 2025 09:56 WIB! Berikut data aktivitas kamu yang sudah tersimpan.
- Activity ID: 123456789
- Name: John Doe
- Title: Morning Run
- Date Time: 24 Maret 2025
- Type Sport: Run
- Distance: 5.2 KM
- Moving Time: 30 Menit
- Elevation: 10 Meter
- Status: Valid
Jangan Curang yaaaa!
Sana Lari lagi jangan malas!
Semangat terus, jangan lupa jaga kesehatan dan tetap semangat!! 💪🏻💪🏻💪🏻
Maaf kak, *John Doe*! Aktivitas yang kamu kirimkan tidak valid. Berikut datanya.
- Type Sport: Run
- Distance: 2.2 KM
- Moving Time: 30 Menit
- Elevation: 10 Meter
- Status: Invalid
Sana Lari lagi jangan malas!
Semangat terus, jangan lupa jaga kesehatan dan tetap semangat!! 💪🏻💪🏻💪🏻
Jangan Curang donggg! Silahkan share record aktivitas yang benar dari Strava ya kak, bukan dibikin manual kaya gitu.
Yang semangat dong... yang semangat dong...
Dokumentasi ini memberikan gambaran bagaimana sistem scraping aktivitas Strava bekerja, mulai dari cara mengolah input, proses scraping, hingga validasi data sebelum disimpan ke database. Pastikan untuk menguji setiap skenario agar sistem dapat bekerja secara optimal.