All Projects → draw-dev → DRAW

draw-dev / DRAW

Licence: BSD-3-Clause license
DRAW: The Dart Reddit API Wrapper

Programming Languages

dart
5743 projects
shell
77523 projects

Projects that are alternatives of or similar to DRAW

mpvue canvas drawer
[mpvue版本]微信小程序上canvas绘制图片助手,一个json就制作分享朋友圈图片
Stars: ✭ 43 (-47.56%)
Mutual labels:  draw
flutter octo job search
Octo Job Search app is a job search app built in flutter framework.
Stars: ✭ 59 (-28.05%)
Mutual labels:  flutter-apps
connectycube-flutter-call-kit
A Flutter plugin for displaying call screen when the app in the background or terminated.
Stars: ✭ 35 (-57.32%)
Mutual labels:  flutter-apps
shoppers
Flutter E-Commerce App using Firebase, Razorpay and Stripe
Stars: ✭ 94 (+14.63%)
Mutual labels:  flutter-apps
u-draw-poster
绘制多端海报工具,支持uni多端与微信环境执行。
Stars: ✭ 41 (-50%)
Mutual labels:  draw
quickstart-flutter
No description or website provided.
Stars: ✭ 22 (-73.17%)
Mutual labels:  flutter-apps
phaser3-plugin-pathbuilder
Draw and edit Lines, Bezier Curves, Splines at runtime, explore your scene and export your paths to Phaser
Stars: ✭ 67 (-18.29%)
Mutual labels:  draw
flutter spacexopedia
Flutter app which provide info about space projects of SpaceX company.
Stars: ✭ 27 (-67.07%)
Mutual labels:  flutter-apps
Post-it
social media app which is made entirely with flutter and firebase
Stars: ✭ 96 (+17.07%)
Mutual labels:  flutter-apps
syntax highlighter
Syntax Highlighter for Dart/Flutter Code
Stars: ✭ 28 (-65.85%)
Mutual labels:  flutter-apps
glass kit
💎 A package containing widgets to implement glass morphism in flutter apps
Stars: ✭ 50 (-39.02%)
Mutual labels:  flutter-apps
HelpingHand
Leveraging Intelligent Processing Tools and Algorithms to help the Visually Impaired see and navigate 💥✨
Stars: ✭ 29 (-64.63%)
Mutual labels:  flutter-apps
MemePolice bot
This is a bot for r/PewdiepieSubmissions. Moderate harmful submissions by applying OCR on graphical content
Stars: ✭ 26 (-68.29%)
Mutual labels:  reddit-api
Sub-Track
Flutter Application to keep track of Subscriptions
Stars: ✭ 31 (-62.2%)
Mutual labels:  flutter-apps
getx-snippets-intelliJ
An extension to accelerate the process of developing applications with flutter, aimed at everyone using the GetX package.
Stars: ✭ 52 (-36.59%)
Mutual labels:  flutter-apps
flutter qr code scanner generator sharing
Flutter App For Scanning, Generating, Sharing QR Code
Stars: ✭ 137 (+67.07%)
Mutual labels:  flutter-apps
CleanToDO
A Cleaner To-Do manager for Android, made with Flutter and ❤️
Stars: ✭ 21 (-74.39%)
Mutual labels:  flutter-apps
dart-tags
ID3 Tag parser written on the pure dart language.
Stars: ✭ 35 (-57.32%)
Mutual labels:  pub
budget my life
Budget your life with ease.
Stars: ✭ 34 (-58.54%)
Mutual labels:  flutter-apps
Knockdown-Flutter
Enough exercises to knockdown the fear of Flutter in you 👊
Stars: ✭ 33 (-59.76%)
Mutual labels:  flutter-apps

DRAW: The Dart Reddit API Wrapper

Build Status Pub Version Coverage Status

DRAW, also known as the Dart Reddit API Wrapper, is a Dart package that provides simple access to the Reddit API. DRAW is inspired by PRAW, the Python Reddit API Wrapper, and aims to also maintain a similar interface.

Want to get involved? Check out how to contribute to get started!

Disclaimer: This is not an official Google product.

Installation

Installing DRAW is simple using Dart's package management system, pub. Instructions on how to import DRAW into your project can be found here. If you would prefer to live on the hemorrhaging-edge, methods to depend on a local copy of DRAW or on the Github repository can be found here.

Getting Started

Assuming you already have your Reddit OAuth credentials, getting started with DRAW is simple:

import 'dart:async';
import 'package:draw/draw.dart';

Future<void> main() async {
  // Create the `Reddit` instance and authenticated
  Reddit reddit = await Reddit.createScriptInstance(
    clientId: CLIENT_ID,
    clientSecret: SECRET,
    userAgent: AGENT_NAME,
    username: "DRAWApiOfficial",
    password: "hunter12", // Fake
  );

  // Retrieve information for the currently authenticated user
  Redditor currentUser = await reddit.user.me();
  // Outputs: My name is DRAWApiOfficial
  print("My name is ${currentUser.displayName}");
}

This simple example is a great way to confirm that DRAW is working and that your credentials have been configured correctly.

Web Authentication

To authenticate via the Reddit authentication page, the web authentication flow needs to be used. This requires that a web application is registered with a valid Reddit account, which provides a client-id and a client-secret. As part of this process, a redirect URL is associated with the registered web application. These three values are all that is needed to complete the web authentication flow.

Here is a simple example of how to use web authentication with DRAW:

import 'package:draw/draw.dart';

main() async {
  final userAgent = 'foobar';
  final configUri = Uri.parse('draw.ini');

  // Create a `Reddit` instance using a configuration file in the
  // current directory.
  final reddit = Reddit.createWebFlowInstance(userAgent: userAgent,
                                              configUri: configUri);

  // Build the URL used for authentication. See `WebAuthenticator`
  // documentation for parameters.
  final auth_url = reddit.auth.url(['*'], 'foobar');

  // ...
  // Complete authentication at `auth_url` in the browser and retrieve
  // the `code` query parameter from the redirect URL.
  // ...

  // Assuming the `code` query parameter is stored in a variable
  // `auth_code`, we pass it to the `authorize` method in the
  // `WebAuthenticator`.
  await reddit.auth.authorize(auth_code);

  // If everything worked correctly, we should be able to retrieve
  // information about the authenticated account.
  print(await reddit.user.me());
}

It is also possible to restore cached credentials in order to avoid the need to complete the web authentication flow on each run:

import 'package:draw/draw.dart';

// Provides methods to load and save credentials.
import 'credential_loader.dart';

main() async {
  final userAgent = 'foobar';
  final configUri = Uri.parse('draw.ini');

  // Load cached credentials from disk, if available.
  final credentialsJson = await loadCredentials();

  var reddit;

  if (credentialsJson == null) {
    reddit =
        await Reddit.createWebFlowInstance(userAgent: userAgent,
                                           configUri: configUri);

    // Build the URL used for authentication. See `WebAuthenticator`
    // documentation for parameters.
    final auth_url = reddit.auth.url(['*'], 'foobar');

    // ...
    // Complete authentication at `auth_url` in the browser and retrieve
    // the `code` query parameter from the redirect URL.
    // ...

    // Assuming the `code` query parameter is stored in a variable
    // `auth_code`, we pass it to the `authorize` method in the
    // `WebAuthenticator`.
    await reddit.auth.authorize(auth_code);

    // Write credentials to disk.
    await writeCredentials(reddit.auth.credentials.toJson());
  } else {
    // Create a new Reddit instance using previously cached credentials.
    reddit = Reddit.restoreAuthenticatedInstance(
        userAgent: userAgent,
        configUri: configUri,
        credentialsJson: credentialsJson);
  }

  // If everything worked correctly, we should be able to retrieve
  // information about the authenticated account.
  print(await reddit.user.me());
}

Installed Application Authentication

For usage in environments where it is impossible to keep a client secret secure, the installed application flow should be used. This requires that an installed application is registered with a valid Reddit account, which provides a client-id. As part of this process, a redirect URL is associated with the registered installed application. These two values are all that is needed to complete the installed application authentication flow.

The installed application authentication flow is almost identical to the web authentication flow described above, and it is also possible to save and restore credentials for installed applications in a similar fashion.

Read up more about how to use this authentication flow on here.

Here is a simple example of how to use the installed application authentication flow with DRAW:

import 'package:draw/draw.dart';

main() async {
  final userAgent = 'foobar';
  final configUri = Uri.parse('draw.ini');

  // Create a `Reddit` instance using a configuration file in the current
  // directory. Unlike the web authentication example, a client secret does
  // not need to be provided in the configuration file.
  final reddit = Reddit.createInstalledFlowInstance(userAgent: userAgent,
                                                    configUri: configUri);

  // Build the URL used for authentication. See `WebAuthenticator`
  // documentation for parameters.
  final auth_url = reddit.auth.url(['*'], 'foobar');

  // ...
  // Complete authentication at `auth_url` in the browser and retrieve
  // the `code` query parameter from the redirect URL.
  // ...

  // Assuming the `code` query parameter is stored in a variable
  // `auth_code`, we pass it to the `authorize` method in the
  // `WebAuthenticator`.
  await reddit.auth.authorize(auth_code);

  // If everything worked correctly, we should be able to retrieve
  // information about the authenticated account.
  print(await reddit.user.me());
}

DRAW Configuration Files (draw.ini)

Here's an example draw.ini suitable for web based authentication:

default=default
reddit_url='https://www.reddit.com'
oauth_url=https://oauth.reddit.com
redirect_uri=https://www.google.com
client_id=YOUR_CLIENT_ID_HERE
client_secret=YOUR_SECRET_HERE
userAgent=draw_testing_agent

Here the redirect URI is set to https://www.google.com, but you'll need to replace that with whatever redirect you have registered.

The format of draw.ini configuration files is very similar to that of praw.ini files used by PRAW, although there may be some minor differences due to the .ini parser used by DRAW.

Frequently Asked Questions (FAQ)

Q: "I'm having trouble authenticating. What's wrong?"

Assuming the build status of DRAW is passing, there's likely something wrong with your credentials or user-agent. Here's some things to check:

  • Ensure your client ID and client secret match those provided by Reddit, applicable for your use case.
  • Try a new value for userAgent. Reddit rejects requests with commonly used user-agents like "foobar", "testing", or "reddit", so try using a randomly generated user-agent to make sure this isn't the issue you're seeing.

License

DRAW is provided under a BSD 3-clause license. Copyright (c), 2017, the DRAW Project Authors and Google LLC.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].