Flutter Twitter API集成插件twitter_api_v2的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter Twitter API集成插件 twitter_api_v2 的使用

简介

twitter_api_v2 是一个用于 Dart 和 Flutter 应用程序的 Twitter API v2.0 封装库。它提供了对 Twitter API v2.0 的轻松集成,并确保响应对象具有安全的类型。该库支持所有端点、请求参数和响应字段,支持高性能流式处理端点、扩展和字段特性、良好的文档和测试、强大的自动重试机制、大媒体上传(图像、GIF、视频)以及安全且强大的分页功能。

twitter_api_v2

GitHub Sponsor | Maintainer | Pub Package

特性

  • 支持 Twitter API v2.0
  • 易于集成到 Dart 和 Flutter 应用中
  • 提供带有保证安全类型的响应对象
  • 支持所有端点
  • 支持所有请求参数和响应字段
  • 支持高性能流式处理端点
  • 支持 expansionsfields 特性
  • 文档完善且经过充分测试
  • 支持强大的自动重试机制
  • 支持大媒体上传(图像、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

1 回复

更多关于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?,
    );
  }
}

在这个示例中:

  1. 我们创建了一个 TwitterApiClient 实例,并使用我们的 Twitter API 凭证进行初始化。
  2. 使用 twitterClient.getUserTimelineTweets 方法获取用户的时间线推文。
  3. 将获取到的推文数据存储在 tweets 列表中,并在 UI 中显示。

请确保替换示例代码中的 YOUR_CONSUMER_KEYYOUR_CONSUMER_SECRETYOUR_ACCESS_TOKENYOUR_ACCESS_TOKEN_SECRET 为你自己的 Twitter API 凭证。同时,将 userId 替换为你想获取时间线推文的用户ID。

这个示例仅展示了基本的集成和获取推文功能。根据需求,你可以进一步扩展这个示例,比如处理分页、错误处理、用户认证等。

回到顶部