Столкнулся с проблемой, уже иссякли идеи. Суть вот в чем:
есть страница, на которой стоит WYSIWYG редактор, в котором пишутся новости. При отправке формы, данные пишутся в БД. Потребовалось добавить кросспостинг в группу ВКонтате. Т.к. без костылей на PHP этого реализовать не получится, то использую OpenApi и jQuery. Написал функцию:
function postVK(text, news_id, id_tape)
{
//функция редиректа
function redirectToMain()
{
if (action == 'subscribe'){
location.href='subscribes.php';
} else {
location.href='index.php?id_tape='+id_tape;
}
}
//преобразование мнемоники
var HTML=function(){
var x,mnem=
{34:"quot",38:"amp",39:"apos",60:"lt",62:"gt",402:"fnof",
338:"OElig",339:"oelig",352:"Scaron",353:"scaron",
376:"Yuml",710:"circ",732:"tilde",8226:"bull",8230:"hellip",
8242:"prime",8243:"Prime",8254:"oline",8260:"frasl",8472:"weierp",
8465:"image",8476:"real",8482:"trade",8501:"alefsym",8592:"larr",
8593:"uarr",8594:"rarr",8595:"darr",8596:"harr",8629:"crarr",
8656:"lArr",8657:"uArr",8658:"rArr",8659:"dArr",8660:"hArr",
8704:"forall",8706:"part",8707:"exist",8709:"empty",8711:"nabla",
8712:"isin",8713:"notin",8715:"ni",8719:"prod",8721:"sum",
8722:"minus",8727:"lowast",8730:"radic",8733:"prop",8734:"infin",
8736:"ang",8743:"and",8744:"or",8745:"cap",8746:"cup",8747:"int",
8756:"there4",8764:"sim",8773:"cong",8776:"asymp",8800:"ne",
8801:"equiv",8804:"le",8805:"ge",8834:"sub",8835:"sup",8836:"nsub",
8838:"sube",8839:"supe",8853:"oplus",8855:"otimes",8869:"perp",
8901:"sdot",8968:"lceil",8969:"rceil",8970:"lfloor",8971:"rfloor",
9001:"lang",9002:"rang",9674:"loz",9824:"spades",9827:"clubs",
9829:"hearts",9830:"diams",8194:"ensp",8195:"emsp",8201:"thinsp",
8204:"zwnj",8205:"zwj",8206:"lrm",8207:"rlm",8211:"ndash",
8212:"mdash",8216:"lsquo",8217:"rsquo",8218:"sbquo",8220:"ldquo",
8221:"rdquo",8222:"bdquo",8224:"dagger",8225:"Dagger",8240:"permil",
8249:"lsaquo",8250:"rsaquo",8364:"euro",977:"thetasym",978:"upsih",982:"piv"},
tab=("nbsp|iexcl|cent|pound|curren|yen|brvbar|sect|uml|"+
"copy|ordf|laquo|not|shy|reg|macr|deg|plusmn|sup2|sup3|"+
"acute|micro|para|middot|cedil|sup1|ordm|raquo|frac14|"+
"frac12|frac34|iquest|Agrave|Aacute|Acirc|Atilde|Auml|"+
"Aring|AElig|Ccedil|Egrave|Eacute|Ecirc|Euml|Igrave|"+
"Iacute|Icirc|Iuml|ETH|Ntilde|Ograve|Oacute|Ocirc|Otilde|"+
"Ouml|times|Oslash|Ugrave|Uacute|Ucirc|Uuml|Yacute|THORN|"+
"szlig|agrave|aacute|acirc|atilde|auml|aring|aelig|ccedil|"+
"egrave|eacute|ecirc|euml|igrave|iacute|icirc|iuml|eth|ntilde|"+
"ograve|oacute|ocirc|otilde|ouml|divide|oslash|ugrave|uacute|"+
"ucirc|uuml|yacute|thorn|yuml").split("|");
for(x=0;x<96;x++)mnem[160+x]=tab[x];
tab=("Alpha|Beta|Gamma|Delta|Epsilon|Zeta|Eta|Theta|Iota|Kappa|"+
"Lambda|Mu|Nu|Xi|Omicron|Pi|Rho").split("|");
for(x=0;x<17;x++)mnem[913+x]=tab[x];
tab=("Sigma|Tau|Upsilon|Phi|Chi|Psi|Omega").split("|");
for(x=0;x<7;x++)mnem[931+x]=tab[x];
tab=("alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|"+
"lambda|mu|nu|xi|omicron|pi|rho|sigmaf|sigma|tau|upsilon|phi|chi|"+
"psi|omega").split("|");
for(x=0;x<25;x++)mnem[945+x]=tab[x];
return {
encode:function(text){
return text.replace(/[\u00A0-\u2666<>\&]/g,function(a){
return "&"+(mnem[a=a.charCodeAt(0)]||"#"+a)+";"
})
},
decode:function(text){
return text.replace(/\&#?(\w+);/g,function(a,b){
if(Number(b))return String.fromCharCode(Number(b));
for(x in mnem){
if(mnem[x]===b)return String.fromCharCode(x);
}
})
}
}
}();
//Спрашиваем, нужно ли добавлять запись в ВК
if(confirm("Отправить запись в группу ВКонтакте?"))
{
//если да, то проверяем авторизацию, если нет, запрашиваем ее.
VK.Auth.getLoginStatus(authInfo);
//основная часть функции.
function authInfo(auth) {
//если авторизация есть
if (auth.session) {
//удаляем все HTML-тэги из него
var strippedText = HTML.decode(text.replace(/(<([^>]+)>)/ig,""));
//вызываем АПИ для добавления на стену
VK.Api.call('wall.post', {owner_id: -123456789, from_group: 1, message: strippedText, attachments: 'http://www.site.ru/news/'+news_id}, function(r)
{
//если пришел ответ - запись добавлена
if(r.response){
//сообщаем об успехе
alert("Запись успешно добавлена в группу ВКонтакте");
//и редиректим
redirectToMain();
}
//если ответ не пришел - репост отменен
else
{
//сообщаем об этом
alert("Запись в группу ВКонтакте отменена");
//редиректим
redirectToMain();
}
});
//если авторизации нет
} else {
//вызываем АПИ авторизации, и делаем рекурсию
VK.Auth.login(authInfo);
}
}
//ну а коль барин не желает репостить запись
}else{
//просто посылаем его редиректом
redirectToMain();
}
}
Она принимает текст поста при отправке из редактора, чистит от HTML-тегов и сущностей и отправляет запрос на апи wall.post. Функция отправки такая (не пинать, кто это делал - хз):
function save_message(){
$("#bg_form_div").css('display','block');
params = {
id_tape:id_tape,
action:action,
id_message:id_message
};
var fields = $('#mess_form').serializeArray();
for (i in fields ) {
params[fields [i].name] = fields [i].value;
}
if ($('#t_content')[0]){
var txt = CKEDITOR.instances.t_content;
params['t_content']=txt.getData();
}
if ($('#foto')[0]) params['file']=$('#foto')[0];
params['is_cats']=a_cats;
var message='';
JsHttpRequest.query('message.ajax.php', params,function(result, errors) {
$("#bg_form_div").css('display','none');
if (result&&!result.success){
$.each( result.messages, function(i,n){
message+=n+"\n";
});
alert(message);
}
if (result&&result.success){
$.each(result.messages, function(i,n){
message+=n+"\n";
/////////////////////////////////////////////////////////////////////////////////////////////////
var news_id=message.substring(0,message.indexOf(':'));
$.when(alert(message)).done(postVK($("#t_content").text(), news_id, id_tape));
/////////////////////////////////////////////////////////////////////////////////////////////////
});
}
},true);
}
слешами указал место, в которое впихнул функцию отправки в ВК. По сути тут функция просто посылает данные аяксом на php файл, который грузит все в БД.
Сама проблема:
при отправке одного текста (например длинной в 2000 символов) - ВК его принимает без проблем, а при отправке другого (например 3000 символов, или 1500 символов) - ВК отвергает и разрывает соединение, но при этом принимает тот же текст после обрезки до, например, 500 символов. Есть подозрения, что это из-за ограничений метода GET (8192байт), но я не совсем уверен что 1к символов может столько занимать (кодировка файлов CP-1251)
Что это за тайная магия и каким заклинанием её избежать? Спасибо!
ЗЫ: jQuery версии 1.5 (выше никак)
UPD:
передал в PHP токен, полученный методом
Implicit Flow вот таким макаром:
require './apivk/apivk.php';
$vk = new apivk;
if(!isset($_GET['auth']))
{
$vk->oAuth();
}
elseif(isset($_GET['auth']) && !isset($_GET['access_token']))
{
?>
<script
src="https://code.jquery.com/jquery-1.5.js"
integrity="sha256-NhPIl0e+Si1dwX9ELQpILaZleE4uWjkx+5ofw4+g+o0="
crossorigin="anonymous">
</script>
<script type="text/javascript" >
$(document).ready(function(){
//получаем данные из адресной строки в виде объекта
var pageHref=location;
//преобразуем в строку
var stroka =pageHref.toString();
//находим выстригаем все данные от слова 'access_token='
var get_data = stroka.substring(stroka.indexOf('access_token='), stroka.length);
//редиректим с подстановкой полученной строки
location.replace('?auth=true&'+get_data);
});
</script>
<?php
}
elseif(isset($_GET['access_token']) && isset($_GET['auth']))
{
var_dump($_GET);
}
костыль, понимаю. Но и он не работает... При обращении с полученным токеном получаю тоже, что с токеном, полученным по второй схеме (
Authorization Code Flow) :
{"error":{"error_code":15,"error_msg":"Access denied: no access to call this method","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"wall.post"}]}}
Пока идей больше нет...