twitter-snap 0.0.15 → 0.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +43 -54
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +5 -0
  4. package/bin/run.cmd +3 -0
  5. package/bin/run.js +5 -0
  6. package/dist/cli.d.ts +0 -1
  7. package/dist/cli.js +13 -35
  8. package/dist/cli.js.map +1 -1
  9. package/dist/commands/index.d.ts +24 -0
  10. package/dist/commands/index.d.ts.map +1 -0
  11. package/dist/commands/index.js +99 -0
  12. package/dist/commands/index.js.map +1 -0
  13. package/dist/core/core.d.ts +29 -0
  14. package/dist/core/core.d.ts.map +1 -0
  15. package/dist/core/core.js +133 -0
  16. package/dist/core/core.js.map +1 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +2 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/tsconfig.build.tsbuildinfo +1 -1
  22. package/dist/utils/fonts.d.ts +0 -4
  23. package/dist/utils/fonts.d.ts.map +1 -1
  24. package/dist/utils/fonts.js +26 -12
  25. package/dist/utils/fonts.js.map +1 -1
  26. package/dist/utils/logger.d.ts +21 -0
  27. package/dist/utils/logger.d.ts.map +1 -0
  28. package/dist/utils/logger.js +130 -0
  29. package/dist/utils/logger.js.map +1 -0
  30. package/dist/utils/types.d.ts +8 -0
  31. package/dist/utils/types.d.ts.map +1 -0
  32. package/dist/utils/types.js +4 -0
  33. package/dist/utils/types.js.map +1 -0
  34. package/oclif.manifest.json +133 -0
  35. package/package.json +67 -21
  36. package/.eslintrc.json +0 -4
  37. package/.vscode/settings.json +0 -3
  38. package/dist/app/api/twitter/route.d.ts +0 -3
  39. package/dist/app/api/twitter/route.d.ts.map +0 -1
  40. package/dist/app/api/twitter/route.js +0 -19
  41. package/dist/app/api/twitter/route.js.map +0 -1
  42. package/dist/app/layout.d.ts +0 -7
  43. package/dist/app/layout.d.ts.map +0 -1
  44. package/dist/app/layout.js +0 -11
  45. package/dist/app/layout.js.map +0 -1
  46. package/dist/app/page.d.ts +0 -2
  47. package/dist/app/page.d.ts.map +0 -1
  48. package/dist/app/page.js +0 -22
  49. package/dist/app/page.js.map +0 -1
  50. package/dist/core/twitterSnap.d.ts +0 -49
  51. package/dist/core/twitterSnap.d.ts.map +0 -1
  52. package/dist/core/twitterSnap.js +0 -62
  53. package/dist/core/twitterSnap.js.map +0 -1
  54. package/dist/theme/normal.d.ts +0 -4
  55. package/dist/theme/normal.d.ts.map +0 -1
  56. package/dist/theme/normal.js +0 -52
  57. package/dist/theme/normal.js.map +0 -1
  58. package/dist/theme/normalComponent.d.ts +0 -4
  59. package/dist/theme/normalComponent.d.ts.map +0 -1
  60. package/dist/theme/normalComponent.js +0 -257
  61. package/dist/theme/normalComponent.js.map +0 -1
  62. package/dist/theme/normalUtils.d.ts +0 -19
  63. package/dist/theme/normalUtils.d.ts.map +0 -1
  64. package/dist/theme/normalUtils.js +0 -114
  65. package/dist/theme/normalUtils.js.map +0 -1
  66. package/dist/utils/cookies.d.ts +0 -2
  67. package/dist/utils/cookies.d.ts.map +0 -1
  68. package/dist/utils/cookies.js +0 -12
  69. package/dist/utils/cookies.js.map +0 -1
  70. package/docs/img/output.png +0 -0
  71. package/next-env.d.ts +0 -5
  72. package/next.config.cjs +0 -5
  73. package/test/test.ps1 +0 -21
  74. package/tsconfig.build.json +0 -25
  75. package/tsconfig.json +0 -40
package/README.md CHANGED
@@ -16,61 +16,50 @@ npx twitter-snap 1518623997054918657
16
16
  ## Arguments
17
17
 
18
18
  ```shell
19
- Usage: twitter-snap [options] <string>
20
-
21
- Arguments:
22
- string tweet url or tweet id
23
-
24
- Options:
25
- -V, --version output the version number
26
- -o, --output <path> output file path (default: "output.png")
27
- -w, --width <number> image width (default: "600")
28
- -h, --height <number> image height
29
- -t, --theme <string> normal
30
- --margin <number> margin
31
- --fonts <path> font config file path .json
32
- --emoji <string> emoji type (twemoji, openmoji, blobmoji, noto, fluent, fluentFlat) (default: "twemoji")
33
- --cookies <path> net escape cookie file path .txt
34
- --auto-photo if the tweet is not a video, save it as an image
35
- --no-remove-temp no remove temp file
36
- --help display help for command
37
- ```
38
-
39
- ## Output file type
40
-
41
- ```shell
42
- npx twitter-snap 1518623997054918657 -o output.png # output.png
43
- npx twitter-snap 1518623997054918657 -o output.mp4 # Error
44
- npx twitter-snap 1518623997054918657 -o output.mp4 --auto-photo # output.png
45
-
46
- npx twitter-snap 1585341984679469056 -o output.png # output.png
47
- npx twitter-snap 1585341984679469056 -o output.mp4 # output.mp4
48
- npx twitter-snap 1585341984679469056 -o output.mp4 --auto-photo # output.mp4
49
- ```
50
-
51
- ## Fonts
52
-
53
- You can specify the font by creating a font config file. (path: `--fonts`)
54
-
55
- ```json
56
- [
57
- {
58
- "data": "NotoSansJP-Regular.ttf",
59
- "name": "Noto Sans JP",
60
- "weight": 400,
61
- "theme": "normal",
62
- "lang": "ja-JP"
63
- },
64
- {
65
- "data": "NotoSansJP-Bold.ttf",
66
- "name": "Noto Sans JP",
67
- "weight": 700,
68
- "theme": "normal",
69
- "lang": "ja-JP"
70
- }
71
- ]
19
+ $ bin/run --help
20
+ Create beautiful Tweet images fast
21
+
22
+ USAGE
23
+ $ twitter-snap ID [--api
24
+ getTweetResultByRestId|getTweetDetail|getSearchTimeline|getHomeTimeline|getHomeLatestTimeline|getListLatestTweetsTimeline|getUserTweets|getUserTweetsAndReplies|getUserMedia|getLikes|ge
25
+ tBookmarks] [--theme RenderBasic] [-o <value>] [--cleanup] [--max <value>] [--debug] [--sleep <value>] [--session_type <value>] [--cookies_file <value>] [--browser_profile <value>]
26
+ [--browser_headless]
27
+
28
+ ARGUMENTS
29
+ ID Twitter status id
30
+
31
+ FLAGS
32
+ -o, --output=<value> [default: {id}.{if-photo:png:mp4}] Output file name
33
+ --api=<option> [default: getTweetResultByRestId] API type
34
+ <options: getTweetResultByRestId|getTweetDetail|getSearchTimeline|getHomeTimeline|getHomeLatestTimeline|getListLatestTweetsTimeline|getUserTweets|getUserTw
35
+ eetsAndReplies|getUserMedia|getLikes|getBookmarks>
36
+ --browser_headless Browser headless
37
+ --browser_profile=<value> [default: C:\Users\yuki/.cache/twitter-snap/profiles] Browser profile
38
+ --cleanup Cleanup
39
+ --cookies_file=<value> [default: cookies.json] Cookies file
40
+ --debug Debug
41
+ --max=<value> [default: 30] Max count
42
+ --session_type=<value> [default: guest] Session type
43
+ --sleep=<value> Sleep (ms)
44
+ --theme=<option> [default: RenderBasic] Theme type
45
+ <options: RenderBasic>
46
+
47
+ DESCRIPTION
48
+ Create beautiful Tweet images fast
49
+ https://github.com/fa0311/twitter-snap
50
+
51
+ EXAMPLES
52
+ $ twitter-snap 1765415187161464972
53
+
54
+ $ twitter-snap 1765415187161464972 --session_type browser
55
+
56
+ $ twitter-snap 1765415187161464972 --session_type file --cookies_file cookies.json
57
+
58
+ $ twitter-snap 44196397 --api getUserTweets --max 10
59
+
60
+ $ twitter-snap 44196397 --api getUserTweets --output "data/{user-screen-name}/{id}.{if-photo:png:mp4}"
72
61
  ```
73
62
 
74
63
  ## Dependence
75
64
 
76
- - [ffmpeg](https://ffmpeg.org/) (for video)
65
+ - [ffmpeg](https://ffmpeg.org/) (for video)
package/bin/dev.cmd ADDED
@@ -0,0 +1,3 @@
1
+ @echo off
2
+
3
+ node --loader ts-node/esm --no-warnings=ExperimentalWarning "%~dp0\dev" %*
package/bin/dev.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env -S node --loader ts-node/esm --no-warnings=ExperimentalWarning
2
+
3
+ import {execute} from '@oclif/core'
4
+
5
+ await execute({development: true, dir: import.meta.url})
package/bin/run.cmd ADDED
@@ -0,0 +1,3 @@
1
+ @echo off
2
+
3
+ node "%~dp0\run" %*
package/bin/run.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {execute} from '@oclif/core'
4
+
5
+ await execute({dir: import.meta.url})
package/dist/cli.d.ts CHANGED
@@ -1,3 +1,2 @@
1
- #!/usr/bin/env node
2
1
  export {};
3
2
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.js CHANGED
@@ -1,38 +1,16 @@
1
- #!/usr/bin/env node
2
- import { Command } from "commander";
3
- import { TwitterSnap } from "./core/twitterSnap.js";
4
- import { getClient } from "./utils/cookies.js";
5
- import { getFonts } from "./utils/fonts.js";
6
- const version = "0.0.10";
7
- const program = new Command();
8
- program.name("twitter-snap").version(version);
9
- const emoji = "(twemoji, openmoji, blobmoji, noto, fluent, fluentFlat)";
10
- program
11
- .argument("<string>", "tweet url or tweet id")
12
- .option("-o, --output <path>", "output file path", "output.png")
13
- .option("-w, --width <number>", "image width", "600")
14
- .option("-h, --height <number>", "image height")
15
- .option("-t, --theme <string>", Object.keys(TwitterSnap.themes).join())
16
- .option("--margin <number>", "margin")
17
- .option("--fonts <path>", "font config file path .json")
18
- .option("--emoji <string>", `emoji type ${emoji}`, "twemoji")
19
- .option("--cookies <path>", "net escape cookie file path .txt")
20
- .option("--auto-photo", "if the tweet is not a video, save it as an image")
21
- .option("--no-remove-temp", "no remove temp file")
22
- .action(async (text, param) => {
23
- const id = isNaN(text) ? text.split("/").pop() : text;
24
- const twitterSnap = new TwitterSnap({
25
- width: parseInt(param.width),
26
- height: param.height ? parseInt(param.height) : undefined,
27
- client: param.cookies ? await getClient(param.cookies) : undefined,
28
- themeName: param.theme,
29
- fonts: param.fonts ? await getFonts(param.fonts) : undefined,
30
- emoji: param.emoji ? param.emoji : undefined,
31
- autoPhoto: param.autoPhoto ? true : false,
32
- removeTemp: param.removeTemp ? true : false,
1
+ // #!/usr/bin/env node
2
+ import { twitterSnapPuppeteer } from './core/core';
3
+ const snap = await twitterSnapPuppeteer();
4
+ await snap({ id: '900282258736545792', type: 'getLikes', max: 100 }, async (render) => {
5
+ const finalize = await render({
6
+ themeName: 'RenderBasic',
7
+ themeParam: {
8
+ width: 600,
9
+ },
10
+ output: 'temp/{id}.png',
11
+ });
12
+ await finalize({
13
+ cleanup: true,
33
14
  });
34
- await twitterSnap.render({ output: param.output, id });
35
- process.exit(0);
36
15
  });
37
- program.parse(process.argv);
38
16
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAqB,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,OAAO,GAAG,QAAQ,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAe9C,MAAM,KAAK,GAAG,yDAAyD,CAAC;AAExE,OAAO;KACJ,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC;KAC7C,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,YAAY,CAAC;KAC/D,MAAM,CAAC,sBAAsB,EAAE,aAAa,EAAE,KAAK,CAAC;KACpD,MAAM,CAAC,uBAAuB,EAAE,cAAc,CAAC;KAC/C,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;KACtE,MAAM,CAAC,mBAAmB,EAAE,QAAQ,CAAC;KACrC,MAAM,CAAC,gBAAgB,EAAE,6BAA6B,CAAC;KACvD,MAAM,CAAC,kBAAkB,EAAE,cAAc,KAAK,EAAE,EAAE,SAAS,CAAC;KAC5D,MAAM,CAAC,kBAAkB,EAAE,kCAAkC,CAAC;KAC9D,MAAM,CAAC,cAAc,EAAE,kDAAkD,CAAC;KAC1E,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,KAAY,EAAE,EAAE;IACnC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAEtD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;QAClC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;QAC5B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QACzD,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;QAClE,SAAS,EAAE,KAAK,CAAC,KAAK;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5D,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QAC5C,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;QACzC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;KAC5C,CAAC,CAAC;IAEH,MAAM,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IAEvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AACL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,sBAAsB;AAEtB,OAAO,EAAC,oBAAoB,EAAC,MAAM,aAAa,CAAA;AAEhD,MAAM,IAAI,GAAG,MAAM,oBAAoB,EAAE,CAAA;AACzC,MAAM,IAAI,CAAC,EAAC,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;IAClF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;QAC5B,SAAS,EAAE,aAAa;QACxB,UAAU,EAAE;YACV,KAAK,EAAE,GAAG;SACX;QACD,MAAM,EAAE,eAAe;KACxB,CAAC,CAAA;IACF,MAAM,QAAQ,CAAC;QACb,OAAO,EAAE,IAAI;KACd,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Default extends Command {
3
+ static args: {
4
+ id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
5
+ };
6
+ static description: string;
7
+ static examples: string[];
8
+ static browser_profile: string;
9
+ static flags: {
10
+ api: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<"getTweetDetail" | "getSearchTimeline" | "getHomeTimeline" | "getHomeLatestTimeline" | "getListLatestTweetsTimeline" | "getUserTweets" | "getUserTweetsAndReplies" | "getUserMedia" | "getLikes" | "getBookmarks" | "getTweetResultByRestId", import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
11
+ theme: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<"RenderBasic", import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
12
+ output: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
13
+ cleanup: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
14
+ max: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<number, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
15
+ debug: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
16
+ sleep: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<number, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
17
+ session_type: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<"guest" | "browser" | "file", import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
18
+ cookies_file: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
19
+ browser_profile: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
20
+ browser_headless: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
21
+ };
22
+ run(): Promise<void>;
23
+ }
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,OAAO,EAAQ,MAAM,aAAa,CAAA;AAwBhD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAC,IAAI;;MAEV;IAED,MAAM,CAAC,WAAW,SAA8F;IAChH,MAAM,CAAC,QAAQ,WAMd;IAED,MAAM,CAAC,eAAe,SAAiD;IAEvE,MAAM,CAAC,KAAK;;;;;;;;;;;;MAYX;IAEK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAwD3B"}
@@ -0,0 +1,99 @@
1
+ var _a;
2
+ import { Args, Command, Flags } from '@oclif/core';
3
+ import os from 'os';
4
+ import { themeList } from 'twitter-snap-core';
5
+ import { twitterSnapCookies, twitterSnapGuest, twitterSnapPuppeteer } from '../core/core.js';
6
+ import { Logger } from '../utils/logger.js';
7
+ import { getTweetList } from './../utils/types.js';
8
+ const apiFlag = Flags.custom({
9
+ description: 'API type',
10
+ options: ['getTweetResultByRestId', ...getTweetList],
11
+ default: 'getTweetResultByRestId',
12
+ });
13
+ const themeNameFlag = Flags.custom({
14
+ description: 'Theme type',
15
+ options: Object.keys(themeList),
16
+ default: 'RenderBasic',
17
+ });
18
+ const sessionType = Flags.custom({
19
+ description: 'Session type',
20
+ default: 'guest',
21
+ });
22
+ class Default extends Command {
23
+ async run() {
24
+ const { args, flags } = await this.parse(_a);
25
+ const logger = new Logger();
26
+ console.log = flags.debug ? logger.log.bind(logger) : (_) => { };
27
+ const getClient = (() => {
28
+ switch (flags.session_type) {
29
+ case 'guest':
30
+ return twitterSnapGuest();
31
+ case 'browser':
32
+ return twitterSnapPuppeteer(flags.browser_headless, flags.browser_profile);
33
+ case 'file':
34
+ return twitterSnapCookies(flags.cookies_file);
35
+ }
36
+ })();
37
+ const client = await logger.guard({ text: 'Loading Client' }, getClient);
38
+ const logHandler = async ({ type, user, id }) => {
39
+ switch (type) {
40
+ case 'start':
41
+ return logger.update(`Rendering tweet ${user}/${id}`);
42
+ case 'image':
43
+ return logger.update(`Rendering image ${user}/${id}`);
44
+ case 'video':
45
+ return logger.update(`Rendering video ${user}/${id}`);
46
+ }
47
+ };
48
+ const sleep = async (ms) => new Promise((resolve) => setTimeout(resolve, ms));
49
+ const render = client({ id: args.id, type: flags.api, max: flags.max }, async (render) => {
50
+ try {
51
+ const finalize = await render({
52
+ themeName: flags.theme,
53
+ themeParam: {
54
+ width: 600,
55
+ },
56
+ output: flags.output,
57
+ handler: logHandler,
58
+ });
59
+ await finalize({
60
+ cleanup: true,
61
+ });
62
+ logger.succeed();
63
+ }
64
+ catch (e) {
65
+ logger.error(e);
66
+ }
67
+ await sleep(flags.sleep);
68
+ });
69
+ await logger.guardProgress({ text: 'Rendering tweet', max: flags.max }, render);
70
+ }
71
+ }
72
+ _a = Default;
73
+ Default.args = {
74
+ id: Args.string({ description: 'Twitter status id', required: true }),
75
+ };
76
+ Default.description = ['Create beautiful Tweet images fast', 'https://github.com/fa0311/twitter-snap'].join('\n');
77
+ Default.examples = [
78
+ 'twitter-snap 1765415187161464972',
79
+ 'twitter-snap 1765415187161464972 --session_type browser',
80
+ 'twitter-snap 1765415187161464972 --session_type file --cookies_file cookies.json',
81
+ 'twitter-snap 44196397 --api getUserTweets --max 10',
82
+ 'twitter-snap 44196397 --api getUserTweets --output "data/{user-screen-name}/{id}.{if-photo:png:mp4}"',
83
+ ];
84
+ Default.browser_profile = `${os.homedir()}/.cache/twitter-snap/profiles`;
85
+ Default.flags = {
86
+ api: apiFlag(),
87
+ theme: themeNameFlag(),
88
+ output: Flags.string({ char: 'o', description: 'Output file name', default: '{id}.{if-photo:png:mp4}' }),
89
+ cleanup: Flags.boolean({ description: 'Cleanup', default: true }),
90
+ max: Flags.integer({ description: 'Max count', default: 30 }),
91
+ debug: Flags.boolean({ description: 'Debug', default: false }),
92
+ sleep: Flags.integer({ description: 'Sleep (ms)', default: 0 }),
93
+ session_type: sessionType(),
94
+ cookies_file: Flags.file({ description: 'Cookies file', default: 'cookies.json' }),
95
+ browser_profile: Flags.string({ description: 'Browser profile', default: _a.browser_profile }),
96
+ browser_headless: Flags.boolean({ description: 'Browser headless', default: false }),
97
+ };
98
+ export default Default;
99
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { TweetApiUtilsData } from 'twitter-openapi-typescript';
2
+ import { ThemeNameType } from 'twitter-snap-core';
3
+ import { GetTweetApi, ThemeParamType } from '../utils/types.js';
4
+ export declare const twitterSnapGuest: () => Promise<({ id, type, max }: tweetApiSnapParam, handler: (e: ReturnType<typeof twitterRender>) => Promise<void>) => Promise<void>>;
5
+ export declare const twitterSnapPuppeteer: (headless?: boolean, userDataDir?: string) => Promise<({ id, type, max }: tweetApiSnapParam, handler: (e: ReturnType<typeof twitterRender>) => Promise<void>) => Promise<void>>;
6
+ export declare const twitterSnapCookies: (path: string) => Promise<({ id, type, max }: tweetApiSnapParam, handler: (e: ReturnType<typeof twitterRender>) => Promise<void>) => Promise<void>>;
7
+ type tweetApiSnapParam = {
8
+ id: string;
9
+ type?: 'getTweetResultByRestId' | keyof GetTweetApi;
10
+ max: number;
11
+ };
12
+ type HandlerTypeLiteral = 'start' | 'image' | 'video';
13
+ export type HandlerType = {
14
+ type: HandlerTypeLiteral;
15
+ user: string;
16
+ id: string;
17
+ };
18
+ type twitterRenderParam = {
19
+ themeName: ThemeNameType;
20
+ themeParam: ThemeParamType;
21
+ output: string;
22
+ handler?: (e: HandlerType) => void;
23
+ };
24
+ declare const twitterRender: (data: TweetApiUtilsData) => ({ themeName, themeParam, output, handler }: twitterRenderParam) => Promise<({ cleanup }: FinalizeParam) => Promise<void>>;
25
+ type FinalizeParam = {
26
+ cleanup: boolean;
27
+ };
28
+ export {};
29
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/core/core.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,iBAAiB,EAAuC,MAAM,4BAA4B,CAAA;AAGlG,OAAO,EAAC,aAAa,EAAY,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAC,WAAW,EAAE,cAAc,EAAe,MAAM,mBAAmB,CAAA;AAE3E,eAAO,MAAM,gBAAgB,oCA4CR,iBAAiB,eACrB,WAAW,oBAAoB,CAAC,KAAK,QAAQ,IAAI,CAAC,mBAzClE,CAAA;AAED,eAAO,MAAM,oBAAoB,cAAqB,OAAO,gBAAgB,MAAM,iCAsC9D,iBAAiB,eACrB,WAAW,oBAAoB,CAAC,KAAK,QAAQ,IAAI,CAAC,mBAnBlE,CAAA;AAED,eAAO,MAAM,kBAAkB,SAAgB,MAAM,iCAgBhC,iBAAiB,eACrB,WAAW,oBAAoB,CAAC,KAAK,QAAQ,IAAI,CAAC,mBAXlE,CAAA;AAED,KAAK,iBAAiB,GAAG;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,wBAAwB,GAAG,MAAM,WAAW,CAAA;IACnD,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AA4CD,KAAK,kBAAkB,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAA;AACrD,MAAM,MAAM,WAAW,GAAG;IAAC,IAAI,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC,CAAA;AAE9E,KAAK,kBAAkB,GAAG;IACxB,SAAS,EAAE,aAAa,CAAA;IACxB,UAAU,EAAE,cAAc,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,KAAK,IAAI,CAAA;CACnC,CAAA;AAED,QAAA,MAAM,aAAa,SAAU,iBAAiB,kDAKY,kBAAkB,2BAsDjD,aAAa,mBANvC,CAAA;AAED,KAAK,aAAa,GAAG;IACnB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA"}
@@ -0,0 +1,133 @@
1
+ import { ImageResponse } from '@vercel/og';
2
+ import { promises as fs } from 'fs';
3
+ import { TwitterOpenApi } from 'twitter-openapi-typescript';
4
+ import puppeteer from 'puppeteer';
5
+ import { themeList } from 'twitter-snap-core';
6
+ import { getTweetList } from '../utils/types.js';
7
+ export const twitterSnapGuest = async () => {
8
+ const twitter = new TwitterOpenApi();
9
+ const api = await twitter.getGuestClient();
10
+ return tweetApiSnap(api);
11
+ };
12
+ export const twitterSnapPuppeteer = async (headless, userDataDir) => {
13
+ const browser = await puppeteer.launch({
14
+ headless: headless,
15
+ timeout: 0,
16
+ userDataDir: userDataDir,
17
+ });
18
+ const [page] = await browser.pages();
19
+ await page.goto('https://twitter.com/login');
20
+ page.setDefaultNavigationTimeout(0);
21
+ page.setDefaultTimeout(0);
22
+ await page.waitForResponse((res) => {
23
+ return RegExp('https://twitter.com/i/api/graphql/[a-zA-Z0-9_-]+/HomeTimeline?.*').test(res.url());
24
+ });
25
+ const cookies = await page.cookies();
26
+ await browser.close();
27
+ const twitter = new TwitterOpenApi();
28
+ const api = await twitter.getClientFromCookies(cookies.reduce((acc, e) => ({ ...acc, [e.name]: e.value }), {}));
29
+ return tweetApiSnap(api);
30
+ };
31
+ export const twitterSnapCookies = async (path) => {
32
+ const data = await fs.readFile(path, 'utf-8');
33
+ const cookies = JSON.parse(data);
34
+ const twitter = new TwitterOpenApi();
35
+ const api = await twitter.getClientFromCookies(cookies.reduce((acc, e) => ({ ...acc, [e.name]: e.value }), {}));
36
+ return tweetApiSnap(api);
37
+ };
38
+ const tweetApiSnap = (client) => {
39
+ return async ({ id, type, max }, handler) => {
40
+ const key = getTweetList.find((k) => k == type);
41
+ if (key) {
42
+ const that = client.getTweetApi();
43
+ const api = that[key].bind(that);
44
+ let count = 0;
45
+ const cursor = [];
46
+ while (count < max) {
47
+ const res = await api({
48
+ focalTweetId: id,
49
+ rawQuery: id,
50
+ listId: id,
51
+ userId: id,
52
+ cursor: cursor.length ? cursor.pop() : undefined,
53
+ });
54
+ for (const e of res.data.data) {
55
+ if (e.promotedMetadata)
56
+ continue;
57
+ if (count >= max)
58
+ return;
59
+ await handler(twitterRender(e));
60
+ count++;
61
+ }
62
+ if (res.data.cursor.bottom) {
63
+ cursor.push(res.data.cursor.bottom?.value);
64
+ }
65
+ else {
66
+ return;
67
+ }
68
+ }
69
+ }
70
+ else {
71
+ const res = await client.getDefaultApi().getTweetResultByRestId({
72
+ tweetId: id,
73
+ });
74
+ if (res.data)
75
+ await handler(twitterRender(res.data));
76
+ }
77
+ };
78
+ };
79
+ const twitterRender = (data) => {
80
+ const extEntities = data.tweet.legacy?.extendedEntities;
81
+ const extMedia = extEntities?.media ?? [];
82
+ const isVideoData = !!extMedia.find((e) => e.type !== 'photo');
83
+ return async ({ themeName, themeParam, output, handler }) => {
84
+ handler && handler({ type: 'start', user: data.user.legacy.screenName, id: data.tweet.restId });
85
+ const theme = Object.entries(themeList).find(([k, _]) => k == themeName)?.[1];
86
+ const replacData = [
87
+ ['{id}', data.tweet.restId],
88
+ ['{user-screen-name}', data.user.legacy.screenName],
89
+ ['{if-photo:(?<true>.+?):(?<false>.+?)}', isVideoData ? '$2' : '$1'],
90
+ ];
91
+ const repOutput = replacData.reduce((acc, [k, v]) => acc.replace(new RegExp(k, 'g'), v), output);
92
+ const video = repOutput.split('.').pop() != 'png';
93
+ const pngOutput = video ? repOutput.replace(/\.\w+$/, '.png') : repOutput;
94
+ const render = new theme({
95
+ ...themeParam,
96
+ video: video,
97
+ });
98
+ handler && handler({ type: 'image', user: data.user.legacy.screenName, id: data.tweet.restId });
99
+ const element = render.imageRender({
100
+ data: data,
101
+ });
102
+ const img = new ImageResponse(element, {
103
+ width: themeParam.width,
104
+ height: undefined,
105
+ emoji: 'twemoji',
106
+ });
107
+ const png = Buffer.from(await img.arrayBuffer());
108
+ if (pngOutput.split('/').length > 1) {
109
+ await fs.mkdir(pngOutput.split('/').slice(0, -1).join('/'), { recursive: true });
110
+ }
111
+ await fs.writeFile(pngOutput, png);
112
+ if (video) {
113
+ handler && handler({ type: 'video', user: data.user.legacy.screenName, id: data.tweet.restId });
114
+ const res = await render.videoRender({
115
+ data: data,
116
+ image: pngOutput,
117
+ output: repOutput,
118
+ });
119
+ return finalize(res.temp);
120
+ }
121
+ else {
122
+ return finalize([]);
123
+ }
124
+ };
125
+ };
126
+ const finalize = async (temp) => {
127
+ return async ({ cleanup }) => {
128
+ if (cleanup) {
129
+ temp.forEach(async (e) => await fs.unlink(e));
130
+ }
131
+ };
132
+ };
133
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/core/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { run } from '@oclif/core';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,aAAa,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { run } from '@oclif/core';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,aAAa,CAAA"}