• Telegram Bot на Powershell вылетает с ошибкой Bad Request: message to edit not found. Почему?

    @trlhrn Автор вопроса
    MaxKozlov, как только уже ни пробовал. В примере ниже на текст B уходит сообщение от бота с верным first_name пользователя. Все ОК вроде бы. При нажатии на кнопку на клавиатуре, код пользователя в первый раз называет корректно по никнейму, а затем, один из пользователей отваливается - то есть при нажатии кнопки, сообщения летят другому пользователю.

    $URL_get = "https://api.telegram.org/bot$token/getUpdates"
    $URL_set = "https://api.telegram.org/bot$token/sendMessage"
    $token = "TOKEN"
    
    # timeout sec
    $timeout = 1
    
    function getUpdates($URL) {
        $json = Invoke-RestMethod -Uri $URL
        $data = $json.result | Select-Object -Last 1
    
        #Make variable nulliable
        $text = $null
        $callback_data = $null
        $chat_id = $null
    
    
        # Нажатие на кнопку
        if ($data.callback_query) {  
            $callback_data = $data.callback_query.data
            $chat_id = $data.callback_query.chat.id
            $f_name = $data.callback_query.from.first_name
            $l_name = $data.callback_query.from.last_name
            $username = $data.callback_query.chat.username
        }
        # Обычное сообщение
        elseif ($data.message) {
            $chat_id = $data.message.chat.id
            $text = $data.message.text
            $f_name = $data.message.chat.first_name
            $l_name = $data.message.chat.last_name
            $type = $data.message.chat.type
            $username = $data.message.chat.username
    
        }
    
        $ht = @{}
        $ht["chat_id"] = $chat_id
        $ht["text"] = $text
        $ht["f_name"] = $f_name
        $ht["l_name"] = $l_name
        $ht["username"] = $username
        $ht["callback_data"] = $callback_data
        # confirm
        Invoke-RestMethod "$($URL)?offset=$($($data.update_id)+1)" -Method Get | Out-Null
        
        return $ht
    }
    
    
    function sendMessage($URL, $chat_id, $text) {
    
        #Create a Hash Table
        $ht = @{
            text       = $text
            parse_mode = "Markdown"
            chat_id    = $chat_id
        }
        #Convert data to JSON
        $json = $ht | ConvertTo-Json
    
        Invoke-RestMethod $URL -Method Post -ContentType 'application/json; charset=utf-8' -Body $json | Out-Null   
    
    }
    
    function sendMessagePr($URL, $chat_id, $text) {
    
        #Create a Hash Table
        $ht = @{
            text       = $text
            parse_mode = "HTML"
            chat_id    = $chat_id
        }
        #Convert data to JSON
        $json = $ht | ConvertTo-Json
    
        Invoke-RestMethod $URL -Method Post -ContentType 'application/json; charset=utf-8' -Body $json | Out-Null   
    
    }
    
    #Buttons (MAIN)
    ###############
    $buttonsmain = @()
    $button0 = @{ "text" = "Text1"; callback_data = "Data1" }
    $button1 = @{ "text" = "Text2"; callback_data = "Data2" }
    $button2 = @{ "text" = "Website"; "url" = 'https://google.com/' }
    $button3 = @{ "text" = "Text3"; callback_data = "Data3" }
    
    $rowmain1 = @($button0, $button1)
    $rowmain2 = @($button3, $button2)
    
    $buttons = ($rowmain1, $rowmain2)
    #$buttons = ($button0, $button1, $button2, $button3)
    
    $buttonsmain = @{"inline_keyboard" = $buttons } | ConvertTo-Json -Depth 10
    
    while ($true) { # вечный цикл
        # вызываем функцию
        $returns = @()
        $returns = getUpdates $URL_get
        foreach ($return in $returns) {
    
        If ($return.text -eq "B") {
            $textt = "Hello, *$($return["f_name"])*! Please, choose the option you need:"
            $chat_id = $return.chat_id
            $chat_id
            $username = $return.username
            $keybrd = sendKeyboardMain $URL_set $buttonsmain $chat_id $textt
            }
    
            ElseIf ($return.callback_data -eq "Data2") {
    
            $text = "Please, $username choose the option you need:"
                    $keybrd = sendKeyboardMain $URL_set $buttonsmain $chat_id $text
    
                    }
        
        #Else {}
        Start-Sleep -s $timeout    
    }
    }
    Написано
  • Telegram Bot на Powershell вылетает с ошибкой Bad Request: message to edit not found. Почему?

    @trlhrn Автор вопроса
    MaxKozlov, спасибо за комментарии. А как Вы определили, что принимается только одно сообщение за раз? Касательно ещё одного get updates. Он действительно есть. Попробую его убрать.
    Написано
  • Telegram Bot на Powershell вылетает с ошибкой Bad Request: message to edit not found. Почему?

    @trlhrn Автор вопроса
    MaxKozlov, ниже часть моего кода. Я конечно подозревал, что все это не очень хорошо выглядит и где-то выбран не верный подход для работы с переменными. Остальная часть в работе с кнопками в общем и целом аналогична этой.
    while ($true) {
    
        $return = getUpdates $URL_get
    
        #If the MSG is in default text
        if ($return.text) {
    
            #write-host "$($return["chat_id"])"
            #Write-Host "$($return["msg_id"])"
            switch -Wildcard ($return["text"]) {
                "*" {
                    $text = "Hello, *$($return["f_name"])*! Please, choose the option you need:"
                    $chat_id = $return.chat_id
                    $keybrd = sendKeyboardMain $URL_set $buttons $chat_id $text
                    
                    #Get MSG ID from MAIN keybrd
                    $last_bot_msg = $keybrd.result.message_id
                }
    
            }  
    
        }
           
        #If button has been pressed
        elseif ($return.callback_data) {
    
            #If GET REPORT button pressed
            If ($return.callback_data -eq "SQLPredReport") {
    
                #Check if user has access (subscription)
                $useraccessbtns = UserAccessToButtons
    
                If ($useraccessbtns -eq $true) {
               
                    $keybrd = Invoke-RestMethod -Uri "https://api.telegram.org/bot$($token)/editMessageText?chat_id=$($return.chat_id)&message_id=$($last_bot_msg)&text=Choose period:&reply_markup=$buttonreport" -ContentType "application/json; charset=utf-8"
                    $last_bot_msg = $keybrd.result.message_id
    
                    #Loop until Back button will be pressed
                    Do {
    
                        $return = getUpdates $URL_get
    
                        #If TODAY btn pressed
                        If ($return.callback_data -eq "reptoday") {
    
                            $reportdate = (Get-Date).ToString('yyyy-MM-dd')
    
                            #Run SQL Report (TODAY) function
                            $SQLReport = GetReportTodayYesterday
                            sendMessage $URL_set $($return.chat_id) $SQLReport
    
                            #Delete previous MSG with keyboard
                            Invoke-RestMethod -Uri "https://api.telegram.org/bot$($token)/deleteMessage?chat_id=$($return.chat_id)&message_id=$($last_bot_msg)"
    
                            #Send Report keybrd again
                            $text = "Choose period:"
                            $keybrd = sendKeyboardReport $URL_set $buttonreport $chat_id $text
                            $last_bot_msg = $keybrd.result.message_id
    
                        }
    Написано
  • Telegram Bot на Powershell вылетает с ошибкой Bad Request: message to edit not found. Почему?

    @trlhrn Автор вопроса
    MaxKozlov, подскажите, что имеется в виду под глобальными переменными?
    Написано
  • Как добавить кнопку Inline Keyboard в Телеграм вторым рядом, используя PowerShell?

    @trlhrn Автор вопроса
    MaxKozlov, большое спасибо. Чуть поправил код, основываясь на Вашем. Сейчас все ок!
    Написано
  • Как добавить кнопку Inline Keyboard в Телеграм вторым рядом, используя PowerShell?

    @trlhrn Автор вопроса
    Попробовал такой вариант. Ошибка: InlineKeyboardButton must be an Object
    Написано
  • Как разграничить права доступа к файлам при использовании IIS?

    @trlhrn Автор вопроса
    NewDevLab, спасибо. Сделал этим методом "- корневое приложение - это редиректор на asp.net core,
    - виртуальное приложение - в папке users, например, где корень приложения - папка с файлами. и оно безо всякого asp, только статика и NTLM аутентификация.
    "
    Похоже, что все ОК теперь.
  • Как разграничить права доступа к файлам при использовании IIS?

    @trlhrn Автор вопроса
    NewDevLab, похоже что да, так работает как нужно с NTFS правами. ASP.net был сделан для того, чтобы при входе на сайт пользователя сразу редиректило на аллоцированный ему файл по username. Т.е. юзер идут на https://qwe.site.com и его по его логину редиректит на нужный файл. Можно это сделать без ASP.net?
  • Как разграничить права доступа к файлам при использовании IIS?

    @trlhrn Автор вопроса
    NewDevLab, считаете, что мне нужно отказаться от asp.net и пойти каким-то другим путем?
  • Как разграничить права доступа к файлам при использовании IIS?

    @trlhrn Автор вопроса
    NewDevLab, Visual Studio по Context.User.Identity.AuthenticationType возвращает negotiate
  • Как разграничить права доступа к файлам при использовании IIS?

    @trlhrn Автор вопроса
    NewDevLab, вот так это выглядит у меня. Сайт на asp.net core. Это просто startup.cs, который при входе в IIS перерасывает залогиненного пользователя сразу на нужный html файл по username.
    60bf08e97e485059567236.jpeg

    60bf094757160771829672.jpeg

    На папке с файлами есть права на группу Users. Также они унаследованы файлами. Если я уберу из доступа эту группу, и добавлю нужного пользователя на файл - доступ нет ни у кого, в том числе и у нужного юзера.

    Может мне что-то где-то нужно донастроить в IIS?
  • Как разграничить права доступа к файлам при использовании IIS?

    @trlhrn Автор вопроса
    NewDevLab, Windows Auth включена. Папка с файлами, к которым я хочу ограничтьть доступ per-user лежит сразу в корне сайта, не в wwwroot. Возможно мне нужно ее переложить в другое место?
  • Скрыть всю часть пути в адресной строке, кроме домена\сайта?

    @trlhrn Автор вопроса
    Lord_Dantes, неужели никак нельзя скрыть это?)
  • Как разграничить права доступа к файлам при использовании IIS?

    @trlhrn Автор вопроса
    Подскажите на что\куда смотреть в оснастке IIS?