prettifystudio / twitter
PHP & Laravel 的 Twitter API
Requires
- php: ^8.0.2
- ext-json: *
- guzzlehttp/guzzle: ^6.4 || ^7.0
- guzzlehttp/oauth-subscriber: ^0.6
- illuminate/support: ^9
- kamermans/guzzle-oauth2-subscriber: ^1.0
- league/oauth2-client: ^2.6
- nesbot/carbon: ^1.2 || ^2.26
- php-di/php-di: ^6.2
- phpoption/phpoption: ^1.7
- psr/log: ^1.1 || ^2.0 || ^3.0
- react/http: ^1.2
- vlucas/phpdotenv: *
Requires (Dev)
- orchestra/testbench: ^7.0
- phpspec/prophecy-phpunit: ^2.0
- phpunit/phpunit: ^8.3 || ^9.1
README
Laravel 6.x, 7.x, 8.x (以及发布的新版本) 的 Twitter API。同时支持其他框架通过 PHP-DI (或者您也可以通过 PR 添加对您框架的支持)
注意:这是从 atymic\twitter 克隆的。所有这些工作都是他的工作。
您需要在 应用程序管理 中创建一个应用程序并创建您的访问令牌。
安装
composer require Prettify/twitter
Laravel 配置
只需在您的 .env
中设置以下环境变量。
TWITTER_CONSUMER_KEY=
TWITTER_CONSUMER_SECRET=
TWITTER_ACCESS_TOKEN=
TWITTER_ACCESS_TOKEN_SECRET=
TWITTER_API_VERSION=
高级 Laravel 配置
运行 php artisan vendor:publish --provider="PrettifyStudio\Twitter\ServiceProvider\LaravelServiceProvider"
/config/twitter.php
版本
3.x
3.x 是当前的主要版本,与 2.x 不兼容。
请参阅 UPGRADE.md 中的迁移指南。
2.x
2.x 已不再维护。我们不接受错误修复,请升级到 3.x
用法
输出格式
您可以选择三种不同的输出格式。默认情况下,响应将以对象的形式返回。要更改此,请使用您传递给任何方法的参数中的 format
选项。
format : object|json|array (default:object)
Twitter API 版本
要将默认的 Twitter API 版本设置为 v2 而不是默认的 v1.1
,请将 TWITTER_API_VERSION
设置为 2
在您的 .env
中。
如果您已将 v1.1
api 设置为默认,您可以使用 Twitter::forApiV2()
获取 v2 客户端的实例。同样,从 v2 客户端获取 v1
实例,使用 Twitter::forApiV1()
。
在 v1
或 v2
客户端实例上调用 Twitter::forApiV1()
是安全的。
函数
Twitter API v1.1
账户
getSettings()
- 返回认证用户的设置(包括当前趋势、地理位置和睡眠时间信息)。getCredentials()
postSettings()
- 更新认证用户的设置。postSettingsDevice()
- 为认证用户设置 Twitter 传送更新到哪个设备。将设备参数发送为 none 将禁用短信更新。postProfile()
- 设置用户可以在其设置页面“账户”选项卡下设置的一些值。只有指定的参数将被更新。postBackground()
- 更新认证用户的个人资料背景图片。此方法也可以用来启用或禁用个人资料背景图片。postProfileImage()
- 更新认证用户的个人资料图片。请注意,此方法期望原始的多部分数据,而不是指向图片的 URL。destroyUserBanner()
- 删除上传的个人资料横幅。在成功时返回 HTTP 200。postUserBanner()
- 代表认证用户上传个人资料横幅。为了获得最佳效果,请上传个人资料对象中的 profile_banner_url 节点。
账户活动(高级版)
setWebhook($env, $url)
- 在给定环境中为所有事件类型注册 webhook URL。crcHash($crcToken)
- 根据给定的CRC令牌和消费者密钥返回HMAC SHA-256哈希值。您需要在webhook中返回此信息(更多信息)。getWebhooks($env)
- 返回指定环境的webhook URL(如果没有提供任何环境,则返回所有环境的webhook URL)及其验证应用的状况。updateWebhooks($env, $webhookId)
- 触发给定环境的webhook的所有活动的挑战响应检查(CRC)。如果检查成功,则返回true并将webhook的状态设置为有效,重新启用。destroyWebhook($env, $webhookId)
- 从提供的应用程序的所有活动配置中删除webhook。成功时返回true。setSubscriptions($env)
- 将提供的应用程序订阅到指定环境的所有事件以及所有消息类型。成功时返回true。getSubscriptions($env)
- 如果提供的用户上下文与提供的应用程序有活动订阅,则返回true。getSubscriptionsCount()
- 返回您账户上所有活动的活动订阅总数。getSubscriptionsList($env)
- 返回当前所有活动类型订阅的列表。destroyUserSubscriptions($env, $userId)
- 从环境中停用指定用户ID的订阅。成功时返回true。
屏蔽
getBlocks()
- 返回一个用户对象集合,表示认证用户正在屏蔽的用户。getBlocksIds()
- 返回认证用户正在屏蔽的用户的数字用户ID数组。postBlock()
- 屏蔽指定的用户,使其无法关注认证用户。此外,被屏蔽的用户不会出现在认证用户的提及或时间线中(除非被其他用户转发)。如果存在关注或朋友关系,则将其销毁。destroyBlock()
- 为认证用户取消屏蔽ID参数中指定的用户。成功时返回取消屏蔽的用户,以请求的格式返回。如果屏蔽之前存在关系,则不会恢复。
私信
getDm()
- 根据ID参数返回单个私信事件。getDms()
- 返回过去30天内所有直接消息事件(包括发送和接收的),按时间倒序排序。destroyDm()
- 销毁在所需ID参数中指定的直接消息。认证用户必须是该直接消息的收件人。postDm()
- 发布一个新的message_create事件,将一条直接消息从认证用户发送到指定的用户。成功时返回事件。支持发布带有可选快速回复和媒体附件的直接消息。
收藏
getFavorites()
- 返回认证用户或指定用户最近20条收藏的推文。destroyFavorite()
- 取消收藏ID参数中指定的状态作为认证用户。成功时返回取消收藏的状态,以请求的格式返回。postFavorite()
- 收藏ID参数中指定的状态作为认证用户。成功时返回收藏的状态。
友谊
getNoRters()
- 返回当前认证用户不想接收转发推文的用户ID集合。getFriendsIds()
- 返回每个跟随指定用户的用户的用户ID的cursored集合。getFollowersIds()
- 返回每个跟随指定用户的用户的用户ID的cursored集合。getFriendshipsIn()
- 返回每个向认证用户发送关注请求的用户的数字ID集合。getFriendshipsOut()
- 返回认证用户向其发送关注请求的每个受保护用户的数字ID集合。postFollow()
- 允许认证用户关注ID参数中指定的用户。postUnfollow()
- 允许认证用户取消关注ID参数中指定的用户。postFollowUpdate()
- 允许启用或禁用来自指定用户的转发和设备通知。getFriendships()
- 返回两个任意用户之间关系的详细信息。getFriends()
- 返回指定用户所关注的每个用户的用户对象集合(也称为“朋友”)。getFollowers()
- 返回关注指定用户的用户对象的游标集合。getFriendshipsLookup()
- 返回认证用户与逗号分隔的最多100个screen_names或user_ids提供的列表之间的关系。连接的值可以是:following、following_requested、followed_by、none、blocking、muting。
地理
getGeo()
- 返回关于已知地点的所有信息。getGeoReverse()
- 给定纬度和经度,搜索最多20个可以用于更新状态时作为place_id的地点。getGeoSearch()
- 搜索可以附加到statuses/update的地点。给定纬度和经度对、IP地址或名称,此请求将返回所有有效的地点列表,这些地点可以在更新状态时用作place_id。getGeoSimilar()
- 定位与给定坐标相似的地点。从概念上讲,您会使用此方法首先获取一组已知地点进行选择。然后,如果所需的地点不存在,请向POST geo/place发出请求以创建新地点。响应中包含的令牌是创建新地点所需的令牌。
帮助
postSpam()
- 将指定的用户报告为Twitter的垃圾邮件账户。此外,代表认证用户执行POST blocks / create的等效操作。getHelpConfiguration()
- 返回Twitter当前使用的配置,包括twitter.com的slugs(不是用户名)、最大照片分辨率和t.co URL长度。getHelpLanguages()
- 返回Twitter支持的语言列表以及Twitter支持的语言代码。getHelpPrivacy()
- 返回Twitter的隐私政策。getHelpTos()
- 返回Twitter的服务条款。注意:这些条款与开发者政策不同。getAppRateLimit()
- 返回指定资源家族的方法的当前速率限制。
列表
getLists()
- 返回认证用户或指定用户订阅的所有列表,包括他们自己的列表。使用user_id或screen_name参数指定用户。如果没有指定用户,则使用认证用户。getListStatuses()
- 返回指定列表成员撰写的推文的时间线。默认情况下包括转发。使用include_rts=false参数省略转发。destroyListMember()
- 从列表中删除指定的成员。认证用户必须是列表的所有者才能从列表中删除成员。getListsMemberships()
- 返回指定用户被添加到的列表。如果没有提供user_id或screen_name,则返回认证用户的会员资格。getListsSubscribers()
- 返回指定列表的订阅者。如果认证用户是指定的列表的所有者,则仅显示私人列表的订阅者。postListSubscriber()
- 订阅认证用户到指定的列表。getListSubscriber()
- 返回指定列表的订阅者。如果认证用户是列表的所有者,则仅显示私人列表的订阅者。destroyListSubscriber()
- 从指定列表中取消订阅认证用户。postListCreateAll()
- 通过指定以逗号分隔的成员ID或屏幕名称列表,将多个成员添加到列表中。认证用户必须拥有该列表才能添加成员。请注意,列表不能超过5,000个成员,并且使用此方法一次最多只能添加100个成员到列表中。getListMember()
- 检查指定的用户是否是指定列表的成员。getListMembers()
- 返回指定列表的成员。只有认证用户拥有指定的列表时,才会显示私有列表成员。postListMember()
- 将成员添加到列表中。认证用户必须拥有列表才能添加成员。请注意,列表不能超过5,000个成员。destroyList()
- 删除指定的列表。认证用户必须拥有列表才能将其删除。postListUpdate()
- 更新指定的列表。认证用户必须拥有列表才能更新它。postList()
- 为认证用户创建一个新的列表。请注意,每个账户最多只能创建20个列表。getList()
- 返回指定的列表。只有认证用户拥有指定的列表时,才会显示私有列表。getListSubscriptions()
- 获取指定用户订阅的列表集合,默认每页20个列表。不包括用户的个人列表。destroyListMembers()
- 通过指定以逗号分隔的成员ID或屏幕名称列表,从列表中删除多个成员。认证用户必须拥有列表才能从列表中删除成员。请注意,列表不能超过500个成员,并且使用此方法一次最多只能删除100个成员到列表中。getListOwnerships()
- 返回指定Twitter用户的列表所有权。只有认证用户也是列表的所有者时,才会显示私有列表。
媒体
uploadMedia()
- 将媒体(图片)上传到Twitter,用于推文或Twitter托管卡片。
搜索
getSearch()
- 返回与指定查询匹配的相关推文集合。getSavedSearches()
- 返回认证用户的已保存搜索查询。getSavedSearch()
- 获取给定id表示的已保存搜索的信息。请求的已保存搜索ID的所有者必须是认证用户。postSavedSearch()
- 为认证用户创建一个新的已保存搜索。用户最多只能有25个已保存搜索。destroySavedSearch()
- 删除认证用户的已保存搜索。请求删除的已保存搜索ID的所有者必须是认证用户。
状态
getMentionsTimeline()
- 返回认证用户最近的20条提及(包含用户的@screen_name的推文)。getUserTimeline()
- 返回由screen_name或user_id参数指定的用户最近发布的推文集合。getHomeTimeline()
- 返回认证用户及其关注的用户最近发布的推文和转发的推文集合。主页时间线是大多数用户与Twitter服务互动的核心。getRtsTimeline()
- 返回认证用户创作的最近被他人转发的推文。getRts()
- 返回id参数指定的推文最近的100条转发的集合。getTweet()
- 返回由id参数指定的单个推文。推文的作者也将嵌入到推文中。destroyTweet()
- 销毁指定ID参数的状态。认证用户必须是该状态的作者。如果成功,则返回销毁的状态。postTweet()
- 更新认证用户的当前状态,也称为发推。postRt()
- 转发一条推文。返回包含转发详情的原始推文。getOembed()
- 以oEmbed兼容的格式返回单个推文,指定方式可以是推文网页URL或推文ID。当页面包含Twitter的小部件JavaScript时,返回的HTML片段将自动识别为嵌入的推文。getRters()
- 返回最多100个属于已经转发指定id参数推文的用户ID的集合。getStatusesLookup()
- 返回最多100条推文每个请求的完整推文对象,通过id参数传递的逗号分隔值指定。
趋势
getTrendsPlace()
- 如果有趋势信息,则返回特定WOEID的前10个热门话题。getTrendsAvailable()
- 返回Twitter有趋势话题信息的地点。getTrendsClosest()
- 返回Twitter有趋势话题信息的地点,最接近指定地点。
用户
getUsersLookup()
- 返回最多100个用户每个请求的完整用户对象,通过user_id和/或screen_name参数传递的逗号分隔值指定。getUsers()
- 返回关于指定用户_id或screen_name参数的多种信息。如果可能,将返回作者的最近推文。getUsersSearch()
- 提供一个简单、基于相关性的搜索接口,用于Twitter上的公共用户账户。可以通过主题兴趣、全名、公司名称、位置或其他标准进行查询。不支持精确匹配搜索。getUserBanner()
- 返回指定用户个人资料横幅的可用尺寸变体映射。如果用户未上传个人资料横幅,则将提供HTTP 404。此方法可以替代在用户对象中返回的profile_banner_url上的字符串操作,如个人资料图片和横幅中所述。muteUser()
- 对认证用户静音指定ID参数中的用户。unmuteUser()
- 对认证用户取消静音指定ID参数中的用户。mutedUserIds()
- 返回认证用户静音的数字用户ID数组。mutedUsers()
- 返回认证用户静音的用户对象数组。getSuggesteds()
- 访问Twitter推荐用户列表中给定类别的用户。getSuggestions()
- 访问Twitter推荐用户列表。此操作返回推荐用户类别列表。可以使用该类别在GET users / suggestions / :slug中获取该类别的用户。getSuggestedsMembers()
- 访问Twitter推荐用户列表中给定类别的用户,并在它们不是受保护用户的情况下返回他们的最新状态。
Twitter API v2
推文查找
getTweet()
- 返回关于请求ID指定的单个推文的多种信息。getTweets()
- 返回关于请求ID或ID列表指定的推文的多种信息。
搜索推文
-
searchRecent()
- 最近搜索端点返回与搜索查询匹配的过去七天的推文。 -
searchAll()
- 完整存档搜索端点返回与搜索查询匹配的公共推文的历史记录;自2006年3月26日第一条推文创建以来。注意: 此端点仅供获得学术研究产品轨道批准的人员使用。
时间线
userTweets()
- 返回由指定用户ID的单个用户组成的推文。默认情况下,每次请求返回最近的10条推文。使用分页,可以检索最近的3,200条推文。userMentions()
- 返回提及指定用户ID的单个用户的推文。默认情况下,每次请求返回最近的10条推文。使用分页,最多可以检索最近的800条推文。
过滤流
getStreamRules()
- 返回当前在流式传输端点启用的规则列表,可以是列表或单个规则。postStreamRules()
- 向流中添加或删除规则。getStream()
- 根据一组特定的过滤规则实时传输推文。
样本流
getSampledStream()
- 实时传输大约1%的所有推文。
隐藏回复
hideTweet()
- 隐藏或显示对推文的回复。
推文计数
-
countRecent()
- 接收在过去7天内与查询匹配的推文数量。 -
countAll()
- 接收与查询匹配的推文数量。注意: 仅可通过学术研究产品渠道使用。
辅助函数
Linkify:将URL、@用户名、标签转换为链接。$tweet的类型可以是对象、数组或文本。通过发送对象或数组,方法将展开链接(t.co)。
Twitter::linkify($tweet);
Ago:将日期转换为差异(2小时前)
Twitter::ago($timestamp);
LinkUser:通过用户对象(如$tweet->user)或ID/字符串生成指向特定用户的链接。
Twitter::linkUser($user);
LinkTweet:生成指向特定推文的链接。
Twitter::linkTweet($tweet);
示例
返回由screen_name或user_id参数指示的用户最近发布的推文集合。
Route::get('/userTimeline', function() { return Twitter::getUserTimeline(['screen_name' => 'thujohn', 'count' => 20, 'response_format' => 'json']); });
返回认证用户及其所关注用户最近发布的推文和转推文集合。
Route::get('/homeTimeline', function() { return Twitter::getHomeTimeline(['count' => 20, 'response_format' => 'json']); });
返回认证用户最近的X条提及(包含用户@screen_name的推文)。
Route::get('/mentionsTimeline', function() { return Twitter::getMentionsTimeline(['count' => 20, 'response_format' => 'json']); });
更新认证用户的当前状态,也称为推文。
Route::get('/tweet', function() { return Twitter::postTweet(['status' => 'Laravel is beautiful', 'response_format' => 'json']); });
使用媒体更新认证用户的当前状态。
Route::get('/tweetMedia', function() { $uploaded_media = Twitter::uploadMedia(['media' => File::get(public_path('filename.jpg'))]); return Twitter::postTweet(['status' => 'Laravel is beautiful', 'media_ids' => $uploaded_media->media_id_string]); });
使用电子邮件获取用户凭证。
$credentials = Twitter::getCredentials([
'include_email' => 'true',
]);
在上面的示例中,您需要将true作为字符串传递,而不是作为布尔值。布尔值将被转换为
1
,Twitter会忽略它。
这也假定您已正确设置Twitter的权限。在设置您的Twitter应用时,您必须选择“获取用户电子邮件”,仅传递值是不够的。
使用Twitter登录
use Prettify\Twitter\Facade\Twitter; Route::get('twitter/login', ['as' => 'twitter.login', static function () { $token = Twitter::getRequestToken(route('twitter.callback')); if (isset($token['oauth_token_secret'])) { $url = Twitter::getAuthenticateUrl($token['oauth_token']); Session::put('oauth_state', 'start'); Session::put('oauth_request_token', $token['oauth_token']); Session::put('oauth_request_token_secret', $token['oauth_token_secret']); return Redirect::to($url); } return Redirect::route('twitter.error'); }]); Route::get('twitter/callback', ['as' => 'twitter.callback', static function () { // You should set this route on your Twitter Application settings as the callback // https://apps.twitter.com/app/YOUR-APP-ID/settings if (Session::has('oauth_request_token')) { $twitter = Twitter::usingCredentials(session('oauth_request_token'), session('oauth_request_token_secret')); $token = $twitter->getAccessToken(request('oauth_verifier')); if (!isset($token['oauth_token_secret'])) { return Redirect::route('twitter.error')->with('flash_error', 'We could not log you in on Twitter.'); } // use new tokens $twitter = Twitter::usingCredentials($token['oauth_token'], $token['oauth_token_secret']); $credentials = $twitter->getCredentials(); if (is_object($credentials) && !isset($credentials->error)) { // $credentials contains the Twitter user object with all the info about the user. // Add here your own user logic, store profiles, create new users on your tables...you name it! // Typically you'll want to store at least, user id, name and access tokens // if you want to be able to call the API on behalf of your users. // This is also the moment to log in your users if you're using Laravel's Auth class // Auth::login($user) should do the trick. Session::put('access_token', $token); return Redirect::to('/')->with('notice', 'Congrats! You\'ve successfully signed in!'); } } return Redirect::route('twitter.error') ->with('error', 'Crab! Something went wrong while signing you up!'); }]); Route::get('twitter/error', ['as' => 'twitter.error', function () { // Something went wrong, add your own error handling here }]); Route::get('twitter/logout', ['as' => 'twitter.logout', function () { Session::forget('access_token'); return Redirect::to('/')->with('notice', 'You\'ve successfully logged out!'); }]);
Webhook
为了成功设置Webhook,您需要从Webhook URL返回一个使用CRC令牌的哈希(更多信息)。
Route::post('twitter/webhook', ['as' => 'twitter.webhook', function(){ if (request()->has('crc_token')) return response()->json(['response_token' => Twitter::crcHash(request()->crc_token)], 200); // Your webhook logic goes here }]);
Twitter API v2 示例
获取用户推文
// ... use Prettify\Twitter\Twitter as TwitterContract; use Illuminate\Http\JsonResponse; use Twitter; // ... public function userTweets(int $userId): JsonResponse { $params = [ 'place.fields' => 'country,name', 'tweet.fields' => 'author_id,geo', 'expansions' => 'author_id,in_reply_to_user_id', TwitterContract::KEY_RESPONSE_FORMAT => TwitterContract::RESPONSE_FORMAT_JSON, ]; return JsonResponse::fromJsonString(Twitter::userTweets($userId, $params)); }
搜索推文
// ... public function searchRecent(string $query): JsonResponse { $params = [ 'place.fields' => 'country,name', 'tweet.fields' => 'author_id,geo', 'expansions' => 'author_id,in_reply_to_user_id', TwitterContract::KEY_RESPONSE_FORMAT => TwitterContract::RESPONSE_FORMAT_JSON, ]; return JsonResponse::fromJsonString(Twitter::searchRecent($query, $params)); } // ...
调用新添加的端点
由于Twitter API v2处于积极开发中,您可能需要调用“函数”部分上未明确记录的端点。以下是如何使用此包调用任何新添加端点的示例。这里我们使用新添加的“最近计数”端点。
// ... $querier = \Prettify\Twitter\Facade\Twitter::forApiV2() ->getQuerier(); $result = $querier ->withOAuth2Client() ->get('tweets/counts/recent', ['query' => 'foo']); // ...
调试
首先在配置文件中激活调试模式。
然后您可以通过logs()方法访问日志。
try { $response = Twitter::getUserTimeline(['count' => 20, 'response_format' => 'array']); } catch (Exception $e) { // dd(Twitter::error()); dd(Twitter::logs()); } dd($response);