2013-11-21 36 views
0

我正在使用HybridAuth库。 我希望能够发布消息到我的经过身份验证的用户twitter个人资料的图像。HybridAuth发送带图像的鸣叫

setUserStatus方法很适合自动发送推文。

我写了下面的方法:

function setUserStatus($status, $image) 
{ 
    //$parameters = array('status' => $status, 'media[]' => "@{$image}"); 
    $parameters = array('status' => $status, 'media[]' => file_get_contents($image)); 
    $response = $this->api->post('statuses/update_with_media.json', $parameters); 

    // check the last HTTP status code returned 
    if ($this->api->http_code != 200){ 
     throw new Exception("Update user status failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus($this->api->http_code)); 
    } 
} 

我从Twitter获得的消息是:

Ooophs,我们得到了一个错误:更新用户状态失败! Twitter返回一个错误。 403禁止:请求被理解,但它已被拒绝。

如何获得有关错误的更精确信息? 是否有人已经成功发送附在推文上的图片?

谢谢!

雨果

+0

嘿,你有没有解决这个问题? –

+0

不!当我将要处理它时,我将直接使用twitter API ... – hugsbrugs

回答

3

感谢@ Heena为了让自己在这个问题上醒来,我做了它;)

function setUserStatus($status) 
{ 
    if(is_array($status)) 
    { 
     $message = $status["message"]; 
     $image_path = $status["image_path"]; 
    } 
    else 
    { 
     $message = $status; 
     $image_path = null; 
    } 

    $media_id = null; 

    # https://dev.twitter.com/rest/reference/get/help/configuration 
    $twitter_photo_size_limit = 3145728; 

    if($image_path!==null) 
    { 
     if(file_exists($image_path)) 
     { 
      if(filesize($image_path) < $twitter_photo_size_limit) 
      { 
       # Backup base_url 
       $original_base_url = $this->api->api_base_url; 

       # Need to change base_url for uploading media 
       $this->api->api_base_url = "https://upload.twitter.com/1.1/"; 

       # Call Twitter API media/upload.json 
       $parameters = array('media' => base64_encode(file_get_contents($image_path))); 
       $response = $this->api->post('media/upload.json', $parameters); 
       error_log("Twitter upload response : ".print_r($response, true)); 

       # Restore base_url 
       $this->api->api_base_url = $original_base_url; 

       # Retrieve media_id from response 
       if(isset($response->media_id)) 
       { 
        $media_id = $response->media_id; 
        error_log("Twitter media_id : ".$media_id); 
       } 

      } 
      else 
      { 
       error_log("Twitter does not accept files larger than ".$twitter_photo_size_limit.". Check ".$image_path); 
      } 
     } 
     else 
     { 
      error_log("Can't send file ".$image_path." to Twitter cause does not exist ... "); 
     } 
    } 

    if($media_id!==null) 
    { 
     $parameters = array('status' => $message, 'media_ids' => $media_id); 
    } 
    else 
    { 
     $parameters = array('status' => $message); 
    } 
    $response = $this->api->post('statuses/update.json', $parameters); 

    // check the last HTTP status code returned 
    if ($this->api->http_code != 200){ 
     throw new Exception("Update user status failed! {$this->providerId} returned an error. " . $this->errorMessageByStatus($this->api->http_code)); 
    } 
} 

为了使它工作,你需要做的是这样的:

$config = "/path_to_hybridauth_config.php"; 
$hybridauth = new Hybrid_Auth($config); 
$adapter = $hybridauth->authenticate("Twitter"); 

$twitter_status = array(
    "message" => "Hi there! this is just a random update to test some stuff", 
    "image_path" => "/path_to_your_image.jpg" 
); 
$res = $adapter->setUserStatus($twitter_status); 

享受!

2

我不明白它hybridauth然后我用这个库 https://github.com/J7mbo/twitter-api-php/archive/master.zip

然后我成功了使用下面的代码:(在其他地方出现在堆栈)

<?php 
    require_once('TwitterAPIExchange.php'); 
    $settings= array(
    'oauth_access_token' => ''; 
    'oauth_access_secret' => ''; 
    'consumer_key' => ''; 
    'consumer_secret' => ''; 
    // paste your keys above properly 
    ) 

    $url_media = "https://api.twitter.com/1.1/statuses/update_with_media.json"; 
    $requestMethod = "POST"; 

    $tweetmsg = $_POST['post_description']; //POST data from upload form 
    $twimg = $_FILES['pictureFile']['tmp_name']; // POST data of file upload 

    $postfields = array(
     'status' => $tweetmsg, 
     'media[]' => '@' . $twimg 
    ); 
    try { 
     $twitter = new TwitterAPIExchange($settings); 
     $twitter->buildOauth($url_media, $requestMethod) 
       ->setPostfields($postfields) 
       ->performRequest(); 

     echo "You just tweeted with an image"; 
    } catch (Exception $ex) { 
     echo $ex->getMessage(); 
    } 
?> 
+0

来硬编码消息和图像,像 $ tweetmsg =“查看我的新照片”; $ twimg =“catfight.jpg”; –

+0

嗨update_with_media.json已弃用[Twitter的API](https://dev.twitter.com/rest/reference/post/statuses/update_with_media),你应该考虑使用media/upload.json的新方法,然后状态/更新。 JSON – hugsbrugs