0
0
mirror of https://github.com/Maks1mS/free-ozon-dpr.git synced 2025-11-28 08:11:56 +03:00

Compare commits

..

42 Commits

Author SHA1 Message Date
d8df3c804f update manual 2025-06-19 13:55:14 +03:00
f18d854f99 update manual 2025-02-28 09:34:22 +03:00
679ca9b8bf Revert "[Automated action] Update points"
This reverts commit 8f5c35ba2b.
2024-12-29 10:24:16 +03:00
github-actions[bot]
8f5c35ba2b [Automated action] Update points 2024-12-27 01:06:16 +00:00
a4cd93b09a add tvoya_dostavka 2024-12-26 09:06:47 +03:00
b6043843e4 update manual 2024-12-21 15:02:37 +03:00
84af1913c5 fix update script 2024-12-21 14:45:30 +03:00
fadb204413 update manual 2024-12-19 18:03:37 +03:00
9f4f0838d7 update manual 2024-12-05 10:19:08 +03:00
9409fbe1b4 update manual 2024-11-06 20:27:03 +03:00
93f36be0d5 update manual 2024-10-30 18:30:29 +03:00
36fd635c53 update manual 2024-10-29 08:13:15 +03:00
d7dce20a0f remove form 2024-10-08 10:07:38 +03:00
7b0b892e70 fix 2024-09-15 09:16:40 +03:00
2708952473 fix 2024-09-03 08:13:47 +03:00
1932d2a4b0 update manual 2024-07-16 17:53:08 +03:00
01df7305cf merge data 2024-07-11 20:31:37 +03:00
3e8e219c34 Merge branch 'main' of https://github.com/Maks1mS/free-ozon-dpr 2024-07-11 20:29:17 +03:00
b465d70517 update manual 2024-07-11 20:29:13 +03:00
github-actions[bot]
f7a6431681 [Automated action] Update points 2024-07-07 01:01:03 +00:00
github-actions[bot]
48ae10bdac [Automated action] Update points 2024-07-01 01:03:23 +00:00
3cc83c531d fix analytics 2024-06-26 18:46:34 +03:00
cdba0bfa16 fix globalExpress newline 2024-06-22 23:16:49 +03:00
f6b26f049f feat: add merged-data to output 2024-06-22 20:15:47 +03:00
github-actions[bot]
47ad0aef22 [Automated action] Update points 2024-06-18 00:56:13 +00:00
8e12f4a9cb fix 2024-06-13 21:01:13 +03:00
c11e80178d more analytics 2024-06-13 20:57:21 +03:00
41a33e6516 Добавлено отображение ID пункта выдачи
Closes #3
2024-06-13 20:30:01 +03:00
5f07385314 fix WOЯЖ operationTime 2024-06-12 08:46:04 +03:00
964009cdc3 feat: add info button 2024-06-10 20:58:19 +03:00
9b68dea419 update 2024-06-10 20:11:14 +03:00
799de028da fix favicon 2024-06-09 08:21:13 +03:00
baa73c0c2e fix: hide map while popup is opened 2024-06-09 08:14:56 +03:00
be1acbbbf8 fix: remove padding on mobile 2024-06-09 08:10:27 +03:00
d1085dfcba feat: add info popup (#2)
* add info popup

* add wikimapia copyright
2024-06-09 08:04:37 +03:00
9215bc9522 fix url 2024-06-08 21:12:02 +03:00
64394ada44 add og:image and og:url 2024-06-08 21:09:51 +03:00
3701d2b125 add yandex-verification 2024-06-08 20:54:54 +03:00
24f5a53913 chore: add seo tags 2024-06-08 20:29:35 +03:00
deeed2e2ef chore: improve ux and dx (#1)
* move to src

* hide popup at startup

* add eslint
2024-06-08 20:18:09 +03:00
ccdce54b73 add global express script 2024-06-08 19:23:22 +03:00
70364d671a update 2024-06-07 21:45:39 +03:00
31 changed files with 16884 additions and 1009 deletions

View File

@@ -2,6 +2,26 @@
"name": "WOЯЖ",
"source": "https://login.woyag.ru/map",
"points": [
{
"coordinates": [
37.804049,
47.993063
],
"name": "ПВЗ-01 Планета",
"address": "Донецк, ул. Артема 50а",
"link": "https://ozon.ru/point/620808",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.96675,
48.042848
],
"name": "ПВЗ-02 Макеевка",
"address": "Макеевка, ул. Островского, 2/37",
"link": "https://ozon.ru/point/1217157",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.689712,
@@ -10,7 +30,17 @@
"name": "ПВЗ-03 Ляшенко",
"address": "Донецк, Ляшенко 1а",
"link": "https://ozon.ru/point/538097",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
38.484234,
48.038333
],
"name": "ПВЗ-07 Шахтерск",
"address": "Шахтёрск, ул. Берегового 11",
"link": "https://ozon.ru/point/1215804",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -20,7 +50,7 @@
"name": "ПВЗ-08 Первомайская",
"address": "Донецк, ул. Первомайская (АС Центр)",
"link": "https://ozon.ru/point/538186",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -30,7 +60,7 @@
"name": "ПВЗ-10 Театральный",
"address": "Донецк, ул. Университетская 26",
"link": "https://ozon.ru/point/524639",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -40,7 +70,7 @@
"name": "ПВЗ-11 Шевченко",
"address": "Донецк, бул. Шевченко 77",
"link": "https://ozon.ru/point/536833",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -50,7 +80,7 @@
"name": "ПВЗ-13 Торез",
"address": "Торез, ул. Пионерская 1",
"link": "https://ozon.ru/point/536825",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -60,7 +90,7 @@
"name": "ПВЗ-14 Ильича",
"address": "Донецк, пр. Ильича 27",
"link": "https://ozon.ru/point/538179",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -70,7 +100,7 @@
"name": "ПВЗ-15 Боссе",
"address": "Донецк, ул. Речная 24б",
"link": "https://ozon.ru/point/536838",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -80,7 +110,7 @@
"name": "ПВЗ-16 Харцызск",
"address": "Харцызск, ул. Шалимова 14б",
"link": "https://ozon.ru/point/536623",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -90,7 +120,27 @@
"name": "ПВЗ-17 Зугрэс",
"address": "Зугрэс, ул. Рыночная 1",
"link": "https://ozon.ru/point/536839",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.78178,
48.035305
],
"name": "ПВЗ-19 Северный",
"address": "Донецк, ул. Университетская 107",
"link": "https://ozon.ru/point/1224270",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.799398,
47.992543
],
"name": "ПВЗ-20 Пассаж",
"address": "Донецк, пл. Коммунаров 1",
"link": "https://ozon.ru/point/620821",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -100,7 +150,7 @@
"name": "ПВЗ-21 Крытый",
"address": "Донецк, ул. 50-летия СССР 150",
"link": "https://ozon.ru/point/533314",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -110,7 +160,7 @@
"name": "ПВЗ-22 Независимости",
"address": "Донецк, ул. Независимости 16д",
"link": "https://ozon.ru/point/536826",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -120,7 +170,7 @@
"name": "ПВЗ-23 Раздольная",
"address": "Донецк, ул. Раздольная 6",
"link": "https://ozon.ru/point/533348",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -130,7 +180,7 @@
"name": "ПВЗ-24 Соловки",
"address": "Донецк, ул. Пилотная 28",
"link": "https://ozon.ru/point/536830",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -140,7 +190,7 @@
"name": "ПВЗ-25 МК3 Черемушки",
"address": "Макеевка, квартал Северный 17",
"link": "https://ozon.ru/point/534957",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -150,7 +200,7 @@
"name": "ПВЗ-26 Шахтостроителей",
"address": "Донецк, бул. Шахтостроителей 20",
"link": "https://ozon.ru/point/534949",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -160,7 +210,17 @@
"name": "ПВЗ-27 Детский Мир",
"address": "Донецк, ул. Артема 147а",
"link": "https://ozon.ru/point/536823",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.926916,
47.964525
],
"name": "ПВЗ-29 Объединенный",
"address": "Донецк, ул. Буденновских партизан",
"link": "https://ozon.ru/point/538369",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -170,7 +230,27 @@
"name": "ПВЗ-30 Постышева",
"address": "Донецк, ул. Постышева 43",
"link": "https://ozon.ru/point/538183",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
38.762477,
48.022609
],
"name": "ПВЗ-31 Снежное",
"address": "Снежное, ул. Крестьянская 43",
"link": "https://ozon.ru/point/1217165",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.858368,
48.003342
],
"name": "ПВЗ-32 Макаронка",
"address": "Донецк, пр. Ильича 84",
"link": "https://ozon.ru/point/620816",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -180,7 +260,7 @@
"name": "ПВЗ-33 Пирамида",
"address": "Донецк, ул. 50-летия СССР 100",
"link": "https://ozon.ru/point/533329",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -190,7 +270,7 @@
"name": "ПВЗ-34 Киевский",
"address": "Донецк, пр. Киевский 24",
"link": "https://ozon.ru/point/538182",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -200,7 +280,7 @@
"name": "ПВЗ-35 Топаз",
"address": "Донецк, ул. Куйбышева 169б",
"link": "https://ozon.ru/point/538096",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -210,7 +290,17 @@
"name": "ПВЗ-36 МК-4 Даки",
"address": "Макеевка, ул. 50 лет Образования СССР 24а",
"link": "https://ozon.ru/point/538184",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.749093,
48.042633
],
"name": "ПВЗ-37 ЖД Космос",
"address": "Донецк, ул. Артема 275",
"link": "https://ozon.ru/point/1217174",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -220,7 +310,7 @@
"name": "ПВЗ-38 Волна",
"address": "Донецк, ул. Куйбышева 217Б",
"link": "https://ozon.ru/point/533332",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -230,7 +320,7 @@
"name": "ПВЗ-39 Семашко",
"address": "Донецк, ул. Коммунаров 38",
"link": "https://ozon.ru/point/535056",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -240,7 +330,17 @@
"name": "ПВЗ-40 Островского20",
"address": "Донецк, ул. Островского 20",
"link": "https://ozon.ru/point/533345",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.774099,
48.037829
],
"name": "ПВЗ-41 Маяк",
"address": "Донецк, ул. Артема 179б",
"link": "https://ozon.ru/point/1215788",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -250,7 +350,7 @@
"name": "ПВЗ-43 Гурова 22",
"address": "Донецк, пр. Гурова 22",
"link": "https://ozon.ru/point/538094",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
@@ -260,7 +360,137 @@
"name": "ПВЗ-44 Кольцова15",
"address": "Донецк, ул. Кольцова 15",
"link": "https://ozon.ru/point/538095",
"operationTime": "пн-вс с 9:00 до 17:45"
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.800047,
48.001798
],
"name": "ПВЗ-45 Гринкевича 9",
"address": "Донецк, пр. Гринкевича 9",
"link": "https://ozon.ru/point/549337",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.88167,
47.963065
],
"name": "ПВЗ-46 Буденного",
"address": "Донецк, пл. Буденного (трамвайное кольцо)",
"link": "https://ozon.ru/point/1217171",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.91487,
47.974376
],
"name": "ПВЗ-47 Раздольная 34б (Юта)",
"address": "Донецк, ул. Раздольная 34б",
"link": "https://ozon.ru/point/620819",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.859927,
48.036184
],
"name": "ПВЗ-48 МК-5 Кронштадская 69",
"address": "Макеевка, ул. Кронштадтская 69",
"link": "https://ozon.ru/point/622517",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.983099,
48.015676
],
"name": "ПВЗ-49 МК-6 Репина 26",
"address": "Макеевка, ул. Репина 26",
"link": "https://ozon.ru/point/622515",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.882111,
47.959607
],
"name": "ПВЗ-50 Октября 24",
"address": "Донецк, ул. Октября 24",
"link": "https://ozon.ru/point/1215819",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.850286,
47.981267
],
"name": "ПВЗ-52 Бессарабская 19",
"address": "Донецк, ул. Бессарабская 19",
"link": "https://ozon.ru/point/1255353",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.918123,
47.98129
],
"name": "ПВЗ-54 Щетинина 23а",
"address": "Донецк, ул. Щетинина 23а",
"link": "https://ozon.ru/point/1229358",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.795304,
48.011411
],
"name": "ПВЗ-55 Щорса 38",
"address": "Донецк, ул. Щорса 38",
"link": "https://ozon.ru/point/1229562",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.983865,
48.08509
],
"name": "ПВЗ-53 МК-7 Монтажная 48/11",
"address": "Макеевка, ул. Монтажная 48/11",
"link": "https://ozon.ru/point/1255364",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.966101,
47.955685
],
"name": "ПВЗ-56 Палладина 22",
"address": "Донецк, ул. Палладина 22",
"link": "https://ozon.ru/point/1230956",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
37.898197,
48.067402
],
"name": "ПВЗ-58 МК-9 Героев Сталинграда",
"address": "Макеевка, ул. Героев Сталинграда 19",
"link": "https://ozon.ru/point/1255360",
"operationTime": "пн-вс с 9:00 до 18:00"
},
{
"coordinates": [
38.02035,
47.751643
],
"name": "ПВЗ-60 Старобешево",
"address": "пгт. Старобешево, ул. Победы 94б",
"link": "https://ozon.ru/point/1263965",
"operationTime": "пн-вс с 9:00 до 18:00"
}
]
}

View File

@@ -1,66 +1,76 @@
{
"name": "Global Express",
"source": "https://t.me/Mariupol_global_express/1989",
"source": "https://t.me/global_express_dnr/784",
"points": [
{
"coordinates": [
37.775896,
47.959707
37.849239,
48.009934
],
"name": "Донецк 7 (микр-н Звездный)",
"link": "https://ozon.ru/point/534953",
"address": "Донецк, пр-кт Ленинский 98А",
"operationTime": "пн-вс с 9:00 до 17:00"
"link": "https://ozon.ru/point/538177",
"name": "г. Донецк Калининский рынок (рядом с гостиницей Нива) бульвар Шевченко, 66",
"address": "г. Донецк Калининский рынок (рядом с гостиницей Нива) бульвар Шевченко, 66",
"operationTime": "<a href=\"https://vk.com/global_express_dnr?w=address-124759560_72654\">ГРАФИК РАБОТЫ</a>"
},
{
"coordinates": [
37.811995,
48.011767
],
"name": "Донецк 8 (Крытый рынок)",
"link": "https://ozon.ru/point/533323",
"address": "Донецк, ул. 50-летия СССР 157А",
"operationTime": "пн-пт с 9:00 до 17:00"
"name": "г. Донецк, ул. 50-летия СССР, 157А",
"address": "г. Донецк, ул. 50-летия СССР, 157А",
"operationTime": "<a href=\"https://vk.com/global_express_dnr?w=address-124759560_72654\">ГРАФИК РАБОТЫ</a>"
},
{
"coordinates": [
37.799192,
47.991666
],
"name": "Донецк 1 (Южный)",
"link": "https://ozon.ru/point/533347",
"address": "Донецк, площадь Коммунаров 1к1, ТЦ «Южный»",
"operationTime": "пн-пт с 9:00 до 17:00, сб-вс с 10:00 ло 17:00"
"name": " г. Донецк, площадь Коммунаров 1к1, ТЦ «Южный» ",
"address": " г. Донецк, площадь Коммунаров 1к1, ТЦ «Южный» ",
"operationTime": "<a href=\"https://vk.com/global_express_dnr?w=address-124759560_72654\">ГРАФИК РАБОТЫ</a>"
},
{
"coordinates": [
37.775896,
47.959707
],
"link": "https://ozon.ru/point/534953",
"name": "г. Донецк, пр - кт Ленинский, 98А остановка «Звездный»",
"address": "г. Донецк, пр - кт Ленинский, 98А остановка «Звездный»",
"operationTime": "<a href=\"https://vk.com/global_express_dnr?w=address-124759560_72654\">ГРАФИК РАБОТЫ</a>"
},
{
"coordinates": [
38.635921,
48.047327
],
"name": "Торез 3",
"link": "https://ozon.ru/point/533350",
"name": "г. Торез, 4й микрорайон, (торговые павильоны в районе дома 23)",
"address": "г. Торез, 4й микрорайон, (торговые павильоны в районе дома 23)",
"operationTime": "пн-вс с 9:00 до 17:00"
"operationTime": "<a href=\"https://vk.com/global_express_dnr?w=address-124759560_72654\">ГРАФИК РАБОТЫ</a>"
},
{
"coordinates": [
38.761523,
48.021133
],
"name": "Снежное",
"link": "https://ozon.ru/point/534920",
"address": "Снежное, ул. Дзержинского, 2",
"operationTime": "пн-вс с 9:00 до 17:00"
"name": "г. Снежное, ул. Дзержинского, 2 ",
"address": "г. Снежное, ул. Дзержинского, 2 ",
"operationTime": "<a href=\"https://vk.com/global_express_dnr?w=address-124759560_72654\">ГРАФИК РАБОТЫ</a>"
},
{
"coordinates": [
38.208714,
48.221055
],
"name": "Енакиево",
"link": "https://ozon.ru/point/534903",
"address": "Енакиево, проспект Ленина, 98в",
"operationTime": "пн-вс с 9:00 до 17:00"
"name": "Енакиево, проспект Ленина, 98 ",
"address": "Енакиево, проспект Ленина, 98 ",
"operationTime": "<a href=\"https://vk.com/global_express_dnr?w=address-124759560_72654\">ГРАФИК РАБОТЫ</a>"
}
]
}

View File

@@ -7,9 +7,9 @@
37.845475,
47.994778
],
"name": "ПВЗ г.Донецк, ул.Харитонова, 3",
"address": "г.Донецк, ул.Харитонова, 3",
"link": "https://ozon.ru/point/517058",
"name": "ПВЗ г. Донецк, ул. Харитонова, 3а",
"address": "г. Донецк, ул. Харитонова, 3а",
"link": "https://ozon.ru/t/lNMb4a7",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
@@ -17,9 +17,9 @@
37.790642,
47.988073
],
"name": "ПВЗ г.Донецк, пр.Ленинский, 4",
"address": "г.Донецк, пр.Ленинский, 4",
"link": "https://ozon.ru/point/517054",
"name": "ПВЗ г. Донецк, пр-кт Ленинский, 4",
"address": "г. Донецк, пр-кт Ленинский, 4",
"link": "https://ozon.ru/t/bJKdjAE",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
@@ -27,9 +27,9 @@
37.694046,
47.949874
],
"name": "ПВЗ г.Донецк, ул.Петровского, 111в",
"address": "г.Донецк, ул.Петровского, 111в",
"link": "https://ozon.ru/point/517053",
"name": "ПВЗ г. Донецк, ул. Петровского, 111в",
"address": "г. Донецк, ул. Петровского, 111в",
"link": "https://ozon.ru/t/QlR8LlD",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
@@ -37,19 +37,9 @@
37.798637,
48.009
],
"name": "ПВЗ г.Донецк, ул.Университетская, 34",
"address": "г.Донецк, ул.Университетская, 34",
"link": "https://ozon.ru/point/514822",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.899868,
47.991365
],
"name": "ПВЗ г.Донецк, ул.Полоцкая, 9",
"address": "г.Донецк, ул.Полоцкая, 9",
"link": "https://ozon.ru/point/517056",
"name": "ПВЗ г. Донецк, ул. Университетская, 34",
"address": "г. Донецк, ул. Университетская, 34",
"link": "https://ozon.ru/t/WkV05VJ",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
@@ -57,9 +47,9 @@
37.551447,
47.106867
],
"name": "ПВЗ г.Мариуполь, пр.Металлургов, 94",
"address": "г.Мариуполь, пр.Металлургов, 94",
"link": "https://ozon.ru/point/516734",
"name": "ПВЗ г. Мариуполь, пр-кт Металлургов, 94",
"address": "г. Мариуполь, пр-кт Металлургов, 94",
"link": "https://ozon.ru/t/85ALaJb",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
@@ -67,9 +57,9 @@
37.960468,
48.041197
],
"name": "ПВЗ г.Макеевка, ул.Рябцева, 1",
"address": "г.Макеевка, ул.Рябцева, 1",
"link": "https://ozon.ru/point/517062",
"name": "ПВЗ г. Макеевка, ул. Рябцева, 1",
"address": "г. Макеевка, ул. Рябцева, 1",
"link": "https://ozon.ru/t/akMALGL",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
@@ -77,9 +67,9 @@
37.781488,
48.03651
],
"name": "ПВЗ г.Донецк, ул.Артема, 148а",
"address": "г.Донецк, ул.Артема, 148а",
"link": "https://ozon.ru/point/517055",
"name": "ПВЗ г. Донецк, ул. Артема, 148а",
"address": "г. Донецк, ул. Артема, 148а",
"link": "https://ozon.ru/t/grW5Y08",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
@@ -87,19 +77,19 @@
37.7964,
48.00381
],
"name": "ПВЗ г.Донецк, пр.Гурова, 7",
"address": "г.Донецк, пр.Гурова, 7",
"link": "https://ozon.ru/point/517061",
"name": "ПВЗ г. Донецк, пр-кт Гурова, 7",
"address": "г. Донецк, пр-кт Гурова, 7",
"link": "https://ozon.ru/t/R9egGrb",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.807934,
48.014371
37.807755,
48.016661
],
"name": "ПВЗ г.Донецк, ул.Челюскинцев, 167",
"address": "г.Донецк, ул.Челюскинцев, 167",
"link": "https://ozon.ru/point/517059",
"name": "ПВЗ г. Донецк, пр-кт Мира, 13",
"address": "г. Донецк, пр-кт Мира, 13",
"link": "https://ozon.ru/t/EMEA7XD",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
@@ -107,9 +97,9 @@
37.835405,
48.002471
],
"name": "ПВЗ г.Донецк, пр.Ильича, 32",
"address": "г.Донецк, пр.Ильича, 32",
"link": "https://ozon.ru/point/514844",
"name": "ПВЗ г. Донецк, пр-кт Ильича, 32",
"address": "г. Донецк, пр-кт Ильича, 32",
"link": "https://ozon.ru/t/P9LAMA4",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
@@ -117,9 +107,9 @@
38.026077,
48.045442
],
"name": "ПВЗ г.Макеевка, пр.Генерала Данилова, 71б",
"address": "г.Макеевка, пр.Генерала Данилова, 71б",
"link": "https://ozon.ru/point/534902",
"name": "ПВЗ г. Макеевка, ул. Ленина, 85",
"address": "г. Макеевка, ул. Ленина, 85",
"link": "https://ozon.ru/point/1224455",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
@@ -127,8 +117,8 @@
37.778362,
47.978513
],
"name": "ПВЗ г. Донецк, ул.Воровского, 9",
"address": "г. Донецк, ул.Воровского, 9",
"name": "ПВЗ г. Донецк, ул. Воровского, 9",
"address": "г. Донецк, ул. Воровского, 9",
"link": "https://ozon.ru/point/534899",
"operationTime": "пн-вс с 9:00 до 17:45"
},
@@ -137,8 +127,8 @@
38.084391,
47.11915
],
"name": "ПВЗ г.Новоазовск, ул.Ленина, 48",
"address": "г.Новоазовск, ул.Ленина, 48",
"name": "ПВЗ г. Новоазовск, ул. Ленина, 48",
"address": "г. Новоазовск, ул. Ленина, 48",
"link": "https://ozon.ru/point/533305",
"operationTime": "пн-вс с 9:00 до 17:45"
},
@@ -147,8 +137,8 @@
37.795933,
48.021495
],
"name": "ПВЗ г.Донецк, ул.Университетская, 76",
"address": "г.Донецк, ул.Университетская, 76",
"name": "ПВЗ г. Донецк, ул. Университетская, 76",
"address": "г. Донецк, ул. Университетская, 76",
"link": "https://ozon.ru/point/538086",
"operationTime": "пн-вс с 9:00 до 17:45"
},
@@ -157,9 +147,9 @@
37.958366,
48.084373
],
"name": "ПВЗ г.Макеевка, ул.Рябцева, 1",
"address": "г.Макеевка, ул.Рябцева, 1",
"link": "https://ozon.ru/point/517062",
"name": "ПВЗ г. Макеевка, ул. Ленина, 152",
"address": "г. Макеевка, ул. Ленина, 152",
"link": "https://ozon.ru/point/1215795",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
@@ -167,8 +157,8 @@
37.907342,
47.977482
],
"name": "ПВЗ г.Донецк, ул.Прожекторная, 3",
"address": "г.Донецк, ул.Прожекторная, 3",
"name": "ПВЗ г. Донецк, ул. Прожекторная, 3",
"address": "г. Донецк, ул. Прожекторная, 3",
"link": "https://ozon.ru/point/533308",
"operationTime": "пн-вс с 9:00 до 17:45"
},
@@ -177,8 +167,8 @@
37.864259,
48.009494
],
"name": "ПВЗ г.Донецк, бул.Шевченко, 129",
"address": "г.Донецк, бул.Шевченко, 129",
"name": "ПВЗ г. Донецк, б-р Шевченко, 129",
"address": "г. Донецк, б-р Шевченко, 129",
"link": "https://ozon.ru/point/538180",
"operationTime": "пн-вс с 9:00 до 17:45"
},
@@ -187,9 +177,239 @@
37.963765,
48.054088
],
"name": "ПВЗ г.Макеевка, ул.Рябцева, 1",
"address": "г.Макеевка, ул.Рябцева, 1",
"link": "https://ozon.ru/point/517062",
"name": "ПВЗ г. Макеевка, ул. Ленина, 85",
"address": "г. Макеевка, ул. Ленина, 85",
"link": "https://ozon.ru/point/1224455",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.799239,
47.987542
],
"name": "ПВЗ г. Донецк, ул. Первомайская, 19",
"address": "г. Донецк, ул. Первомайская, 19",
"link": "https://ozon.ru/point/549338",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.694468,
47.942444
],
"name": "ПВЗ г. Донецк, ул. Харитонова, 3а",
"address": "г. Донецк, ул. Харитонова, 3а",
"link": "https://ozon.ru/t/lNMb4a7",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
38.02918,
48.298144
],
"name": "ПВЗ г. Донецк, ул. Первомайская, 19",
"address": "г. Донецк, ул. Первомайская, 19",
"link": "https://ozon.ru/point/549338",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.769091,
48.007909
],
"name": "ПВЗ г. Донецк, пр-кт Панфилова, 118",
"address": "г. Донецк, пр-кт Панфилова, 118",
"link": "https://ozon.ru/point/565085",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
36.792443,
46.755655
],
"name": "ПВЗ г. Макеевка, ул. Ленина, 85",
"address": "г. Макеевка, ул. Ленина, 85",
"link": "https://ozon.ru/point/1224455",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.828003,
47.991136
],
"name": "ПВЗ г. Донецк, ул. Мушкетовская, 5",
"address": "г. Донецк, ул. Мушкетовская, 5",
"link": "https://ozon.ru/point/1217155",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.777302,
48.060357
],
"name": "ПВЗ г. Донецк, пр-кт Партизанский, 75",
"address": "г. Донецк, пр-кт Партизанский, 75",
"link": "https://ozon.ru/point/1224264",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.82926,
48.008801
],
"name": "ПВЗ г. Донецк, б-р Шевченко, 27",
"address": "г. Донецк, б-р Шевченко, 27",
"link": "https://ozon.ru/point/549324",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.801502,
47.97817
],
"name": "ПВЗ г. Донецк, ул. И. Ткаченко, 121а",
"address": "г. Донецк, ул. И. Ткаченко, 121а",
"link": "https://ozon.ru/point/565090",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
36.815574,
46.747857
],
"name": "ПВЗ г. Донецк, ул. Харитонова, 3а",
"address": "г. Донецк, ул. Харитонова, 3а",
"link": "https://ozon.ru/t/lNMb4a7",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.766495,
47.942046
],
"name": "ПВЗ г. Донецк, ул. Шутова, 16а",
"address": "г. Донецк, ул. Шутова, 16а",
"link": "https://ozon.ru/point/1224266",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
38.063011,
48.327194
],
"name": "ПВЗ г. Макеевка, ул. Ленина, 85",
"address": "г. Макеевка, ул. Ленина, 85",
"link": "https://ozon.ru/point/1224455",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.810225,
48.032287
],
"name": "ПВЗ г. Донецк, ул. Северская, 23а",
"address": "г. Донецк, ул. Северская, 23а",
"link": "https://ozon.ru/point/1215785",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
38.026527,
48.048848
],
"name": "ПВЗ г. Макеевка, микрорайон Зеленый, 6а",
"address": "г. Макеевка, микрорайон Зеленый, 6а",
"link": "https://ozon.ru/point/534902",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
38.155744,
48.036233
],
"name": "ПВЗ г. Харцызск, ул. Октябрьская, 34б",
"address": "г. Харцызск, ул. Октябрьская, 34б",
"link": "https://ozon.ru/point/1224267",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
38.068456,
47.666574
],
"name": "ПВЗ г. Комсомольское, ул. Горького, 69б",
"address": "г. Комсомольское, ул. Горького, 69б",
"link": "https://ozon.ru/point/1215789",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.898826,
47.989924
],
"name": "ПВЗ г. Донецк, ул. Вышнеградского, 25",
"address": "г. Донецк, ул. Вышнеградского, 25",
"link": "https://ozon.ru/t/7nArwJX",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.905976,
48.071797
],
"name": "ПВЗ г. Макеевка, ул. Коккинаки, 60",
"address": "г. Макеевка, ул. Коккинаки, 60",
"link": "https://ozon.ru/point/1236281",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.8616,
48.03683
],
"name": "ПВЗ г. Макеевка, ул. Ленина, 85",
"address": "г. Макеевка, ул. Ленина, 85",
"link": "https://ozon.ru/point/1224455",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.85559,
47.977886
],
"name": "ПВЗ г. Донецк, ул. Майская, 18б",
"address": "г. Донецк, ул. Майская, 18б",
"link": "https://ozon.ru/point/1236293",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.873395,
47.979135
],
"name": "ПВЗ г. Донецк, ул. Майская, 18б",
"address": "г. Донецк, ул. Майская, 18б",
"link": "https://ozon.ru/point/1236293",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.782243,
48.020904
],
"name": "ПВЗ г. Донецк, пр-кт Панфилова, 118",
"address": "г. Донецк, пр-кт Панфилова, 118",
"link": "https://ozon.ru/point/565085",
"operationTime": "пн-вс с 9:00 до 17:45"
},
{
"coordinates": [
37.931821,
48.026767
],
"name": "ПВЗ г. Макеевка, ул. Рябцева, 1",
"address": "г. Макеевка, ул. Рябцева, 1",
"link": "https://ozon.ru/t/akMALGL",
"operationTime": "пн-вс с 9:00 до 17:45"
}
]

View File

@@ -0,0 +1,46 @@
{
"name": "Твоя доставка",
"source": "https://t.me/twoya_dostavka/650",
"points": [
{
"coordinates": [
37.833752,
47.991413
],
"name": "пр-кт Павших Коммунаров 96",
"link": "https://ozon.ru/point/1233432",
"address": "Донецк, пр-кт Павших Коммунаров 96",
"operationTime": "Ежедневно с 9.00-18.00"
},
{
"coordinates": [
37.778757,
47.956758
],
"name": "ул.Актюбинская 5а",
"link": "https://ozon.ru/point/1233413",
"address": "Донецк, ул.Актюбинская 5а",
"operationTime": "Ежедневно с 9.00-18.00"
},
{
"coordinates": [
37.805042,
47.990069
],
"name": "ул. Артема 41 Каб.113",
"link": "https://ozon.ru/point/1233419",
"address": "Донецк, ул. Артема 41 Каб.113",
"operationTime": "Ежедневно с 9.00-18.00"
},
{
"coordinates": [
37.777041,
47.966956
],
"name": "ул. Артема 41 Каб.113",
"link": "https://ozon.ru/point/1236298",
"address": "Донецк, ул. Днепродзержинская 5",
"operationTime": "Ежедневно с 9.00-18.00"
}
]
}

File diff suppressed because it is too large Load Diff

16
eslint.config.js Normal file
View File

@@ -0,0 +1,16 @@
import globals from "globals";
import pluginJs from "@eslint/js";
export default [
{
// files: ["src/**/*.js"],
ignores: [
"dist/**/*.js",
"!scripts/**/*.js"
],
},
{
languageOptions: { globals: { ...globals.browser, ...globals.node } },
},
pluginJs.configs.recommended,
];

View File

@@ -1,31 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link href="https://fonts.googleapis.com/css2?family=Roboto&display=swap" rel="stylesheet">
<title>БЕСПЛАТНЫЕ ПВЗ ОЗОН В ДНР</title>
</head>
<body>
<div id="map" class="map"></div>
<div id="popup" class="ol-popup">
<a href="#" id="popup-closer" class="ol-popup-closer"></a>
<div id="popup-content">
<p id="popup-name"></p>
<a id="popup-address"></a>
<p>График работы: <span id="popup-operation-time">неизвестно</span></p>
<p>
Отсканируйте QR или нажмите на него
<a id="popup-link" href="">
<canvas id="popup-canvas"></canvas>
</a>
</p>
<p>
<a id="popup-source">Источник</a>
</p>
</div>
</div>
<script type="module" src="/main.js"></script>
</body>
</html>

38
map.js
View File

@@ -1,38 +0,0 @@
import 'ol/ol.css';
import Map from 'ol/Map';
import View from 'ol/View';
import TileLayer from 'ol/layer/Tile';
import { fromLonLat } from 'ol/proj';
import { XYZ } from 'ol/source';
import { createXYZ } from 'ol/tilegrid';
const MAP_TARGET = 'map';
const MAP_CENTER = fromLonLat([37.57725139554275, 48.02287702854201]);
const MAP_ZOOM = 8.5;
const customTileSource = new TileLayer({
source: new XYZ({
// url: 'https://tile-server.ozon.ru/tile/default/{z}/{x}/{y}.png'
tileUrlFunction: ([z, x, y]) => {
const s = x % 4 + (y % 4) * 4
return `https://i${s}.wikimapia.org/?x=${x}&y=${y}&zoom=${z}&type=map&lng=1`
},
maxZoom: 18,
})
});
export const view = new View({
center: MAP_CENTER,
zoom: MAP_ZOOM,
})
const map = new Map({
target: MAP_TARGET,
layers: [
customTileSource
],
view,
});
export default map;

File diff suppressed because it is too large Load Diff

1314
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -6,15 +6,23 @@
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
"preview": "vite preview",
"lint": "eslint"
},
"devDependencies": {
"@eslint/js": "^9.4.0",
"collapse-white-space": "^2.1.0",
"eslint": "^9.4.0",
"globals": "^15.4.0",
"vite": "^5.2.0",
"vite-plugin-html-config": "^1.0.11",
"vite-plugin-radar": "^0.9.6",
"vite-plugin-static-copy": "^1.0.5",
"vite-plugin-webfont-dl": "^3.9.4"
},
"dependencies": {
"fastest-levenshtein": "^1.0.16",
"js-cookie": "^3.0.5",
"jsdom": "^24.1.0",
"modern-async": "^2.0.0",
"node-fetch": "^3.3.2",

View File

@@ -1,6 +1,7 @@
import fs from "node:fs/promises";
import { asyncMap } from "modern-async";
import { getDistance } from "ol/sphere.js";
import { extractIDFromURL } from "./utils.js";
function removeDuplicatesByUrl(points) {
const uniquePoints = [];
@@ -64,6 +65,12 @@ async function main() {
data = data.flatMap((v) => v);
data = removeDuplicatesByUrl(data);
data = removeDuplicatesByRadius(data, 10);
// pick all except url
data = data.map(x => {
const { link, ...rest } = x;
return { id: extractIDFromURL(link), ...rest };
});
await fs.writeFile("merged-data.json", JSON.stringify(data, undefined, 2));
}

View File

@@ -1,49 +1,15 @@
import fs from "node:fs/promises";
import { asyncMap } from "modern-async";
import { getFinalURL } from "./utils.js";
import ozonWbDpr from "./update/ozon-wb-dpr.js";
import sevenDostavka from "./update/sevenDostavka.js";
async function woyag() {
const apiResponse = await fetch("https://login.woyag.ru/ajax/pvz-list");
const json = await apiResponse.json();
let points = json.filter((point) => !!point.link);
points = await asyncMap(points, async (point) => {
const link = await getFinalURL(point.link).then(u => {
const final = new URL(u);
final.search = '';
return final.toString();
})
return {
coordinates: [parseFloat(point["geo_lng"]), parseFloat(point["geo_lat"])],
name: point.name,
address: point.address,
link,
operationTime: "пн-вс с 9:00 до 17:45",
};
});
await fs.writeFile(
"data/01_woyag.json",
JSON.stringify(
{
name: "WOЯЖ",
source: "https://login.woyag.ru/map",
points,
},
undefined,
4
)
);
}
import {
woyag,
// sevenDostavka,
ozonWbDpr,
globalExpress
} from './update/index.js';
async function main() {
await woyag();
await sevenDostavka();
// await sevenDostavka();
await ozonWbDpr();
await globalExpress();
}
main();

View File

@@ -0,0 +1,193 @@
import fs from "node:fs/promises";
import { JSDOM } from "jsdom";
import { asyncMap } from "modern-async";
import { getTelegramMessage } from "../utils.js";
import { collapseWhiteSpace } from "collapse-white-space";
const OUTPUT_FILE = "data/02_global-express.json";
const MAIN_URL = "https://t.me/global_express_dnr/784";
/*
function generateReadableSchedule(schedule) {
const dayMappings = {
mon: "Пн",
tue: "Вт",
wed: "Ср",
thu: "Чт",
fri: "Пт",
sat: "Сб",
sun: "Вс",
};
let readableSchedule = "";
Object.keys(dayMappings).forEach((key) => {
const day = dayMappings[key];
const daySchedule = schedule[key];
if (
daySchedule &&
daySchedule.open_time !== null &&
daySchedule.close_time !== null
) {
const openTime = formatTime(daySchedule.open_time);
const closeTime = formatTime(daySchedule.close_time);
const breakStart = daySchedule.break_open_time
? daySchedule.break_open_time
: daySchedule.close_time;
const breakEnd = daySchedule.break_close_time
? daySchedule.break_close_time
: daySchedule.close_time;
if (breakStart === daySchedule.close_time) {
readableSchedule += `${day} ${openTime} - ${closeTime}\n`;
} else {
const breakStartFormatted = formatTime(breakStart);
const breakEndFormatted = formatTime(breakEnd);
readableSchedule += `${day} ${openTime} - ${breakStartFormatted}, ${breakEndFormatted} - ${closeTime}\n`;
}
} else {
readableSchedule += `${day} Выходной\n`;
}
});
return readableSchedule.trim();
}
function formatTime(minutes) {
if (minutes < 0) return "00:00"; // Время меньше 0, возвращаем 00:00
const hours = Math.floor(minutes / 60);
const mins = minutes % 60;
return `${padZero(hours)}:${padZero(mins)}`;
}
function padZero(num) {
return num.toString().padStart(2, "0");
}
*/
async function getPVZFromPost(post) {
const message = await getTelegramMessage(post);
const dom = new JSDOM(message.text);
const document = dom.window.document;
// Ищем координаты, которые всегда в скобках, возможно с пробелами
const coordinatesNode = Array.from(document.querySelectorAll("br"))
.map((br) => br.nextSibling)
.find(
(node) =>
node &&
node.nodeType === 3 &&
/\(\s*\d+(\.\d+)?\s*,\s*\d+(\.\d+)?\s*\)/.test(node.nodeValue.trim())
);
let coordinates = null;
if (coordinatesNode) {
const matches = coordinatesNode.nodeValue.trim().match(/\(\s*([^)]*)\s*\)/);
if (matches) {
const [lat, lng] = matches[1]
.split(",")
.map((coord) => parseFloat(coord.trim()));
coordinates = [lng, lat];
}
}
// Ищем ссылку, которая начинается с https://ozon.ru/point
const linkNode = document.querySelector('a[href^="https://ozon.ru/point"]');
const link = linkNode ? linkNode.href : null;
return {
coordinates,
link,
};
}
async function getFromTelegram() {
const message = await getTelegramMessage(MAIN_URL);
const dom = new JSDOM(message.text);
const document = dom.window.document;
const addressesSection = Array.from(document.querySelectorAll("b")).find(
(b) => b.textContent.includes("Наши адреса ПВЗ с OZON")
);
const privilegesSection = Array.from(document.querySelectorAll("a")).find(
(u) => u.textContent.includes("КАК ЗАКАЗАТЬ САМОСТОЯТЕЛЬНО С : OZON/ Wildberries/ Яндекс Маркет")
);
const links = [];
let currentElement = addressesSection.nextElementSibling;
while (currentElement && currentElement !== privilegesSection) {
if (currentElement.tagName === "A") {
links.push(currentElement);
}
currentElement = currentElement.nextElementSibling;
}
const data = await asyncMap(links, async (link) => {
const textContent = collapseWhiteSpace(
link.innerHTML.replace(/<br\s*\/?>/gi, " ")
);
let pvzData = await getPVZFromPost(link.href.replace('Mariupol_global_express', 'global_express_dnr'));
if (!pvzData || !pvzData.coordinates) return undefined;
return {
...pvzData,
name: textContent,
address: textContent,
};
});
return data.filter(Boolean);
}
/*
async function getFromVK() {
const group_id = 124759560;
const access_token = "";
const v = "5.199";
const res = await fetch(
`https://api.vk.com/method/groups.getAddresses?group_id=${group_id}&access_token=${access_token}&count=999&v=${v}`,
{
headers: {
"Accept-Language": "ru,en;q=0.9",
},
}
);
const items = (await res.json()).response.items;
return items.map((item) => ({
address: `${item.city.title}, ${item.address}`,
timetable: item.timetable,
}));
}
*/
async function globalExpress() {
const points = await getFromTelegram();
// const points = await getFromVK();
fs.writeFile(
OUTPUT_FILE,
JSON.stringify(
{
name: "Global Express",
source: MAIN_URL,
points: points.map((p) => ({
...p,
operationTime: `<a href="https://vk.com/global_express_dnr?w=address-124759560_72654">ГРАФИК РАБОТЫ</a>`,
})),
},
undefined,
4
)
);
}
export default globalExpress;

View File

@@ -0,0 +1,4 @@
export { default as woyag } from "./woyag.js";
export { default as ozonWbDpr } from "./ozon-wb-dpr.js";
export { default as sevenDostavka } from "./sevenDostavka.js";
export { default as globalExpress } from "./globalExpress.js";

View File

@@ -4,6 +4,8 @@ import { JSDOM } from "jsdom";
import { asyncMap } from "modern-async";
import fs from "node:fs/promises";
const OUTPUT_FILE = "data/03_ozon-wb-dpr.json";
const MAIN_URL = "https://t.me/ozon_wb_dpr/627";
const QR_FOR_PVZ_STRING = "QR для ПВЗ";
@@ -81,8 +83,8 @@ async function getFromSite() {
const scripts = document.querySelectorAll("script");
for (let script of scripts) {
if (script.textContent.includes('descr: "Бесплатный озон')) {
let x = script.textContent.split("[\n{\n").pop().split("\n},\n]")[0];
if (script.textContent.includes('descr:"Бесплатный озон')) {
let x = script.textContent.split("[{").pop().split("},]")[0];
if (x) {
const points = new Function(`return [{${x}}]`)();
@@ -108,7 +110,7 @@ async function ozonWbDpr() {
});
await fs.writeFile(
"data/03_ozon-wb-dpr.json",
OUTPUT_FILE,
JSON.stringify(
{
name: "ПВЗ ДНР",

View File

@@ -1,12 +1,33 @@
import fs from "node:fs/promises";
import { JSDOM } from "jsdom";
const OUTPUT_FILE = "data/99_sevenDostavka.json";
const linkRegexp = new RegExp(/https:\/\/ozon\.ru\/point\/\d+/);
async function sevenDostavka() {
const res = await fetch("https://dostavka.7telecom.ru");
const res = await fetch(
"https://yandex.ru/maps/?from=mapframe&ll=37.686304%2C47.189563&mode=usermaps&source=mapframe&um=constructor%3A3126b0c176a2b846a523a2cd2488869ea2f984ec51bcb43b2807ff27a2de39f4&utm_source=share&z=11",
{
headers: {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en-US,en;q=0.9',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'DNT': '1',
'Host': 'yandex.ru',
'Pragma': 'no-cache',
'Referer': 'https://yandex.ru/',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
}
);
const htmlText = await res.text();
console.log(htmlText)
const dom = new JSDOM(htmlText);
const document = dom.window.document;
const scripts = document.querySelectorAll("script");
@@ -19,7 +40,7 @@ async function sevenDostavka() {
const points = new Function(`return [{${x}}]`)();
fs.writeFile(
"data/99_sevenDostavka.json",
OUTPUT_FILE,
JSON.stringify(
{
name: "7dostavka",
@@ -44,4 +65,4 @@ async function sevenDostavka() {
}
}
export default sevenDostavka;
export default sevenDostavka;

43
scripts/update/woyag.js Normal file
View File

@@ -0,0 +1,43 @@
import fs from "node:fs/promises";
import { asyncMap } from "modern-async";
import { getFinalURL } from "../utils.js";
const OUTPUT_FILE = "data/01_woyag.json";
async function woyag() {
const apiResponse = await fetch("https://login.woyag.ru/ajax/pvz-list");
const json = await apiResponse.json();
let points = json.filter((point) => !!point.link);
points = await asyncMap(points, async (point) => {
const link = await getFinalURL(point.link).then(u => {
const final = new URL(u);
final.search = '';
return final.toString();
})
return {
coordinates: [parseFloat(point["geo_lng"]), parseFloat(point["geo_lat"])],
name: point.name,
address: point.address,
link,
operationTime: "пн-вс с 9:00 до 18:00",
};
});
await fs.writeFile(
OUTPUT_FILE,
JSON.stringify(
{
name: "WOЯЖ",
source: "https://login.woyag.ru/map",
points,
},
undefined,
4
)
);
}
export default woyag

View File

@@ -46,6 +46,7 @@ export async function getFinalURL(url) {
}
export async function getTelegramMessage(input) {
console.log(input);
const url = new URL(input);
url.search = "?embed=1&mode=tme";
@@ -63,3 +64,15 @@ export async function getTelegramMessage(input) {
.innerHTML,
};
}
/**
* Извлекает идентификатор пункта выдачи OZON из ссылки
* @param {string} url
*/
export function extractIDFromURL(url) {
const match = url.match(/https:\/\/ozon\.ru\/point\/([0-9]+)/);
if (match) {
return match[1];
}
return null;
}

33
src/analytics.js Normal file
View File

@@ -0,0 +1,33 @@
import { el } from "./utils.js";
class Analytics {
static event(name, data = undefined) {
if (typeof ym !== 'undefined') {
// eslint-disable-next-line no-undef
ym(window.YANDEX_METRICA_ID, 'reachGoal', name, data);
}
}
}
document.addEventListener("DOMContentLoaded", function () {
const popupPVZId = el("popup-pvz-id");
const popupLink = el("popup-link");
const sourceLink = el("popup-source");
const infoPopupButton = el("info-popup-button");
popupLink.addEventListener("click", function () {
const pvzData = { pvz: popupPVZId.innerText };
Analytics.event("pvz-link-clicked", pvzData);
});
sourceLink.addEventListener("click", function () {
const pvzData = { pvz: popupPVZId.innerText };
Analytics.event("pvz-source-clicked", pvzData);
});
infoPopupButton.addEventListener("click", function () {
Analytics.event("info-popup-closed");
});
});

View File

@@ -22,7 +22,7 @@ function createFeatures(places) {
geometry: new Point(fromLonLat(place.coordinates)),
name: `[${place.provider}] ${place.name}`,
address: place.address,
link: place.link,
id: place.id,
source: place.source,
operationTime: place.operationTime,
});

123
src/index.html Normal file
View File

@@ -0,0 +1,123 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<title>БЕСПЛАТНЫЕ ПВЗ ОЗОН В ДНР</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta
name="description"
content="Бесплатные ПВЗ Озон в ДНР. Найдите ближайший пункт выдачи заказов Озон и воспользуйтесь бесплатной доставкой в ДНР."
/>
<meta
name="keywords"
content="ПВЗ Озон, бесплатная доставка, ДНР, пункты выдачи заказов, Озон ДНР"
/>
<meta property="og:title" content="БЕСПЛАТНЫЕ ПВЗ ОЗОН В ДНР" />
<meta
property="og:description"
content="Найдите ближайший пункт выдачи заказов Озон в ДНР и воспользуйтесь бесплатной доставкой."
/>
<meta property="og:type" content="website" />
<meta property="og:image" content="https://cdn1.ozone.ru/s3/cms/logo/og_ozon_ru.png" />
<link
href="https://fonts.googleapis.com/css2?family=Roboto&display=swap"
rel="stylesheet"
/>
<style>
#popup {
display: none;
}
.ol-overlay-container > #popup {
display: unset;
}
.info-popup {
display: none;
position: absolute;
top: 0;
z-index: 999;
left: 0;
right: 0;
bottom: 0;
background: white;
padding: 1rem;
font-size: 14pt;
}
.info-popup-content {
max-width: 1000px;
margin: 0 auto;
}
.info-popup-content > footer {
display: flex;
flex-direction: column;
gap: 1rem;
border-top: 1px solid black;
padding: 20px;
}
.info-popup-content > footer > button {
font-size: 14pt;
padding: 10px;
max-width: 300px;
}
</style>
</head>
<body>
<div id="info-popup" class="info-popup">
<div class="info-popup-content">
<h1>Важная информация перед использованием сайта</h1>
<h2>Пожалуйста, прочитайте внимательно</h2>
<p>
На сайте собраны данные о пунктах выдачи заказов (ПВЗ) от разных служб доставок, чтобы вам было удобнее выбирать. <b>Создатели сайта не несут ответственности за точность информации о пунктах выдачи.</b> Информация собирается из открытых источников. Для каждого ПВЗ указан источник, откуда была взята информация, чтобы вы смогли сами проверить.
</p>
<p>
<b>Как пользоваться?</b>
<ol>
<li>Найдите удобный для вас пункт выдачи заказов на карте.</li>
<li>Сканируйте QR-код или переходите по ссылке, чтобы добавить адрес пункта выдачи.</li>
<li>В приложении новый пункт выдачи отобразится как "обл. Ростовская, Пункт Партнёра XXXXXX". Не переживайте это нормально. Просто сделайте заказ на этот адрес.</li>
<li>Когда получите уведомление о готовности заказа, приходите в выбранный вами пункт выдачи. Чтобы забрать заказ необходимо будет показать штрих-код из приложения.</li>
</ol>
</p>
<p>Сайт не является коммерческим и не связан ни с одной из служб доставки или с OZON.</p>
<p>Все товарные знаки, логотипы и обозначения, упомянутые на сайте, являются собственностью их соответствующих владельцев.</p>
<p>Проект является проектом с открытым исходным кодом. Если хотите посмотреть исходный код или поучаствовать в проекте - <a href="https://github.com/Maks1mS/free-ozon-dpr">вот ссылка</a>.</p>
<p>Для улучшения работы сайта и анализа трафика мы используем Яндекс Метрику.</p>
<p>Мы используем cookie-файлы. Вы можете прочитать подробнее о cookie-файлах или изменить настройки браузера. Продолжая пользоваться сайтом без изменения настроек, вы даёте согласие на использование ваших cookie-файлов.</p>
<footer>
<label>
<input type="checkbox" name="no-show">
Больше не показывать
</label>
<button id="info-popup-button">Я прочитал и понял прочитанное</button>
</footer>
</div>
</div>
<div id="map" class="map"></div>
<div id="popup" class="ol-popup">
<a href="#" id="popup-closer" class="ol-popup-closer"></a>
<div id="popup-content">
<p id="popup-name"></p>
<a id="popup-address"></a>
<p>График работы: <span id="popup-operation-time">неизвестно</span></p>
<p>
Отсканируйте QR или нажмите на него
<a id="popup-link" href="">
<canvas id="popup-canvas"></canvas>
</a>
</p>
<p>
Пункт Партнёра <span id="popup-pvz-id"></span>
</p>
<p>
<a id="popup-source">Источник</a>
</p>
</div>
</div>
<script type="module" src="/main.js"></script>
</body>
</html>

51
src/info-popup.js Normal file
View File

@@ -0,0 +1,51 @@
import Cookies from "js-cookie";
import { el } from "./utils.js";
const HIDE_INFO_POPUP = "hideInfoPopup";
let infoPopup;
let map;
function getHidePopup() {
const hidePopupCookie = Cookies.get(HIDE_INFO_POPUP);
return hidePopupCookie === 'true';
}
function setHidePopup(hidePopupCookie) {
Cookies.set(HIDE_INFO_POPUP, hidePopupCookie ? "true" : "false", { expires: 400 });
}
export function showPopup() {
infoPopup.style.display = "block";
map.style.display = "none";
const hidePopupCookie = getHidePopup();
if (hidePopupCookie) {
const noShowCheckbox = document.querySelector('input[name="no-show"]');
noShowCheckbox.checked = true;
}
}
export function hidePopup() {
infoPopup.style.display = "none";
map.style.display = "block";
}
document.addEventListener("DOMContentLoaded", function () {
infoPopup = el("info-popup");
const noShowCheckbox = document.querySelector('input[name="no-show"]');
const confirmButton = document.querySelector(".info-popup footer button");
map = el("map");
const hidePopupCookie = getHidePopup();
if (!hidePopupCookie) {
showPopup();
}
confirmButton.addEventListener("click", function () {
setHidePopup(noShowCheckbox.checked);
hidePopup();
});
});

View File

@@ -2,9 +2,11 @@ import "./style.css";
import map from "./map";
import "./info-popup";
import "./popup";
import "./analytics";
import mergedData from "./merged-data.json";
import mergedData from "../merged-data.json";
import { createFeatures } from "./features";
import VectorSource from "ol/source/Vector";
import VectorLayer from "ol/layer/Vector";

63
src/map.js Normal file
View File

@@ -0,0 +1,63 @@
import "ol/ol.css";
import Map from "ol/Map";
import View from "ol/View";
import TileLayer from "ol/layer/Tile";
import { fromLonLat } from "ol/proj";
import { XYZ } from "ol/source";
import { Control, defaults as defaultControls } from "ol/control.js";
// import { createXYZ } from 'ol/tilegrid';
import { showPopup } from "./info-popup.js";
const MAP_TARGET = "map";
const MAP_CENTER = fromLonLat([37.57725139554275, 48.02287702854201]);
const MAP_ZOOM = 8.5;
const customTileSource = new TileLayer({
source: new XYZ({
attributionsCollapsible: false,
attributions: ['&#169; <a href="https://wikimapia.org/">Wikimapia</a>'],
tileUrlFunction: ([z, x, y]) => {
const s = (x % 4) + (y % 4) * 4;
return `https://i${s}.wikimapia.org/?x=${x}&y=${y}&zoom=${z}&type=map&lng=1`;
},
maxZoom: 18,
}),
});
class InfoButton extends Control {
constructor(opt_options) {
const options = opt_options || {};
const button = document.createElement("button");
button.innerHTML = "i";
const element = document.createElement("div");
element.className = "info-button ol-unselectable ol-control";
element.appendChild(button);
super({
element: element,
target: options.target,
});
button.addEventListener("click", this.showInfo.bind(this), false);
}
showInfo() {
showPopup();
}
}
export const view = new View({
center: MAP_CENTER,
zoom: MAP_ZOOM,
});
const map = new Map({
controls: defaultControls().extend([new InfoButton()]),
target: MAP_TARGET,
layers: [customTileSource],
view,
});
export default map;

View File

@@ -4,18 +4,20 @@ import QRCode from "qrcode";
import { el } from "./utils";
import { toLonLat } from "ol/proj";
const container = el("popup");
const popup = el("popup");
const closer = el("popup-closer");
const popupName = el("popup-name");
const popupAddress = el("popup-address");
const popupLink = el("popup-link");
const popupPVZId = el("popup-pvz-id");
const popupCanvas = el("popup-canvas");
const popupSource = el("popup-source");
const popupOperationTime = el("popup-operation-time");
const overlay = new Overlay({
element: container,
element: popup,
autoPan: true,
autoPanAnimation: {
duration: 250,
@@ -41,16 +43,21 @@ function onClick(event) {
const [lon, lat] = toLonLat(coordinates);
const pvzId = feature.get("id");
const link = `https://ozon.ru/point/${pvzId}`;
popupName.textContent = feature.get("name");
popupAddress.textContent = feature.get("address");
popupAddress.href = `https://yandex.ru/maps/?whatshere[point]=${lon},${lat}&whatshere[zoom]=18&l=map`
popupLink.href = feature.get("link");
popupAddress.href = `https://yandex.ru/maps/?whatshere[point]=${lon},${lat}&whatshere[zoom]=18&l=map`;
popupLink.href = link;
popupSource.href = feature.get("source");
popupOperationTime.textContent = feature.get("operationTime") ?? "неизвестно";
popupOperationTime.innerHTML = feature.get("operationTime") ?? "неизвестно";
popupPVZId.innerText = pvzId;
QRCode.toCanvas(popupCanvas, feature.get("link"), function (error) {
QRCode.toCanvas(popupCanvas, link, function (error) {
if (error) console.error(error);
console.log("success!");
});
overlay.setPosition(coordinates);

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -69,5 +69,17 @@ body {
}
#popup-operation-time {
white-space: pre-line
white-space: pre-line;
}
.ol-attribution a:hover {
color: var(--ol-brand-color);
text-decoration: underline;
}
.info-popup-content > p { text-align:justify; }
.info-button {
top: 5em;
left: .5em;
}

View File

@@ -1,13 +1,57 @@
import webfontDownload from 'vite-plugin-webfont-dl';
import { VitePluginRadar } from 'vite-plugin-radar'
import webfontDownload from "vite-plugin-webfont-dl";
import { VitePluginRadar } from "vite-plugin-radar";
import htmlPlugin from "vite-plugin-html-config";
import { viteStaticCopy } from "vite-plugin-static-copy";
const metas = [];
const headScripts = [];
console.log(process.env.YANDEX_METRICA_ID);
if (process.env.YANDEX_VERIFICATION) {
metas.push({
name: "yandex-verification",
content: process.env.YANDEX_VERIFICATION,
});
}
if (process.env.YANDEX_METRICA_ID) {
headScripts.push(`window.YANDEX_METRICA_ID=${process.env.YANDEX_METRICA_ID}`);
}
const PUBLIC_URL =
process.env.PUBLIC_URL || process.env.VERCEL_PROJECT_PRODUCTION_URL;
if (PUBLIC_URL) {
metas.push({
name: "og:url",
content: "https://" + PUBLIC_URL,
});
}
export default {
root: "src",
build: {
outDir: "../dist",
},
plugins: [
webfontDownload(),
VitePluginRadar({
VitePluginRadar({
metrica: {
id: process.env.YANDEX_METRICA_ID
id: process.env.YANDEX_METRICA_ID,
},
})
}),
htmlPlugin({
metas,
headScripts,
}),
viteStaticCopy({
targets: [
{
src: "../merged-data.json",
dest: "",
},
],
}),
],
};
};