PHP小工具连接Twitter API V2
清明假期后突然来了一个需求:要在一个PHP服务器环境中,连接推特API获取数据,筛出一批有过特定行为的关注者名单。看推特文档,这个事按理该用Account Activity API,通过自定义webhook来实现对这些特定行为的即时处理,但这个API貌似要申请Enterprise权限,还挺麻烦。于是决定还是用已经有的开发者权限,连接Twitter API v2,跑通拿到数据就齐活了。
Twitter API的文档相当完备,条分缕析、详尽规整。但如果完全没有相关经验也很容易迷失其中,茫然无从下手。建议挑一个最核心的需求做为突破点,直接看具体细节。对我来说这个点就是获取关注者,这部分文档可以在左侧导航栏中依次点击Twitter API->Twitter API v2->Users->Follows进入。在这个数据点(endpoint)的文档页中,右侧上方有四个内容标签,分别是Introduction(简介)、Quick Start(快捷上手)、Migrate(从版本1.1迁移到2的说明)以及API reference(API参考)。简介部分都是blah blah的废话,快捷上手部分有很明晰的步骤,但都是基于Postman这种API接口测试工具的,如果没有这个工具的账号这部分内容就不好使了,所以最后还是要看API参考部分(见下图)。
根据需求,我们要获取的是关注者信息,所以点击Lookup followers of a user by ID后面的链接,在随后出现页面中的Example requests部分里,可以看到一个用curl命令发送请求的范例:curl -X GET "https://api.twitter.com/2/users/2244994945/followers?max_results=10" -H "Authorization: Bearer $ACCESS_TOKEN"
有这个其实就差不多够了,下一步可以用PHP编程,将自己的用户ID(范例中的2244994945部分)和Bearer Token(范例中的$ACCESS_TOKEN部分)代入,形成正确的请求以获取数据。当然,这个页面中还有一些重要信息,比如上方的Authentication and rate limits(验证和速率限制)内容,明确说明这个功能对开发者账号的限制是每15分钟的时间窗口中最多请求15次;还有就是Path parameters和Query parameters这种请求参数的说明,也要仔细看清楚。
Twitter开发者门户设置
下一步要到Twitter开发者门户中进行应用程序的创建和设置,并拿到Bearer Token。用开发者账户登录推特,进入Twitter Developer Portal,创建一个新的Project/App,然后进行设置:
输入App基本信息后,点击User authentication settings下的Set up按钮;
开启OAuth 2.0、选择App类型、填写回调Callback网址和自己的网站网址;
随后进入Keys & Tokens内容,页面中会显示用于向Twitter API验证自己身份的各种API Key和secret,将这些信息复制并保存到自己电脑的文档中,一定要保密决不能泄露给无关人士。
代码
具体功能的实现分布在三个PHP文件以及一个文本log文件中。文本文件可以事先创建好,与PHP文件放在同一路径下。
config.php
这个文件中集中保存了所有的设置信息。
<?php
/*
* Description
Twitter API工具设置信息
* Changelog
* 2022-04-06: 创建设置信息文件
*/
return [
'twitter_id'=>xxxxxxxx,//要查看信息的推特ID
'bearer_token'=>'xxxxxxxx',//之前记录下来的Bearer Token
'follower_data'=>'followers.log',//保存关注者信息的文本文件名
];
functions.php
这个文件中是一些可复用的功能模块。
<?php
/*
* Description
Twitter API工具功能模块
* Changelog
* 2022-04-06: 创建
*/
date_default_timezone_set('Asia/Chongqing');
function storeFollowerData($data)
{
//将获取到的关注者信息保存到文本文件中
global $config;
$file=fopen($config['follower_data'], "a");
foreach ($data as $item) {
$newLine=$item->id.",".$item->username."\r\n";
fwrite($file, $newLine);
}
fclose($file);
}
function storeRetweetData($retweetid, $data)
{
//将转发了某条推特的用户信息保存到文本文件中
global $config;
$file=fopen($config['retweet_data'], "a");
foreach ($data as $item) {
$newLine=$retweetid.",".$item->id."\r\n";
fwrite($file, $newLine);
}
fclose($file);
}
function curlTwitterData($url)
{
//用curl方式向twitter api v2数据点发送get请求以获取数据
global $config;
$auth='Authorization: Bearer '.$config['bearer_token'];
$twitter=curl_init();
curl_setopt($twitter, CURLOPT_URL, $url);
curl_setopt($twitter, CURLOPT_HTTPHEADER, array('Content-Type: application/json' , $auth));
curl_setopt($twitter, CURLOPT_RETURNTRANSFER, true);
curl_setopt($twitter, CURLOPT_FOLLOWLOCATION, 1);
$result=json_decode(curl_exec($twitter));
curl_close($twitter);
return $result;
}
follower.php
通过在命令行下执行follower.php,可以获取全部关注者的信息,并将其保存到followers.log文本文件中。这里要注意的是Twitter API每次请求默认返回100条用户信息,如关注者数量超过此数,会在返回的数据中多一个next_token数据。在下次请求中将这个token做为pagination_token参数发送出去,才能获得下一页100条用户数据。而如果要连续发送请求,则要考虑到前述的速率限制问题,否则很可能违规。因为要遵守这个时限规定,follower.php的执行时间会比较长,所以要在代码中重置PHP页面执行时长,并在每次发送数据请求时做echo输出,提示执行者等待。
<?php
/*
* Description
连接Twitter API v2以获取关注者信息
* Changelog
* 2022-04-06: 创建
*/
$config=require_once('config.php');
include('functions.php');
$url="https://api.twitter.com/2/users/".$config['twitter_id']."/followers";
$result=curlTwitterData($url);
$count=intval($result->meta->result_count);
storeFollowerData($result->data);
$requests=1;
echo($requests."...\r\n");
while (isset($result->meta->next_token)) {//如果返回信息中包含next_token表明数据还有下一页,需要继续发送请求以得到全部数据
set_time_limit(90);//重设PHP页面执行时长,以免超时被中止执行
sleep(70);//twitter api速率限制是每15分钟的时间窗口内最多15次请求,所以两次请求间隔只要超过1分钟就可以了
$next_token=$result->meta->next_token;
$url="https://api.twitter.com/2/users/".$config['twitter_id']."/followers?pagination_token=".$next_token;
$result=curlTwitterData($url);
$count=$count+intval($result->meta->result_count);
storeFollowerData($result->data);
$requests++;
echo($requests."...\r\n");
}
echo($count." followers found, mission complete.\r\n");
其他功能
实现获取关注者信息的功能后,以此类推可以很容易的实现其他功能,比如查看是否转发了某条推特。只要将请求网址和相关参数进行替换就可以了。
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。