Skip to content

Instantly share code, notes, and snippets.

@manzt
Created September 11, 2022 20:10
Show Gist options
  • Save manzt/d6cbf7f901a6e7b68c145d3820fbed7b to your computer and use it in GitHub Desktop.
Save manzt/d6cbf7f901a6e7b68c145d3820fbed7b to your computer and use it in GitHub Desktop.
import * as oauth from "https://raw.githubusercontent.com/snsinfu/deno-oauth-1.0a/main/mod.ts";
class OAuthClient extends oauth.OAuthClient {
fetch(
input: RequestInfo | URL,
init: RequestInit & { token?: oauth.Token },
): Promise<Response> {
let href = typeof input === "string"
? input
: input instanceof URL
? input.href
: input.url;
let method = init.method ?? "GET";
let headers = new Headers(init.headers);
if (init.token) {
headers.set(
"Authorization",
oauth.toAuthHeader(
this.sign(method, href, { token: init.token }),
),
);
}
return fetch(input, { ...init, method, headers });
}
}
export class TwitterClient extends OAuthClient {
token?: oauth.Token;
constructor(options: Partial<oauth.ClientOptions> & { token?: oauth.Token } = {}) {
let consumer = options.consumer ?? {
key: Deno.env.get("TWITTER_API_KEY"),
secret: Deno.env.get("TWITTER_API_SECRET"),
};
super({ consumer, signature: oauth.HMAC_SHA1 });
this.token = options.token ?? {
key: Deno.env.get("TWITTER_ACCESS_TOKEN"),
secret: Deno.env.get("TWITTER_ACCESS_TOKEN_SECRET"),
};
}
fetch(route: string, init: RequestInit & { token?: oauth.Token }) {
let token = init.token ?? this.token;
return super.fetch(new URL(route, "https://api.twitter.com"), {
...init,
token,
});
}
}
@manzt
Copy link
Author

manzt commented Sep 11, 2022

import { TwitterClient } from 'https://gist.github.com/manzt/d6cbf7f901a6e7b68c145d3820fbed7b/raw/d22066c5f516fdc51555b3af9b25fdf439aefc92/mod.ts';

let client = new TwitterClient()

// tweet
let status = "Hello, world";
let response = await client.fetch("/2/tweets", {
  method: "POST",
  body: JSON.stringify({ text: status }),
  headers: { "Content-Type": "application/json" },
});
let { data } = await response.json();
console.log("Tweeted", data);

// delete tweet
response = await client.fetch("/2/tweets/" + data.id, { method: "DELETE" });
console.log("Deleted", await response.json());

// Tweeted { id: "1569057473041924097", text: "Hello, world" }
// Deleted { data: { deleted: true } }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment