如何使用 Codebird PHP 从弹出窗口发布推文

2022-08-30 17:55:18

我正在尝试允许我的网站的访问者直接从网站上发布带有图像的推文。我正在使用Codebird PHP库来完成这项工作。到目前为止,一切都正常工作,但是在发布到用户帐户之前,没有预览帖子。目前,它只是在他们点击按钮后立即直接发布到他们的帐户。

我想要的是让它弹出一个小窗口,如果他们还没有登录,它会要求他们登录,或者它会显示推文的预览,并允许他们点击“推文”按钮,如果他们登录,如下图所示:

sample tweet popup window

这是我的PHP:

function tweet($message,$image) {
    require_once('codebird.php');
    \Codebird\Codebird::setConsumerKey("MYCONSUMERKEY", "MYCONSUMERSECRET");
    $cb = \Codebird\Codebird::getInstance();
    session_start();

    if (! isset($_SESSION['oauth_token'])) {
      // get the request token
      $reply = $cb->oauth_requestToken([
        'oauth_callback' => 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']
      ]);

      // store the token
      $cb->setToken($reply->oauth_token, $reply->oauth_token_secret);
      $_SESSION['oauth_token'] = $reply->oauth_token;
      $_SESSION['oauth_token_secret'] = $reply->oauth_token_secret;
      $_SESSION['oauth_verify'] = true;

      // redirect to auth website
      $auth_url = $cb->oauth_authorize();
      header('Location: ' . $auth_url);
      die();

    } elseif (isset($_GET['oauth_verifier']) && isset($_SESSION['oauth_verify'])) {
      // verify the token
      $cb->setToken($_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
      unset($_SESSION['oauth_verify']);

      // get the access token
      $reply = $cb->oauth_accessToken([
        'oauth_verifier' => $_GET['oauth_verifier']
      ]);

      // store the token (which is different from the request token!)
      $_SESSION['oauth_token'] = $reply->oauth_token;
      $_SESSION['oauth_token_secret'] = $reply->oauth_token_secret;

      // send to same URL, without oauth GET parameters
      header('Location: ' . basename(__FILE__));
      die();
    }

    // assign access token on each page load
    $cb->setToken($_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
    $reply = $cb->media_upload(array(
        'media' => $image
    ));
    $mediaID = $reply->media_id_string;
    $params = array(
        'status' => $message,
        'media_ids' => $mediaID
    );
    $reply = $cb->statuses_update($params);
}

tweet("Tweet tweet","assets/tweet.jpg");

这是我的Javascript / HTML:

function postTweet() {
  $.ajax({
    type: "POST",
    url: 'tweet.php',
    data:{action:'call_this'},
    success:function(html) {
      alert('Success!');
    }
  });
}
<button class="download-share" onclick="postTweet()">Download and Share</button>

答案 1

在按钮单击中,您需要另一个功能来打开弹出窗口以及推文按钮。

将单击事件侦听器添加到新的推文按钮。postTweet

我创建了一个示例代码段。请在下面查看。

若要显示实时预览,需要将事件侦听器添加到文本区域,该文本区域应复制其值并将其添加为预览窗格。keyupinnerHTML

function openTweet(){
    document.getElementsByClassName("preview")[0].style.display="";
    document.getElementById("tweetPr").innerHTML = document.getElementById("tweet").value;
    document.getElementById("tweet").addEventListener("keyup",
      function(){
          document.getElementById("tweetPr").innerHTML = document.getElementById("tweet").value;
      });
      document.getElementsByClassName("download-share")[0].style.display="none";
}

function postTweet() {
  $.ajax({
    type: "POST",
    url: 'tweet.php',
    data:{action:'call_this'},
    success:function(html) {
      alert('Success!');
    }
  });
}
<div style="display:none;" class="preview"><textarea id="tweet"> </textarea><div id="tweetPr"></div><button onclick="postTweet();">Tweet</button></div>
<button class="download-share" onclick="openTweet()">Download and Share</button>

答案 2

首先,你(codebird)使用twitter API发布到twitter,它利用API中的状态/更新端点。此调用是服务器到服务器的调用,即从托管文件的服务器到Twitter服务器。https://dev.twitter.com/rest/reference/post/statuses/update

我看到有2种可能性可以让你完成你的想法

- 首先是使用twitters网络意图系统,您可以使用该系统将推文作为查询字符串发送,只要您已将twitter js文件包含在 https://dev.twitter.com/web/tweet-button/web-intent

- 其次,如果这不是您的风格,那么您可以尝试像@ceejayoz提到的那样,通过重新创建必要的输入来创建一个新窗口,如图所示,并按照您现在相同的过程进行操作

现在回答你的问题,既然你有一个图像,网络意图选项将不起作用,但如果它是一个带有图像(twitter卡)的链接,那么我认为twitter机器人应该能够通读页面并在弹出窗口中显示预览,前提是你在链接的页面上有正确的元标记