【问题标题】:update_with_media using abraham's twitteroauthupdate_with_media 使用 abraham 的 twitteroauth
【发布时间】:2012-05-18 19:29:31
【问题描述】:

我正在尝试使用 Abraham 的 twitteroauth 库 (TwitterOAuth v0.2.0-beta2) 实现来自 ajax 的 upload_with_media 请求。我对基本帖子没有任何问题,但是当我尝试包含媒体时,我得到以下回复:

"{"request":"\/1\/statuses\/update_with_media.json","error":"Error creating status."}"

我发布媒体的代码如下所示:

   $image = $_FILES["media"]["tmp_name"];

    $parameters = array(
        'media[]'  => "@{$image};type=image/jpeg;filename={$image}",
        'status'   => $status
      );

    if(isset($reply_id)) {
        $parameters['in_reply_to_status_id'] = $reply_id;
    }
    $post = $twitteroauth->post('https://upload.twitter.com/1/statuses/update_with_media.json', $parameters);
    echo json_encode($post);

我已验证所有数据都正确发送到此脚本,甚至使用上面相同的数据和 tmhOAuth 库设法让 update_with_media 帖子工作,但由于我的小部件的其余部分使用 twitteroauth,我更愿意保留东西统一。我也尝试过在结尾加上和不加 .json 的情况下,没有发现任何区别。谁能向我展示一个使用 twitteroauth 成功实现 update_with_media 的示例?我似乎无法弄清楚我做错了什么。

【问题讨论】:

  • TwitterOAuth 目前不支持媒体上传。希望以后能增加支持。
  • @abraham,知道我们什么时候希望支持媒体上传吗?另外,对于那些仍想通过脚本上传媒体的人,您有什么建议?

标签: php twitter twitter-oauth


【解决方案1】:

在几个小时内使用 twitterauth 库处理 UPDATE_WITH_MEDIA 的解决方案后,我发现以下解决方案可以正常工作:

  • 首先:从 Twitter Dev here 链接的 PHP 原始库不起作用。

不适用于 UPDATE_WITH_MEDIA

基本区别是原版有“post”功能,没有“$multipart”参数。此参数允许发送 Twiiter 在文档中要求的内容:多部分 enctype 帖子。所以最后基本代码如下:

$image_path="folder/image.jpg";

$handle = fopen($image_path,'rb');
$image  = fread($handle,filesize($image_path));
fclose($handle);

$params = array(
  'media[]' => "{$image};type=image/jpeg;filename={$image_path}",
  'status'  => "Put your message here, must be less than 117 characters!"
);
$post = $connection->post('statuses/update_with_media', $params, true);

重要!如果你用原始库尝试这段代码,你会发现一个错误。您必须从上面的链接下载并替换项目中的两个文件(OAuth.php 和 twitteroauth.php)。

【讨论】:

  • 太棒了!谢谢,这对我也有用。不幸的是,由于 CURLFile 的要求,Natefanaro 的库不适用于 PHP 5.5+。您的解决方案和库的链接分支是该线程上唯一对我有用的选项之一。我还猜测 fopen 是处理图像的更好方法,因为它也应该允许您拉入远程图像。
【解决方案2】:

尝试使用 codebird-php https://github.com/mynetx/codebird-php

事实证明,尽管它在 Twitter 建议的 php 库列表中排在最后,但它确实成功了。只需从 git repo 中获取 codebird.php 和 cacert.pem。

    include_once('codebird.php');
    \Codebird\Codebird::setConsumerKey($consumer_key, $consumer_secret);
    $cb = \Codebird\Codebird::getInstance();
    $cb->setToken($token, $token_secret);
    $status = 'Gamo, I just tweeted with an image!';
    $filename = '/home/asdf/test.png';
    $cb->statuses_updateWithMedia(array('status' => $status, 'media[]' => $filename));

【讨论】:

  • 经过一个小时的努力让 Abraham twitteroauth 执行此操作后,我找到了您的答案,并在 3 分钟内使其正常工作。谢谢!
  • 我这几天一直在为自动推特而苦苦挣扎。现在我找到了你的代码,它似乎比其他任何代码都简单,但我仍然无法让它工作。我下载了声明密钥和令牌变量的 codebird 文件(codebird.php 和 cacert.pem),并将 $filename 更改为指向我服务器上的图像。它没有工作:(
  • @ahojvole 很抱歉听到这个消息。一年前我使用了这个库。也许codebird的作者改变了一些东西。您应该查看 codebird 的文档。
  • @ahojvole 你提到的 cacert.pem 是什么?
  • @gtsouk 有点尴尬我不能说 cacert.pem 文件是干什么用的,但是 codebird.php 在没有这个文件的情况下要求这个文件(可能在以后的版本中),甚至没有文本被推文。
【解决方案3】:

原始库不包含上传媒体功能。 您可以查看https://github.com/natefanaro/twitteroauth

【讨论】:

  • 很遗憾,此库更新不适用于 PHP 5.5 或更高版本。
【解决方案4】:

我建议您使用 Fiddler2 或其他类似工具来检查和比较使用 twitteroauth 和 tmhOAuth 发出的消息。你会看到不同之处。

根据我的经验,这是向 Twitter 发送 HTTP POST 的样子,使用 update_with_media.{xml,json}。我相信,您使用的后缀只会影响响应。 (您的应用程序必须以特定于 你的应用程序。)

您想让 twitteroauth 发布类似以下内容的内容

POST https://upload.twitter.com/1/statuses/update_with_media.xml HTTP/1.1
Authorization: OAuth oauth_callback="oob", oauth_consumer_key="xxxxxxxxxxxx", oauth_nonce="7774328k", oauth_signature="pUYjRnccmrBYiO1j9cliETsw%2B5s%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1318300521", oauth_token="59152613-vrlZ2edX56PudQtBmpAWd3SPDt9cPyAhibO7ysl6W", oauth_version="1.0"
Content-Type: multipart/form-data; boundary=======c49479438c600bf59345e======
Host: upload.twitter.com
Content-Length: 7320
Connection: Keep-Alive

--======c49479438c600bf59345e======
Content-Disposition: form-data; name="status"

working on a Tweet tool that uses the OAuth Manager library.
--======c49479438c600bf59345e======
Content-Disposition: file; name="media[]"; filename="ThisIsAPicture.png"
Content-Type: image/png

  ...binary png data here...

--======c49479438c600bf59345e======--

【讨论】:

  • 亲爱的@Cheeso,你能解释一下上面几行吗.. 把这段代码放在哪里以及如何运行?它上面的php
  • 这些是消息。您希望您的代码生成这些消息。您不运行它。这就是输出。
  • stackoverflow.com/questions/11243612/… 这有什么问题?你能帮帮我吗?
【解决方案5】:

我想发送带有状态参数的 url 链接

like : 把你的消息放在这里

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2015-11-16
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    相关资源
    最近更新 更多