Скрипт для создания запросов к Api ВКонтакта

Лучший способ помочь другим, поделиться своими находками.

Скрипт для создания запросов к Api ВКонтакта

Сообщение PAX 14 мар 2010, 22:37

Жаль нет сейчас времени туториал писать, так что поделюсь пока тем что есть.

Первое с чего начну - код моей текущей страницы, которая загружает вэб-плеер Юнити и инициализирует его данными (необходимые скрипты есть во вложениях):
Синтаксис:
Используется javascript
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>GameName</title>

    <script src="http://vk.com/js/common.js" type="text/javascript"></script>

    <script src="http://vk.com/js/xd_connection.js" type="text/javascript"></script>

    <script src="/scripts/unityobject.js" type="text/javascript"></script>

    <script src="/scripts/vk_api.js" type="text/javascript"></script>

</head>
<body>
    <!--<script src="http://vk-jsapi.googlecode.com/svn/trunk/vk_api.min.js" type="text/javascript"></script>-->
    <center>
        <div id="ss_game" style="z-index: -100">
        </div>
    </center>

    <script type="text/javascript">        //<![CDATA[
        var uniObj;

        function createUnityObject() {
            uniObj = new UnityObject("game.unity3d", "game", "760", "590");
            //uniObj.addParam("logoimage", "MyLogo.png");
            //uniObj.addParam("progressbarimage", "MyProgressBar.png");
            //uniObj.addParam("progressframeimage", "MyProgressFrame.png");
            //uniObj.addParam("disableContextMenu", "true");
            uniObj.addParam("disableFullscreen", "true");
            uniObj.setAttribute("altHTML", "<a href='http://unity3d.com/unitywebplayer.html' title='Перейти на unity3d.com для установки Unity Web Player'>Установить Unity Web Player</a>");
            uniObj.write('ss_game');
        }

        var api = new vk_api(
        'AppSecret',
        function() {

            api.callMethod('setTitle', 'Название приложения');

            api.makeInstall(function() {
                api.makeSettings(api.SETT_FRIENDS | api.SETT_NOTIFY);
            });

            api.addCallback('onWindowBlur', function(settings) { document.getElementById('ss_game').style.display = 'none'; });

            api.addCallback('onWindowFocus', function(settings) { document.getElementById('ss_game').style.display = 'block'; });

            api.addCallback('onSettingsChanged', function(settings) { document.getElementById('ss_game').style.display = 'block'; });

            createUnityObject();

        },
    function() { document.getElementById('text').innerHTML += 'Ошибка инициализации API\n'; },
    true);
   
   
// Функция вызываемая плеером для получения параметров, необходимых для работы с API ВКонтакта
        function SendSettingsToPlayer() {
            uniObj.msg("VkontakteAPI", "SetApiUrl", api.params.api_url);
            uniObj.msg("VkontakteAPI", "SetAppId", api.params.api_id);
            uniObj.msg("VkontakteAPI", "SetViewerId", api.params.viewer_id);
            uniObj.msg("VkontakteAPI", "ApiInitialized");
        }


        //]]></script>
</body>
</html>



Далее скрипт для Юнити и вспомогательный класс (думаю всем будет понятно как они взаимосвязаны):
Синтаксис:
Используется csharp
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;

public class VKontakteApi: MonoBehaviour
{
    public string Secret = "";
    public bool TestMode = true;
    public string Version = "2.0";

    private string _apiUrl = "";
    private string _viewerId = "";
    private string _appId = "";
    private System.Random _random;

    private bool _isInit = false;

    public bool IsInit
    {
        get { return _isInit; }
    }

    void Awake()
    {
        _random = new System.Random();
        Application.ExternalCall("SendSettingsToPlayer");
    }

    public void SetApiUrl(string url)
    {
        _apiUrl = url + (url.EndsWith("?") ? "" : "?");
    }

    public void SetAppId(string appId)
    {
        _appId = appId;
    }

    public void SetViewerId(string viewerId)
    {
        _viewerId = viewerId;
    }

    public void ApiInitialized()
    {
        _isInit = true;
    }

    /// <summary>
    /// Функция расчета хэша Md5
    /// </summary>
    /// <param name="value">Строка, для которой считается хэш</param>
    /// <returns>Возвращает хэш-строку переданной строи</returns>
    public static string Md5(string value)
    {
        MD5CryptoServiceProvider x = new MD5CryptoServiceProvider();
        byte[] data = Encoding.ASCII.GetBytes(value);
        data = x.ComputeHash(data);
        string ret = "";
        for (int i = 0; i < data.Length; i++)
            ret += data[i].ToString("x2").ToLower();
        return ret;
    }


    /// <summary>
    /// Функция создает Url запроса для Api ВКонтакте
    /// </summary>
    /// <param name="parameters">Параметры запроса</param>
    /// <returns>Возвращает строку запроса</returns>
    public string CreateRequestUrl(RequestParameter[] parameters)
    {
        List<RequestParameter> pars = new List<RequestParameter>();
        pars.Add(new RequestParameter("api_id", _appId));
        pars.Add(new RequestParameter("v", Version));

        if (TestMode)
        {
            pars.Add(new RequestParameter("test_mode", "1"));
        }

        pars.AddRange(parameters);


        // Сортируем параметры по имени для правильного построения подписи запроса
        List<string> parNames = new List<string>();

        foreach (RequestParameter par in pars)
        {
            parNames.Add(par.Name);
        }

        parNames.Sort();

        List<RequestParameter> sortedPars = new List<RequestParameter>();

        foreach (string parName in parNames)
        {
            foreach (RequestParameter par in pars)
            {
                if (par.Name == parName)
                {
                    sortedPars.Add(par);
                    break;
                }
            }
        }

        pars = sortedPars;



        StringBuilder sb = new StringBuilder();

        sb.Append(_viewerId);
       

        foreach (RequestParameter s in pars)
        {
            sb.Append(s.ToString());
        }

        sb.Append(Secret);
       
        // считаем сигнатуру
        string sig = Md5(sb.ToString());

        sb = new StringBuilder();

        sb.Append(_apiUrl);

        foreach (RequestParameter s in pars)
        {
            sb.Append(s.ToString());
            sb.Append("&");
        }

        // Добавляем сигнатуру
        sb.Append("sig=");
        sb.Append(sig);


        return sb.ToString();
    }

}


Синтаксис:
Используется csharp
public struct RequestParameter
{
    public string Name;
    public string Value;

    public RequestParameter(string name, string value)
    {
        Name = name;
        Value = value;
    }

    public override string ToString()
    {
        return Name + "=" + Value;
    }
}


Для правильной работы в сцене необходимо создать GO с именем VkontakteAPI и привязать к нему первый скрипт. При старте скрипт вызовет функцию SendSettingsToPlayer() созданную заранее в странице, которая в свою очередь проинициализирует объект VkontakteAPI необходимыми параметрами.

После инициализации можно пользоваться конструктором запросов (url) для api вконтакта. Дальше пока сил не хватило... на JS не люблю программировать :)

Если кто в силах помочь лучше переписать код страницы для правильной работы с настройками, так же очень хочется посмотреть как определять пользователя, если он был приглашен другим пользователем и т.д. Серверной стороны тут нет, т.к. пока до нее далеко. Но необходимый клиентский функционал хорошо бы разработать заранее.

PS: Приветствуется критика и свои примеры :)
У вас нет доступа для просмотра вложений в этом сообщении.
Blitz3d to Unity Wiki
icq: 208084972
skype: pax62rus
Аватара пользователя
PAX
UNIт
 
Сообщения: 134
Зарегистрирован: 03 ноя 2009, 12:53
Откуда: Россия, Рязань
  • Сайт
  • ICQ

Re: Скрипт для создания запросов к Api ВКонтакта

Сообщение d3gator 15 мар 2010, 14:39

привет,
пытался использовать этот же unityobject.js Источник: http://www.unifycommunity.com/wiki/inde ... nityObject
для Wordpress блога, почему то не работал, страница все время как бы перегружаласть(каждую секунду).

Это можифицированный unityobject.js или использовал тот же что на вики?
skype : oleg_fomenko
d3gator
UNIт
 
Сообщения: 119
Зарегистрирован: 20 май 2009, 21:19

Re: Скрипт для создания запросов к Api ВКонтакта

Сообщение PAX 15 мар 2010, 21:08

Я там поправил тока возможность записи объекта Юнити в тег с определенным идентификатором, в том что на вики, похоже забыли это сделать. Тот который у меня, прикреплен в аттаче.
Blitz3d to Unity Wiki
icq: 208084972
skype: pax62rus
Аватара пользователя
PAX
UNIт
 
Сообщения: 134
Зарегистрирован: 03 ноя 2009, 12:53
Откуда: Россия, Рязань
  • Сайт
  • ICQ

Re: Скрипт для создания запросов к Api ВКонтакта

Сообщение Ferz 17 мар 2010, 23:37

Спасибо за информацию. Внесу свои 5 копеек - сортировку стоит сделать более джедайской.
Для этого надо вот этот кусок кода

Код: Выделить всё
// Сортируем параметры по имени для правильного построения подписи запроса
        List<string> parNames = new List<string>();

        foreach (RequestParameter par in pars)
        {
            parNames.Add(par.Name);
        }

        parNames.Sort();

        List<RequestParameter> sortedPars = new List<RequestParameter>();

        foreach (string parName in parNames)
        {
            foreach (RequestParameter par in pars)
            {
                if (par.Name == parName)
                {
                    sortedPars.Add(par);
                    break;
                }
            }
        }

        pars = sortedPars;


заменить вот на этот:

Код: Выделить всё
pars.Sort(RequestParameterSort);


и где нибудь добавить функцию

Код: Выделить всё
  public int RequestParameterSort(RequestParameter p1,RequestParameter p2)
    {
        return p1.Name.CompareTo(p2.Name);
    }
Ferz
UNец
 
Сообщения: 35
Зарегистрирован: 25 июл 2009, 00:20

Re: Скрипт для создания запросов к Api ВКонтакта

Сообщение PAX 19 мар 2010, 16:30

Спасибо за подсказку, записал в одну строчку :)
Синтаксис:
Используется csharp
pars.Sort(delegate(RequestParameter p1, RequestParameter p2){return p1.Name.CompareTo(p2.Name);});
Blitz3d to Unity Wiki
icq: 208084972
skype: pax62rus
Аватара пользователя
PAX
UNIт
 
Сообщения: 134
Зарегистрирован: 03 ноя 2009, 12:53
Откуда: Россия, Рязань
  • Сайт
  • ICQ

Re: Скрипт для создания запросов к Api ВКонтакта

Сообщение lax 28 мар 2010, 00:37

Просидел весь день пытаясь разобраться с вконтакте API.
Вечный SWF DEBUG: Connection error.
Я честно говоря уже не знаю что еще можно.
Скиньте пожалуйста пример проекта и оболочки вебплеера(сами html) или поясните как это заставить все работать.
lax
UNец
 
Сообщения: 1
Зарегистрирован: 28 мар 2010, 00:30

Re: Скрипт для создания запросов к Api ВКонтакта

Сообщение PAX 28 мар 2010, 11:55

немного не понятно, что значит SWF DEBUG: Connection error?
Blitz3d to Unity Wiki
icq: 208084972
skype: pax62rus
Аватара пользователя
PAX
UNIт
 
Сообщения: 134
Зарегистрирован: 03 ноя 2009, 12:53
Откуда: Россия, Рязань
  • Сайт
  • ICQ

Re: Скрипт для создания запросов к Api ВКонтакта

Сообщение gnoblin 03 апр 2010, 07:35

А список из каких вообще запросов минимален для средней социгры?
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Скрипт для создания запросов к Api ВКонтакта

Сообщение Lucchese 19 апр 2010, 23:07

Можете по подробней расписать...
Сделать как бы уроком)
Lucchese
UNец
 
Сообщения: 4
Зарегистрирован: 19 апр 2010, 23:06

Re: Скрипт для создания запросов к Api ВКонтакта

Сообщение Warlock 20 апр 2010, 10:42

gnoblin писал(а):А список из каких вообще запросов минимален для средней социгры?


Добрый! Для каждой сети может чуть меняться, но обзорно примерно так:
- запрос на установку прав для приложения(доступ к данным друзей, пост на стену и пр.)
- запрос списка всех друзей и запрос требуемой информации по всем друзьям
- запрос списка друзей, установивших приложение.
- пост на стену пользователя
- пост сообщения для пользователя(обычно это сообщение видно в разделе приложений)
- пост виджета(блок, который размещается обычно на главной страничке пользователя в сети), на котором Вы можете разместить некую информацию по игре... или не по иге.... :-)
- операции с деньгами - этот набор запросов обычно индивидуален для каждой соц сети.
- в зависимости от игры может еще понадобиться запросы для работы с фотоальбомами пользователя(размещать скриншоты с игры)

Запросы обычно разделяются на два типа(опять же для каждой сети может быть по своему):
- запросы, которые можно посылать напрямую с клиента к АПИ соц сети(список френдов..)
- запросы, которые можно посылать только посредством промежуточного сервера(операции с деньгами, пост сообщений пользователю..)

Вот все что вспомнилось.... :-)
Warlock
UNец
 
Сообщения: 27
Зарегистрирован: 17 ноя 2008, 17:25
Откуда: Ростов-на-Дону
  • ICQ

Re: Скрипт для создания запросов к Api ВКонтакта

Сообщение Lucchese 01 май 2010, 17:33

Что не кто не может объяснить как это все работает ?
Lucchese
UNец
 
Сообщения: 4
Зарегистрирован: 19 апр 2010, 23:06

Re: Скрипт для создания запросов к Api ВКонтакта

Сообщение gnoblin 01 май 2010, 17:43

На официальном форуме есть урок про запросы к facebook.
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Скрипт для создания запросов к Api ВКонтакта

Сообщение Maxim Mazurenko 22 май 2010, 15:53

Синтаксис:
Используется csharp
 public void SetAppId(string appId)
    {
        _appId = appId;
    }

Не подскажете поподробнее что делают эти строчки и напишите альтернативу в JS этих строчек.
Заранее спасибо. :-?
Maxim Mazurenko
UNец
 
Сообщения: 27
Зарегистрирован: 20 май 2010, 21:59

Re: Скрипт для создания запросов к Api ВКонтакта

Сообщение gnoblin 22 май 2010, 16:45

Как-то так
Код: Выделить всё
function SetAppId(var appId : String)
    {
        _appId = appId;
    }
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Скрипт для создания запросов к Api ВКонтакта

Сообщение PAX 28 май 2010, 20:03

Извиняюсь что поздно, эта функция вызывается со странички и инициализирует класс параметром ApiId - идентификатор приложения. JS уже привели )
Blitz3d to Unity Wiki
icq: 208084972
skype: pax62rus
Аватара пользователя
PAX
UNIт
 
Сообщения: 134
Зарегистрирован: 03 ноя 2009, 12:53
Откуда: Россия, Рязань
  • Сайт
  • ICQ

След.

Вернуться в Исходники (Копилка)

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2