如何使用PHP Bitly v4缩短URL?

5

我有一段关于Bitly v3的代码,它运行良好。

<?php
$login = 'login-code-here';
$api_key = 'api-key-here';
$long_url = 'https://stackoverflow.com/questions/ask';

$ch = curl_init('http://api.bitly.com/v3/shorten?login='.$login.'&apiKey='.$api_key.'&longUrl='.$long_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$res = json_decode($result, true);
echo $res['data']['url']; // bit.ly/2PcG3Fg
?>

然而,在更新版本中如何完成这个任务呢?上面的例子使用API密钥,但已被弃用,转而采用OAuth请求。

如何使用Bitly v4缩短URL?


1
快速查看提供的文档,看起来不错,https://dev.bitly.com/v4_documentation.html你卡在哪里了? - user10051234
2个回答

26

获取通用访问令牌

进入您的 Bitly,单击右上角的汉堡菜单> "设置" > "高级设置" > "API支持" > 单击链接 "通用访问令牌"。输入密码并生成一个通用令牌。这就是您将用于身份验证的内容。

请参见https://dev.bitly.com/v4_documentation.html,查找“使用单个帐户的应用程序”部分。

身份验证方式已经根据https://dev.bitly.com/v4/#section/Application-using-a-single-account 进行了更改。

如何通过 Bitly API 进行身份验证在 V4 中发生了变化。以前,您的身份验证令牌将作为每个请求的 access_token 查询参数提供。V4 要求令牌作为每个请求的 Authorization 标头的一部分提供。

代码

请参阅此文档https://dev.bitly.com/v4/#operation/createFullBitlink,了解 Bitly 的预期信息。

在 v4 中,您可以像这样在标头中使用通用令牌作为承载者进行每个请求:

<?php

$long_url = 'https://stackoverflow.com/questions/ask';
$apiv4 = 'https://api-ssl.bitly.com/v4/bitlinks';
$genericAccessToken = 'your-token';

$data = array(
    'long_url' => $long_url
);
$payload = json_encode($data);

$header = array(
    'Authorization: Bearer ' . $genericAccessToken,
    'Content-Type: application/json',
    'Content-Length: ' . strlen($payload)
);

$ch = curl_init($apiv4);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$result = curl_exec($ch);

print_r($result);

请求

您发送的 JSON 将会像这样:

{"long_url":"https:\/\/stackoverflow.com\/questions\/ask"}

响应

{
   "created_at":"1970-01-01T00:00:00+0000",
   "id":"shortcode-link-id-here",
   "link":"shortcode-link-here",
   "custom_bitlinks":[

   ],
   "long_url":"https://stackoverflow.com/questions/ask",
   "archived":false,
   "tags":[

   ],
   "deeplinks":[

   ],
   "references":{
      "group":"group-link-here"
   }
}

编辑

评论中有请求只显示短链接输出。为了做到这一点,只需按以下方式调整代码:

<?php
$long_url = 'https://stackoverflow.com/questions/ask';
$apiv4 = 'https://api-ssl.bitly.com/v4/bitlinks';
$genericAccessToken = 'your-token';

$data = array(
    'long_url' => $long_url
);
$payload = json_encode($data);

$header = array(
    'Authorization: Bearer ' . $genericAccessToken,
    'Content-Type: application/json',
    'Content-Length: ' . strlen($payload)
);

$ch = curl_init($apiv4);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$result = curl_exec($ch);
$resultToJson = json_decode($result);

if (isset($resultToJson->link)) {
    echo $resultToJson->link;
}
else {
    echo 'Not found';
}

结果(假设上面的文件是test.php)

php test.php

bit.ly/2ZbYD4Z

你好,如何只打印 bitly 的网址? - FilipeOS
那个 API URL 看起来不正确,应该是:https://api-ssl.bitly.com/v4/shorten https://dev.bitly.com/v4/#operation/createBitlink - 另外,这需要 group_guid。 - gvanto
1
@dijon 我已经编辑了我的答案,展示了如何仅输出短链接而不包括其他内容(只要链接是解码JSON的属性)。 - zedfoxus
1
@zedfoxus非常好,感谢您添加最后一部分。 - dijon
如果我需要添加自定义的后半部分怎么办? - Tormy Van Cool
显示剩余4条评论

1

这里有一个PHP包https://packagist.org/packages/codehaveli/bitly-php,可以使用。

使用该包的步骤如下:

步骤1:

composer require codehaveli/bitly-php:dev-master --prefer-source 通过composer安装该包 [如果没有安装,请从此处获取https://getcomposer.org/]

步骤2:

添加Bitly的访问令牌和组GUID [指南在此:https://www.codehaveli.com/how-to-generate-bitly-oauth-access-token/]

<?php

require 'vendor/autoload.php';

use Codehaveli\Bitly;
use Codehaveli\Exceptions\BitlyErrorException;

// First setup your credentials provided by Bitly

$accessToken  = "ACCESS_TOKEN_FROM_BITLY";
$guid         = "GUID_FROM_BITLY";

Bitly::init($accessToken, $guid);

步骤 3:

在使用访问令牌和指南进行初始化后,只需从资源中调用 getUrl 方法,就像使用 URL 一样,将给您提供短链接。

<?php

use Codehaveli\Bitly;
use Codehaveli\Exceptions\BitlyErrorException;

$accessToken  = "ACCESS_TOKEN_FROM_BITLY";
$guid         = "GUID_FROM_BITLY";

Bitly::init($accessToken, $guid);

$link = Bitly::link();

try {

    $shortLink = $link->getUrl("https://stackoverflow.com/"); // Generated link

} catch (BitlyErrorException $e) {

    $code    = $e->getCode();
    $message = $e->getMessage();
}

注意:此软件包正在积极开发中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接