REST API v2

6,520 views
Skip to first unread message

siegfried mohr

unread,
Jan 26, 2013, 1:27:06 PM1/26/13
to stalker-m...@googlegroups.com
Может кто знает?
где можно взять Документацию для REST API v2
хочу для Андроид plugin написать.

Aleksey Zhurbitsky

unread,
Jan 28, 2013, 3:51:30 AM1/28/13
to stalker-m...@googlegroups.com

siegfried mohr

unread,
Jan 28, 2013, 9:12:44 PM1/28/13
to stalker-m...@googlegroups.com
Большое спасибо за доку. , но немогу разобратся как правильно делать запросы по HTTP.
Пробую по запросу: http://xxx.xxx.xxx.xxx/stalker_portal/api/api_v2/......  (accounts или settings или tv-channels)
Постоянно получаю одну и ту же информацию. 

array (
  'status' => 'ERROR',
  'results' => NULL,
  'error' => 'Empty resource',
)

blackcatw

unread,
Jan 28, 2013, 10:37:21 PM1/28/13
to stalker-m...@googlegroups.com
Я думаю кроме REST API нужно будет знать как инициировать устройство. Ведь есть ещё проверка по MAC адресу. Если три первых октета не принадлежат 00:1A:79: - то миддлеваре вас не пустит.

воскресенье, 27 января 2013 г., 0:27:06 UTC+6 пользователь siegfried mohr написал:

Aleksey Zhurbitsky

unread,
Jan 29, 2013, 3:42:26 AM1/29/13
to stalker-m...@googlegroups.com
Для начала нужно создать домен вида v2.api.ваш домен.tdl. Ключевыми является "v2.api", по этому вхождению происходит роутинг на API v2.
В принципе можно обращаться и к url http://.../stalker_portal/api/api_v2.php?_resource=..., но данный способ не проверялся.

Перед обращением к API необходимо пройти процедуру авторизации (п 2.1.1 или 2.1.2) или использовать api_key (только для отладки, п 2.1.4), который нужно предварительно добавить в таблицу developer_api_key с привязкой к конкретному пользователю.

Aleksey Zhurbitsky

unread,
Jan 29, 2013, 3:47:09 AM1/29/13
to stalker-m...@googlegroups.com
Аккаунт должен быть уже заведен в базе. Авторизация проходит по логину и паролю.

tos

unread,
Jan 29, 2013, 5:50:44 AM1/29/13
to stalker-m...@googlegroups.com
А защита от повторной авторизации (к примеру несколько устройств с одним логином/паролем) реализована?

вторник, 29 января 2013 г., 10:47:09 UTC+2 пользователь Aleksey Zhurbitsky написал:

Aleksey Zhurbitsky

unread,
Jan 29, 2013, 5:58:47 AM1/29/13
to stalker-m...@googlegroups.com
При повторной авторизации первая сессия обрывается.

orioni

unread,
Sep 5, 2013, 11:23:58 AM9/5/13
to stalker-m...@googlegroups.com
Hi to all 

since the documentation is in russian ( i tried via google translate but cant understand ) can someone show us an example 
how to authorize via API v2 ?

i tried also the developer key but didnt worked for me 

thanks 

Aleksey Zhurbitsky

unread,
Sep 6, 2013, 3:36:43 AM9/6/13
to stalker-m...@googlegroups.com
Here is example (http flow):

POST /stalker_portal/auth/token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded

grant_type
=password&username=<username>&password=<password>

If everything OK you should receive JSON response
Message has been deleted

orioni

unread,
Sep 6, 2013, 9:04:09 AM9/6/13
to stalker-m...@googlegroups.com
thanks , tried but got this 

The requested URL / stalker_portal / auth / token was not found on this server.

T
On Friday, September 6, 2013 9:36:43 AM UTC +2, Aleksey Zhurbitsky wrote:


Here is example (http flow):

POST / stalker_portal / auth / token




If everything OK you should receive JSON response

On Thursday, September 5, 2013 6:23:58 PM UTC +3, orioni wrote:
Hi to all 

since the documentation is in russian (i tried via google translate but cant understand) can someone show us an example 
how to authorize via API v2?

i tried also the developer key but didnt worked for me 

thanks 

On Saturday, January 26, 2013 7:27:06 PM UTC +1, siegfried mohr wrote:
Maybe who knows?
where you can take the documentation for the REST API v2
I want to write a plugin for Android.

Aleksey Zhurbitsky

unread,
Sep 6, 2013, 9:16:13 AM9/6/13
to stalker-m...@googlegroups.com
Looks like you have not installed or properly configured mod_rewrite in apache.
When you open /stalker_portal/auth/token in the browser you should see message "Method not allowed"

orioni

unread,
Sep 6, 2013, 9:25:11 AM9/6/13
to stalker-m...@googlegroups.com
Thanks 
looking at the  error logs  of apache i see this 

[Fri Sep 06 15:24:12 2013] [error] [client 10.10.1.165] Negotiation: discovered file (s) matching request: / var / www / stalker_portal / auth / token (None could be negotiated).


On Friday, September 6, 2013 3:16:13 PM UTC +2, Aleksey Zhurbitsky wrote:
Looks like you have not installed or Properly Configured mod_rewrite in Apache.
When you Open / stalker_portal / auth / token in the Browser you Should See message " Method not allowed " On Friday, September 6, 2013 4:04:09 PM UTC +3 , orioni wrote:


thanks, tried but got this 

orioni

unread,
Sep 6, 2013, 9:29:37 AM9/6/13
to stalker-m...@googlegroups.com
... and this is the .htaccess content  

Options + MultiViews + FollowSymLinks 

Aleksey Zhurbitsky

unread,
Sep 6, 2013, 9:30:25 AM9/6/13
to stalker-m...@googlegroups.com
Try to disable mod_negotiation
a2dismod mod_negotiation

orioni

unread,
Sep 6, 2013, 9:35:36 AM9/6/13
to stalker-m...@googlegroups.com
ERROR: Module mod_negotiation does not exist!

orioni

unread,
Sep 6, 2013, 9:36:35 AM9/6/13
to stalker-m...@googlegroups.com
but if i go to this URL


i get the Method not allowed

Aleksey Zhurbitsky

unread,
Sep 6, 2013, 9:39:33 AM9/6/13
to stalker-m...@googlegroups.com
You can use it for authorization, but without working mod_rewrite API v2 wouldn't work.

Aleksey Zhurbitsky

unread,
Sep 6, 2013, 9:44:37 AM9/6/13
to Stalker Middleware on behalf of orioni
Ok, seems you need to google the solution
because i don't know what it means


--
Вы получили это сообщение, поскольку подписаны на группу Stalker Middleware.
 
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес stalker-middlew...@googlegroups.com.
Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу stalker-m...@googlegroups.com.
Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msgid/stalker-middleware/a0cecb05-ad3a-4489-9d9e-c3e95545078a%40googlegroups.com.

Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.

orioni

unread,
Sep 6, 2013, 9:45:19 AM9/6/13
to stalker-m...@googlegroups.com
strange cause i havent changed the .htacess and the mod_rewrite seems to be enabled and working for other requests 

i.e if i go to 

i get the JSON response with users 

{"status":"OK","results":{"login":"o","full_name":"oo","phone":"","account_number":"124","tariff_plan":"1","stb_sn":"","stb_mac":"","stb_type":"","status":1,"online":"0","ip":"","version":"","comment":"","subscribed":[],"subscribed_id":[]}}

On Friday, September 6, 2013 3:39:33 PM UTC +2, Aleksey Zhurbitsky wrote:
You can use IT for authorization, but Without working mod_rewrite API v2 would not work. On Friday, September 6, 2013 4:36:35 PM UTC +3, orioni wrote:

I Get the  Method not allowed

Aleksey Zhurbitsky

unread,
Sep 6, 2013, 9:49:57 AM9/6/13
to stalker-m...@googlegroups.com
This is different API - API v1.
For API v2 you need to configure apache virtial host with name v2.api (e.g. v2.api.example.com) and DocumentRoot /var/www/stalker_portal/api

orioni

unread,
Sep 6, 2013, 9:54:08 AM9/6/13
to stalker-m...@googlegroups.com
using the auth / token.php directly i get this 
and the files on the test/rest_api   i get the token but it says "invalid length" 

{"token_type":"bearer","access_token":"5.5c98c3e0b4795406cb0fd88ac44be1ca","refresh_token":"b1d674570401a19cd29ccd9c5fefc0a3","user_id":5,"expires_in":86400}


but using the informir URL it gives the correct access_token lenght
{"token_type":"bearer","access_token":"1557.f9bc72ce36f32d338474a7675b88ce41","refresh_token":"24b4ced67a0e480e5ca44eb515c5658b","user_id":1557,"expires_in":86400}

On Friday, September 6, 2013 3:45:19 PM UTC +2, orioni wrote:
strange cause i havent changed the. htacess and the mod_rewrite seems to be enabled and working for other requests 

ie if i go to 

i get the JSON response with users 

{"status":"OK","results":{"login":"o","full_name":"oo","phone":"","account_number":"124","tariff_plan":"1","stb_sn":"","stb_mac":"","stb_type":"","status":1,"online":"0","ip":"","version":"","comment":"","subscribed":[],"subscribed_id":[]}}

On Friday, September 6, 2013 3:39:33 PM UTC +2, Aleksey Zhurbitsky wrote:

Aleksey Zhurbitsky

unread,
Sep 6, 2013, 10:02:46 AM9/6/13
to stalker-m...@googlegroups.com
What do you mean by "invalid length"?
Both responses are correct.

orioni

unread,
Sep 6, 2013, 10:08:05 AM9/6/13
to stalker-m...@googlegroups.com
its from this 

 $ Dd = strlen ($ obj-> access_token);
                if ($ dd == 37) {
                    $ Html. = "<b Style='color:green;'> Ok </ b>";
                    $ Done_test + +;
                }
                else {
                    $ Html. = "<b Style='color:red;'> Invalid length. </ B>";     <------------------------------------------------
                    $ Fail_test + +;
                }



What do you mean by "invalid length"?
Responses are both correct. On Friday, September 6, 2013 4:54:08 PM UTC +3, orioni wrote:

using the  auth / token.php  Directly I Get this 
and the Files on the test / rest_api I Get the token but IT says "Invalid length" 


{"token_type":"bearer","access_token":"5.5c98c3e0b4795406cb0fd88ac44be1ca","refresh_token":"b1d674570401a19cd29ccd9c5fefc0a3","user_id":5,"expires_in":86400}


but using the informir URL it gives the correct access_token lenght

Aleksey Zhurbitsky

unread,
Sep 6, 2013, 10:10:38 AM9/6/13
to stalker-m...@googlegroups.com
I do not know what it is.

orioni

unread,
Sep 6, 2013, 10:14:23 AM9/6/13
to stalker-m...@googlegroups.com
its on the index.php file on 
/stalker_portal/test/rest_api/index.php 

On Friday, September 6, 2013 4:10:38 PM UTC +2, Aleksey Zhurbitsky wrote:
I do not know What is IT. On Friday, September 6, 2013 5:08:05 PM UTC +3, orioni wrote:

its from this 

 $ Dd = strlen ($ obj-> access_token);
                if ($ dd == 37) {
                    $ Html. = "<b Style='color:green;'> Ok </ b>";
                    $ Done_test + +;
                }
                else {
                    $ Html. = "<b Style='color:red;'> Invalid length. </ B>"; <--------------------------- - -------------------
                    $ Fail_test + +;
                }



What do you mean by "invalid length"?
Responses are both correct. On Friday, September 6, 2013 4:54:08 PM UTC +3, orioni wrote:

using the  auth / token.php  Directly I Get this 
and the Files on the test / rest_api I Get the token but IT says "Invalid length" 

{"token_type":"bearer","access_token":"5.5c98c3e0b4795406cb0fd88ac44be1ca","refresh_token":"b1d674570401a19cd29ccd9c5fefc0a3","user_id":5,"expires_in":86400}


but using the informir URL it gives the correct access_token lenght


Friday, September 6, 2013 3:45:19 PM UTC +2, orioni wrote:
strange Cause I havent changed the. htacess and the mod_rewrite Seems to be enabled and working for Other requests 

Aleksey Zhurbitsky

unread,
Sep 6, 2013, 10:16:04 AM9/6/13
to stalker-m...@googlegroups.com
This is old not used code.

orioni

unread,
Sep 6, 2013, 10:34:24 AM9/6/13
to stalker-m...@googlegroups.com
i added the virtual host on apache  with a config file like this 


added the hostname to the /etc/hosts 

so when i ping v2.api.stalker.com  it shows the IP of the server where stalker is installed 

now doing test i get 

PHP Warning: file_get_contents (http://v2.api.stalker.com/token/): failed to open stream: HTTP request failed! HTTP/1.1 406 Not Acceptable



On Friday, September 6, 2013 4:16:04 PM UTC +2, Aleksey Zhurbitsky wrote:


This is old code not used. On Friday, September 6, 2013 5:14:23 PM UTC +3, orioni wrote:

its on the index.php file on 
/ Stalker_portal / test / rest_api / index.php 


On Friday, September 6, 2013 4:10:38 PM UTC +2, Aleksey Zhurbitsky wrote:
I do not know What is IT. On Friday, September 6, 2013 5:08:05 PM UTC +3, orioni wrote:

its from this 

 $ Dd = strlen ($ obj-> access_token);
                if ($ dd == 37) {
                    $ Html. = "<b Style='color:green;'> Ok </ b>";
                    $ Done_test + +;
                }
                else {
                    $ Html. = "Invalid length <b Style='color:red;'>. </ B>"; <------------------------ ---- -------------------
                    $ Fail_test + +;
                }

Aleksey Zhurbitsky

unread,
Sep 6, 2013, 10:42:45 AM9/6/13
to stalker-m...@googlegroups.com
You really shouldn't use this test. It is only for the developing purpose.
Also auth URL http://v2.api.stalker.com/token/ is wrong. It shouldn't be on the v2.api host.
Auth URL can be the same /stalker_portal/auth/token

orioni

unread,
Sep 6, 2013, 10:43:10 AM9/6/13
to stalker-m...@googlegroups.com
opening http://v2.api.stalker.com/token/  via browser i get 

array (
 
'status' => 'ERROR',
 
'results' => NULL,
 
'error' => 'Authorization required',
)

orioni

unread,
Sep 6, 2013, 12:38:01 PM9/6/13
to stalker-m...@googlegroups.com
all i`m trying to do is to get a list of channels that a specific user can view( has permissions...are assigned to his account)  via php



All
On Friday, September 6, 2013 4:43:10 PM UTC +2, orioni wrote:try


Opening  http://v2.api.stalker. COM / token /   Via Browser I Get 

array ( 
 
'status' => 'ERROR' ,
 
'results' => NULL ,
 
'error' => 'Authorization required' ,
)





On Friday, September 6, 2013 4:34:24 PM UTC +2, orioni wrote:
i added the virtual host on apache with a config file like this 


added the hostname to the / etc / hosts 

so When I Ping  v2.api.stalker.com  IT Shows the IP of the Server where STALKER is installed 

now doing test i get 

PHP Warning: file_get_contents ( http://v2.api.stalker.com/ token / ): failed to Open Stream: HTTP Request failed! HTTP/1.1 406 Not Acceptable



On Friday, September 6, 2013 4:16:04 PM UTC +2, Aleksey Zhurbitsky wrote:


Aleksey Zhurbitsky

unread,
Sep 6, 2013, 1:31:13 PM9/6/13
to stalker-m...@googlegroups.com
1) Get access_token and user_id from the auth URL (2.1.2  from the REST API v2 doc) /stalker_porta/auth/token
POST /stalker_portal/auth/token HTTP/1.1

Content-Type: application/x-www-form-urlencoded

grant_type
=password&username=<username>&password=<password>


2) Get channels list for this user (3.2 from the REST API v2 doc)
GET /users/<user_id>/tv-channels
Accept: application/
json
Authorization: Bearer <access_token>

tos

unread,
Nov 4, 2013, 4:17:16 AM11/4/13
to stalker-m...@googlegroups.com
Дошли тут руки, чтобы разобраться с avi v.2
Есть вопросы.
1. Какой правильный URL надо указывать для доступа к api?
Сделал виртуалхост вида v2.api.domain.tld, у которого DocumentRoot вида
/home/www/domain.tld/stalker_portal/api

С такими настройками не работает авторизация
 curl -X POST "http://v2.api.domain.tld/auth/token" -d "grant_type=password&username=test&password=test"
<pre>array (
  'status' => 'ERROR',
  'results' => NULL,
  'error' => 'Not acceptable type',
)</pre>

Если ставлю DocumentRoot
/home/www/domain.tld/stalker_portal
Авторизация срабатывает, я получаю токен и дальше могу получать ресурсы, но в URL ресурса, мне тогда надо указывать /api, что не совсем красиво

curl -i -X GET -H "Accept: application/json" -H "Authorization: Bearer 540.49a7328a6509bb1c929ae4229af186f5" "http://v2.api.domain.tld/api/tv-channels"

ЧЯДНТ?

2. Можно ли через api менять пользователю дополнительные параметры, например, сервер вещания?
3. Запрос на авторизацию и получение токена выполняется сравнительно долго - чуть больше секунды, при том, что получение, к примеру, списка каналов - раз в десять меньше.
Запрос выполняется на том же сервере, где живёт сталкер. Нагрузка на сервер небольшая - порядка 20 пользователей онлайн. В чём может быть причина такого долгого ответа?


вторник, 29 января 2013 г., 10:42:26 UTC+2 пользователь Aleksey Zhurbitsky написал:
Для начала нужно создать домен вида v2.api.ваш домен.tdl. Ключевыми является "v2.api", по этому вхождению происходит роутинг на API v2.
В принципе можно обращаться и к url http://.../stalker_portal/api/api_v2.php?_resource=..., но данный способ не проверялся.

Перед обращением к API необходимо пройти процедуру авторизации (п 2.1.1 или 2.1.2) или использовать api_key (только для отладки, п 2.1.4), который нужно предварительно добавить в таблицу developer_api_key с привязкой к конкретному пользователю.

On Tuesday, January 29, 2013 4:12:44 AM UTC+2, siegfried mohr wrote:
Большое спасибо за доку. , но немогу разобратся как правильно делать запросы по HTTP.
Пробую по запросу: http://xxx.xxx.xxx.xxx/stalker_portal/api/api_v2/......  (accounts или settings или tv-channels)
Постоянно получаю одну и ту же информацию. 

array (
  'status' => 'ERROR',
  'results' => NULL,
  'error' => 'Empty resource',
)

Am Montag, 28. Januar 2013 09:51:30 UTC+1 schrieb Aleksey Zhurbitsky:
https://docs.google.com/document/d/1Q9aK62XSGEcvYMzlcJ2cIppZhwy824JuCtCfkiIJQu4/edit

Aleksey Zhurbitsky

unread,
Nov 4, 2013, 10:09:36 AM11/4/13
to stalker-m...@googlegroups.com
1. Какой правильный URL надо указывать для доступа к api?
Для API достаточно виртуального хоста к /home/www/domain.tld/stalker_portal/api

Авторизация работает отдельно, поэтому можно либо использовать прямой url
либо отдельный хост для авторизации http://auth.domain.tld/token (/home/www/domain.tld/stalker_portal/auth)

2. Можно ли через api менять пользователю дополнительные параметры, например, сервер вещания?
Не совсем понял вопрос. Список каналов загружается сразу и url в нем открытые, либо в случае лоад балансинга или временных ссылок - непосредственно перед каждым проигрыванием необходимо запрашивать ссылку на канал. Ссылка в этом случае формируется динамически.

3. Запрос на авторизацию и получение токена выполняется сравнительно долго - чуть больше секунды
Это простая защита от брутфорса, 1с пауза при авторизации. 

Андрей Новиков

unread,
Nov 19, 2013, 8:45:28 AM11/19/13
to stalker-m...@googlegroups.com


понедельник, 4 ноября 2013 г., 19:09:36 UTC+4 пользователь Aleksey Zhurbitsky написал:
я что-то не понимаю. авторизация проходит.
curl -X POST http://stalker_server/stalker_portal/auth/token -d "grant_type=password&username=test&password=test"

{"token_type":"bearer","access_token":"352.b308a724cdfdf65dd398caf3ffe8588c","refresh_token":"614120208bcd7b04c19f50a7384b145b","user_id":352,"expires_in":86400}

 а вот дальше как-то беда

curl -i -X GET -H "Accept: application/json" -H "Authorization: Bearer 352.b308a724cdfdf65dd398caf3ffe8588c" "http://stalker_server/stalker_portal/api/api_v2/tv-channels"

HTTP/1.1 401 Unauthorized
Server: nginx
Date: Tue, 19 Nov 2013 13:45:34 GMT
Content-Type: application/json
Content-Length: 66
Connection: keep-alive
X-Powered-By: PHP/5.3.3
WWW-Authenticate: Basic realm="Stalker API"

{"status":"ERROR","results":"","error":"401 Unauthorized request"}

tos

unread,
Nov 19, 2013, 9:05:51 AM11/19/13
to stalker-m...@googlegroups.com
В доке рекомендуют сделать отдельный хост для api v2, тогда запрос будет такой
curl -i -X GET -H "Accept: application/json" -H "Authorization: Bearer 540.49a7328a6509bb1c929ae4229af186f5" "http://v2.api.domain.tld/api/tv-channels"



вторник, 19 ноября 2013 г., 15:45:28 UTC+2 пользователь Андрей Новиков написал:

Aleksey Zhurbitsky

unread,
Nov 20, 2013, 5:03:37 AM11/20/13
to stalker-m...@googlegroups.com
Скорее всего проблема именно в хосте, нужен виртуальный хост начинающийся с v2.api

Lemon

unread,
Mar 17, 2014, 2:32:36 AM3/17/14
to stalker-m...@googlegroups.com
Когда выставляю в ссылке на канал значение WiFi или Ethernet параметру фильтр, канал исчезает из списка метода TV-CHANNELS. Что я не так делаю? Желательно, чтобы выдавалась "wifi-ссылка".

Aleksey Zhurbitsky

unread,
Mar 17, 2014, 7:59:01 AM3/17/14
to stalker-m...@googlegroups.com
Фильтр работает по заголовку User-Agent. Если в этом заголовке встречается WiFi, то фильтр сработает. Другими словами в зависимости от подключения в заголовок User-Agent при обращении к API нужно добавлять текст WiFi или Ethernet.

Marcos Amador Bonilla

unread,
Nov 3, 2014, 6:42:56 AM11/3/14
to stalker-m...@googlegroups.com
Hi I want to design new API 2 I want to know if there is a gift ludar there an example of how you can design

Alexei Vorobey

unread,
Oct 13, 2015, 2:49:43 PM10/13/15
to Stalker Middleware
Just add the following header:

Accept: application/json

Ferdi Akhan

unread,
May 19, 2016, 11:35:00 AM5/19/16
to Stalker Middleware
Hi everbody,i have a problem if i want to use api_v2 i take an error " Unsupported authentication type ", maybe can anybody help me ? thanks to much

Mekhti Mamedov

unread,
Jul 2, 2018, 2:35:24 PM7/2/18
to Stalker Middleware
Здраствуйте Олексий,

Мне тоже нужна эта документация. Расшарте пожалуйста и для меня. Спасибо заранее.



понедельник, 28 января 2013 г., 11:51:30 UTC+3 пользователь Oleksii Zhurbytskyi написал:
https://docs.google.com/document/d/1Q9aK62XSGEcvYMzlcJ2cIppZhwy824JuCtCfkiIJQu4/edit

On Saturday, January 26, 2013 8:27:06 PM UTC+2, siegfried mohr wrote:
Может кто знает?
где можно взять Документацию для REST API v2
хочу для Андроид plugin написать.
Image already added

Андрей Резников

unread,
Jul 2, 2018, 2:36:42 PM7/2/18
to Stalker Middleware
--
Вы получили это сообщение, поскольку подписаны на группу "Stalker Middleware".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес stalker-middlew...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес stalker-m...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/stalker-middleware/8935b7e7-a854-4f6a-9a8a-d0e9b0fa5ae2%40googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
Message has been deleted
Message has been deleted
0 new messages