Flutter Twitter API集成插件twitter_api_v2的使用
Flutter Twitter API集成插件 twitter_api_v2 的使用
简介
twitter_api_v2
是一个用于 Dart 和 Flutter 应用程序的 Twitter API v2.0 封装库。它提供了对 Twitter API v2.0 的轻松集成,并确保响应对象具有安全的类型。该库支持所有端点、请求参数和响应字段,支持高性能流式处理端点、扩展和字段特性、良好的文档和测试、强大的自动重试机制、大媒体上传(图像、GIF、视频)以及安全且强大的分页功能。
GitHub Sponsor | Maintainer | Pub Package
特性
- 支持 Twitter API v2.0
- 易于集成到 Dart 和 Flutter 应用中
- 提供带有保证安全类型的响应对象
- 支持所有端点
- 支持所有请求参数和响应字段
- 支持高性能流式处理端点
- 支持
expansions
和fields
特性 - 文档完善且经过充分测试
- 支持强大的自动重试机制
- 支持大媒体上传(图像、GIF、视频)
- 支持安全且强大的分页功能
快速开始
安装库
使用 Dart:
dart pub add twitter_api_v2
使用 Flutter:
flutter pub add twitter_api_v2
导入
import 'package:twitter_api_v2/twitter_api_v2';
实现
下面是一个完整的示例代码,展示了如何使用 twitter_api_v2
插件进行各种操作,如获取用户信息、搜索推文、上传媒体并发布带媒体的推文等。
import 'dart:async';
import 'dart:io';
import 'package:twitter_api_v2/twitter_api_v2.dart' as v2;
Future<void> main() async {
//! 您需要在 https://developer.twitter.com 获取密钥和令牌
final twitter = v2.TwitterApi(
//! 默认使用 OAuth2.0 进行身份验证。
//!
//! 注意:要使用需要特定用户权限的端点,
//! 例如推文和点赞,您需要由 OAuth2.0 PKCE 发行的令牌。
//!
//! 要实现 OAuth 2.0 PKCE 身份验证,最简单的方法是
//! 使用 [twitter_oauth2_pkce](https://pub.dev/packages/twitter_oauth2_pkce)!
bearerToken: 'YOUR_TOKEN_HERE',
//! 或者您可能更喜欢使用传统的 OAuth1.0a 方法
//! 而不是 OAuth2.0 PKCE 方法。那么您可以使用以下代码
//! 设置 OAuth1.0a 令牌。
//!
//! 但是请注意,某些端点无法用于 OAuth 1.0a 方法身份验证。
oauthTokens: v2.OAuthTokens(
consumerKey: 'YOUR_CONSUMER_KEY_HERE',
consumerSecret: 'YOUR_CONSUMER_SECRET_HERE',
accessToken: 'YOUR_ACCESS_TOKEN_HERE',
accessTokenSecret: 'YOUR_ACCESS_TOKEN_SECRET_HERE',
),
//! 当发生网络错误或服务器错误时,提供自动重试。
retryConfig: v2.RetryConfig(
maxAttempts: 5,
onExecute: (event) => print(
'Retry after ${event.intervalInSeconds} seconds... '
'[${event.retryCount} times]',
),
),
//! 默认超时时间为 10 秒。
timeout: Duration(seconds: 20),
);
try {
//! 获取已认证用户的个人资料。
final me = await twitter.users.lookupMe();
//! 根据搜索查询获取相关推文。
final tweets = await twitter.tweets.searchRecent(
query: '#ElonMusk',
maxResults: 20,
// 您可以扩展搜索结果。
expansions: [
v2.TweetExpansion.authorId,
v2.TweetExpansion.inReplyToUserId,
],
tweetFields: [
v2.TweetField.conversationId,
v2.TweetField.publicMetrics,
v2.TweetField.editControls,
],
userFields: [
v2.UserField.location,
v2.UserField.verified,
v2.UserField.entities,
v2.UserField.publicMetrics,
],
//! 安全分页易于实现。
paging: (event) {
print(event.response);
if (event.count == 3) {
return v2.ForwardPaginationControl.stop();
}
return v2.ForwardPaginationControl.next();
},
);
//! 您可以从响应对象和模型对象序列化和反序列化 JSON。
final tweetJson = tweets.data.first.toJson();
final tweet = v2.TweetData.fromJson(tweetJson);
print(tweet);
await twitter.tweets.createLike(
userId: me.data.id,
tweetId: tweets.data.first.id,
);
//! 您可以上传媒体,如图像、GIF 和视频。
final uploadedMedia = await twitter.media.uploadMedia(
file: File.fromUri(Uri.file('FILE_PATH')),
altText: 'This is alt text.',
//! 您可以检查上传进度。
onProgress: (event) {
switch (event.state) {
case v2.UploadState.preparing:
print('Upload is preparing...');
break;
case v2.UploadState.inProgress:
print('${event.progress}% completed...');
break;
case v2.UploadState.completed:
print('Upload has completed!');
break;
}
},
onFailed: (error) => print('Upload failed due to "${error.message}"'),
);
//! 您可以轻松地发布带有上传媒体的推文。
await twitter.tweets.createTweet(
text: 'Tweet with uploaded media',
media: v2.TweetMediaParam(
mediaIds: [uploadedMedia.data.id],
),
);
//! 高性能 Volume Stream 端点可用。
final sampleStream = await twitter.tweets.connectSampleStream();
await for (final response in sampleStream.stream.handleError(print)) {
print(response);
}
//! 高性能 Filtered Stream 端点也可用。
await twitter.tweets.createFilteringRules(
rules: [
v2.FilteringRuleParam(value: '#ElonMusk'),
//! 您可以使用 "FilteringRule" 对象轻松构建过滤规则。
v2.FilteringRuleParam(
//! => #Tesla has:media
value: v2.FilteringRule.of()
.matchHashtag('Tesla')
.and()
.matchTweetContainsMedia()
.build(),
),
v2.FilteringRuleParam(
//! => (#SpaceX has:media) OR (#SpaceX has:hashtags) sample:50
value: v2.FilteringRule.ofSample(percent: 50)
.group(
v2.FilteringRule.of()
.matchHashtag('SpaceX')
.and()
.matchTweetContainsMedia(),
)
.or()
.group(
v2.FilteringRule.of()
.matchHashtag('SpaceX')
.and()
.matchTweetContainsHashtags(),
)
.build(),
),
],
);
final filteredStream = await twitter.tweets.connectFilteredStream();
await for (final response in filteredStream.stream.handleError(print)) {
print(response.data);
print(response.matchingRules);
}
} on TimeoutException catch (e) {
print(e);
} on v2.UnauthorizedException catch (e) {
print(e);
} on v2.RateLimitExceededException catch (e) {
print(e);
} on v2.DataNotFoundException catch (e) {
print(e);
} on v2.TwitterUploadException catch (e) {
print(e);
} on v2.TwitterException catch (e) {
print(e.response.headers);
print(e.body);
print(e);
}
}
支持的端点
推文服务
Endpoint | Method Name |
---|---|
POST /2/tweets | createTweet |
DELETE /2/tweets/:id | destroyTweet |
用户服务
Endpoint | Method Name |
---|---|
POST /2/users/:id/likes | createLike |
DELETE /2/users/:id/likes/:tweet_id | destroyLike |
GET /2/tweets/:id/liking_users | lookupLikingUsers |
GET /2/users/:id/liked_tweets | lookupLikedTweets |
其他服务
更多端点请参阅官方文档或 API 参考。
更多信息
通过以上内容,您应该能够顺利地将 twitter_api_v2
集成到您的 Flutter 项目中,并利用其丰富的功能与 Twitter API 进行交互。如果您有任何问题或建议,请随时提交 Issue 或 Pull Request!
更多关于Flutter Twitter API集成插件twitter_api_v2的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter Twitter API集成插件twitter_api_v2的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个使用 twitter_api_v2
插件在 Flutter 中集成 Twitter API 的基本示例代码。这个示例演示了如何初始化 Twitter API 客户端,以及如何获取用户的时间线推文。
首先,确保你已经在 pubspec.yaml
文件中添加了 twitter_api_v2
依赖:
dependencies:
flutter:
sdk: flutter
twitter_api_v2: ^最新版本号 # 请替换为实际可用的最新版本号
然后运行 flutter pub get
来获取依赖。
接下来,在你的 Flutter 应用中,你需要配置 Twitter API 的凭证。这通常包括消费者密钥(Consumer Key)、消费者密钥秘密(Consumer Secret)、访问令牌(Access Token)和访问令牌秘密(Access Token Secret)。这些凭证可以通过 Twitter Developer Portal 获取。
下面是一个完整的示例代码,展示了如何使用 twitter_api_v2
插件:
import 'package:flutter/material.dart';
import 'package:twitter_api_v2/twitter_api_v2.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late TwitterApiClient twitterClient;
late List<Tweet> tweets;
@override
void initState() {
super.initState();
// 替换为你的Twitter API凭证
const consumerKey = 'YOUR_CONSUMER_KEY';
const consumerSecret = 'YOUR_CONSUMER_SECRET';
const accessToken = 'YOUR_ACCESS_TOKEN';
const accessTokenSecret = 'YOUR_ACCESS_TOKEN_SECRET';
twitterClient = TwitterApiClient(
consumerKey: consumerKey,
consumerSecret: consumerSecret,
accessToken: accessToken,
accessTokenSecret: accessTokenSecret,
);
fetchTweets();
}
void fetchTweets() async {
try {
final result = await twitterClient.getUserTimelineTweets(
userId: '123456789', // 替换为你想获取时间线推文的用户ID
maxResults: 10,
expansions: ['author_id', 'referenced_tweets.id', 'in_reply_to_user_id'],
'tweet.fields': ['id', 'text', 'created_at', 'author_id', 'public_metrics', 'referenced_tweets'],
'user.fields': ['id', 'name', 'username'],
);
setState(() {
tweets = result.data;
});
} catch (e) {
print(e);
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Twitter API Integration'),
),
body: tweets.isEmpty
? Center(child: CircularProgressIndicator())
: ListView.builder(
itemCount: tweets.length,
itemBuilder: (context, index) {
final tweet = tweets[index];
return Card(
child: ListTile(
title: Text(tweet.text),
subtitle: Text('${tweet.createdAt} by @${tweet.author?.username}'),
),
);
}),
),
);
}
}
class Tweet {
String? id;
String? text;
String? createdAt;
User? author;
Tweet({this.id, this.text, this.createdAt, this.author});
factory Tweet.fromJson(Map<String, dynamic> json) {
return Tweet(
id: json['id'] as String?,
text: json['text'] as String?,
createdAt: json['created_at'] as String?,
author: json['author'] != null ? User.fromJson(json['author'] as Map<String, dynamic>) : null,
);
}
}
class User {
String? id;
String? name;
String? username;
User({this.id, this.name, this.username});
factory User.fromJson(Map<String, dynamic> json) {
return User(
id: json['id'] as String?,
name: json['name'] as String?,
username: json['username'] as String?,
);
}
}
在这个示例中:
- 我们创建了一个
TwitterApiClient
实例,并使用我们的 Twitter API 凭证进行初始化。 - 使用
twitterClient.getUserTimelineTweets
方法获取用户的时间线推文。 - 将获取到的推文数据存储在
tweets
列表中,并在 UI 中显示。
请确保替换示例代码中的 YOUR_CONSUMER_KEY
、YOUR_CONSUMER_SECRET
、YOUR_ACCESS_TOKEN
和 YOUR_ACCESS_TOKEN_SECRET
为你自己的 Twitter API 凭证。同时,将 userId
替换为你想获取时间线推文的用户ID。
这个示例仅展示了基本的集成和获取推文功能。根据需求,你可以进一步扩展这个示例,比如处理分页、错误处理、用户认证等。