Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2013, 16:19   #1
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию Steam, OpenID и file_get_contents()

Имеется следующий кусок кода
PHP код:
<? 
      
include "apikey.php" ;
      include  
"openid.php" ;
      
$OpenID = new LightOpenID("localhost");
 
    
session_start();
 
    if(!
$OpenID->mode){
 
        if(isset(
$_GET['login'])){
            
$OpenID->identity "http://steamcommunity.com/openid";
            
header("Location: {$OpenID->authUrl()}");
        }
 
        if(!isset(
$_SESSION['T2SteamAuth'])){
            
$login "<div id=\"login\">Welcome Guest. Please <a href=\"?login\"><img src=\"http://cdn.steamcommunity.com/public/images/signinthroughsteam/sits_small.png\"/></a> to *Website Action*.</div>";
        }
            
    }elseif(
$OpenID->mode == "cancel"){
        echo 
"User has canceled Authenticiation.";
    } else {

        if(!isset(
$_SESSION['T2SteamAuth'])){
 
            
$_SESSION['T2SteamAuth'] = $OpenID->validate() ? $OpenID->identity null;
            
$_SESSION['T2SteamID64'] = str_replace("http://steamcommunity.com/openid/id/"""$_SESSION['T2SteamAuth']);
            if(
$_SESSION['T2SteamAuth'] !== null){
 
            }
            
$Steam64 str_replace("http://steamcommunity.com/openid/id/"""$_SESSION['T2SteamAuth']);
            
$profile file_get_contents("https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key={$api}&steamids={$Steam64}");
            
$steam = (array)json_decode($profile);
                
print_r($steam);
            
#header("Location: index.php");
 
        
}
 
    }
 
    if(isset(
$_SESSION['T2SteamAuth'])){
 
        
$login  "<div id=\"login\"><a href=\"?logout\">Logout</a></div>";
 
    }
 
    if(isset(
$_GET['logout'])){
 
        unset(
$_SESSION['T2SteamAuth']);
        unset(
$_SESSION['T2SteamID64']);
        
header("Location: index.php");
 
    }
 
    
    
$profile file_get_contents("https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key={$api}&steamids={$_SESSION['T2SteamID64']}");
    
$steam = (array)json_decode($profile);
    
print_r($steam);
 
    echo 
$login;
 
    
?>
Поясню строчки
PHP код:
$profile file_get_contents("https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key={$api}&steamids={$_SESSION['T2SteamID64']}");
    
$steam = (array)json_decode($profile);
    
print_r($steam); 
В переменную $profile должен загружаться профиль Steam $_SESSION['T2SteamID64'] (или $Steam64 что идентично) в формате JSON. Код одинаковый и встречается в листинге 2 раза. Первый раз в случае успешной аутентификации в Steam, второй каждый раз при вызове скрипта (т.е. например если пройти аутентификацию и обновить страничку, то вызывается только воторой). Код абсолютно одинаковый, однако file_get_contents возвращает профиль только во втором случае. В первом он возвращает следующее:
Код HTML:
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>Not Found</h1>
</body>
</html>
Итак, вопрос: кто нибудь может объяснить почему так происходит, и как мне получить профиль сразу после аутентификации?
ICQ: 5311314
[SIGPIC][/SIGPIC]

Последний раз редактировалось AVer; 17.07.2013 в 17:00.
AVer вне форума Ответить с цитированием
Старый 17.07.2013, 17:02   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

В обе строки запроса точно подставляются совершенно одинаковые данные? (я не имею ввиду идентичность кода – именно идентичность данных)
Если вывести одновременно обе строки запроса с подставленными значениями переменных в браузер – они абсолютно идентичны?
Andkorol вне форума Ответить с цитированием
Старый 17.07.2013, 17:08   #3
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию

Да. Более того если вставить сформированную ссылку в браузер, то он показывает инфу о профиле даже в том случае когда file_get_contents() возвращает Not Found.
ICQ: 5311314
[SIGPIC][/SIGPIC]
AVer вне форума Ответить с цитированием
Старый 17.07.2013, 17:24   #4
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию

Немного видоизменил код чтобы убрать все нестыковки между 1 и 2 случаями и добавил вывод. Итак код:
PHP код:
<? 
      
include "apikey.php" ;
      include  
"openid.php" ;
      
$OpenID = new LightOpenID("localhost");
 
    
session_start();
 
    if(!
$OpenID->mode){
 
        if(isset(
$_GET['login'])){
            
$OpenID->identity "http://steamcommunity.com/openid";
            
header("Location: {$OpenID->authUrl()}");
        }
 
        if(!isset(
$_SESSION['T2SteamAuth'])){
            
$login "<div id=\"login\">Welcome Guest. Please <a href=\"?login\"><img src=\"http://cdn.steamcommunity.com/public/images/signinthroughsteam/sits_small.png\"/></a> to *Website Action*.</div>";
        }
            
    }elseif(
$OpenID->mode == "cancel"){
        echo 
"User has canceled Authenticiation.";
    } else {

        if(!isset(
$_SESSION['T2SteamAuth'])){
 
            
$_SESSION['T2SteamAuth'] = $OpenID->validate() ? $OpenID->identity null;
            
$_SESSION['T2SteamID64'] = str_replace("http://steamcommunity.com/openid/id/"""$_SESSION['T2SteamAuth']);
            if(
$_SESSION['T2SteamAuth'] !== null){
 
            }
            
$q "https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key={$api}&steamids={$_SESSION['T2SteamID64']}";
            
$profile file_get_contents($q);
            
$steam = (array)json_decode($profile);
            echo 
$q."<br>";
            
print_r($steam);
            echo 
"<br>";
            
#header("Location: index.php");
 
        
}
 
    }
 
    if(isset(
$_SESSION['T2SteamAuth'])){
 
        
$login  "<div id=\"login\"><a href=\"?logout\">Logout</a></div>";
 
    }
 
    if(isset(
$_GET['logout'])){
 
        unset(
$_SESSION['T2SteamAuth']);
        unset(
$_SESSION['T2SteamID64']);
        
header("Location: index.php");
 
    }
 
    
$q "https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key={$api}&steamids={$_SESSION['T2SteamID64']}";
    
$profile file_get_contents($q);
    
$steam = (array)json_decode($profile);
    echo 
$q."<br>";
    
print_r($steam);
    echo 
$login;
 
    
?>
После первого вызова и прохождения аутентификации имеем следующий вывод:
Код:
https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=ХХХ&steamids=76561198039628013
Array ( ) 
https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=ХХХ&steamids=76561198039628013
Array ( )
Как видно ссылки одинаковые и результата нет ни там, ни там.
Далее обновляем страницу и получаем:
Код:
https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=XXX&steamids=76561198039628013
Array ( [response] => stdClass Object ( [players] => Array ( [0] => stdClass Object ( [steamid] => 76561198039628013 [communityvisibilitystate] => 3 [profilestate] => 1 [personaname] => WFF.AVer [lastlogoff] => 1374055842 [profileurl] => http://steamcommunity.com/profiles/76561198039628013/ [avatar] => http://media.steampowered.com/steamcommunity/public/images/avatars/35/354104dba148204ab492e28e74d41514c54f204b.jpg [avatarmedium] => http://media.steampowered.com/steamcommunity/public/images/avatars/35/354104dba148204ab492e28e74d41514c54f204b_medium.jpg [avatarfull] => http://media.steampowered.com/steamcommunity/public/images/avatars/35/354104dba148204ab492e28e74d41514c54f204b_full.jpg [personastate] => 1 [primaryclanid] => 103582791429521408 [timecreated] => 1300685167 [gameextrainfo] => Dota 2 [gameid] => 570 ) ) ) )
То есть информацию из профиля.
Обновив страницу мы сделали искуственный редирект (который закомментирован). И все встало на свои места. Однако я хочу получить информацию о профиле СРАЗУ после аутентификации, чтобы произвести действия с базой данных, а потом уже совершать редирект. Как мне этого достичь?
ICQ: 5311314
[SIGPIC][/SIGPIC]
AVer вне форума Ответить с цитированием
Старый 17.07.2013, 17:33   #5
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Мистика, однако.
Костыльное решение – вынести авторизацию в отдельный скрипт, в случае успеха редиректить на этот скрипт по-тихому, и получать профиль.
Раз уж за один раз никак...
Возможно, это какие-то заморочки в самом API Steam...
Andkorol вне форума Ответить с цитированием
Старый 17.07.2013, 17:35   #6
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию

Вот ссылка на видео, где пишется подобный код:
http://www.youtube.com/watch?v=e2OnJfhkLxU
Интересующий нас кусок кода пишется на 8-9 минуте. Разница только в том, что там после аутентификации инфа о профиле записывается в файл, а не выводится на экран как у меня. И там это работает. Что я делаю не так?
ICQ: 5311314
[SIGPIC][/SIGPIC]
AVer вне форума Ответить с цитированием
Старый 17.07.2013, 17:46   #7
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию

Итак, костыль сработал.
index.php
PHP код:
<? 
      
include "apikey.php" ;
      include  
"openid.php" ;
      
$OpenID = new LightOpenID("localhost");
 
    
session_start();
 
    if(!
$OpenID->mode){
 
        if(isset(
$_GET['login'])){
            
$OpenID->identity "http://steamcommunity.com/openid";
            
header("Location: {$OpenID->authUrl()}");
        }
 
        if(!isset(
$_SESSION['T2SteamAuth'])){
            
$login "<div id=\"login\">Welcome Guest. Please <a href=\"?login\"><img src=\"http://cdn.steamcommunity.com/public/images/signinthroughsteam/sits_small.png\"/></a> to *Website Action*.</div>";
        }
            
    }elseif(
$OpenID->mode == "cancel"){
        echo 
"User has canceled Authenticiation.";
    } else {

        if(!isset(
$_SESSION['T2SteamAuth'])){
 
            
$_SESSION['T2SteamAuth'] = $OpenID->validate() ? $OpenID->identity null;
            
$_SESSION['T2SteamID64'] = str_replace("http://steamcommunity.com/openid/id/"""$_SESSION['T2SteamAuth']);
            if(
$_SESSION['T2SteamAuth'] !== null){
                
header("Location: testpage.php");
            }
            
            
#header("Location: index.php");
 
        
}
 
    }
 
    if(isset(
$_SESSION['T2SteamAuth'])){
 
        
$login  "<div id=\"login\"><a href=\"?logout\">Logout</a></div>";
 
    }
 
    if(isset(
$_GET['logout'])){
 
        unset(
$_SESSION['T2SteamAuth']);
        unset(
$_SESSION['T2SteamID64']);
        
header("Location: index.php");
 
    }
 
    
$q "https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key={$api}&steamids={$_SESSION['T2SteamID64']}";
    
$profile file_get_contents($q);
    
$steam = (array)json_decode($profile);
    echo 
$q."<br>";
    
print_r($steam);
    echo 
$login;
 
    
?>
testpage.php
PHP код:
<?php
include 'apikey.php';
session_start();
$q "https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key={$api}&steamids={$_SESSION['T2SteamID64']}";
$profile file_get_contents($q);
$steam = (array)json_decode($profile);
echo 
$q."<br>";
print_r($steam);
echo 
"<br>";
?>
И testpage.php действительно показывает профиль и здесь можно совершить нужные мне действия.
Однако хочется добраться до истины. Цель конечно достигнута, но в оригинале это сделано без костылей. Все таки хочется узнать где же ошибка.
ICQ: 5311314
[SIGPIC][/SIGPIC]
AVer вне форума Ответить с цитированием
Старый 17.07.2013, 17:49   #8
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от AVer Посмотреть сообщение
Что я делаю не так?
На первый взгляд только одно отличие увидел – в коде на видео в строке запроса профиля используется "http://" – а в вашем "https://", это может быть весьма существенным отличием.
В мануале, кстати, также прописан http://:
Andkorol вне форума Ответить с цитированием
Старый 17.07.2013, 17:53   #9
AVer
Андрей
Форумчанин
 
Аватар для AVer
 
Регистрация: 21.11.2006
Сообщений: 457
По умолчанию

Да, я знаю. https написал от безысходности чтобы проверить. =) Но:
1) И с http это не работало
2) И с https это работает если делать другом скрипте
ICQ: 5311314
[SIGPIC][/SIGPIC]
AVer вне форума Ответить с цитированием
Старый 17.07.2013, 18:00   #10
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

О, нашел в описании под видео:
Цитата:
For people with the file_get_contents function returning 404 page not found errors,
Place the below function after you opening php tags, and replace "file_get_contents" with "get_contents"

PHP код:
function get_contents($URL){ 
    
$ch curl_init(); 
    
curl_setopt($chCURLOPT_RETURNTRANSFER1); 
    
curl_setopt($chCURLOPT_URL$URL); 
    
$data curl_exec($ch); 
    
curl_close($ch); 
    return 
$data;

Может, пригодится...
Andkorol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с file_get_contents() Fellics{новичок} PHP 1 09.02.2013 15:19
php ругается на file_get_contents Pingvinenok_Lolo PHP 10 23.03.2012 20:06
file_get_contents + все ссылки со станицы valerka92 PHP 3 19.01.2012 09:17
file_get_contents DimmoS Помощь студентам 1 12.08.2011 13:15
аналог file_get_contents() A_r_r_a_y PHP 7 07.07.2010 17:26