მეთოდი 2 უკეთესია — თემის განახლება არ წაშლის კოდს.
Android & iOS აპლიკაციები
კოუნტერი მუშაობს მობილურ აპლიკაციებშიც — სტატისტიკაში აპის მომხმარებლები ცალკე გამოჩნდება
(app://android / app://ios რეფერერებად და ონლაინ-ჭრილში).
პროტოკოლი მარტივია: ორი GET მოთხოვნა, პასუხად 1×1 GIF.
1
ვიზიტი (აპის გახსნაზე ერთხელ)
GET https://oxo.ge/api/counter_hit?site_id=SITE_ID&s=SESSION&page=https://YOUR-DOMAIN/app/android&ref=app://android&lang=ka
iOS-ზე: ref=app://ios და page=.../app/ios. SESSION = ერთხელ გენერირებული 32-სიმბოლოიანი [a-z0-9] ID, შეინახეთ მუდმივად (SharedPreferences / UserDefaults). page-ის დომენი უნდა ემთხვეოდეს რეგისტრირებულ საიტს.
2
ონლაინ-სიგნალი (ყოველ 2 წუთში, სანამ აპი ღიაა)
GET https://oxo.ge/api/counter_ping?site_id=SITE_ID&s=SESSION&r=RANDOM
ფონზე გადასვლისას შეაჩერეთ — მომხმარებელი „ონლაინ"-იდან 5 წუთში ამოვარდება. User-Agent-ში ჩასვით Android ან iPhone სიტყვა — OS-სტატისტიკა სწორად დაითვლება.
Android (Kotlin)
val sess = prefs.getString("oxo_sess", null) ?: List(32){"abcdefghijklmnopqrstuvwxyz0123456789".random()}.joinToString("").also { prefs.edit().putString("oxo_sess", it).apply() }
val ua = "Mozilla/5.0 (Linux; Android) Mobile MyApp"
fun pixel(url: String) = OkHttpClient().newCall(Request.Builder().url(url).header("User-Agent", ua).build()).enqueue(object: Callback { override fun onFailure(c: Call, e: IOException) {}; override fun onResponse(c: Call, r: Response) { r.close() } })
// აპის გახსნაზე:
pixel("https://oxo.ge/api/counter_hit?site_id=SITE_ID&s=$sess&page=https://YOUR-DOMAIN/app/android&ref=app://android&lang=ka")
// ყოველ 2 წუთში (lifecycle-aware timer):
pixel("https://oxo.ge/api/counter_ping?site_id=SITE_ID&s=$sess&r=${Math.random()}")
iOS (Swift)
let sess = UserDefaults.standard.string(forKey: "oxo_sess") ?? { let s = String((0..<32).map { _ in "abcdefghijklmnopqrstuvwxyz0123456789".randomElement()! }); UserDefaults.standard.set(s, forKey: "oxo_sess"); return s }()
func pixel(_ url: String) { var rq = URLRequest(url: URL(string: url)!); rq.setValue("Mozilla/5.0 (iPhone; CPU iPhone OS like Mac OS X) MyApp", forHTTPHeaderField: "User-Agent"); URLSession.shared.dataTask(with: rq).resume() }
// აპის გახსნაზე:
pixel("https://oxo.ge/api/counter_hit?site_id=SITE_ID&s=\(sess)&page=https://YOUR-DOMAIN/app/ios&ref=app://ios&lang=ka")
// Timer ყოველ 120 წამში (scenePhase == .active):
pixel("https://oxo.ge/api/counter_ping?site_id=SITE_ID&s=\(sess)&r=\(Double.random(in: 0...1))")
Flutter (Dart)
final plat = Platform.isIOS ? 'ios' : 'android';
final ua = Platform.isIOS ? 'Mozilla/5.0 (iPhone; CPU iPhone OS like Mac OS X) MyApp' : 'Mozilla/5.0 (Linux; Android) Mobile MyApp';
Future<void> pixel(String u) async { try { await Dio().get(u, options: Options(headers: {'User-Agent': ua})); } catch (_) {} }
// hit აპის გახსნაზე + ping Timer.periodic(Duration(minutes: 2)) ფორგრაუნდში:
pixel('https://oxo.ge/api/counter_hit?site_id=SITE_ID&s=$sess&page=https://YOUR-DOMAIN/app/$plat&ref=app://$plat&lang=ka');
pixel('https://oxo.ge/api/counter_ping?site_id=SITE_ID&s=$sess&r=${Random().nextDouble()}');
შეცვალეთ SITE_ID თქვენი საიტის ID-ით (ზემოთ კოდშია) და YOUR-DOMAIN — რეგისტრირებული დომენით. შედეგი: stat-გვერდზე „ონლაინ ახლა" იყოფა ვები/Android/iOS-ად, რეფერერებში ჩანს app://android და app://ios.
როგორ მუშაობს კოუნტერი?
1
რეგისტრაცია
დაარეგისტრირეთ თქვენი საიტი OXO.GE-ზე და მიიღეთ უნიკალური ID.
2
კოდის განთავსება
ჩასვით HTML კოდი თქვენი საიტის ყველა გვერდზე </body> ტეგამდე.
3
ვიზიტორების აღრიცხვა
ყოველი ვიზიტისას სკრიპტი რეგისტრავს ჰიტს OXO.GE სერვერზე.
4
კოუნტერის ჩვენება
SVG კოუნტერ-ბანერი აჩვენებს ჰიტებს და უნიკალურ ვიზიტორებს რეალურ დროში.
5
რეიტინგში ასახვა
შეგროვებული მონაცემები განსაზღვრავს თქვენი საიტის პოზიციას OXO.GE რეიტინგში.
ჩვენ ვიყენებთ cookies რათა შემოგთავაზოთ უკეთესი სერვისი. საიტით სარგებლობით თქვენ ეთანხმებით წესებსა და პირობებს