Visavi клиент для Android
1.
ramzes 15.03.2026 / 14:44
Делал чисто ради интереса, и наглядного примера возможностей нейросетей в кодинге
Для авторизации нужен API ключ который можно взять тут на сайте в самом низу страницы
https://visavi.net/accounts Ваш API-токен (создать, скопировать, вставить в приложение)
Из возможностей:
Просмотр профилей пользователей (нет списка всех пользователей ввиду отсутствия реальной необходимости) например в форуме или привате.
Чтение и отправка личных сообщений, уведомления о новых сообщениях (андроид стал особенно жестко гнобить фоновые сервисы, могут быть затыки, но вроде не должно быть)
Чтение Форума, Разделы, подразделы, темы, сообщения.
Доступа у приложения ни куда нет и не просит, можете не переживать, обращается к апи
https://visavi.net/api , хранит в своей системной папке настройки и аватары, и все.
Интерфейс сыроват, по мере появления свободного времени и желания буду подравнивать
______________________________
Обновление: v 0.8.4
Исправил дублирование фонового сервиса проверки сообщений,
Исправил краш из-за парсинга неправильной последовательности тегов типа: [сode][quоte]123[/сode][/quоte]
Изменил способ передачи токена теперь в GET запросе не будет ключа, более безопасно в плане перехвата запроса.
Немного дизайн подправил
_____________
Обновление: v 0.8.5
Добавил отметки о прочтении в диалогах,
указания входящее или исходящее последнее сообщение,
Подсветку своих сообщений в переписке и в темах форума (Ник красным цветом)
Подсветка ссылок и жирного текста,
Сменил иконку в уведомлениях на аналогичную иконке самого приложения
Убрал поле ввода ответа для диалогов в которых нельзя ответить (Система или блок типа ЧС)
Добавил принудительное обновление списка диалогов даже при открытии из "кэша" (кнопки назад) если последнее обновление было более 30 сек назад
2.
Gray Wolf 15.03.2026 / 15:08
Приложение чисто для просмотра visavi? Или для своего сайта на движке ротор тоже можно юзать?
3.
ramzes 15.03.2026 / 15:12
ну вообще для visavi но фактически можно под любой ротор с тем же апи заточить,
/**
* API сервис Visavi.net
* RotorCMS v12.7.0
*/
interface VisaviApiService {
/** Данные текущего пользователя */
@GET("api/user")
suspend fun getUser(@Query("token") token: String): Response<ApiData>
/** Данные пользователя по логину */
@GET("api/users/{login}")
suspend fun getUserByLogin(
@Path("login") login: String,
@Query("token") token: String
): Response<ApiData>
/** Диалоги с пользователями */
@GET("api/dialogues")
suspend fun getDialogues(
@Query("token") token: String,
@Query("page") page: Int = 1,
@Query("per_page") perPage: Int = 50
): Response<DialoguesData>
/** Приватные письма пользователя */
@GET("api/talk/{login}")
suspend fun getTalk(
@Path("login") login: String,
@Query("token") token: String,
@Query("page") page: Int = 1,
@Query("per_page") perPage: Int = 50
): Response<MessagesData>
/** Отправка сообщения */
@POST("api/messages/send")
suspend fun sendMessage(
@Body request: SendMessageRequest,
@Query("token") token: String
): Response<SendMessageResponse>
/** Проверка новых сообщений */
@GET("api/messages/new")
suspend fun getNewMessages(
@Query("token") token: String
): Response<NewMessagesResponse>
/** Список корневых разделов форума */
@GET("api/forums")
suspend fun getForumSections(
@Query("token") token: String
): Response<ForumSectionsData>
/** Раздел форума с темами (если раздел имеет подразделы, они возвращаются в children) */
@GET("api/forums/{id}")
suspend fun getForumSection(
@Path("id") sectionId: Int,
@Query("token") token: String,
@Query("page") page: Int = 1,
@Query("per_page") perPage: Int = 50
): Response<ForumTopicsData>
/** Список сообщений темы форума */
@GET("api/topics/{id}")
suspend fun getTopicPosts(
@Path("id") topicId: Int,
@Query("token") token: String,
@Query("page") page: Int = 1,
@Query("per_page") perPage: Int = 50,
@Query("order") order: String = "desc"
): Response<ForumPostsData>
}
/**
* Singleton для доступа к API
*/
object VisaviApi {
private const val BASE_URL = "https://visavi.net/"
val instance: VisaviApiService by lazy {
val logging = HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
}
val client = OkHttpClient.Builder()
.addInterceptor(logging)
.build()
Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(VisaviApiService::class.java)
}
}
4.
ramzes 19.03.2026 / 21:38
Приложение создает отдельный сервис проверки сообщений, так что даже если оно закрыто (кроме принудительного закрытия из окна информации о программе) уведомления о новых сообщениях будут приходить исправно
URL:
https://visavi.net/topics/44999