2016-04-08 6 views
0

Ich wollte einen Inline-Bot machen! und wenn ich dies tun:senden Inline-Abfrage Ergebnis Fehler (Telegramm)

function sendResponse($url, $data){ 
    $ch = curl_init(); 
    //curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data')); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, array('inline_query_id' => $data['inline_query_id'], 'results' => json_encode($data['results']))); 
    $output = curl_exec($ch); 
    return $output; 
} 

Es wird nicht funktionieren, wird der Fehler (mit oder ohne Header): {"ok":false,"error_code":400,"description":"[Error]: Bad request: Field \"message_text\" must be of type String"}

aber wenn ich es wie folgt tun:

function sendResponse($url, $data){ 
    $ch = curl_init(); 
    //curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data')); 
    curl_setopt($ch, CURLOPT_URL, $url.'?inline_query_id='.rawurlencode($data['inline_query_id']).'&results='.rawurlencode(json_encode($data['results']))); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    //curl_setopt($ch, CURLOPT_POST, 1); 
    //curl_setopt($ch, CURLOPT_POSTFIELDS, $q); 
    $output = curl_exec($ch); 
    return $output; 
} 

Es funktioniert! Das Problem ist die zweite Methode Anfrage URI wird zu groß, so kann ich es nicht verwenden!

Jede Art, wie ich diese Daten senden kann, ist okay für mich! Vielen Dank!

und der Code für $ data machen, ist hier:

$result = connectWebsite(SITE_SEARCH_URL, urlencode($update['inline_query']['query'])); 
$result = json_decode($result); 
$output = array(); 
$output['inline_query_id'] = $update['inline_query']['id']; 
$i = 0; 
foreach($result as $post){ 
    $data = array(); 
    $data['type'] = 'article'; 
    $data['id'] = strval($post->ID); 
    $data['title'] = '('.$post->atypes.') '.$post->title; 
    if(strlen($post->content) > 2100) 
     $tmp = substr($post->content, 0, 2096).'...'; 
    $data['message_text'] = '<b>'.$post->title.'</b>'.ucwords($post->genre, ',').$tmp; 
    $data['parse_mode'] = 'HTML'; 
    if(strlen($post->content) > 200) 
     $tmp = substr($post->content, 0, 196).'...'; 
    //$data['description'] = ucwords($post->genre, ',').' | '.$tmp; 
    $output['results'][$i] = $data; 
    $i++; 
    if($i == MAX_RESULTS) 
     break; 
} 
sendResponse(API_URL.'answerInlineQuery', $output); 
+0

oh senden. und wenn Sie ein -1 geben, weil es ein Duplikat oder etwas ist, antworten Sie es bitte auch (oder mindestens einen Link). Professor von -1s! danke –

+0

Sie können es nur von der Nachricht debuggen, um von api Anruf zu erhalten '[Fehler]: Falsche Anfrage: Feld \" message_text \ "muss vom Typ String sein, so stellen Sie sicher, dass' message_text' ist String; – itzmukeshy7

+0

@ itzmukeshy7 ist es! –

Antwort

1

Es jemand helfen könnte, so werde ich es selbst beantworten.

das Problem war, die UTF-8-Codierung

I ersetzt substr mit mb_substr

neben in der ersten Zeile I'v diese hinzugefügt: mb_internal_encoding("UTF-8")

und ... das Problem war gelöst. Jetzt kann ich meine Inline-Abfrageergebnisse (oder einen anderen Befehl) ohne die URL-Länge Problem

Vielen Dank allen für Ihre Hilfe